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; }
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; }
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; }
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; }
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; }
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; }
/* * 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; }
/* * 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; }
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); }
/* 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; }
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(); }
/* 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; }
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; }
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; }
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; }
/* 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; }
/* * 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; }