static void menubar_execute (WMenuBar * menubar) { const Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); const menu_entry_t *entry = g_list_nth_data (menu->entries, menu->selected); if ((entry != NULL) && (entry->command != CK_IgnoreKey)) { mc_global.widget.is_right = (menubar->selected != 0); menubar_finish (menubar); menubar->widget.owner->callback (menubar->widget.owner, &menubar->widget, DLG_ACTION, entry->command, NULL); do_refresh (); } }
static void menubar_execute (WMenuBar * menubar) { const menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected)); const menu_entry_t *entry = MENUENTRY (g_list_nth_data (menu->entries, menu->selected)); if ((entry != NULL) && (entry->command != CK_IgnoreKey)) { Widget *w = WIDGET (menubar); mc_global.widget.is_right = (menubar->selected != 0); menubar_finish (menubar); send_message (w->owner, w, MSG_ACTION, entry->command, NULL); do_refresh (); } }
static int menubar_event (Gpm_Event * event, void *data) { WMenuBar *menubar = MENUBAR (data); Widget *w = WIDGET (data); gboolean was_active = TRUE; int left_x, right_x, bottom_y; menu_t *menu; Gpm_Event local; if (!mouse_global_in_widget (event, w)) return MOU_UNHANDLED; /* ignore unsupported events */ if ((event->type & (GPM_UP | GPM_DOWN | GPM_DRAG)) == 0) return MOU_NORMAL; /* ignore wheel events if menu is inactive */ if (!menubar->is_active && ((event->buttons & (GPM_B_MIDDLE | GPM_B_UP | GPM_B_DOWN)) != 0)) return MOU_NORMAL; local = mouse_get_local (event, w); if (local.y == 1 && (local.type & GPM_UP) != 0) return MOU_NORMAL; if (!menubar->is_dropped) { if (local.y > 1) { /* mouse click below menubar -- close menu and send focus to widget under mouse */ menubar_finish (menubar); return MOU_UNHANDLED; } menubar->previous_widget = dlg_get_current_widget_id (w->owner); menubar->is_active = TRUE; menubar->is_dropped = TRUE; was_active = FALSE; } /* Mouse operations on the menubar */ if (local.y == 1 || !was_active) { /* wheel events on menubar */ if ((local.buttons & GPM_B_UP) != 0) menubar_left (menubar); else if ((local.buttons & GPM_B_DOWN) != 0) menubar_right (menubar); else { const unsigned int len = g_list_length (menubar->menu); unsigned int new_selection = 0; while ((new_selection < len) && (local.x > MENU (g_list_nth_data (menubar->menu, new_selection))->start_x)) new_selection++; if (new_selection != 0) /* Don't set the invalid value -1 */ new_selection--; if (!was_active) { menubar->selected = new_selection; dlg_select_widget (menubar); } else { menubar_remove (menubar); menubar->selected = new_selection; } menubar_draw (menubar); } return MOU_NORMAL; } if (!menubar->is_dropped || (local.y < 2)) return MOU_NORMAL; /* middle click -- everywhere */ if (((local.buttons & GPM_B_MIDDLE) != 0) && ((local.type & GPM_DOWN) != 0)) { menubar_execute (menubar); return MOU_NORMAL; } /* the mouse operation is on the menus or it is not */ menu = MENU (g_list_nth_data (menubar->menu, menubar->selected)); left_x = menu->start_x; right_x = left_x + menu->max_entry_len + 3; if (right_x > w->cols) { left_x = w->cols - menu->max_entry_len - 3; right_x = w->cols; } bottom_y = g_list_length (menu->entries) + 3; if ((local.x >= left_x) && (local.x <= right_x) && (local.y <= bottom_y)) { int pos = local.y - 3; const menu_entry_t *entry = MENUENTRY (g_list_nth_data (menu->entries, pos)); /* mouse wheel */ if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0) { menubar_up (menubar); return MOU_NORMAL; } if ((local.buttons & GPM_B_DOWN) != 0 && (local.type & GPM_DOWN) != 0) { menubar_down (menubar); return MOU_NORMAL; } /* ignore events above and below dropped down menu */ if ((pos < 0) || (pos >= bottom_y - 3)) return MOU_NORMAL; if ((entry != NULL) && (entry->command != CK_IgnoreKey)) { menubar_paint_idx (menubar, menu->selected, MENU_ENTRY_COLOR); menu->selected = pos; menubar_paint_idx (menubar, menu->selected, MENU_SELECTED_COLOR); if ((event->type & GPM_UP) != 0) menubar_execute (menubar); } } else if (((local.type & GPM_DOWN) != 0) && ((local.buttons & (GPM_B_UP | GPM_B_DOWN)) == 0)) { /* use click not wheel to close menu */ menubar_finish (menubar); } return MOU_NORMAL; }
static int menubar_handle_key (WMenuBar * menubar, int key) { /* Lowercase */ if (isascii (key)) key = g_ascii_tolower (key); if (is_abort_char (key)) { menubar_finish (menubar); return 1; } /* menubar help or menubar navigation */ switch (key) { case KEY_F (1): { ev_help_t event_data = { NULL, NULL }; if (menubar->is_dropped) event_data.node = MENU (g_list_nth_data (menubar->menu, menubar->selected))->help_node; else event_data.node = "[Menu Bar]"; mc_event_raise (MCEVENT_GROUP_CORE, "help", &event_data); menubar_draw (menubar); return 1; } case KEY_LEFT: case XCTRL ('b'): menubar_left (menubar); return 1; case KEY_RIGHT: case XCTRL ('f'): menubar_right (menubar); return 1; default: break; } if (!menubar->is_dropped) { GList *i; /* drop menu by hotkey */ for (i = menubar->menu; i != NULL; i = g_list_next (i)) { menu_t *menu = MENU (i->data); if ((menu->text.hotkey != NULL) && (key == g_ascii_tolower (menu->text.hotkey[0]))) { menubar_drop (menubar, g_list_position (menubar->menu, i)); return 1; } } /* drop menu by Enter or Dowwn key */ if (key == KEY_ENTER || key == XCTRL ('n') || key == KEY_DOWN || key == '\n') menubar_drop (menubar, menubar->selected); return 1; } { menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected)); GList *i; /* execute menu command by hotkey */ for (i = menu->entries; i != NULL; i = g_list_next (i)) { const menu_entry_t *entry = MENUENTRY (i->data); if ((entry != NULL) && (entry->command != CK_IgnoreKey) && (entry->text.hotkey != NULL) && (key == g_ascii_tolower (entry->text.hotkey[0]))) { menu->selected = g_list_position (menu->entries, i); menubar_execute (menubar); return 1; } } /* menu execute by Enter or menu navigation */ switch (key) { case KEY_ENTER: case '\n': menubar_execute (menubar); return 1; case KEY_HOME: case ALT ('<'): menubar_first (menubar); break; case KEY_END: case ALT ('>'): menubar_last (menubar); break; case KEY_DOWN: case XCTRL ('n'): menubar_down (menubar); break; case KEY_UP: case XCTRL ('p'): menubar_up (menubar); break; default: break; } } return 0; }