static gchar *menu_translate(const gchar *path, gpointer data);
+static void menu_item_add_accel( GtkWidget *widget, guint accel_signal_id, GtkAccelGroup *accel_group,
+ guint accel_key, GdkModifierType accel_mods, GtkAccelFlags accel_flags,
+ gpointer user_data);
+
+static void menu_item_remove_accel(GtkWidget *widget, GtkAccelGroup *accel_group,
+ guint accel_key, GdkModifierType accel_mods,
+ gpointer user_data);
+
+static void connect_accel_change_signals(GtkWidget* widget, GtkWidget *wid2) ;
+
+
GtkWidget *menubar_create(GtkWidget *window, GtkItemFactoryEntry *entries,
guint n_entries, const gchar *path, gpointer data)
{
return -1;
}
+/* call backs for accelerator changes on selected menu items */
+static void menu_item_add_accel( GtkWidget *widget, guint accel_signal_id, GtkAccelGroup *accel_group,
+ guint accel_key, GdkModifierType accel_mods, GtkAccelFlags accel_flags,
+ gpointer user_data)
+{
+ GtkWidget *connected = GTK_WIDGET(user_data);
+ if (gtk_signal_n_emissions_by_name(GTK_OBJECT(widget),"add_accelerator") > 1 ) return;
+ gtk_widget_remove_accelerators(connected,"activate",FALSE);
+ /* lock _this_ widget */
+ gtk_accel_group_lock_entry(accel_group,accel_key,accel_mods);
+ /* modify the _other_ widget */
+ gtk_widget_add_accelerator(connected, "activate",
+ gtk_item_factory_from_widget(connected)->accel_group,
+ accel_key, accel_mods,
+ GTK_ACCEL_VISIBLE );
+ gtk_accel_group_unlock_entry(accel_group,accel_key,accel_mods);
+}
+
+static void menu_item_remove_accel(GtkWidget *widget, GtkAccelGroup *accel_group,
+ guint accel_key, GdkModifierType accel_mods,
+ gpointer user_data)
+{
+ GtkWidget *wid = GTK_WIDGET(user_data);
+
+ if (gtk_signal_n_emissions_by_name(GTK_OBJECT(widget),
+ "remove_accelerator") > 2 )
+ return;
+ gtk_widget_remove_accelerators(wid,"activate",FALSE);
+}
+
+static void connect_accel_change_signals(GtkWidget* widget, GtkWidget *wid2)
+{
+ gtk_signal_connect_after(GTK_OBJECT(widget), "add_accelerator",
+ menu_item_add_accel, wid2);
+ gtk_signal_connect_after(GTK_OBJECT(widget), "remove_accelerator",
+ menu_item_remove_accel, wid2);
+}
+
+void menu_connect_identical_items(void)
+{
+ gint n;
+ GtkWidget *item1;
+ GtkWidget *item2;
+
+ static const struct {
+ const gchar *path1;
+ const gchar *path2;
+ } pairs[] = {
+ {"<Main>/Message/Reply", "<SummaryView>/Reply"},
+ {"<Main>/Message/Reply to/all", "<SummaryView>/Reply to/all"},
+ {"<Main>/Message/Reply to/sender", "<SummaryView>/Reply to/sender"},
+ {"<Main>/Message/Reply to/mailing list", "<SummaryView>/Reply to/mailing list"},
+ {"<Main>/Message/Follow-up and reply to", "<SummaryView>/Follow-up and reply to"},
+ {"<Main>/Message/Forward", "<SummaryView>/Forward"},
+ {"<Main>/Message/Redirect", "<SummaryView>/Redirect"},
+ {"<Main>/Message/Re-edit", "<SummaryView>/Re-edit"},
+ {"<Main>/Message/Move...", "<SummaryView>/Move..."},
+ {"<Main>/Message/Copy...", "<SummaryView>/Copy..."},
+ {"<Main>/Message/Delete", "<SummaryView>/Delete"},
+ {"<Main>/Message/Cancel a news message", "<SummaryView>/Cancel a news message"},
+ {"<Main>/Tools/Execute", "<SummaryView>/Execute"},
+ {"<Main>/Message/Mark/Mark", "<SummaryView>/Mark/Mark"},
+ {"<Main>/Message/Mark/Unmark", "<SummaryView>/Mark/Unmark"},
+ {"<Main>/Message/Mark/Mark as unread", "<SummaryView>/Mark/Mark as unread"},
+ {"<Main>/Message/Mark/Mark as read", "<SummaryView>/Mark/Mark as read"},
+ {"<Main>/Message/Mark/Mark all read", "<SummaryView>/Mark/Mark all read"},
+ {"<Main>/Tools/Add sender to address book", "<SummaryView>/Add sender to address book"},
+ {"<Main>/Tools/Create filter rule/Automatically", "<SummaryView>/Create filter rule/Automatically"},
+ {"<Main>/Tools/Create filter rule/by From", "<SummaryView>/Create filter rule/by From"},
+ {"<Main>/Tools/Create filter rule/by To", "<SummaryView>/Create filter rule/by To"},
+ {"<Main>/Tools/Create filter rule/by Subject", "<SummaryView>/Create filter rule/by Subject"},
+ {"<Main>/View/Open in new window", "<SummaryView>/View/Open in new window"},
+ {"<Main>/View/Message source", "<SummaryView>/View/Source"},
+ {"<Main>/View/Show all headers", "<SummaryView>/View/All header"},
+ {"<Main>/File/Save as...", "<SummaryView>/Save as..."},
+ {"<Main>/File/Print...", "<SummaryView>/Print..."},
+ {"<Main>/Edit/Select all", "<SummaryView>/Select all"},
+ {"<Main>/Edit/Select thread", "<SummaryView>/Select thread"}
+ };
+
+ const gint numpairs = sizeof pairs / sizeof pairs[0];
+ for (n = 0; n < numpairs; n++) {
+ /* get widgets from the paths */
+
+ item1 = gtk_item_factory_get_widget
+ (gtk_item_factory_from_path(pairs[n].path1),pairs[n].path1);
+ item2 = gtk_item_factory_get_widget
+ (gtk_item_factory_from_path(pairs[n].path2),pairs[n].path2);
+
+ if (item1 && item2) {
+ /* connect widgets both ways around */
+ connect_accel_change_signals(item2,item1);
+ connect_accel_change_signals(item1,item2);
+ } else {
+ if (!item1) debug_print(" ** Menu item not found: %s\n",pairs[n].path1);
+ if (!item2) debug_print(" ** Menu item not found: %s\n",pairs[n].path2);
+ }
+ }
+}
+
+void menu_select_by_data(GtkMenu *menu, gpointer data)
+{
+ GList *children, *cur;
+ GtkWidget *select_item = NULL;
+
+ g_return_if_fail(menu != NULL);
+
+ children = gtk_container_children(GTK_CONTAINER(menu));
+
+ for (cur = children; cur != NULL; cur = g_list_next(cur)) {
+ GtkObject *child = GTK_OBJECT(cur->data);
+
+ if (gtk_object_get_user_data(child) == data) {
+ select_item = GTK_WIDGET(child);
+ }
+ }
+ if (select_item != NULL) {
+ gtk_menu_shell_select_item(GTK_MENU_SHELL(menu), select_item);
+ gtk_menu_shell_activate_item(GTK_MENU_SHELL(menu), select_item, FALSE);
+ }
+
+ g_list_free(children);
+}