0.8.8claws71
[claws.git] / src / gtk / menu.c
index 1fe647fa5b5977de67fac6edfa5ad6391da3e7de..6c527ef63cfcd77ad6f424aec9e78195c7ac1f5f 100644 (file)
 
 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)
 {
@@ -195,3 +206,126 @@ gint menu_find_option_menu_index(GtkOptionMenu *optmenu, 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);
+}