|
View:
New views
8 Messages
—
Rating Filter:
Alert me
|
|
|
RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)Hi,
in the wake of chaos and panic (yeah, right) from upcoming widget deprecation, perhaps you'd care to look at attached patch. I sent something very similar few months back, but the patch was given a cold shoulder due to use of inline XML strings for menu design. Well, this time there is no XML inside! :) Feel free to comment. -- Andrej Kacian <andrej at kacian dot sk> [claws-mail-uimanager-proof-of-concept.noxml.diff] ? editaddress_other_combobox.patch ? folder_special_icons.patch ? src/.mimeview.c.swo Index: src/main.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/main.c,v retrieving revision 1.115.2.198 diff -u -B -r1.115.2.198 main.c --- src/main.c 2008/06/09 16:48:39 1.115.2.198 +++ src/main.c 2008/07/16 20:28:02 @@ -211,6 +211,8 @@ const gchar *target; } cmd; +GtkUIManager *gui_manager; + static void parse_cmd_opt(int argc, char *argv[]); static gint prohibit_duplicate_launch (void); @@ -1153,6 +1155,8 @@ gdk_rgb_init(); gtk_widget_set_default_colormap(gdk_rgb_get_colormap()); gtk_widget_set_default_visual(gdk_rgb_get_visual()); + + gui_manager = gtk_ui_manager_new(); if (!g_thread_supported()) { g_error(_("g_thread is not supported by glib.\n")); Index: src/mimeview.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/mimeview.c,v retrieving revision 1.83.2.133 diff -u -B -r1.83.2.133 mimeview.c --- src/mimeview.c 2008/05/28 05:41:55 1.83.2.133 +++ src/mimeview.c 2008/07/16 20:28:03 @@ -168,20 +168,45 @@ MimeView *mimeview); static MimeInfo *mimeview_get_part_to_use(MimeView *mimeview); -static void mimeview_launch_cb(MimeView *mimeview) +static void mimeview_launch_cb(GtkAction *action, gpointer data) { + MimeView *mimeview = (MimeView *)data; mimeview_launch(mimeview, mimeview_get_part_to_use(mimeview)); } -static GtkItemFactoryEntry mimeview_popup_entries[] = + +static void mimeview_open_with_cb(GtkAction *action, gpointer data) { - {N_("/_Open (l)"), NULL, mimeview_launch_cb, 0, NULL}, -#ifndef MAEMO - {N_("/Open _with (o)..."), NULL, mimeview_open_with, 0, NULL}, -#endif - {N_("/_Display as text (t)"), NULL, mimeview_display_as_text, 0, NULL}, - {N_("/_Save as (y)..."), NULL, mimeview_save_as, 0, NULL}, - {N_("/Save _all..."), NULL, mimeview_save_all, 0, NULL}, - {N_("/Next part (a)"), NULL, mimeview_select_next_part,0, NULL}, + mimeview_open_with((MimeView *)data); +} + +static void mimeview_display_as_text_cb(GtkAction *action, gpointer data) +{ + mimeview_display_as_text((MimeView *)data); +} + +static void mimeview_save_as_cb(GtkAction *action, gpointer data) +{ + mimeview_save_as((MimeView *)data); +} + +static void mimeview_save_all_cb(GtkAction *action, gpointer data) +{ + mimeview_save_all((MimeView *)data); +} + +static void mimeview_select_next_part_cb(GtkAction *action, gpointer data) +{ + mimeview_select_next_part((MimeView *)data); +} + +static const GtkActionEntry mimeview_menu_actions[] = { + { "MimeView", NULL, "MimeView" }, + { "MimeView/Open", NULL, N_("_Open (l)"), NULL, "Open MIME part", G_CALLBACK(mimeview_launch_cb) }, + { "MimeView/OpenWith", NULL, N_("Open _with (o)..."), NULL, "Open MIME part with...", G_CALLBACK(mimeview_open_with_cb) }, + { "MimeView/DisplayAsText", NULL, N_("_Display as text (t)"), NULL, "Display as text", G_CALLBACK(mimeview_display_as_text_cb) }, + { "MimeView/SaveAs", NULL, N_("_Save as (y)..."), NULL, "Save as", G_CALLBACK(mimeview_save_as_cb) }, + { "MimeView/SaveAll", NULL, N_("Save _all..."), NULL, "Save all parts", G_CALLBACK(mimeview_save_all_cb) }, + { "MimeView/NextPart", NULL, N_("Next part (a)"), NULL, "Next part", G_CALLBACK(mimeview_select_next_part_cb) } }; static GtkTargetEntry mimeview_mime_types[] = @@ -192,6 +217,8 @@ GSList *mimeviewer_factories; GSList *mimeviews; +extern GtkUIManager *gui_manager; + static GdkCursor *hand_cursor = NULL; static gboolean mimeview_visi_notify(GtkWidget *widget, @@ -237,10 +264,10 @@ GtkWidget *scrollbutton; GtkWidget *hbox; GtkTooltips *tooltips; - GtkItemFactory *popupfactory; + GtkActionGroup *actions; + NoticeView *siginfoview; gchar *titles[N_MIMEVIEW_COLS]; - gint n_entries; gint i; if (!hand_cursor) @@ -332,11 +359,39 @@ ctree_mainbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ctree_mainbox), scrolledwin, TRUE, TRUE, 0); + + actions = gtk_action_group_new("MimeView"); + gtk_action_group_add_actions(actions, mimeview_menu_actions, + G_N_ELEMENTS(mimeview_menu_actions), (gpointer)mimeview); + gtk_ui_manager_insert_action_group(gui_manager, actions, 0); + + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/", "Menus", NULL, GTK_UI_MANAGER_MENUBAR, FALSE); + + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/", "MimeView", "MimeView", GTK_UI_MANAGER_MENU, FALSE); + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/MimeView/", "Open", "MimeView/Open", + GTK_UI_MANAGER_MENUITEM, FALSE); + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/MimeView/", "OpenWith", "MimeView/OpenWith", + GTK_UI_MANAGER_MENUITEM, FALSE); + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/MimeView/", "DisplayAsText", "MimeView/DisplayAsText", + GTK_UI_MANAGER_MENUITEM, FALSE); + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/MimeView/", "SaveAs", "MimeView/SaveAs", + GTK_UI_MANAGER_MENUITEM, FALSE); + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/MimeView/", "SaveAll", "MimeView/SaveAll", + GTK_UI_MANAGER_MENUITEM, FALSE); + gtk_ui_manager_add_ui(gui_manager, gtk_ui_manager_new_merge_id(gui_manager), + "ui/Menus/MimeView/", "NextPart", "MimeView/NextPart", + GTK_UI_MANAGER_MENUITEM, FALSE); + + popupmenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( + gtk_ui_manager_get_widget(gui_manager, "/Menus/MimeView")) ); - n_entries = sizeof(mimeview_popup_entries) / - sizeof(mimeview_popup_entries[0]); - popupmenu = menu_create_items(mimeview_popup_entries, n_entries, - "<MimeView>", &popupfactory, mimeview); tooltips = gtk_tooltips_new(); vbox = gtk_vbox_new(FALSE, 0); @@ -368,7 +423,6 @@ mimeview->ctree = ctree; mimeview->mime_notebook = mime_notebook; mimeview->popupmenu = popupmenu; - mimeview->popupfactory = popupfactory; mimeview->type = -1; mimeview->ctree_mainbox = ctree_mainbox; mimeview->icon_scroll = icon_scroll; @@ -1261,19 +1315,15 @@ if (partinfo && (partinfo->type == MIMETYPE_MESSAGE || partinfo->type == MIMETYPE_IMAGE || partinfo->type == MIMETYPE_MULTIPART)) - menu_set_sensitive(mimeview->popupfactory, - "/Display as text (t)", FALSE); + cm_menu_set_sensitive("MimeView", "DisplayAsText", FALSE); else - menu_set_sensitive(mimeview->popupfactory, - "/Display as text (t)", TRUE); + cm_menu_set_sensitive("MimeView", "DisplayAsText", TRUE); if (partinfo && partinfo->type == MIMETYPE_APPLICATION && !g_ascii_strcasecmp(partinfo->subtype, "octet-stream")) - menu_set_sensitive(mimeview->popupfactory, - "/Open (l)", FALSE); + cm_menu_set_sensitive("MimeView", "Open", FALSE); else - menu_set_sensitive(mimeview->popupfactory, - "/Open (l)", TRUE); + cm_menu_set_sensitive("MimeView", "Open", TRUE); g_object_set_data(G_OBJECT(mimeview->popupmenu), "pop_partinfo", partinfo); Index: src/gtk/menu.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/menu.c,v retrieving revision 1.5.2.28 diff -u -B -r1.5.2.28 menu.c --- src/gtk/menu.c 2008/05/07 08:18:23 1.5.2.28 +++ src/gtk/menu.c 2008/07/16 20:28:03 @@ -44,6 +44,8 @@ #include <gtk/gtkmain.h> #endif +extern GtkUIManager *gui_manager; + static void connect_accel_change_signals(GtkWidget* widget, GtkWidget *wid2) ; @@ -102,6 +104,24 @@ g_return_if_fail(widget != NULL); gtk_widget_set_sensitive(widget, sensitive); +} + +void cm_menu_set_sensitive(gchar *menu, gchar *item, gboolean sensitive) +{ + GtkWidget *widget; + gchar *path = g_strdup_printf("/Menus/%s/%s/", menu, item); + + widget = gtk_ui_manager_get_widget(gui_manager, path); + if( !GTK_IS_WIDGET(widget) ) { + g_message("Blah, '%s' is not a widget.\n", path); + } + + if( !GTK_IS_MENU_ITEM(widget) ) { + g_message("Blah, '%s' is not a menu item.\n", path); + } + + gtk_widget_set_sensitive(widget, sensitive); + g_free(path); } void menu_set_sensitive_all(GtkMenuShell *menu_shell, gboolean sensitive) Index: src/gtk/menu.h =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/menu.h,v retrieving revision 1.4.2.12 diff -u -B -r1.4.2.12 menu.h --- src/gtk/menu.h 2007/10/15 17:20:01 1.4.2.12 +++ src/gtk/menu.h 2008/07/16 20:28:03 @@ -65,6 +65,8 @@ const gchar *path, gboolean sensitive); +void cm_menu_set_sensitive(gchar *menu, gchar *item, gboolean sensitive); + void menu_set_active (GtkItemFactory *ifactory, const gchar *path, gboolean is_active); |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On Wed, 16 Jul 2008 22:31:42 +0200
Andrej Kacian <andrej@...> wrote: > Hi, > > in the wake of chaos and panic (yeah, right) from upcoming widget > deprecation, perhaps you'd care to look at attached patch. I sent something > very similar few months back, but the patch was given a cold shoulder due to > use of inline XML strings for menu design. > > Well, this time there is no XML inside! :) > > Feel free to comment. - introduced macro MENUITEM_ADDUI for better code readability - simplified cm_menu_set_sensitive() arguments - converted also context menu in Edit Tags dialog - other small tweaks Shall I commit? :) -- Andrej Kacian <andrej at kacian dot sk> [claws-mail-uimanager-proof-of-concept.noxml.v2.diff] ? editaddress_other_combobox.patch ? folder_special_icons.patch Index: src/edittags.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/Attic/edittags.c,v retrieving revision 1.1.2.16 diff -u -B -r1.1.2.16 edittags.c --- src/edittags.c 2008/01/07 11:33:23 1.1.2.16 +++ src/edittags.c 2008/07/17 19:30:47 @@ -47,6 +47,8 @@ #include "gtkutils.h" #include "manual.h" +extern GtkUIManager *gui_manager; + enum { TAG_SELECTED, TAG_SELECTED_INCONSISTENT, @@ -197,10 +199,9 @@ } -static GtkItemFactory *apply_popup_factory = NULL; static GtkWidget *apply_popup_menu = NULL; -static void apply_popup_delete (void *obj, guint action, void *data) +static void apply_popup_delete (GtkAction *action, gpointer data) { GtkTreeIter sel; GtkTreeModel *model; @@ -234,7 +235,7 @@ APPLYWINDOW_UNLOCK(); } -static void apply_popup_delete_all (void *obj, guint action, void *data) +static void apply_popup_delete_all (GtkAction *action, gpointer data) { GSList *cur; GtkTreeModel *model; @@ -264,15 +265,18 @@ APPLYWINDOW_UNLOCK(); } -static GtkItemFactoryEntry apply_popup_entries[] = +static const GtkActionEntry apply_popup_actions[] = { - {N_("/_Delete"), NULL, apply_popup_delete, 0, NULL, NULL}, - {N_("/Delete _all"), NULL, apply_popup_delete_all, 0, NULL, NULL}, + { "EditTags", NULL, "EditTags" }, + { "EditTags/Delete", NULL, N_("_Delete"), NULL, "Delete tag", G_CALLBACK(apply_popup_delete) }, + { "EditTags/DeleteAll", NULL, N_("Delete _all"), NULL, "Delete all tags", G_CALLBACK(apply_popup_delete_all) } }; static gint apply_list_btn_pressed(GtkWidget *widget, GdkEventButton *event, GtkTreeView *list_view) { + GtkActionGroup *actions; + if (applywindow.busy) return FALSE; @@ -282,17 +286,25 @@ gboolean non_empty; if (!apply_popup_menu) { - gint n_entries = sizeof(apply_popup_entries) / - sizeof(apply_popup_entries[0]); - apply_popup_menu = menu_create_items(apply_popup_entries, n_entries, - "<TagPopupMenu>", &apply_popup_factory, - list_view); + actions = gtk_action_group_new("EditTags"); + gtk_action_group_add_actions(actions, apply_popup_actions, + G_N_ELEMENTS(apply_popup_actions), (gpointer)list_view); + gtk_ui_manager_insert_action_group(gui_manager, actions, 0); + + MENUITEM_ADDUI("/Menus", "EditTags", "EditTags", GTK_UI_MANAGER_MENU) + MENUITEM_ADDUI("/Menus/EditTags", "Delete", "EditTags/Delete", + GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI("/Menus/EditTags", "DeleteAll", "EditTags/DeleteAll", + GTK_UI_MANAGER_MENUITEM) + + apply_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( + gtk_ui_manager_get_widget(gui_manager, "/Menus/EditTags")) ); } /* grey out popup menu items if list is empty */ non_empty = gtk_tree_model_get_iter_first(model, &iter); - menu_set_sensitive(apply_popup_factory, "/Delete", non_empty); - menu_set_sensitive(apply_popup_factory, "/Delete all", non_empty); + cm_menu_set_sensitive("EditTags/Delete", non_empty); + cm_menu_set_sensitive("EditTags/DeleteAll", non_empty); gtk_menu_popup(GTK_MENU(apply_popup_menu), NULL, NULL, NULL, NULL, @@ -464,7 +476,7 @@ { if (applywindow.busy) return; - apply_popup_delete(NULL, 0, NULL); + apply_popup_delete(NULL, NULL); gtk_widget_grab_focus(applywindow.taglist); } @@ -475,7 +487,7 @@ if (event && event->keyval == GDK_Escape) apply_window_close(); else if (event && event->keyval == GDK_Delete) - apply_popup_delete(NULL, 0, NULL); + apply_popup_delete(NULL, NULL); return FALSE; } Index: src/main.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/main.c,v retrieving revision 1.115.2.198 diff -u -B -r1.115.2.198 main.c --- src/main.c 2008/06/09 16:48:39 1.115.2.198 +++ src/main.c 2008/07/17 19:30:47 @@ -211,6 +211,8 @@ const gchar *target; } cmd; +GtkUIManager *gui_manager; + static void parse_cmd_opt(int argc, char *argv[]); static gint prohibit_duplicate_launch (void); @@ -1153,6 +1155,11 @@ gdk_rgb_init(); gtk_widget_set_default_colormap(gdk_rgb_get_colormap()); gtk_widget_set_default_visual(gdk_rgb_get_visual()); + + gui_manager = gtk_ui_manager_new(); + + /* Create container for all the menus we will be adding */ + MENUITEM_ADDUI("/", "Menus", NULL, GTK_UI_MANAGER_MENUBAR); if (!g_thread_supported()) { g_error(_("g_thread is not supported by glib.\n")); Index: src/mimeview.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/mimeview.c,v retrieving revision 1.83.2.133 diff -u -B -r1.83.2.133 mimeview.c --- src/mimeview.c 2008/05/28 05:41:55 1.83.2.133 +++ src/mimeview.c 2008/07/17 19:30:49 @@ -168,20 +168,47 @@ MimeView *mimeview); static MimeInfo *mimeview_get_part_to_use(MimeView *mimeview); -static void mimeview_launch_cb(MimeView *mimeview) +static void mimeview_launch_cb(GtkAction *action, gpointer data) { + MimeView *mimeview = (MimeView *)data; mimeview_launch(mimeview, mimeview_get_part_to_use(mimeview)); +} + +static void mimeview_open_with_cb(GtkAction *action, gpointer data) +{ + mimeview_open_with((MimeView *)data); +} + +static void mimeview_display_as_text_cb(GtkAction *action, gpointer data) +{ + mimeview_display_as_text((MimeView *)data); +} + +static void mimeview_save_as_cb(GtkAction *action, gpointer data) +{ + mimeview_save_as((MimeView *)data); +} + +static void mimeview_save_all_cb(GtkAction *action, gpointer data) +{ + mimeview_save_all((MimeView *)data); } -static GtkItemFactoryEntry mimeview_popup_entries[] = + +static void mimeview_select_next_part_cb(GtkAction *action, gpointer data) { - {N_("/_Open (l)"), NULL, mimeview_launch_cb, 0, NULL}, + mimeview_select_next_part((MimeView *)data); +} + +static const GtkActionEntry mimeview_menu_actions[] = { + { "MimeView", NULL, "MimeView" }, + { "MimeView/Open", NULL, N_("_Open (l)"), NULL, "Open MIME part", G_CALLBACK(mimeview_launch_cb) }, #ifndef MAEMO - {N_("/Open _with (o)..."), NULL, mimeview_open_with, 0, NULL}, + { "MimeView/OpenWith", NULL, N_("Open _with (o)..."), NULL, "Open MIME part with...", G_CALLBACK(mimeview_open_with_cb) }, #endif - {N_("/_Display as text (t)"), NULL, mimeview_display_as_text, 0, NULL}, - {N_("/_Save as (y)..."), NULL, mimeview_save_as, 0, NULL}, - {N_("/Save _all..."), NULL, mimeview_save_all, 0, NULL}, - {N_("/Next part (a)"), NULL, mimeview_select_next_part,0, NULL}, + { "MimeView/DisplayAsText", NULL, N_("_Display as text (t)"), NULL, "Display as text", G_CALLBACK(mimeview_display_as_text_cb) }, + { "MimeView/SaveAs", NULL, N_("_Save as (y)..."), NULL, "Save as", G_CALLBACK(mimeview_save_as_cb) }, + { "MimeView/SaveAll", NULL, N_("Save _all..."), NULL, "Save all parts", G_CALLBACK(mimeview_save_all_cb) }, + { "MimeView/NextPart", NULL, N_("Next part (a)"), NULL, "Next part", G_CALLBACK(mimeview_select_next_part_cb) } }; static GtkTargetEntry mimeview_mime_types[] = @@ -192,6 +219,8 @@ GSList *mimeviewer_factories; GSList *mimeviews; +extern GtkUIManager *gui_manager; + static GdkCursor *hand_cursor = NULL; static gboolean mimeview_visi_notify(GtkWidget *widget, @@ -237,10 +266,10 @@ GtkWidget *scrollbutton; GtkWidget *hbox; GtkTooltips *tooltips; - GtkItemFactory *popupfactory; + GtkActionGroup *actions; + NoticeView *siginfoview; gchar *titles[N_MIMEVIEW_COLS]; - gint n_entries; gint i; if (!hand_cursor) @@ -332,11 +361,31 @@ ctree_mainbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ctree_mainbox), scrolledwin, TRUE, TRUE, 0); + + actions = gtk_action_group_new("MimeView"); + gtk_action_group_add_actions(actions, mimeview_menu_actions, + G_N_ELEMENTS(mimeview_menu_actions), (gpointer)mimeview); + gtk_ui_manager_insert_action_group(gui_manager, actions, 0); + + MENUITEM_ADDUI("/Menus/", "MimeView", "MimeView", GTK_UI_MANAGER_MENU); + MENUITEM_ADDUI("/Menus/MimeView/", "Open", "MimeView/Open", + GTK_UI_MANAGER_MENUITEM); +#ifndef MAEMO + MENUITEM_ADDUI("/Menus/MimeView/", "OpenWith", "MimeView/OpenWith", + GTK_UI_MANAGER_MENUITEM); +#endif + MENUITEM_ADDUI("/Menus/MimeView/", "DisplayAsText", "MimeView/DisplayAsText", + GTK_UI_MANAGER_MENUITEM); + MENUITEM_ADDUI("/Menus/MimeView/", "SaveAs", "MimeView/SaveAs", + GTK_UI_MANAGER_MENUITEM); + MENUITEM_ADDUI("/Menus/MimeView/", "SaveAll", "MimeView/SaveAll", + GTK_UI_MANAGER_MENUITEM); + MENUITEM_ADDUI("/Menus/MimeView/", "NextPart", "MimeView/NextPart", + GTK_UI_MANAGER_MENUITEM); + + popupmenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( + gtk_ui_manager_get_widget(gui_manager, "/Menus/MimeView")) ); - n_entries = sizeof(mimeview_popup_entries) / - sizeof(mimeview_popup_entries[0]); - popupmenu = menu_create_items(mimeview_popup_entries, n_entries, - "<MimeView>", &popupfactory, mimeview); tooltips = gtk_tooltips_new(); vbox = gtk_vbox_new(FALSE, 0); @@ -368,7 +417,6 @@ mimeview->ctree = ctree; mimeview->mime_notebook = mime_notebook; mimeview->popupmenu = popupmenu; - mimeview->popupfactory = popupfactory; mimeview->type = -1; mimeview->ctree_mainbox = ctree_mainbox; mimeview->icon_scroll = icon_scroll; @@ -1261,19 +1309,15 @@ if (partinfo && (partinfo->type == MIMETYPE_MESSAGE || partinfo->type == MIMETYPE_IMAGE || partinfo->type == MIMETYPE_MULTIPART)) - menu_set_sensitive(mimeview->popupfactory, - "/Display as text (t)", FALSE); + cm_menu_set_sensitive("MimeView/DisplayAsText", FALSE); else - menu_set_sensitive(mimeview->popupfactory, - "/Display as text (t)", TRUE); + cm_menu_set_sensitive("MimeView/DisplayAsText", TRUE); if (partinfo && partinfo->type == MIMETYPE_APPLICATION && !g_ascii_strcasecmp(partinfo->subtype, "octet-stream")) - menu_set_sensitive(mimeview->popupfactory, - "/Open (l)", FALSE); + cm_menu_set_sensitive("MimeView/Open", FALSE); else - menu_set_sensitive(mimeview->popupfactory, - "/Open (l)", TRUE); + cm_menu_set_sensitive("MimeView/Open", TRUE); g_object_set_data(G_OBJECT(mimeview->popupmenu), "pop_partinfo", partinfo); Index: src/gtk/menu.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/menu.c,v retrieving revision 1.5.2.28 diff -u -B -r1.5.2.28 menu.c --- src/gtk/menu.c 2008/05/07 08:18:23 1.5.2.28 +++ src/gtk/menu.c 2008/07/17 19:30:49 @@ -44,6 +44,8 @@ #include <gtk/gtkmain.h> #endif +extern GtkUIManager *gui_manager; + static void connect_accel_change_signals(GtkWidget* widget, GtkWidget *wid2) ; @@ -102,6 +104,24 @@ g_return_if_fail(widget != NULL); gtk_widget_set_sensitive(widget, sensitive); +} + +void cm_menu_set_sensitive(gchar *menu, gboolean sensitive) +{ + GtkWidget *widget; + gchar *path = g_strdup_printf("/Menus/%s/", menu); + + widget = gtk_ui_manager_get_widget(gui_manager, path); + if( !GTK_IS_WIDGET(widget) ) { + g_message("Blah, '%s' is not a widget.\n", path); + } + + if( !GTK_IS_MENU_ITEM(widget) ) { + g_message("Blah, '%s' is not a menu item.\n", path); + } + + gtk_widget_set_sensitive(widget, sensitive); + g_free(path); } void menu_set_sensitive_all(GtkMenuShell *menu_shell, gboolean sensitive) Index: src/gtk/menu.h =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/menu.h,v retrieving revision 1.4.2.12 diff -u -B -r1.4.2.12 menu.h --- src/gtk/menu.h 2007/10/15 17:20:01 1.4.2.12 +++ src/gtk/menu.h 2008/07/17 19:30:49 @@ -46,6 +46,11 @@ GINT_TO_POINTER(data)); \ } +#define MENUITEM_ADDUI(path, name, action, type) \ + gtk_ui_manager_add_ui(gui_manager, \ + gtk_ui_manager_new_merge_id(gui_manager), \ + path, name, action, type, FALSE); + #define menu_set_insensitive_all(menu_shell) \ menu_set_sensitive_all(menu_shell, FALSE); @@ -64,6 +69,8 @@ void menu_set_sensitive (GtkItemFactory *ifactory, const gchar *path, gboolean sensitive); + +void cm_menu_set_sensitive(gchar *menu, gboolean sensitive); void menu_set_active (GtkItemFactory *ifactory, const gchar *path, |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On 17 July 2008 at 22h07, Andrej Kacian wrote:
Hi, > +extern GtkUIManager *gui_manager; Would be nice to have a creator and getter in gtk/gtkutils.[ch] :) -- Colin |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On Fri, 18 Jul 2008 11:36:40 +0200
Colin Leroy <colin@...> wrote: > On 17 July 2008 at 22h07, Andrej Kacian wrote: > > Hi, > > > +extern GtkUIManager *gui_manager; > > Would be nice to have a creator and getter in gtk/gtkutils.[ch] :) See attached patch. I couldn't decide whether to declare gui_manager variable in main.c (along with many other globals) or gtkutils.c (where no globals are declared so far). I went for the former, and had to declare it as extern again in gtkutils.c, since that's where we work with it. Any suggestions? -- Andrej Kacian <andrej at kacian dot sk> [claws-mail-uimanager-proof-of-concept.noxml.v3.diff] ? editaddress_other_combobox.patch ? folder_special_icons.patch Index: src/edittags.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/Attic/edittags.c,v retrieving revision 1.1.2.16 diff -u -B -r1.1.2.16 edittags.c --- src/edittags.c 2008/01/07 11:33:23 1.1.2.16 +++ src/edittags.c 2008/07/18 20:17:55 @@ -197,10 +197,9 @@ } -static GtkItemFactory *apply_popup_factory = NULL; static GtkWidget *apply_popup_menu = NULL; -static void apply_popup_delete (void *obj, guint action, void *data) +static void apply_popup_delete (GtkAction *action, gpointer data) { GtkTreeIter sel; GtkTreeModel *model; @@ -234,7 +233,7 @@ APPLYWINDOW_UNLOCK(); } -static void apply_popup_delete_all (void *obj, guint action, void *data) +static void apply_popup_delete_all (GtkAction *action, gpointer data) { GSList *cur; GtkTreeModel *model; @@ -264,15 +263,19 @@ APPLYWINDOW_UNLOCK(); } -static GtkItemFactoryEntry apply_popup_entries[] = +static const GtkActionEntry apply_popup_actions[] = { - {N_("/_Delete"), NULL, apply_popup_delete, 0, NULL, NULL}, - {N_("/Delete _all"), NULL, apply_popup_delete_all, 0, NULL, NULL}, + { "EditTags", NULL, "EditTags" }, + { "EditTags/Delete", NULL, N_("_Delete"), NULL, "Delete tag", G_CALLBACK(apply_popup_delete) }, + { "EditTags/DeleteAll", NULL, N_("Delete _all"), NULL, "Delete all tags", G_CALLBACK(apply_popup_delete_all) } }; static gint apply_list_btn_pressed(GtkWidget *widget, GdkEventButton *event, GtkTreeView *list_view) { + GtkActionGroup *actions; + GtkUIManager *gui_manager = gtkut_ui_manager(); + if (applywindow.busy) return FALSE; @@ -282,17 +285,25 @@ gboolean non_empty; if (!apply_popup_menu) { - gint n_entries = sizeof(apply_popup_entries) / - sizeof(apply_popup_entries[0]); - apply_popup_menu = menu_create_items(apply_popup_entries, n_entries, - "<TagPopupMenu>", &apply_popup_factory, - list_view); + actions = gtk_action_group_new("EditTags"); + gtk_action_group_add_actions(actions, apply_popup_actions, + G_N_ELEMENTS(apply_popup_actions), (gpointer)list_view); + gtk_ui_manager_insert_action_group(gui_manager, actions, 0); + + MENUITEM_ADDUI("/Menus", "EditTags", "EditTags", GTK_UI_MANAGER_MENU) + MENUITEM_ADDUI("/Menus/EditTags", "Delete", "EditTags/Delete", + GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI("/Menus/EditTags", "DeleteAll", "EditTags/DeleteAll", + GTK_UI_MANAGER_MENUITEM) + + apply_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( + gtk_ui_manager_get_widget(gui_manager, "/Menus/EditTags")) ); } /* grey out popup menu items if list is empty */ non_empty = gtk_tree_model_get_iter_first(model, &iter); - menu_set_sensitive(apply_popup_factory, "/Delete", non_empty); - menu_set_sensitive(apply_popup_factory, "/Delete all", non_empty); + cm_menu_set_sensitive("EditTags/Delete", non_empty); + cm_menu_set_sensitive("EditTags/DeleteAll", non_empty); gtk_menu_popup(GTK_MENU(apply_popup_menu), NULL, NULL, NULL, NULL, @@ -464,7 +475,7 @@ { if (applywindow.busy) return; - apply_popup_delete(NULL, 0, NULL); + apply_popup_delete(NULL, NULL); gtk_widget_grab_focus(applywindow.taglist); } @@ -475,7 +486,7 @@ if (event && event->keyval == GDK_Escape) apply_window_close(); else if (event && event->keyval == GDK_Delete) - apply_popup_delete(NULL, 0, NULL); + apply_popup_delete(NULL, NULL); return FALSE; } Index: src/main.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/main.c,v retrieving revision 1.115.2.198 diff -u -B -r1.115.2.198 main.c --- src/main.c 2008/06/09 16:48:39 1.115.2.198 +++ src/main.c 2008/07/18 20:17:56 @@ -112,6 +112,7 @@ #include "matcher.h" #include "tags.h" #include "hooks.h" +#include "menu.h" #ifdef HAVE_LIBETPAN #include "imap-thread.h" @@ -211,6 +212,8 @@ const gchar *target; } cmd; +GtkUIManager *gui_manager = NULL; + static void parse_cmd_opt(int argc, char *argv[]); static gint prohibit_duplicate_launch (void); @@ -1153,6 +1156,8 @@ gdk_rgb_init(); gtk_widget_set_default_colormap(gdk_rgb_get_colormap()); gtk_widget_set_default_visual(gdk_rgb_get_visual()); + + gui_manager = gtkut_init_ui_manager(); if (!g_thread_supported()) { g_error(_("g_thread is not supported by glib.\n")); Index: src/mimeview.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/mimeview.c,v retrieving revision 1.83.2.133 diff -u -B -r1.83.2.133 mimeview.c --- src/mimeview.c 2008/05/28 05:41:55 1.83.2.133 +++ src/mimeview.c 2008/07/18 20:17:57 @@ -168,20 +168,47 @@ MimeView *mimeview); static MimeInfo *mimeview_get_part_to_use(MimeView *mimeview); -static void mimeview_launch_cb(MimeView *mimeview) +static void mimeview_launch_cb(GtkAction *action, gpointer data) { + MimeView *mimeview = (MimeView *)data; mimeview_launch(mimeview, mimeview_get_part_to_use(mimeview)); +} + +static void mimeview_open_with_cb(GtkAction *action, gpointer data) +{ + mimeview_open_with((MimeView *)data); +} + +static void mimeview_display_as_text_cb(GtkAction *action, gpointer data) +{ + mimeview_display_as_text((MimeView *)data); +} + +static void mimeview_save_as_cb(GtkAction *action, gpointer data) +{ + mimeview_save_as((MimeView *)data); +} + +static void mimeview_save_all_cb(GtkAction *action, gpointer data) +{ + mimeview_save_all((MimeView *)data); } -static GtkItemFactoryEntry mimeview_popup_entries[] = + +static void mimeview_select_next_part_cb(GtkAction *action, gpointer data) { - {N_("/_Open (l)"), NULL, mimeview_launch_cb, 0, NULL}, + mimeview_select_next_part((MimeView *)data); +} + +static const GtkActionEntry mimeview_menu_actions[] = { + { "MimeView", NULL, "MimeView" }, + { "MimeView/Open", NULL, N_("_Open (l)"), NULL, "Open MIME part", G_CALLBACK(mimeview_launch_cb) }, #ifndef MAEMO - {N_("/Open _with (o)..."), NULL, mimeview_open_with, 0, NULL}, + { "MimeView/OpenWith", NULL, N_("Open _with (o)..."), NULL, "Open MIME part with...", G_CALLBACK(mimeview_open_with_cb) }, #endif - {N_("/_Display as text (t)"), NULL, mimeview_display_as_text, 0, NULL}, - {N_("/_Save as (y)..."), NULL, mimeview_save_as, 0, NULL}, - {N_("/Save _all..."), NULL, mimeview_save_all, 0, NULL}, - {N_("/Next part (a)"), NULL, mimeview_select_next_part,0, NULL}, + { "MimeView/DisplayAsText", NULL, N_("_Display as text (t)"), NULL, "Display as text", G_CALLBACK(mimeview_display_as_text_cb) }, + { "MimeView/SaveAs", NULL, N_("_Save as (y)..."), NULL, "Save as", G_CALLBACK(mimeview_save_as_cb) }, + { "MimeView/SaveAll", NULL, N_("Save _all..."), NULL, "Save all parts", G_CALLBACK(mimeview_save_all_cb) }, + { "MimeView/NextPart", NULL, N_("Next part (a)"), NULL, "Next part", G_CALLBACK(mimeview_select_next_part_cb) } }; static GtkTargetEntry mimeview_mime_types[] = @@ -237,10 +264,12 @@ GtkWidget *scrollbutton; GtkWidget *hbox; GtkTooltips *tooltips; - GtkItemFactory *popupfactory; + GtkActionGroup *actions; + + GtkUIManager *gui_manager = gtkut_ui_manager(); + NoticeView *siginfoview; gchar *titles[N_MIMEVIEW_COLS]; - gint n_entries; gint i; if (!hand_cursor) @@ -332,11 +361,31 @@ ctree_mainbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ctree_mainbox), scrolledwin, TRUE, TRUE, 0); + + actions = gtk_action_group_new("MimeView"); + gtk_action_group_add_actions(actions, mimeview_menu_actions, + G_N_ELEMENTS(mimeview_menu_actions), (gpointer)mimeview); + gtk_ui_manager_insert_action_group(gui_manager, actions, 0); + + MENUITEM_ADDUI("/Menus/", "MimeView", "MimeView", GTK_UI_MANAGER_MENU); + MENUITEM_ADDUI("/Menus/MimeView/", "Open", "MimeView/Open", + GTK_UI_MANAGER_MENUITEM); +#ifndef MAEMO + MENUITEM_ADDUI("/Menus/MimeView/", "OpenWith", "MimeView/OpenWith", + GTK_UI_MANAGER_MENUITEM); +#endif + MENUITEM_ADDUI("/Menus/MimeView/", "DisplayAsText", "MimeView/DisplayAsText", + GTK_UI_MANAGER_MENUITEM); + MENUITEM_ADDUI("/Menus/MimeView/", "SaveAs", "MimeView/SaveAs", + GTK_UI_MANAGER_MENUITEM); + MENUITEM_ADDUI("/Menus/MimeView/", "SaveAll", "MimeView/SaveAll", + GTK_UI_MANAGER_MENUITEM); + MENUITEM_ADDUI("/Menus/MimeView/", "NextPart", "MimeView/NextPart", + GTK_UI_MANAGER_MENUITEM); + + popupmenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( + gtk_ui_manager_get_widget(gui_manager, "/Menus/MimeView")) ); - n_entries = sizeof(mimeview_popup_entries) / - sizeof(mimeview_popup_entries[0]); - popupmenu = menu_create_items(mimeview_popup_entries, n_entries, - "<MimeView>", &popupfactory, mimeview); tooltips = gtk_tooltips_new(); vbox = gtk_vbox_new(FALSE, 0); @@ -368,7 +417,6 @@ mimeview->ctree = ctree; mimeview->mime_notebook = mime_notebook; mimeview->popupmenu = popupmenu; - mimeview->popupfactory = popupfactory; mimeview->type = -1; mimeview->ctree_mainbox = ctree_mainbox; mimeview->icon_scroll = icon_scroll; @@ -1261,19 +1309,15 @@ if (partinfo && (partinfo->type == MIMETYPE_MESSAGE || partinfo->type == MIMETYPE_IMAGE || partinfo->type == MIMETYPE_MULTIPART)) - menu_set_sensitive(mimeview->popupfactory, - "/Display as text (t)", FALSE); + cm_menu_set_sensitive("MimeView/DisplayAsText", FALSE); else - menu_set_sensitive(mimeview->popupfactory, - "/Display as text (t)", TRUE); + cm_menu_set_sensitive("MimeView/DisplayAsText", TRUE); if (partinfo && partinfo->type == MIMETYPE_APPLICATION && !g_ascii_strcasecmp(partinfo->subtype, "octet-stream")) - menu_set_sensitive(mimeview->popupfactory, - "/Open (l)", FALSE); + cm_menu_set_sensitive("MimeView/Open", FALSE); else - menu_set_sensitive(mimeview->popupfactory, - "/Open (l)", TRUE); + cm_menu_set_sensitive("MimeView/Open", TRUE); g_object_set_data(G_OBJECT(mimeview->popupmenu), "pop_partinfo", partinfo); Index: src/gtk/gtkutils.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/gtkutils.c,v retrieving revision 1.5.2.75 diff -u -B -r1.5.2.75 gtkutils.c --- src/gtk/gtkutils.c 2007/12/18 08:20:55 1.5.2.75 +++ src/gtk/gtkutils.c 2008/07/18 20:17:58 @@ -65,6 +65,8 @@ #include "manual.h" #include "combobox.h" +extern GtkUIManager *gui_manager; + gboolean gtkut_get_font_size(GtkWidget *widget, gint *width, gint *height) { @@ -1579,3 +1581,20 @@ return TRUE; } +GtkUIManager *gtkut_ui_manager(void) +{ + return gui_manager; +} + +GtkUIManager *gtkut_init_ui_manager(void) +{ + GtkUIManager *gui_manager = NULL; + g_return_val_if_fail(gtkut_ui_manager() == NULL, NULL); + + gui_manager = gtk_ui_manager_new(); + + /* Create container for all the menus we will be adding */ + MENUITEM_ADDUI("/", "Menus", NULL, GTK_UI_MANAGER_MENUBAR); + + return gui_manager; +} Index: src/gtk/gtkutils.h =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/gtkutils.h,v retrieving revision 1.4.2.40 diff -u -B -r1.4.2.40 gtkutils.h --- src/gtk/gtkutils.h 2007/11/10 12:42:10 1.4.2.40 +++ src/gtk/gtkutils.h 2008/07/18 20:17:59 @@ -35,6 +35,7 @@ #include <gtk/gtktextview.h> #include <gtk/gtkitemfactory.h> #include <gtk/gtktreemodel.h> +#include <gtk/gtkuimanager.h> #include <stdlib.h> #if HAVE_WCHAR_H # include <wchar.h> @@ -223,5 +224,8 @@ gint gtkut_list_view_get_selected_row(GtkWidget *list_view); gboolean gtkut_list_view_select_row(GtkWidget *list, gint row); + +GtkUIManager *gtkut_ui_manager(void); +GtkUIManager *gtkut_init_ui_manager(void); #endif /* __GTKUTILS_H__ */ Index: src/gtk/menu.c =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/menu.c,v retrieving revision 1.5.2.28 diff -u -B -r1.5.2.28 menu.c --- src/gtk/menu.c 2008/05/07 08:18:23 1.5.2.28 +++ src/gtk/menu.c 2008/07/18 20:17:59 @@ -31,9 +31,11 @@ #include <gtk/gtkitemfactory.h> #include <gtk/gtkbutton.h> #include <gtk/gtkwindow.h> +#include <gtk/gtkutils.h> #include "menu.h" #include "utils.h" +#include "gtkutils.h" #ifdef MAEMO #ifdef CHINOOK @@ -102,6 +104,25 @@ g_return_if_fail(widget != NULL); gtk_widget_set_sensitive(widget, sensitive); +} + +void cm_menu_set_sensitive(gchar *menu, gboolean sensitive) +{ + GtkUIManager *gui_manager = gtkut_ui_manager(); + GtkWidget *widget; + gchar *path = g_strdup_printf("/Menus/%s/", menu); + + widget = gtk_ui_manager_get_widget(gui_manager, path); + if( !GTK_IS_WIDGET(widget) ) { + g_message("Blah, '%s' is not a widget.\n", path); + } + + if( !GTK_IS_MENU_ITEM(widget) ) { + g_message("Blah, '%s' is not a menu item.\n", path); + } + + gtk_widget_set_sensitive(widget, sensitive); + g_free(path); } void menu_set_sensitive_all(GtkMenuShell *menu_shell, gboolean sensitive) Index: src/gtk/menu.h =================================================================== RCS file: /pack/anoncvs/sylpheedclaws/sylpheed-claws/src/gtk/menu.h,v retrieving revision 1.4.2.12 diff -u -B -r1.4.2.12 menu.h --- src/gtk/menu.h 2007/10/15 17:20:01 1.4.2.12 +++ src/gtk/menu.h 2008/07/18 20:17:59 @@ -46,6 +46,11 @@ GINT_TO_POINTER(data)); \ } +#define MENUITEM_ADDUI(path, name, action, type) \ + gtk_ui_manager_add_ui(gui_manager, \ + gtk_ui_manager_new_merge_id(gui_manager), \ + path, name, action, type, FALSE); + #define menu_set_insensitive_all(menu_shell) \ menu_set_sensitive_all(menu_shell, FALSE); @@ -64,6 +69,8 @@ void menu_set_sensitive (GtkItemFactory *ifactory, const gchar *path, gboolean sensitive); + +void cm_menu_set_sensitive(gchar *menu, gboolean sensitive); void menu_set_active (GtkItemFactory *ifactory, const gchar *path, |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On 18 July 2008 at 23h07, Andrej Kacian wrote:
Hi, > See attached patch. I couldn't decide whether to declare gui_manager > variable in main.c (along with many other globals) or gtkutils.c > (where no globals are declared so far). I went for the former, and > had to declare it as extern again in gtkutils.c, since that's where > we work with it. Any suggestions? Why not :) but I was thinking about static GtkUIManager *mgr = NULL; void claws_create_gui_manager(void) { if (!mgr) mgr = gtk_ui_manager_new(); } GtkUIManager *claws_get_gui_manager(void) { return mgr; } -- Colin |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On Sat, 19 Jul 2008 11:48:20 +0200
Colin Leroy <colin@...> wrote: > > Why not :) but I was thinking about > > static GtkUIManager *mgr = NULL; > void claws_create_gui_manager(void) { > if (!mgr) > mgr = gtk_ui_manager_new(); > } > GtkUIManager *claws_get_gui_manager(void) { > return mgr; > } > static GtkUIManager *mgr = NULL; GtkUIManager *claws_get_gui_manager(void) { if (!mgr) mgr = gtk_ui_manager_new(); return mgr; } -- Hilsen/Regards Michael Rasmussen Get my public GnuPG keys: michael <at> rasmussen <dot> cc http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xD3C9A00E mir <at> datanom <dot> net http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE501F51C mir <at> miras <dot> org http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917 -------------------------------------------------------------- It may or may not be worthwhile, but it still has to be done. |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On 19 July 2008 at 12h07, Michael Rasmussen wrote:
Hi, > static GtkUIManager *mgr = NULL; > GtkUIManager *claws_get_gui_manager(void) { > if (!mgr) > mgr = gtk_ui_manager_new(); > return mgr; > } even better :) -- Colin |
|
|
Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)On Sat, 19 Jul 2008 12:54:20 +0200
Michael Rasmussen <mir@...> wrote: > Why not:-) > > static GtkUIManager *mgr = NULL; > GtkUIManager *claws_get_gui_manager(void) { > if (!mgr) > mgr = gtk_ui_manager_new(); > return mgr; > } Indeed, that will save us one line in main.c. Furthermore, I'd rather have CM print a warning if the function is used second time, so I prefer use of g_return_if_fail() in function above. -- Andrej Kacian <andrej at kacian dot sk> |
| Free Forum Powered by Nabble | Forum Help |