RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

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!)

by Andrej Kacian :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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);



signature.asc (204 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Andrej Kacian :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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.
v2 version of patch attached:

- 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,



signature.asc (204 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Colin Leroy :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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


signature.asc (196 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Andrej Kacian :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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,



signature.asc (204 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Colin Leroy :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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


signature.asc (196 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Michael Rasmussen-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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;
> }
>
Why not:-)

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.


signature.asc (204 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Colin Leroy :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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


signature.asc (196 bytes) Download Attachment

Re: RFC: Proof-of-concept patch for move from itemfactory to UI manager (the no-XML version!)

by Andrej Kacian :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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>


signature.asc (204 bytes) Download Attachment