Пример #1
0
int evtLogon(struct pgEvent *evt){
  picosmUI *interface = (picosmUI *)evt->extra;
  char *login, *loginT, *passwd, *passwdT, *passwdSys, *salt = NULL, *rcPath;
  char *args[3];
  struct passwd *userData; 
  struct spwd *sUserData;

  loginT = pgGetString(pgGetWidget(interface->wLogin,PG_WP_TEXT));
  login = (char *)malloc(strlen(loginT));
  strcpy(login, loginT);
  passwdT = pgGetString(pgGetWidget(interface->wPasswd,PG_WP_TEXT));
  passwd = (char *)malloc(strlen(passwdT));
  strcpy(passwd, passwdT);

  if((userData = getpwnam(login)) != NULL){
    if((sUserData = getspnam(login)) != NULL){
      passwdSys = sUserData->sp_pwdp;
    }else{
      passwdSys = userData->pw_passwd;
    }
    if(passwdSys[0] == '$'){
      salt = (char *)malloc(13);
      strncpy(salt, passwdSys, 12);
    }else{
      salt = (char *)malloc(3);
      strncpy(salt, passwdSys, 2);
    }
    if(!strcmp(passwdSys, (char *)crypt(passwd, salt))){
      if(!fork()){
	setuid(userData->pw_uid);
	rcPath = (char *)malloc(strlen(userData->pw_dir)+
				strlen("/.picoguirc"));
	sprintf(rcPath, "%s/.picoguirc", userData->pw_dir); 
	printf("%s\n", rcPath);
	args[0] = "/bin/sh";
	args[1] = rcPath;
	args[2] = NULL;
	execve("/bin/sh", args, NULL); 
      }else{
	exit(0);
      }
    } 
  }

  pgMessageDialog("Error", "Login failed!", 0);
  evtClear(evt);

  if(salt)
    free(salt);
  free(login);
  free(passwd);

  return 1;
}
Пример #2
0
int btnInput(struct pgEvent *evt) {
  pghandle str;

  str = pgInputDialog("Input Test",
		      "What... is the air-speed velocity of\n"
                      "an unladen swallow?",
                      pgGetWidget(wInputBtn,PG_WP_TEXT));

  if (str) {
    /* Normally we would use pgReplaceText, but we already have a
     * handle so we can save a step. */
    
    pgDelete(pgGetWidget(wInputBtn,PG_WP_TEXT));
    pgSetWidget(wInputBtn,PG_WP_TEXT,str,0);
  }
  return 0;
}
Пример #3
0
int evtLogin(struct pgEvent *evt){
  picosmUI *interface = (picosmUI *)evt->extra;

  /* Advance focus to the password field if the username field is nonempty */
  if (pgGetString(pgGetWidget(interface->wLogin,PG_WP_TEXT))[0])
    pgFocus(interface->wPasswd);

  return 1;
}
Пример #4
0
int selectInterface (struct pgEvent *evt) {
  /* change the interface to monitor */
  pghandle str;

  str = pgInputDialog ("Interface selection",
		       "Which interface you want to monitor ?",
		       pgGetWidget (wDeviceName, PG_WP_TEXT));

  if (str) {
    /* Normally we would use pgReplaceText, but we already have a
     * handle so we can save a step. */
    
    pgDelete (pgGetWidget( wDeviceName, PG_WP_TEXT));
    pgSetWidget (wDeviceName, PG_WP_TEXT, str, 0);

  }

  return 0;

}
Пример #5
0
int evtGetTxt (struct pgEvent *evt)
{
  char * txtp;
  int i;

  txtp = pgGetString (pgGetWidget (edit, PG_WP_TEXT));
  printf ("\nText in textedit widget 1 :\n");
  for (i = 0; i < strlen (txtp); i++) {
    printf ("0x%x(%c) ", txtp [i] & 0xFF, txtp [i]);
  }
  printf ("\n");

  txtp = pgGetString (pgGetWidget (edit2, PG_WP_TEXT));
  printf ("\nText in textedit widget 2 :\n");
  for (i = 0; i < strlen (txtp); i++) {
    printf ("0x%x(%c) ", txtp [i] & 0xFF, txtp [i]);
  }
  printf ("\n");

  return 0;
}
Пример #6
0
int btnFont(struct pgEvent *evt) {
  pghandle fnt;

  fnt = pgFontPicker("Pick a new font");

  if (fnt) {
    /* Delete the old font, and set the new font */
    
    pgDelete(pgGetWidget(wFontBtn,PG_WP_FONT));
    pgSetWidget(wFontBtn,PG_WP_FONT,fnt,0);
  }

  return 0;
}
Пример #7
0
/*
 * Handler for click event on the Keyboard button
 */
