static cb_ret_t listbox_execute_cmd (WListbox * l, long command) { cb_ret_t ret = MSG_HANDLED; Widget *w = WIDGET (l); if (l->list == NULL || g_queue_is_empty (l->list)) return MSG_NOT_HANDLED; switch (command) { case CK_Up: listbox_back (l, TRUE); break; case CK_Down: listbox_fwd (l, TRUE); break; case CK_Top: listbox_select_first (l); break; case CK_Bottom: listbox_select_last (l); break; case CK_PageUp: listbox_back_n (l, w->lines - 1); break; case CK_PageDown: listbox_fwd_n (l, w->lines - 1); break; case CK_Delete: if (l->deletable) { gboolean is_last, is_more; int length; length = g_queue_get_length (l->list); is_last = (l->pos + 1 >= length); is_more = (l->top + w->lines >= length); listbox_remove_current (l); if ((l->top > 0) && (is_last || is_more)) l->top--; } break; case CK_Clear: if (l->deletable && mc_global.widget.confirm_history_cleanup /* TRANSLATORS: no need to translate 'DialogTitle', it's just a context prefix */ && (query_dialog (Q_ ("DialogTitle|History cleanup"), _("Do you want clean this history?"), D_ERROR, 2, _("&Yes"), _("&No")) == 0)) listbox_remove_list (l); break; default: ret = MSG_NOT_HANDLED; } return ret; }
static void listbox_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) { WListbox *l = LISTBOX (w); int old_pos; old_pos = l->pos; switch (msg) { case MSG_MOUSE_DOWN: widget_select (w); listbox_select_entry (l, listbox_y_pos (l, event->y)); break; case MSG_MOUSE_SCROLL_UP: listbox_back (l, FALSE); break; case MSG_MOUSE_SCROLL_DOWN: listbox_fwd (l, FALSE); break; case MSG_MOUSE_DRAG: event->result.repeat = TRUE; /* It'd be functional even without this. */ listbox_select_entry (l, listbox_y_pos (l, event->y)); break; case MSG_MOUSE_CLICK: /* We don't call listbox_select_entry() here: MSG_MOUSE_DOWN/DRAG did this already. */ if (event->count == GPM_DOUBLE) /* Double click */ listbox_do_action (l); break; default: break; } /* If the selection has changed, we redraw the widget and notify the dialog. */ if (l->pos != old_pos) listbox_on_change (l); }
static int listbox_event (Gpm_Event * event, void *data) { WListbox *l = LISTBOX (data); Widget *w = WIDGET (data); if (!mouse_global_in_widget (event, w)) return MOU_UNHANDLED; /* Single click */ if ((event->type & GPM_DOWN) != 0) dlg_select_widget (l); if (listbox_is_empty (l)) return MOU_NORMAL; if ((event->type & (GPM_DOWN | GPM_DRAG)) != 0) { int ret = MOU_REPEAT; Gpm_Event local; int i; local = mouse_get_local (event, w); if (local.y < 1) for (i = -local.y; i >= 0; i--) listbox_back (l); else if (local.y > w->lines) for (i = local.y - w->lines; i > 0; i--) listbox_fwd (l); else if ((local.buttons & GPM_B_UP) != 0) { listbox_back (l); ret = MOU_NORMAL; } else if ((local.buttons & GPM_B_DOWN) != 0) { listbox_fwd (l); ret = MOU_NORMAL; } else listbox_select_entry (l, listbox_select_pos (l, l->top, local.y - 1)); /* We need to refresh ourselves since the dialog manager doesn't */ /* know about this event */ listbox_draw (l, TRUE); return ret; } /* Double click */ if ((event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE)) { Gpm_Event local; int action; local = mouse_get_local (event, w); dlg_select_widget (l); listbox_select_entry (l, listbox_select_pos (l, l->top, local.y - 1)); if (l->callback != NULL) action = l->callback (l); else action = LISTBOX_DONE; if (action == LISTBOX_DONE) { w->owner->ret_value = B_ENTER; dlg_stop (w->owner); } } return MOU_NORMAL; }