static void fill_store (GtkListStore *store) { GtkWidget *menubar; guint i; /* menu items */ menubar = find_menubar (GTK_CONTAINER (geany_data->main_widgets->window)); store_populate_menu_items (store, GTK_MENU_SHELL (menubar), NULL); /* open files */ foreach_document (i) { gchar *basename = g_path_get_basename (DOC_FILENAME (documents[i])); gchar *label = g_markup_printf_escaped ("<big>%s</big>\n" "<small><i>%s</i></small>", basename, DOC_FILENAME (documents[i])); gtk_list_store_insert_with_values (store, NULL, -1, COL_LABEL, label, COL_PATH, DOC_FILENAME (documents[i]), COL_TYPE, COL_TYPE_FILE, COL_DOCUMENT, documents[i], -1); g_free (basename); g_free (label); } }
/** * Handle mouse events of editor screen. * * @param w Widget object (the editor) * @param msg mouse event message * @param event mouse event data */ static void edit_dialog_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) { gboolean unhandled = TRUE; if (msg == MSG_MOUSE_DOWN && event->y == 0) { WDialog *h = DIALOG (w); WMenuBar *b; b = find_menubar (h); if (!widget_get_state (WIDGET (b), WST_FOCUSED)) { /* menubar */ GList *l; GList *top = NULL; int x; /* Try find top fullscreen window */ for (l = h->widgets; l != NULL; l = g_list_next (l)) if (edit_widget_is_editor (CONST_WIDGET (l->data)) && ((WEdit *) l->data)->fullscreen) top = l; /* Handle fullscreen/close buttons in the top line */ x = w->cols - 6; if (top != NULL && event->x >= x) { WEdit *e = (WEdit *) top->data; if (top != h->current) { /* Window is not active. Activate it */ widget_select (WIDGET (e)); } /* Handle buttons */ if (event->x - x <= 2) edit_toggle_fullscreen (e); else send_message (h, NULL, MSG_ACTION, CK_Close, NULL); unhandled = FALSE; } if (unhandled) menubar_activate (b, drop_menus, -1); } } /* Continue handling of unhandled event in window or menu */ event->result.abort = unhandled; }
static int edit_dialog_event (Gpm_Event * event, void *data) { WDialog *h = DIALOG (data); Widget *w; Widget *wh = WIDGET (h); int ret = MOU_UNHANDLED; w = WIDGET (find_menubar (h)); if (event->y == wh->y + 1 && (event->type & GPM_DOWN) != 0 && !MENUBAR (w)->is_active) { /* menubar */ GList *l; GList *top = NULL; int x; /* Try find top fullscreen window */ for (l = h->widgets; l != NULL; l = g_list_next (l)) if (edit_widget_is_editor (WIDGET (l->data)) && ((WEdit *) l->data)->fullscreen) top = l; /* Handle fullscreen/close buttons in the top line */ x = wh->x + wh->cols + 1 - 6; if (top != NULL && event->x >= x) { WEdit *e; e = (WEdit *) top->data; x = event->x - x; if (top != h->current) { /* Window is not active. Activate it */ dlg_set_top_widget (e); } /* Handle buttons */ if (x <= 2) edit_toggle_fullscreen (e); else send_message (h, NULL, MSG_ACTION, CK_Close, NULL); ret = MOU_NORMAL; } if (ret == MOU_UNHANDLED) dlg_select_widget (w); } return ret; }
static int edit_dialog_event (Gpm_Event * event, void *data) { Dlg_head *h = (Dlg_head *) data; Widget *w; int ret = MOU_UNHANDLED; w = (Widget *) find_menubar (h); if (event->y == h->y + 1 && (event->type & GPM_DOWN) != 0 && !((WMenuBar *) w)->is_active) { /* menubar */ GList *l; GList *top = NULL; int x; /* Try find top fullscreen window */ for (l = h->widgets; l != NULL; l = g_list_next (l)) if (edit_widget_is_editor ((Widget *) l->data) && ((WEdit *) l->data)->fullscreen) top = l; /* Handle fullscreen/close buttons in the top line */ x = h->x + h->cols + 1 - 6; if (top != NULL && event->x >= x) { WEdit *e; e = (WEdit *) top->data; x = event->x - x; if (top != h->current) { /* Window is not active. Activate it */ dlg_set_top_widget (e); } /* Handle buttons */ if (x <= 2) edit_toggle_fullscreen (e); else edit_dialog_callback (h, NULL, DLG_ACTION, CK_Close, NULL); ret = MOU_NORMAL; } if (ret == MOU_UNHANDLED) dlg_select_widget (w); } return ret; }
static cb_ret_t edit_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) { WEdit *edit; WMenuBar *menubar; WButtonBar *buttonbar; edit = (WEdit *) find_widget_type (h, edit_callback); menubar = find_menubar (h); buttonbar = find_buttonbar (h); switch (msg) { case DLG_INIT: edit_set_buttonbar (edit, buttonbar); return MSG_HANDLED; case DLG_DRAW: /* don't use common_dialog_repaint() -- we don't need a frame */ tty_setcolor (EDITOR_NORMAL_COLOR); dlg_erase (h); return MSG_HANDLED; case DLG_RESIZE: /* dlg_set_size() is surplus for this case */ h->lines = LINES; h->cols = COLS; widget_set_size (&buttonbar->widget, h->lines - 1, h->x, 1, h->cols); widget_set_size (&menubar->widget, h->y, h->x, 1, h->cols); menubar_arrange (menubar); widget_set_size (&edit->widget, h->y + 1, h->x, h->lines - 2, h->cols); return MSG_HANDLED; case DLG_ACTION: if (sender == (Widget *) menubar) return send_message ((Widget *) edit, WIDGET_COMMAND, parm); if (sender == (Widget *) buttonbar) return send_message ((Widget *) edit, WIDGET_COMMAND, parm); return MSG_HANDLED; case DLG_VALIDATE: h->state = DLG_ACTIVE; /* don't stop the dialog before final decision */ if (edit_ok_to_exit (edit)) h->state = DLG_CLOSED; return MSG_HANDLED; default: return default_dlg_callback (h, sender, msg, parm, data); } }
static void edit_drop_menu_cmd (WEdit * e, int which) { WMenuBar *menubar; menubar = find_menubar (e->widget.owner); if (!menubar->is_active) { menubar->is_active = TRUE; menubar->is_dropped = (drop_menus != 0); if (which >= 0) menubar->selected = which; menubar->previous_widget = dlg_get_current_widget_id (e->widget.owner); dlg_select_widget (menubar); } }
static GtkWidget * find_menubar (GtkContainer *container) { GList *children; GList *node; GtkWidget *menubar = NULL; children = gtk_container_get_children (container); for (node = children; ! menubar && node; node = node->next) { if (GTK_IS_MENU_BAR (node->data)) { menubar = node->data; } else if (GTK_IS_CONTAINER (node->data)) { menubar = find_menubar (node->data); } } g_list_free (children); return menubar; }
static cb_ret_t edit_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { WMenuBar *menubar; WButtonBar *buttonbar; WDialog *h = DIALOG (w); switch (msg) { case MSG_INIT: edit_dlg_init (); return MSG_HANDLED; case MSG_DRAW: /* don't use dlg_default_repaint() -- we don't need a frame */ tty_setcolor (EDITOR_BACKGROUND); dlg_erase (h); return MSG_HANDLED; case MSG_RESIZE: menubar = find_menubar (h); buttonbar = find_buttonbar (h); /* dlg_set_size() is surplus for this case */ w->lines = LINES; w->cols = COLS; widget_set_size (WIDGET (buttonbar), w->lines - 1, w->x, 1, w->cols); widget_set_size (WIDGET (menubar), w->y, w->x, 1, w->cols); menubar_arrange (menubar); g_list_foreach (h->widgets, (GFunc) edit_dialog_resize_cb, NULL); return MSG_HANDLED; case MSG_ACTION: { /* Handle shortcuts, menu, and buttonbar. */ cb_ret_t result; result = edit_dialog_command_execute (h, parm); /* We forward any commands coming from the menu, and which haven't been handled by the dialog, to the focused WEdit window. */ if (result == MSG_NOT_HANDLED && sender == WIDGET (find_menubar (h))) result = send_message (h->current->data, NULL, MSG_ACTION, parm, NULL); return result; } case MSG_KEY: { Widget *we = WIDGET (h->current->data); cb_ret_t ret = MSG_NOT_HANDLED; if (edit_widget_is_editor (we)) { WEdit *e = (WEdit *) we; long command; if (!e->extmod) command = keybind_lookup_keymap_command (editor_map, parm); else command = keybind_lookup_keymap_command (editor_x_map, parm); if (command == CK_IgnoreKey) e->extmod = FALSE; else { ret = edit_dialog_command_execute (h, command); /* if command was not handled, keep the extended mode for the further key processing */ if (ret == MSG_HANDLED) e->extmod = FALSE; } } /* * Due to the "end of bracket" escape the editor sees input with is_idle() == false * (expects more characters) and hence doesn't yet refresh the screen, but then * no further characters arrive (there's only an "end of bracket" which is swallowed * by tty_get_event()), so you end up with a screen that's not refreshed after pasting. * So let's trigger an IDLE signal. */ if (!is_idle ()) widget_idle (w, TRUE); return ret; } /* hardcoded menu hotkeys (see edit_drop_hotkey_menu) */ case MSG_UNHANDLED_KEY: return edit_drop_hotkey_menu (h, parm) ? MSG_HANDLED : MSG_NOT_HANDLED; case MSG_VALIDATE: edit_quit (h); return MSG_HANDLED; case MSG_END: edit_dlg_deinit (); return MSG_HANDLED; case MSG_IDLE: widget_idle (w, FALSE); return send_message (h->current->data, NULL, MSG_IDLE, 0, NULL); default: return dlg_default_callback (w, sender, msg, parm, data); } }
static cb_ret_t edit_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) { WMenuBar *menubar; WButtonBar *buttonbar; switch (msg) { case DLG_INIT: edit_dlg_init (); return MSG_HANDLED; case DLG_DRAW: /* don't use common_dialog_repaint() -- we don't need a frame */ tty_setcolor (EDITOR_BACKGROUND); dlg_erase (h); return MSG_HANDLED; case DLG_RESIZE: menubar = find_menubar (h); buttonbar = find_buttonbar (h); /* dlg_set_size() is surplus for this case */ h->lines = LINES; h->cols = COLS; widget_set_size (&buttonbar->widget, h->lines - 1, h->x, 1, h->cols); widget_set_size (&menubar->widget, h->y, h->x, 1, h->cols); menubar_arrange (menubar); g_list_foreach (h->widgets, (GFunc) edit_dialog_resize_cb, NULL); return MSG_HANDLED; case DLG_ACTION: /* shortcut */ if (sender == NULL) return edit_dialog_command_execute (h, parm); /* message from menu */ menubar = find_menubar (h); if (sender == (Widget *) menubar) { if (edit_dialog_command_execute (h, parm) == MSG_HANDLED) return MSG_HANDLED; /* try send command to the current window */ return send_message ((Widget *) h->current->data, WIDGET_COMMAND, parm); } /* message from buttonbar */ buttonbar = find_buttonbar (h); if (sender == (Widget *) buttonbar) { if (data != NULL) return send_message ((Widget *) data, WIDGET_COMMAND, parm); return edit_dialog_command_execute (h, parm); } return MSG_NOT_HANDLED; case DLG_KEY: { Widget *w = h->current->data; cb_ret_t ret = MSG_NOT_HANDLED; if (edit_widget_is_editor (w)) { WEdit *e = (WEdit *) w; unsigned long command; if (!e->extmod) command = keybind_lookup_keymap_command (editor_map, parm); else { e->extmod = FALSE; command = keybind_lookup_keymap_command (editor_x_map, parm); } if (command != CK_IgnoreKey) ret = edit_dialog_command_execute (h, command); } return ret; } /* hardcoded menu hotkeys (see edit_drop_hotkey_menu) */ case DLG_UNHANDLED_KEY: return edit_drop_hotkey_menu (h, parm) ? MSG_HANDLED : MSG_NOT_HANDLED; case DLG_VALIDATE: edit_quit (h); return MSG_HANDLED; case DLG_END: edit_dlg_deinit (); return MSG_HANDLED; default: return default_dlg_callback (h, sender, msg, parm, data); } }