int kbd_btn_handler (struct pgEvent * evt)
{
  if (evt->type == PG_WE_ACTIVATE)
    {
      if (!blocked)
	{
	  pgSetWidget(wApp,
		      PG_WP_SIZE, mpat->app_size - pgGetWidget (wApp, PG_WP_SIZE),
		      0);
	}
    }
  else
    {
      /* Ignore */
    }

  return 1;
}
Пример #8
0
/*
 * Push the current keyboard context 
 */
void pushKeyboardContext ()
{
  struct keyboard_context * kbc;

  /* Allocate new context */
  kbc = (struct keyboard_context *) malloc (sizeof (struct keyboard_context));
  if (kbc == NULL)
    {
      pgMessageDialog ("Virtual Keyboard", "Error allocating memory for context", 0);
      return;
    }

  /* Fill in context data */
  kbc->appSize = pgGetWidget (wApp, PG_WP_SIZE);
  kbc->enable_status = enable_status;
  kbc->current_patnum = current_patnum;
  kbc->next = context_top;

  /* Update top of context stack */
  context_top = kbc;
}
Пример #9
0
void PG_InitEvents(_THIS)
{
        /* Turn on all the mouse and keyboard triggers for our canvas, normally less important
	 * events like mouse movement are ignored to save bandwidth. */
        pgSetWidget(this->hidden->wCanvas, PG_WP_TRIGGERMASK, 
		    pgGetWidget(this->hidden->wCanvas, PG_WP_TRIGGERMASK) |
		    PG_TRIGGER_UP | PG_TRIGGER_DOWN | PG_TRIGGER_MOVE |
		    PG_TRIGGER_KEYUP | PG_TRIGGER_KEYDOWN | PG_TRIGGER_CHAR,0);

	/* Start our canvas out focused, so we get keyboard input */
	pgFocus(this->hidden->wCanvas);

        /* Set up bindings for all the above event handlers */
        pgBind(this->hidden->wApp,    PG_WE_CLOSE, &PG_HandleClose, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_BUILD, &PG_HandleResize, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_KBD_CHAR, &PG_HandleChar, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_KBD_KEYUP, &PG_HandleKey, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_KBD_KEYDOWN, &PG_HandleKey, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_PNTR_MOVE, &PG_HandleMouseMotion, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_PNTR_UP, &PG_HandleMouseButton, NULL);
        pgBind(this->hidden->wCanvas, PG_WE_PNTR_DOWN, &PG_HandleMouseButton, this);
}
Пример #10
0
/* Event handler to print out our hilight/unhilight events
 */
