gnome-terminal r2480 - trunk/src



Author: chpe
Date: Wed Mar 19 18:11:31 2008
New Revision: 2480
URL: http://svn.gnome.org/viewvc/gnome-terminal?rev=2480&view=rev

Log:
Handle the 'no-mnemonics' setting via GtkSetting, not by messing
with the menu items!


Modified:
   trunk/src/terminal-window.c

Modified: trunk/src/terminal-window.c
==============================================================================
--- trunk/src/terminal-window.c	(original)
+++ trunk/src/terminal-window.c	Wed Mar 19 18:11:31 2008
@@ -56,6 +56,9 @@
   TerminalScreenPopupInfo *popup_info;
   guint remove_popup_info_idle;
 
+  GtkActionGroup *new_terminal_action_group;
+  guint new_terminal_ui_id;
+
   GtkWidget *menubar;
   GtkWidget *notebook;
   guint terms;
@@ -71,8 +74,6 @@
 
   guint menubar_visible : 1;
   guint use_default_menubar_visibility : 1;
-  guint use_mnemonics : 1;   /* config key value */
-  guint using_mnemonics : 1; /* current menubar state */
 
   /* Compositing manager integration */
   guint have_argb_visual : 1;
@@ -189,10 +190,6 @@
 static void help_about_callback           (GtkAction *action,
                                            TerminalWindow *window);
 
-static void set_menuitem_text (GtkWidget  *mi,
-                               const char *text,
-                               gboolean    strip_mnemonic);
-
 static gboolean find_larger_zoom_factor  (double  current,
                                           double *found);
 static gboolean find_smaller_zoom_factor (double  current,
@@ -210,84 +207,43 @@
 /* Menubar mnemonics settings handling */
 
 static void
-menuitem_set_mnemonic (GtkBin *menu_item,
-                       gpointer data)
+mnemonics_setting_change_notify (GConfClient *client,
+                                 guint        cnxn_id,
+                                 GConfEntry  *entry,
+                                 gpointer     user_data)
 {
-  gboolean enable = GPOINTER_TO_UINT (data);
-  GtkWidget *label;
-  GtkAction *action;
-  char *text;
+  GdkScreen *screen;
+  GtkSettings *settings;
+  GConfValue *val;
 
-  if (!GTK_IS_MENU_ITEM (menu_item))
+  if (strcmp (gconf_entry_get_key (entry),
+              CONF_GLOBAL_PREFIX"/use_mnemonics") != 0)
     return;
-
-  label = gtk_bin_get_child (menu_item);
-
-  action = gtk_widget_get_action (GTK_WIDGET (menu_item));
-  g_assert (action != NULL);
-
-  g_object_get (action, "label", &text, NULL);
-  if (enable)
-    gtk_label_set_text_with_mnemonic (GTK_LABEL (label), text);
-  else
-    {
-      char *src, *dest;
-
-      src = dest = text;
-      while (*src)
-        {
-          if (*src != '_')
-            {
-              *dest = *src;
-              ++dest;
-            }
-
-          ++src;
-        }
-      *dest = '\0';
-
-      gtk_label_set_text (GTK_LABEL (label), text);
-    }
-  g_free (text);
-}
-
-static void
-mnemonics_setting_apply (TerminalWindow *window)
-{
-  TerminalWindowPrivate *priv = window->priv;
-  gboolean want_mnemonics;
-
-  want_mnemonics = priv->use_mnemonics;
-  if (want_mnemonics == priv->using_mnemonics)
+ 
+  val = gconf_entry_get_value (entry);
+  if (!val || val->type != GCONF_VALUE_BOOL)
     return;
 
-  priv->using_mnemonics = want_mnemonics;
-  gtk_container_foreach (GTK_CONTAINER (priv->menubar),
-                         (GtkCallback) menuitem_set_mnemonic,
-                         GUINT_TO_POINTER (want_mnemonics));
+  screen = GDK_SCREEN (user_data);
+  settings = gtk_settings_get_for_screen (screen);
+  g_object_set (settings,
+                "gtk-enable-mnemonics",
+                gconf_value_get_bool (val),
+                NULL);
 }
 
 static void
-mnemonics_setting_change_notify (GConfClient *client,
-                                 guint        cnxn_id,
-                                 GConfEntry  *entry,
-                                 gpointer     user_data)
+mnemonics_setting_change_destroy (GdkScreen *screen)
 {
-  GConfValue *val;
-  TerminalWindow *window = TERMINAL_WINDOW (user_data);
-  TerminalWindowPrivate *priv = window->priv;
+  GConfClient *client;
+  guint id;
 
-  val = gconf_entry_get_value (entry);
-  
-  if (strcmp (gconf_entry_get_key (entry),
-              CONF_GLOBAL_PREFIX"/use_mnemonics") == 0)
-    {      
-      if (val && val->type == GCONF_VALUE_BOOL)
-        {
-          priv->use_mnemonics = gconf_value_get_bool (val);
-          mnemonics_setting_apply (window);
-        }
-    }
+  id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (screen), "terminal-settings-connection"));
+  g_assert (id != 0);
+
+  client = gconf_client_get_default ();
+  gconf_client_notify_remove (client, id);
+  g_object_unref (client);
 }
 
 /* utility functions */
