static unsigned press_cb(u32 button, unsigned flags, void *data) { struct guiObject *obj = (struct guiObject *)data; struct guiKeyboard *keyboard = (struct guiKeyboard *)obj; (void)data; if (flags & BUTTON_PRESS || flags & BUTTON_LONGPRESS) { if ( flags & BUTTON_LONGPRESS && CHAN_ButtonIsPressed(button, BUT_ENTER) && keyboard->lastchar == '\x08') { //DEL Long Press erases whole string keyboard->text[0] = '\0'; _kb_draw_text(keyboard->text); } else if (CHAN_ButtonIsPressed(button, BUT_EXIT)) { // allow user to press the EXT key to discard changes if (keyboard->CallBack) { if (keyboard->cb_data != NULL) { int *result = (int *) keyboard->cb_data; *result = 0; } BUTTON_UnregisterCallback(&keyboard->action); keyboard->CallBack(obj, keyboard->cb_data ); } //After DONE it is possible that obj and keyboard are invalid } else if (CHAN_ButtonIsPressed(button, BUT_RIGHT)) { navigate_item(keyboard, 1 , 0); } else if (CHAN_ButtonIsPressed(button, BUT_LEFT)) { navigate_item(keyboard, -1, 0); } else if (CHAN_ButtonIsPressed(button, BUT_UP)) { navigate_item(keyboard, 0 , -1); } else if (CHAN_ButtonIsPressed(button, BUT_DOWN)) { navigate_item(keyboard, 0, 1); } else if (CHAN_ButtonIsPressed(button, BUT_ENTER)) { if (keyboard->lastchar == '\x09') { //CAPS keyboard->flags ^= FLAG_CAPS; keyboard_cmd(KB_DRAW, keyboard, NULL); } else if (keyboard->lastchar == '\x01' || keyboard->lastchar == '\x02') { //Numpad keyboard->type = keyboard->type == KEYBOARD_ALPHA ? KEYBOARD_SPECIAL : KEYBOARD_ALPHA; OBJ_SET_DIRTY(obj, 1); } else if (keyboard->lastchar == '\x06') { //DONE if (keyboard->CallBack) { if (keyboard->cb_data != NULL) { int *result = (int *) keyboard->cb_data; if (*result <= 0) // to avoid loosing the channel number when renaming virtual channels on b/w-screens *result = 1; } BUTTON_UnregisterCallback(&keyboard->action); keyboard->CallBack(obj, keyboard->cb_data ); } //After DONE it is possible that obj and keyboard are invalid } else { kb_update_string(keyboard, keyboard->lastchar); } } return 1; } return 1; }
void GUI_RemoveObj(struct guiObject *obj) { switch(obj->Type) { case Dialog: { GUI_HandleModalButtons(0); GUI_RemoveHierObjects(obj->next); objDIALOG = NULL; break; } case Scrollbar: BUTTON_UnregisterCallback(&((guiScrollbar_t *)obj)->action); break; case Scrollable: GUI_RemoveScrollableObjs(obj); GUI_RemoveObj((guiObject_t *)&((guiScrollable_t *)obj)->scrollbar); break; case Keyboard: BUTTON_UnregisterCallback(&((guiKeyboard_t *)obj)->action); break; case Image: case XYGraph: _GUI_UnmapWindow(1); break; default: break; } if (objTOUCHED == obj) objTOUCHED = NULL; if (objSELECTED == obj) objSELECTED = NULL; OBJ_SET_USED(obj, 0); // Reattach linked list struct guiObject *prev = objHEAD; if (prev == obj) { objHEAD = obj->next; } else { while(prev) { if(prev->next == obj) { prev->next = obj->next; break; } prev = prev->next; } } FullRedraw = objHEAD ? REDRAW_IF_NOT_MODAL : REDRAW_EVERYTHING; }
void PAGE_MainLayoutInit(int page) { (void)page; memset(lp, 0, sizeof(*lp)); BUTTON_RegisterCallback(&action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN), BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_PRIORITY, _action_cb, NULL); PAGE_ShowHeader(NULL); lp->long_press = 0; lp->newelem = 0; lp->selected_x = 0; const u16 color[5] = { RGB888_to_RGB565(0xaa, 0x44, 0x44), RGB888_to_RGB565(0x44, 0xaa, 0x44), RGB888_to_RGB565(0x44, 0x44, 0xaa), RGB888_to_RGB565(0x44, 0x44, 0x44), RGB888_to_RGB565(0x33, 0x33, 0x33), }; for (int i = 0 ; i < 5; i++) gui->desc[i] = (struct LabelDesc){ .font = 0, .font_color = 0xffff, .fill_color = color[i], .outline_color = 0, .style = LABEL_FILL}; gui->desc[1].font = TINY_FONT.font; //Special case for trims GUI_CreateIcon(&gui->newelem, 32, 0, &icons[ICON_LAYOUT_ADD], add_dlg_cb, NULL); GUI_CreateIcon(&gui->editelem, 64, 0, &icons[ICON_LAYOUT_CFG], cfg_cb, NULL); GUI_SetHidden((guiObject_t *)&gui->editelem, 1); //GUI_CreateTextSelect(&gui->newelem, 36, 12, TEXTSELECT_96, newelem_press_cb, newelem_cb, NULL); GUI_CreateLabel(&gui->xlbl, 80+18, 9, NULL, TITLE_FONT, "X"); GUI_CreateTextSelect(&gui->x, 88+18, 8, TEXTSELECT_64, NULL, xpos_cb, NULL); GUI_CreateLabel(&gui->ylbl, 164+16, 9, NULL, TITLE_FONT, "Y"); GUI_CreateTextSelect(&gui->y, 172+16, 8, TEXTSELECT_64, NULL, ypos_cb, NULL); GUI_SelectionNotify(notify_cb); draw_elements(); if (show_config_menu) { lp->selected_for_move = show_config_menu; show_config(); show_config_menu = 0; } } void PAGE_MainLayoutEvent() { } void PAGE_MainLayoutExit() { BUTTON_UnregisterCallback(&action); }
// Bug fix: Unlike devo8, devo10's page always has 1 default selected objects. When a dialog, e.g. saftydialog, // got poped up, the following statement in handle_buttons() will never get satisfied, the dialog hence is stuck. // ... // if (! objTOUCHED || objTOUCHED == objSELECTED) { // So the modal buttons handler must separate, hence devo8's modal button handling logic keeps as current // while have a new logic for devo10 void GUI_HandleModalButtons(u8 enable) { if (! enable) BUTTON_UnregisterCallback(&button_modalaction); else BUTTON_RegisterCallback(&button_modalaction, 0xFFFFFFFF, BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, _handle_modalbuttons_devo10, NULL); }
void MIXER_RegisterTrimButtons() { int i; BUTTON_UnregisterCallback(&button_action); u32 mask = 0; for (i = 0; i < NUM_TRIMS; i++) { mask |= CHAN_ButtonMask(Model.trims[i].neg); mask |= CHAN_ButtonMask(Model.trims[i].pos); } BUTTON_RegisterCallback(&button_action, mask, BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_RELEASE, MIXER_UpdateTrim, NULL); }
void GUI_HandleButtons(u8 enable) { if (! enable) BUTTON_UnregisterCallback(&button_action); else BUTTON_RegisterCallback(&button_action, CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN) | CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT), BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, handle_buttons, NULL); }
static unsigned _action_cb(u32 button, unsigned flags, void *data) { (void)data; if ((flags & BUTTON_PRESS) || (flags & BUTTON_LONGPRESS)) { if (CHAN_ButtonIsPressed(button, BUT_EXIT)) { BUTTON_UnregisterCallback(&action); PAGE_RemoveAllObjects(); rl.return_page(NULL); } else if (CHAN_ButtonIsPressed(button, BUT_LEFT) && ((guiObject_t *)&gui->value == GUI_GetSelected())) { // catch the left/right keys when r1.textsel is selected copy_val_cb(NULL, 1, NULL); GUI_Redraw(&gui->value); } else if (CHAN_ButtonIsPressed(button, BUT_RIGHT)&& ((guiObject_t *)&gui->value == GUI_GetSelected())) { copy_val_cb(NULL, -1, NULL); GUI_Redraw(&gui->value); } else { // only one callback can handle a button press, so we don't handle BUT_ENTER here, let it handled by press cb return 0; } } return 1; }
static void show_button_page() { // show elements where they are located on the real tx enum { OFFSET_X = ((LCD_WIDTH - 320) / 2), // center on Devo12-screen OFFSET_Y = ((LCD_HEIGHT - 240) / 2), }; enum {X = 0, Y = 1}; struct LabelDesc alignRight = { .font = DEFAULT_FONT.font, .align = ALIGN_RIGHT, .font_color = DEFAULT_FONT.font_color, .fill_color = DEFAULT_FONT.fill_color, .outline_color = DEFAULT_FONT.outline_color }; const int label_pos[NUM_TX_BUTTONS][2] = CHANTEST_BUTTON_PLACEMENT; cp->is_locked = 3; GUI_CreateLabelBox(&gui->lock, OFFSET_X, 34, 320, 20, &NARROW_FONT, lockstr_cb, NULL, NULL); for (int i = 0; i < NUM_TX_BUTTONS; i++) { if ((1 << (i + 1)) & Transmitter.ignore_buttons) continue; GUI_CreateLabelBox(&gui->value[i], OFFSET_X + (label_pos[i][X] > 0 ? label_pos[i][X] + 50 : -label_pos[i][X] -20), // >0? box at left side of label, otherwise right OFFSET_Y + label_pos[i][Y], 16, 16, &SMALLBOX_FONT, NULL, NULL, (void *)""); GUI_CreateLabelBox(&gui->chan[i], OFFSET_X + abs(label_pos[i][X]), // no differencing for the label OFFSET_Y + label_pos[i][Y], 48, 16, label_pos[i][X] > 0 ? &alignRight : &DEFAULT_FONT, button_str_cb, NULL, (void *)(long)i); } } void _handle_button_test() { if (cp->is_locked == 0 && SPITouch_IRQ()) { BUTTON_RegisterCallback(&cp->action, 0xFFFFFFFF, BUTTON_PRESS | BUTTON_RELEASE | BUTTON_LONGPRESS | BUTTON_PRIORITY, button_capture_cb, NULL); GUI_Redraw(&gui->lock); //Textbox cp->is_locked++; } else if (cp->is_locked == 1 && ! SPITouch_IRQ()) { cp->is_locked++; } else if (cp->is_locked == 2 && SPITouch_IRQ()) { BUTTON_UnregisterCallback(&cp->action); GUI_Redraw(&gui->lock); //Textbox cp->is_locked++; } else if (cp->is_locked == 3 && ! SPITouch_IRQ()) { cp->is_locked = 0; } u32 buttons = ScanButtons(); for (int i = 0; i < NUM_TX_BUTTONS; i++) { GUI_SetLabelDesc(&gui->value[i], CHAN_ButtonIsPressed(buttons, i+1) ? &SMALLBOXNEG_FONT : &SMALLBOX_FONT); } return; } static inline guiObject_t *_get_obj(int chan, int objid) { return objid == ITEM_GRAPH ? (guiObject_t *)&gui->bar[chan] : (guiObject_t *)&gui->value[chan]; } static const char *channum_cb(guiObject_t *obj, const void *data) { (void)obj; int disp = (long)data; int ch = get_channel_idx(cur_row * NUM_BARS_PER_ROW + disp); if (cp->type) { char *p = tempstring; if (disp & 0x01) { *p = '\n'; p++; } CONFIG_EnableLanguage(0); //Disable translation because tiny font is limited in character set INPUT_SourceName(p, ch+1); CONFIG_EnableLanguage(1); if (! (disp & 0x01)) { sprintf(p + strlen(p), "\n"); } } else { ch -= NUM_INPUTS; if (ch < NUM_OUT_CHANNELS) { sprintf(tempstring, "\n%d", ch+1); } else { ch -= NUM_OUT_CHANNELS; if (Model.virtname[ch][0]) { tempstring_cpy(Model.virtname[ch]) ; } else { sprintf(tempstring, "%s%d", _tr("Virt"), ch+1); } } } return tempstring; }
void PAGE_USBExit() { BUTTON_UnregisterCallback(&up->action); }
void PAGE_ChantestExit() { BUTTON_UnregisterCallback(&cp->action); }
static void _okcancel_cb(guiObject_t *obj, const void *data) { BUTTON_UnregisterCallback(&action); okcancel_cb(obj, data); }