int evtHilight(struct pgEvent *evt) {
  pghandle sText = pgGetWidget(evt->from, PG_WP_TEXT);
  char *text = "(no text)";
  char *evtype;
  if (sText)
    text = pgGetString(sText);

  switch (evt->type) {

  case PG_WE_ACTIVATE: 
    evtype = "PG_WE_ACTIVATE";
    break;

  case PG_WE_PNTR_UP: 
    evtype = "PG_WE_PNTR_UP";
    break;

  default:
    return 0;
  }

  printf("Widget sent %s : %s\n",evtype,text);
  return 0;
}
Пример #11
0
void sysIdle(void) {
  FILE *net;
  char buf[256];
  char *p;
  float rx_bytes, tx_bytes;
  float rx_kbps, tx_kbps;
  float elapsed;
  static float max_kbps = 0, rx_bytes_old = 0, tx_bytes_old = 0;
  struct timeval now;
  static struct timeval then = {0,0};
  static int first_sample = 1;

  /* Read transmitted and received bytes from the kernel
   */
  net = fopen(NET_PROC_FILE,"r");
  while (!feof(net)) {
    fgets(buf,256,net);
    if (strstr (buf,pgGetString (pgGetWidget (wDeviceName, PG_WP_TEXT))))
      if (p = strchr(buf,':')) {
	sscanf(p+1, "%f %*f %*f %*f %*f %*f %*f %*f %f", &rx_bytes, &tx_bytes);
      }   
  }
  fclose(net);


  /* Time for the next sample?
   */

  gettimeofday(&now,NULL);
  if ( first_sample || (now.tv_sec-then.tv_sec)*1000 + 
       (now.tv_usec-then.tv_usec)/1000 >= SAMPLE_TIME ) {
    if (!first_sample) {
      
      /* Calculations
       */
      elapsed = (now.tv_sec - then.tv_sec) + (now.tv_usec - then.tv_usec)/1000000.0;
      tx_kbps = (tx_bytes - tx_bytes_old) / elapsed / 1024.0;
      rx_kbps = (rx_bytes - rx_bytes_old) / elapsed / 1024.0;
      
      if (tx_kbps > max_kbps) max_kbps = tx_kbps;
      if (rx_kbps > max_kbps) max_kbps = rx_kbps;
      
      /* Update PicoGUI display
       */
      pgSetWidget(wTX, PG_WP_VALUE, (int)( 100*tx_kbps/max_kbps ), 0);
      pgSetWidget(wRX, PG_WP_VALUE, (int)( 100*rx_kbps/max_kbps ), 0);
      
      /* display either the total or the current traffic */
      if (bDisplayTotal) {
	pgReplaceTextFmt(wRXlabel, "%.3f KB", rx_bytes/1024);
	pgReplaceTextFmt(wTXlabel, "%.3f KB", tx_bytes/1024);
      } else {
	pgReplaceTextFmt(wRXlabel, "%.4f KB/s", rx_kbps);
	pgReplaceTextFmt(wTXlabel, "%.4f KB/s", tx_kbps);
      }
    }
    then = now;
    rx_bytes_old = rx_bytes;
    tx_bytes_old = tx_bytes;
    first_sample = 0;
  }
  pgUpdate();
}
Пример #12
0
/* Turn the keypad on/off */
int btnKeypad(struct pgEvent *evt) {
  pgSetWidget(wKeypad,
	      PG_WP_SIZE, pgGetWidget(evt->from,PG_WP_ON) ? -1 : 0,
	      0);
  return 0;
}
Пример #13
0
int main(int argc, char **argv) {
  pghandle wBox, wItem, sFoo;
  int i;

  /* Application
   */
  pgInit(argc,argv);
  pgRegisterApp(PG_APP_NORMAL,"List Test App",0);

  /* Scrolling box
   */
  wBox = pgNewWidget(PG_WIDGET_BOX,0,0);
  pgNewWidget(PG_WIDGET_SCROLL, PG_DERIVE_BEFORE, wBox);
  pgSetWidget(PGDEFAULT,
	      PG_WP_BIND, wBox,
	      0);

  /* Add some normal listitems (just text)
   * The listitem widget is hilighted when the cursor is over them,
   * and turned on when clicked. They are mutually exclusive.
   */
  for (i=0;i<5;i++) {
    wItem = pgNewWidget(PG_WIDGET_LISTITEM,
			i ? PGDEFAULT : PG_DERIVE_INSIDE,
			i ? PGDEFAULT : wBox);
    pgReplaceTextFmt(PGDEFAULT,"Normal listitem #%d",i);
  }

  /* Normally you'd want to use listitems, but just to show the
   * difference we'll throw in some menuitems...
   */
  for (i=0;i<5;i++) {
    wItem = pgNewWidget(PG_WIDGET_MENUITEM,0,0);
    pgReplaceTextFmt(PGDEFAULT,"Normal menuitem #%d",i);
  }

  /* Instead of using the PG_WP_TEXT property, create some
   * other widgets inside the listitem. They will be hilighted
   * with their PG_WP_HILIGHTED property when the mouse is over them.
   */
  sFoo = pgNewString("Foo");
  for (i=0;i<5;i++) {
    wItem = pgNewWidget(PG_WIDGET_LISTITEM,PG_DERIVE_AFTER,wItem);

    pgNewWidget(PG_WIDGET_CHECKBOX, PG_DERIVE_INSIDE, wItem);
    pgSetWidget(PGDEFAULT,
		PG_WP_TEXT, sFoo,
		PG_WP_SIDE, PG_S_LEFT,
		PG_WP_SIZEMODE, PG_SZMODE_PERCENT,
		PG_WP_SIZE, 20,
		0);

    pgNewWidget(PG_WIDGET_LABEL, 0,0);
    pgSetWidget(PGDEFAULT,
		PG_WP_SIDE, PG_S_LEFT,
		0);
    pgReplaceTextFmt(PGDEFAULT,"Container listitem #%d",i);
  }

  /* For contrast, repeat the same example with menuitems
   */
  for (i=0;i<5;i++) {
    wItem = pgNewWidget(PG_WIDGET_MENUITEM,PG_DERIVE_AFTER,wItem);

    pgNewWidget(PG_WIDGET_CHECKBOX, PG_DERIVE_INSIDE, wItem);
    pgSetWidget(PGDEFAULT,
		PG_WP_TEXT, sFoo,
		PG_WP_SIDE, PG_S_LEFT,
		PG_WP_SIZEMODE, PG_SZMODE_PERCENT,
		PG_WP_SIZE, 20,
		0);

    pgNewWidget(PG_WIDGET_LABEL, 0,0);
    pgSetWidget(PGDEFAULT,
		PG_WP_SIDE, PG_S_LEFT,
		0);
    pgReplaceTextFmt(PGDEFAULT,"Container menuitem #%d",i);
  }
  
  /* Just for testing the pgTraverseWidget method of finding
   * an item by its index:
   * (Normally if you wanted to print out all the items in a container
   * you should iterate with PG_TRAVERSE_FORWARD)
   */
  for (i=0;;i++) {
    pghandle w,t;
    char *text = "(no text)";

    w = pgTraverseWidget(wBox, PG_TRAVERSE_CHILDREN, i);
    if (!w)
      break;

    /* Get the widget's text if it has any */
    t = pgGetWidget(w, PG_WP_TEXT);
    if (t)
      text = pgGetString(t);

    printf("Child #%d : %s\n",i, text);
  }
  
  /* Add an event handler to catch all hilighting events
   */
  pgBind(PGBIND_ANY, PGBIND_ANY, evtHilight, NULL);  
  pgEventLoop();
  return 0;
}
Пример #14
0
int main(int argc, char **argv) {
  struct pgEvent *evt;
  pghandle wApply,wClose,sTmp,wToolbar;
  pghandle wXres,wYres,wBpp,wRotate,wPopup;
  struct pgmodeinfo mi;
  char buf[20];
   
  pgInit(argc,argv);
  wPopup = pgDialogBox("Set Video Mode");

  /******** Take care of such niceties... */
   
  wToolbar = pgNewWidget(PG_WIDGET_TOOLBAR,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_BOTTOM,
	      0);
		  
  wApply = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar);
  pgSetWidget(PGDEFAULT,
	      PG_WP_TEXT,pgNewString("Apply"),
	      0);

  wClose = pgNewWidget(PG_WIDGET_BUTTON,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_TEXT,pgNewString("Close"),
	      0);

  /******** Mode options */
   
  /* For now just make boxes, we'll fill them in later */
  wXres = pgNewWidget(PG_WIDGET_BOX,PG_DERIVE_AFTER,wToolbar);
  pgSetWidget(PGDEFAULT,PG_WP_TRANSPARENT,1,0);
  wYres = pgNewWidget(PG_WIDGET_BOX,0,0);
  pgSetWidget(PGDEFAULT,PG_WP_TRANSPARENT,1,0);
  wBpp = pgNewWidget(PG_WIDGET_BOX,0,0);
  pgSetWidget(PGDEFAULT,PG_WP_TRANSPARENT,1,0);
   
  wRotate = pgNewWidget(PG_WIDGET_CHECKBOX,0,0);
  pgSetWidget(PGDEFAULT,PG_WP_TEXT,pgNewString("Rotation"),0);
   
  /* Fill in the boxes */
   
  wXres = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wXres);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_SIZE,50,
	      PG_WP_SIZEMODE,PG_SZMODE_PERCENT,
	      0);
  pgNewWidget(PG_WIDGET_LABEL,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_TEXT,pgNewString("Width:"),
	      0);
   
  wYres = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wYres);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_SIZE,50,
	      PG_WP_SIZEMODE,PG_SZMODE_PERCENT,
	      0);
  pgNewWidget(PG_WIDGET_LABEL,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_TEXT,pgNewString("Height:"),
	      0);
   
  wBpp = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wBpp);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_SIZE,50,
	      PG_WP_SIZEMODE,PG_SZMODE_PERCENT,
	      0);
  pgNewWidget(PG_WIDGET_LABEL,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_TEXT,pgNewString("BPP:"),
	      0);
   
  /******** Run a tiny event loop */
   
  /* Big loop setting modes... */
  for (;;) {
      
    /* Get actual mode info, put it in the widgets.
     * Not the best way, but for now pgReplaceTextFmt doesn't work on
     * field widgets because their handle handling is different :)
     * The field copies our string to an internal buffer so we don't need
     * to keep the handle around. Note that a server bug (listed in my
     * todo file) will cause a server segfault if pgReplaceText is used!
     */
    mi = *pgGetVideoMode();
      
    sprintf(buf,"%d",mi.xres);
    sTmp = pgNewString(buf);
    pgSetWidget(wXres,PG_WP_TEXT,sTmp,0);
    pgDelete(sTmp);

    sprintf(buf,"%d",mi.yres);
    sTmp = pgNewString(buf);
    pgSetWidget(wYres,PG_WP_TEXT,sTmp,0);
    pgDelete(sTmp);

    sprintf(buf,"%d",mi.bpp);
    sTmp = pgNewString(buf);
    pgSetWidget(wBpp,PG_WP_TEXT,sTmp,0);
    pgDelete(sTmp);

    pgSetWidget(wRotate,PG_WP_ON,mi.flags & PG_VID_ROTATE90,0);
      
    /* Small event loop waiting for an apply */
    for (;;) {
      evt = pgGetEvent();
	 
      /* Done yet? */
      if (evt->from == wClose)
	return 0;
	 
      /* Any PG_WE_ACTIVATE causes apply, this covers clicking the apply
       * button or pressing enter in a field. Specifically exclude
       * clicking the rotate checkbox */
      if (evt->type == PG_WE_ACTIVATE && evt->from != wRotate) 
	break;
    }
      
    /* Set mode based on widget values */
    pgSetVideoMode(atoi(pgGetString(pgGetWidget(wXres,PG_WP_TEXT))),
		   atoi(pgGetString(pgGetWidget(wYres,PG_WP_TEXT))),
		   atoi(pgGetString(pgGetWidget(wBpp,PG_WP_TEXT))),
		   pgGetWidget(wRotate,PG_WP_ON) ? PG_FM_ON : PG_FM_OFF,
		   PG_VID_ROTATE90);
  }
   
  return 0;
}
Пример #15
0
int
main(int argc, char** argv)
{
  pgcolor color;
  struct pgmodeinfo mi;
  int i;
  pghandle ttl_box;

  /* init PicoGUI client */
  pgInit(argc,argv);
  pgRegisterApp(PG_APP_NORMAL, argv[0], 0);

  /* create the title */
  ttl_box = pgNewWidget(PG_WIDGET_BOX,0,0);

  ttl_text = pgNewWidget(PG_WIDGET_LABEL, PG_DERIVE_INSIDE, ttl_box);
  pgSetWidget (PGDEFAULT,
	       PG_WP_TEXT, pgNewString("wclock"),
	       0);

  pgNewWidget(PG_WIDGET_BUTTON, PG_DERIVE_INSIDE, ttl_box);
  pgSetWidget (PGDEFAULT,
               PG_WP_SIDE, PG_S_RIGHT,
 	       PG_WP_TEXT, pgNewString("?"),
               PG_WP_EXTDEVENTS, PG_EXEV_PNTR_DOWN,
               0);
  pgBind (PGDEFAULT, PG_WE_PNTR_DOWN, &btn_handler, (void*)btnid_set);

  pgNewWidget(PG_WIDGET_BUTTON, PG_DERIVE_INSIDE, ttl_box);
  pgSetWidget (PGDEFAULT,
               PG_WP_SIDE, PG_S_LEFT,
 	       PG_WP_TEXT, pgNewString(">"),
               PG_WP_EXTDEVENTS, PG_EXEV_PNTR_DOWN,
               0);
  pgBind (PGDEFAULT, PG_WE_PNTR_DOWN, &btn_handler, (void*)btnid_right);

  pgNewWidget(PG_WIDGET_BUTTON, PG_DERIVE_INSIDE, ttl_box);
  pgSetWidget (PGDEFAULT,
               PG_WP_SIDE, PG_S_LEFT,
 	       PG_WP_TEXT, pgNewString("<"),
               PG_WP_EXTDEVENTS, PG_EXEV_PNTR_DOWN,
               0);
  pgBind (PGDEFAULT, PG_WE_PNTR_DOWN, &btn_handler, (void*)btnid_left);

  /* create the main context */
  main_window = pgNewWidget(PG_WIDGET_CANVAS, PG_DERIVE_AFTER, ttl_box);
  pgBind(PGDEFAULT, PGBIND_ANY, &canvas_handler, NULL);

  /* init time zones */
  init_zones();

  /* activate mouse move, keyboard and focus events */
  pgSetWidget(main_window,
	      PG_WP_TRIGGERMASK, pgGetWidget(main_window, PG_WP_TRIGGERMASK) |
	      PG_TRIGGER_MOVE |
	      PG_TRIGGER_CHAR |
	      PG_TRIGGER_KEYDOWN |
	      PG_TRIGGER_KEYUP /* |
	      PG_TRIGGER_ACTIVATE |
	      PG_TRIGGER_DEACTIVATE */,
	      0);

  mi = *pgGetVideoMode();
  width = mi.lxres;
  height = mi.lyres;

  /* Make a backbuffer bitmap */
  world_bitmap = create_world_bitmap();
  width = get_world_width();
  height = get_world_height();

  /* Set the clipping rectangle */
  pgWriteCmd(main_window,
	     PGCANVAS_GROP, 5,
	     PG_GROP_SETCLIP, 0, 0, width, height + TIMEBAR_HEIGHT);
  
  /* Set to be always rendered */
  pgWriteCmd(main_window,
	     PGCANVAS_GROPFLAGS, 1,
	     PG_GROPF_UNIVERSAL);
  
  /* Create contexts for the canvas itself and the back-buffer */
  gfx_context = pgNewCanvasContext(main_window, PGFX_IMMEDIATE );

  /* run all */
  DPRINTF(">>> entering loop\n");
  pgEventLoop();

  return 0;
}
Пример #16
0
/* Like a messge dialog, with an input field */
pghandle pgInputDialog(const char *title, const char *message,
		       pghandle deftxt) {
  pghandle wToolbar,wField,wOk,wCancel,from;
  pghandle str = 0;

  /* New context for us! */
  pgEnterContext();

  /* Create the important widgets */
  pgDialogBox(title);
  wToolbar = pgNewWidget(PG_WIDGET_TOOLBAR,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_BOTTOM,
	      0);
  wField = pgNewWidget(PG_WIDGET_TOOLBAR,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_BOTTOM,
	      0);
  pgNewWidget(PG_WIDGET_LABEL,0,0);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_ALL,
	      PG_WP_TEXT,pgNewString(message),
	      0);
  wField = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wField);
  pgSetWidget(PGDEFAULT,
	      PG_WP_SIDE,PG_S_BOTTOM,
	      PG_WP_SIDE,PG_S_ALL,
	      /* Only set the property if nonzero */
	      deftxt ? PG_WP_TEXT : 0,deftxt,
	      0);

  /* buttons */
  wCancel = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar);
  pgSetWidget(PGDEFAULT,
	      PG_WP_TEXT,pgGetServerRes(PGRES_STRING_CANCEL),
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG,
					 PGTH_P_HOTKEY_CANCEL),
	      PG_WP_IMAGE,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG,
					 PGTH_P_ICON_CANCEL),
	      PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG,
					  PGTH_P_ICON_CANCEL_MASK),
	      0);
  wOk = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar);
  pgSetWidget(PGDEFAULT,
	      PG_WP_TEXT,pgGetServerRes(PGRES_STRING_OK),
	      PG_WP_SIDE,PG_S_RIGHT,
	      PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG,
					 PGTH_P_HOTKEY_OK),
	      PG_WP_IMAGE,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG,
					 PGTH_P_ICON_OK),
	      PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG,
					  PGTH_P_ICON_OK_MASK),
	      0);

  /* Run */
  pgFocus(wField);
  for (;;) {
    from = pgGetEvent()->from;
    if (from == wOk) {
      /* Make a copy, because the one used in PG_WP_TEXT is deleted
       * automatically by the field widget on deletion. 
       */
      str = pgDup(pgGetWidget(wField,PG_WP_TEXT));
      /* Send it back up to the caller's context */
      pgChangeContext(str,-1);
      break;
    }
    else if (from == wCancel)
      break;
  }
  pgLeaveContext();
  return str;
}
Пример #17
0
/*
 * Handler for messages sent to the keyboard
 */