@@ -431,7 +387,6 @@
   g_list_free (profiles);
 }
 
-#if 0
 static void
 terminal_window_update_new_terminal_menus (TerminalWindow *window)
 {
@@ -499,9 +454,9 @@
 
       profile_name = escape_underscores (terminal_profile_get_visible_name (profile));
       if (n < 10) {
-        display_name = g_strdup_printf (_("_%d. %s"), i, profile_name);
+        display_name = g_strdup_printf (_("_%d. %s"), n, profile_name);
       } else if (n < 36) {
-        display_name = g_strdup_printf (_("_%c. %s"), ('A' + i - 10), profile_name);
+        display_name = g_strdup_printf (_("_%c. %s"), ('A' + n - 10), profile_name);
       } else {
         display_name = profile_name;
         profile_name = NULL;
@@ -545,7 +500,6 @@
 
   g_list_free (profiles);
 }
-#endif
 
 static void
 fill_in_new_term_submenu_real(GtkWidget *menuitem, 
@@ -1184,6 +1138,10 @@
   g_signal_connect (popup_menu, "deactivate",
                     G_CALLBACK (popup_menu_deactivate_callback), window);
 
+  /* Pseudo activation of the popup menu's action */
+  action = gtk_action_group_get_action (priv->action_group, "Popup");
+  gtk_action_activate (action);
+
   gtk_menu_popup (GTK_MENU (popup_menu),
                   NULL, NULL,
                   NULL, NULL, 
@@ -1274,20 +1232,57 @@
 }
 
 static void
-terminal_window_init (TerminalWindow *window)
+terminal_window_settings_update (GtkWidget *widget)
 {
-  TerminalWindowPrivate *priv;
-  GtkActionGroup *action_group;
-  GtkAction *action;
-  GtkUIManager *manager;
-  GtkWidget *main_vbox;
-
-  GtkWidget *mi;
-  GtkWidget *menu;
-  GtkAccelGroup *accel_group;
-  GError *error;
+  GdkScreen *screen;
+  GConfClient *client;
   gboolean use_mnemonics;
+  guint id;
+
+  if (!gtk_widget_has_screen (widget))
+    return;
+
+  screen = gtk_widget_get_screen (widget);
+  if (0 != GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (screen), "terminal-settings-connection")))
+    return;
+
+  client = gconf_client_get_default ();
+  id = gconf_client_notify_add (client,
+                                CONF_GLOBAL_PREFIX "/use_mnemonics",
+                                mnemonics_setting_change_notify,
+                                screen,
+                                NULL, NULL);
+  g_object_set_data_full (G_OBJECT (screen), "terminal-settings-connection",
+                          GUINT_TO_POINTER (id),
+                          (GDestroyNotify) mnemonics_setting_change_destroy);
+
+  use_mnemonics = gconf_client_get_bool (client,
+                                          CONF_GLOBAL_PREFIX "/use_mnemonics",
+                                          NULL);
+  g_object_unref (client);
+
+  g_object_set (gtk_settings_get_for_screen (screen),
+                "gtk-enable-mnemonics",
+                use_mnemonics,
+                NULL);
+}
+
+static void
+terminal_window_screen_changed (GtkWidget *widget,
+                                GdkScreen *previous_screen)
+{
+  void (* screen_changed) (GtkWidget *, GdkScreen *) =
+    GTK_WIDGET_CLASS (terminal_window_parent_class)->screen_changed;
 
+  if (screen_changed)
+    screen_changed (widget, previous_screen);
+
+  terminal_window_settings_update (widget);
+}
+
+static void
+terminal_window_init (TerminalWindow *window)
+{
   const GtkActionEntry menu_entries[] =
     {
       /* Toplevel */
@@ -1297,6 +1292,7 @@
       { "Terminal", NULL, N_("_Terminal") },
       { "Tabs", NULL, N_("_Tabs") },
       { "Help", NULL, N_("_Help") },
+      { "Popup", NULL, NULL },
 
       /* File menu */
       { "FileNewWindow", STOCK_NEW_WINDOW, N_("Open _Terminal"), NULL,
@@ -1432,6 +1428,16 @@
         G_CALLBACK (view_fullscreen_toggled_callback),
         FALSE }
     };
+  TerminalWindowPrivate *priv;
+  GtkActionGroup *action_group;
+  GtkAction *action;
+  GtkUIManager *manager;
+  GtkWidget *main_vbox;
+  GtkWidget *mi;
+  GtkWidget *menu;
+  GtkAccelGroup *accel_group;
+  GError *error;
+
 
   priv = window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, TERMINAL_TYPE_WINDOW, TerminalWindowPrivate);
 
