unsigned GUI_GetRemappedButtons() { if (USE_4BUTTON_MODE) { if (objACTIVE) { return CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN); } } return 0; }
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 PAGE_Init() { cur_page = sizeof(pages) / sizeof(struct page) - 1; cur_section = 0; modal = 0; GUI_RemoveAllObjects(); enter_cmd = NULL; exit_cmd = NULL; BUTTON_RegisterCallback(&button_action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_LEFT), BUTTON_PRESS | BUTTON_LONGPRESS, page_change_cb, NULL); PAGE_ChangeByID(PAGEID_SPLASH); //PAGE_ChangeByID(PAGEID_MAIN); }
void PAGE_USBInit(int page) { (void)page; PAGE_SetModal(0); _draw_page(0); BUTTON_RegisterCallback(&up->action, CHAN_ButtonMask(BUT_ENTER), BUTTON_PRESS | BUTTON_RELEASE | BUTTON_PRIORITY, usb_cb, NULL); }
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); }
u32 ROTARY_Scan() { int last_rotary; u32 result = 0; result |= !GPIO_pin_get(ROTARY_PRESS_PIN) ? CHAN_ButtonMask(BUT_ENTER) : 0; last_rotary = rotary; if (last_rotary) { u32 rotary_clock = CLOCK_getms(); // To prevent rotary to generate button clicks too frequently we register // an event in 'result' not more often than every ROTARY_TIMEOUT msec if (rotary_clock > last_rotary_clock) { result |= last_rotary > 0 ? CHAN_ButtonMask(BUT_DOWN) : CHAN_ButtonMask(BUT_UP); last_rotary_clock = rotary_clock + ROTARY_TIMEOUT; } rotary = 0; } return result; }
guiObject_t *GUI_CreateKeyboard(guiKeyboard_t *keyboard, enum KeyboardType type, char *text, s32 max_size, void (*CallBack)(struct guiObject *obj, void *data), void *cb_data) { struct guiObject *obj = (guiObject_t *)keyboard; CLEAR_OBJ(keyboard); obj->Type = Keyboard; OBJ_SET_MODAL(obj, 1); connect_object(obj); keyboard->type = type; keyboard->text = text; keyboard->flags = FLAG_BUTTON; keyboard->max_size = max_size; keyboard->last_row = 0; keyboard->last_col = 0; keyboard->lastchar = array[keyboard->type][0][0]; BUTTON_RegisterCallback(&keyboard->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_LONGPRESS | BUTTON_PRIORITY, press_cb, obj); keyboard->CallBack = CallBack; keyboard->cb_data = cb_data; return obj; }
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); }
void PAGE_Init() { cur_page = 0; modal = 0; page_scrollable = NULL; GUI_RemoveAllObjects(); enter_cmd = NULL; exit_cmd = NULL; BUTTON_RegisterCallback(&button_action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN), BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_RELEASE | BUTTON_PRIORITY, page_change_cb, NULL); PAGE_ChangeByID(PAGEID_SPLASH, 0); //PAGE_ChangeByID(PAGEID_MAIN); }
void PAGE_ShowReorderList(u8 *list, u8 count, u8 selected, u8 max_allowed, const char *(*text_cb)(u8 idx), void(*return_page)(u8 *)) { rl.return_page = return_page; rl.list = list; rl.selected = selected; rl.copyto = selected; rl.count = count; rl.text_cb = text_cb; rl.max = max_allowed; if (rl.max < count) rl.max = count; PAGE_RemoveAllObjects(); PAGE_SetModal(1); current_selected = 0; int i; for(i = 0; i < rl.max; i++) { if (i < count) list[i] = i+1; else list[i] = 0; } u8 space = LINE_HEIGHT; u8 y = 0; u8 w = 55; guiObject_t *obj = GUI_CreateButtonPlateText(&gui->up, 0, y, w/2 -2, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)MOVE_UP); GUI_SetSelected(obj); GUI_CreateButtonPlateText(&gui->down, w/2, y, w/2 -2 , LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)MOVE_DOWN); y += space; GUI_CreateTextSelectPlate(&gui->value, 0, y, w, LINE_HEIGHT, &DEFAULT_FONT, NULL, copy_val_cb, NULL); y += space; GUI_CreateButtonPlateText(&gui->apply, 0, y, w, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)APPLY); if (max_allowed) { y += space; GUI_CreateButtonPlateText(&gui->insert, 0, y, w/2 -2, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)INSERT); GUI_CreateButtonPlateText(&gui->remove, w/2, y, w/2 - 2, LINE_HEIGHT, &DEFAULT_FONT, _show_button_cb, 0x0000, press_button_cb, (void *)REMOVE); } y += space; GUI_CreateButtonPlateText(&gui->save, (w -30)/2, y, 30, LINE_HEIGHT, &DEFAULT_FONT, NULL, 0x0000, _okcancel_cb, (void *)_tr("Save")); u8 x = w + 4; GUI_CreateListBoxPlateText(&gui->list, x, 0, LCD_WIDTH - x , LCD_HEIGHT, rl.max, selected, &DEFAULT_FONT, LISTBOX_KEY_RIGHTLEFT, string_cb, select_cb, NULL, NULL); GUI_SetSelectable((guiObject_t *)&gui->list, 0); PAGE_SetActionCB(NULL); // we need to grab the key handler from the listbox to let rl.textsel catch left/right keys when it is selected // hence registerCallback has to be used here BUTTON_RegisterCallback(&action, CHAN_ButtonMask(BUT_ENTER) | CHAN_ButtonMask(BUT_EXIT) | CHAN_ButtonMask(BUT_LEFT) | CHAN_ButtonMask(BUT_RIGHT) | CHAN_ButtonMask(BUT_UP) | CHAN_ButtonMask(BUT_DOWN), BUTTON_PRESS | BUTTON_LONGPRESS | BUTTON_PRIORITY, _action_cb, obj); }
unsigned handle_buttons(u32 button, unsigned flags, void *data) { (void)data; //When modal, we capture all button presses int modalActive = GUI_IsModal() ? 1 : 0; if(USE_4BUTTON_MODE) { // IN 4 button mode, up/down can also act as left/right for TextSelect if (objACTIVE) { if (CHAN_ButtonIsPressed(button, BUT_UP)) { button = CHAN_ButtonMask(BUT_LEFT); } else if (CHAN_ButtonIsPressed(button, BUT_DOWN)) { button = CHAN_ButtonMask(BUT_RIGHT); } else if (CHAN_ButtonIsPressed(button, BUT_ENTER)) { if (flags & BUTTON_RELEASE) objACTIVE = NULL; } else if (CHAN_ButtonIsPressed(button, BUT_EXIT)) { if (flags & BUTTON_RELEASE) objACTIVE = NULL; return 1; } } else { if (objSELECTED && CHAN_ButtonIsPressed(button, BUT_ENTER) && objSELECTED->Type == TextSelect) { if (flags & BUTTON_RELEASE) { objACTIVE = objSELECTED; } return 1; } } } //printf("Button: %08x Flags: %08x Active: %08x\n", button, flags, objACTIVE); if (CHAN_ButtonIsPressed(button, BUT_LEFT) || CHAN_ButtonIsPressed(button, BUT_RIGHT) || CHAN_ButtonIsPressed(button, BUT_ENTER)) { // Widgets can only handle Left, Right and Enter if (objSELECTED) return GUI_ObjButton(objSELECTED, button, flags) || modalActive; return modalActive; } if (flags & (BUTTON_LONGPRESS | BUTTON_RELEASE)) { if ((flags & BUTTON_HAD_LONGPRESS) & (flags & BUTTON_RELEASE)) { //ignore long-press release return modalActive; } else if (CHAN_ButtonIsPressed(button, BUT_DOWN) || CHAN_ButtonIsPressed(button, BUT_UP)) { struct guiObject *obj = (CHAN_ButtonIsPressed(button, BUT_DOWN) || ! objSELECTED) ? GUI_GetNextSelectable(objSELECTED) : GUI_GetPrevSelectable(objSELECTED); if (obj && obj != objSELECTED) { GUI_SetSelected(obj); } } else if (! (flags & BUTTON_LONGPRESS) && objSELECTED && CHAN_ButtonIsPressed(button, BUT_EXIT)) { if (objDIALOG) { //Why doesn't the dialog handle its own buttons? DialogClose(objDIALOG, 0); } else { OBJ_SET_DIRTY(objSELECTED, 1); objSELECTED = NULL; if (select_notify) select_notify(objSELECTED); } } } else if (! objSELECTED && CHAN_ButtonIsPressed(button, BUT_EXIT)) { // We need to tell the button handler that we will handle this press // But we ignore an EXIT if there is nothing selected return modalActive; } return 1; }