int evtMessage (struct pgEvent * evt)
{
  /* Received command */
  struct keyboard_command * cmd;

  switch (evt->type)
    {
    case PG_WE_APPMSG:
      cmd = (struct keyboard_command *) evt->e.data.pointer;

      /* Command structure is in network byte order */
      cmd->type = ntohs(cmd->type);
      DPRINTF ("received command: %d\n", cmd->type);

      if (blocked)
	{
	  if (cmd->type == PG_KEYBOARD_RELEASE)
	    {
	      blocked = 0;
	    }
	}
      else
	{
	  /* Keyboard's new size */
	  int newSize = -1;

	  switch (cmd->type)
	    {
	    case PG_KEYBOARD_SHOW:
	      newSize = mpat->app_size;
	      break;

	    case PG_KEYBOARD_HIDE:
	      newSize = 0;
	      break;

	    case PG_KEYBOARD_TOGGLE:
	      newSize = mpat->app_size - pgGetWidget (wApp, PG_WP_SIZE);
	      break;

	    case PG_KEYBOARD_ENABLE:
	      enableKbdCanvas ();
	      enable_status = 1;
	      break;

	    case PG_KEYBOARD_DISABLE:
	      disableKbdCanvas ();
	      enable_status = 0;
	      break;

	    case PG_KEYBOARD_TOGGLE_DISPLAY:
	      enable_status = !enable_status;
	      enable_status ? enableKbdCanvas () : disableKbdCanvas ();
	      break;

	    case PG_KEYBOARD_SELECT_PATTERN:
	      selectPattern (ntohs (cmd->data.pattern));
	      break;

	    case PG_KEYBOARD_PUSH_CONTEXT:
	      pushKeyboardContext ();
	      break;

	    case PG_KEYBOARD_POP_CONTEXT:
	      popKeyboardContext ();
	      break;

	    case PG_KEYBOARD_BLOCK:
	      blocked = 1;
	      break;

	    case PG_KEYBOARD_RELEASE:
	      /* Nothing */
	      break;

	    default:
	      DPRINTF ("Unknown command: %d\n", cmd->type);
	      break;
	    }

	  if (newSize >= 0)
	    {
	      pgSetWidget(wApp,
			  PG_WP_SIZE, newSize,
			  0);
	    }
	}
      
      break;
     
    default:
      /* Ignore */
      break;
    }

  return 1;
}