@@ -1475,26 +1481,6 @@
   
   priv->conf = gconf_client_get_default ();
 
-  priv->notify_id =
-    gconf_client_notify_add (priv->conf,
-                             CONF_GLOBAL_PREFIX,
-                             mnemonics_setting_change_notify,
-                             window,
-                             NULL, NULL);
-  error = NULL;
-  use_mnemonics = gconf_client_get_bool (priv->conf,
-                                         CONF_GLOBAL_PREFIX"/use_mnemonics",
-                                         &error);
-  if (error)
-    {
-      g_error_free (error);
-      use_mnemonics = TRUE;
-    }
-  
-  priv->use_mnemonics = use_mnemonics;
-
-  priv->using_mnemonics = TRUE;
-
   initialize_alpha_mode (window);
 
   /* force gtk to construct its GtkClipboard; otherwise our UI is very slow the first time we need it */
@@ -1565,7 +1551,10 @@
   terminal_window_set_menubar_visible (window, TRUE);
   priv->use_default_menubar_visibility = TRUE;
 
-  mnemonics_setting_apply (window);
+  /* We have to explicitly call this, since screen-changed is NOT
+   * emitted for the toplevel the first time!
+   */
+  terminal_window_settings_update (GTK_WIDGET (window));
 }
 
 static void
@@ -1577,8 +1566,10 @@
   object_class->finalize = terminal_window_finalize;
   object_class->dispose = terminal_window_dispose;
 
+  g_print ("window class init\n");
   widget_class->show = terminal_window_show;
   widget_class->window_state_event = terminal_window_state_event;
+  widget_class->screen_changed = terminal_window_screen_changed;
 
   g_type_class_add_private (object_class, sizeof (TerminalWindowPrivate));
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]