Blob Blame History Raw
From 2c8f75ba308c1f7a65437aae4d429b2d984c80b4 Mon Sep 17 00:00:00 2001
From: Igor <f2404@yandex.ru>
Date: Wed, 2 Nov 2016 17:58:19 +0300
Subject: Hide TerminalWindow class internals into a private struct


diff --git a/terminal/terminal-app.c b/terminal/terminal-app.c
index b9b2497..a8b433d 100644
--- a/terminal/terminal-app.c
+++ b/terminal/terminal-app.c
@@ -821,8 +821,7 @@ terminal_app_open_window (TerminalApp        *app,
               if (G_LIKELY (active_terminal != NULL))
                 {
                   /* save window geometry to prevent overriding */
-                  TERMINAL_WINDOW (window)->grid_height = height;
-                  TERMINAL_WINDOW (window)->grid_width = width;
+                  terminal_window_set_grid_size (TERMINAL_WINDOW (window), width, height);
 
                   terminal_screen_force_resize_window (active_terminal, GTK_WINDOW (window),
                                                        width, height);
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index 063ef76..3028b5a 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -220,6 +220,39 @@ static void         terminal_window_tab_info_free                 (TerminalWindo
 
 
 
+struct _TerminalWindowPrivate
+{
+  GtkUIManager   *ui_manager;
+
+  guint           tabs_menu_merge_id;
+  GSList         *tabs_menu_actions;
+
+  GtkWidget      *search_dialog;
+  GtkWidget      *title_dialog;
+
+  /* pushed size of screen */
+  glong           grid_width;
+  glong           grid_height;
+
+  GtkAction      *encoding_action;
+
+  TerminalScreen *active;
+
+  /* cached actions to avoid lookups */
+  GtkAction      *action_undo_close_tab;
+  GtkAction      *action_detach_tab;
+  GtkAction      *action_close_other_tabs;
+  GtkAction      *action_prev_tab;
+  GtkAction      *action_next_tab;
+  GtkAction      *action_move_tab_left;
+  GtkAction      *action_move_tab_right;
+  GtkAction      *action_copy;
+  GtkAction      *action_search_next;
+  GtkAction      *action_search_prev;
+
+  GQueue         *closed_tabs_list;
+};
+
 static guint   window_signals[LAST_SIGNAL];
 static gchar   *window_notebook_group = PACKAGE_NAME;
 static GQuark  tabs_menu_action_quark = 0;
@@ -320,6 +353,8 @@ terminal_window_class_init (TerminalWindowClass *klass)
                   G_TYPE_OBJECT,
                   G_TYPE_INT, G_TYPE_INT);
 
+  g_type_class_add_private (gobject_class, sizeof (TerminalWindowPrivate));
+
   /* initialize quark */
   tabs_menu_action_quark = g_quark_from_static_string ("tabs-menu-item");
 }
@@ -335,11 +370,13 @@ terminal_window_init (TerminalWindow *window)
   GdkVisual       *visual;
   GtkStyleContext *context;
 
+  window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, TERMINAL_TYPE_WINDOW, TerminalWindowPrivate);
+
   window->preferences = terminal_preferences_get ();
 
   window->font = NULL;
   window->zoom = TERMINAL_ZOOM_LEVEL_DEFAULT;
-  window->closed_tabs_list = g_queue_new ();
+  window->priv->closed_tabs_list = g_queue_new ();
 
   /* try to set the rgba colormap so vte can use real transparency */
   screen = gtk_window_get_screen (GTK_WINDOW (window));
@@ -362,11 +399,11 @@ terminal_window_init (TerminalWindow *window)
                                        G_N_ELEMENTS (toggle_action_entries),
                                        GTK_WIDGET (window));
 
-  window->ui_manager = gtk_ui_manager_new ();
-  gtk_ui_manager_insert_action_group (window->ui_manager, window->action_group, 0);
-  gtk_ui_manager_add_ui_from_string (window->ui_manager, terminal_window_ui, terminal_window_ui_length, NULL);
+  window->priv->ui_manager = gtk_ui_manager_new ();
+  gtk_ui_manager_insert_action_group (window->priv->ui_manager, window->action_group, 0);
+  gtk_ui_manager_add_ui_from_string (window->priv->ui_manager, terminal_window_ui, terminal_window_ui_length, NULL);
 
-  accel_group = gtk_ui_manager_get_accel_group (window->ui_manager);
+  accel_group = gtk_ui_manager_get_accel_group (window->priv->ui_manager);
   gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
   g_signal_connect_after (G_OBJECT (accel_group), "accel-activate",
       G_CALLBACK (terminal_window_accel_activate), window);
@@ -412,22 +449,22 @@ terminal_window_init (TerminalWindow *window)
   gtk_widget_show_all (window->vbox);
 
   /* create encoding action */
-  window->encoding_action = terminal_encoding_action_new ("set-encoding", _("Set _Encoding"));
-  gtk_action_group_add_action (window->action_group, window->encoding_action);
-  g_signal_connect (G_OBJECT (window->encoding_action), "encoding-changed",
+  window->priv->encoding_action = terminal_encoding_action_new ("set-encoding", _("Set _Encoding"));
+  gtk_action_group_add_action (window->action_group, window->priv->encoding_action);
+  g_signal_connect (G_OBJECT (window->priv->encoding_action), "encoding-changed",
       G_CALLBACK (terminal_window_action_set_encoding), window);
 
   /* cache action pointers */
-  window->action_undo_close_tab = gtk_action_group_get_action (window->action_group, "undo-close-tab");
-  window->action_detach_tab = gtk_action_group_get_action (window->action_group, "detach-tab");
-  window->action_close_other_tabs = gtk_action_group_get_action (window->action_group, "close-other-tabs");
-  window->action_prev_tab = gtk_action_group_get_action (window->action_group, "prev-tab");
-  window->action_next_tab = gtk_action_group_get_action (window->action_group, "next-tab");
-  window->action_move_tab_left = gtk_action_group_get_action (window->action_group, "move-tab-left");
-  window->action_move_tab_right = gtk_action_group_get_action (window->action_group, "move-tab-right");
-  window->action_copy = gtk_action_group_get_action (window->action_group, "copy");
-  window->action_search_next = gtk_action_group_get_action (window->action_group, "search-next");
-  window->action_search_prev = gtk_action_group_get_action (window->action_group, "search-prev");
+  window->priv->action_undo_close_tab = gtk_action_group_get_action (window->action_group, "undo-close-tab");
+  window->priv->action_detach_tab = gtk_action_group_get_action (window->action_group, "detach-tab");
+  window->priv->action_close_other_tabs = gtk_action_group_get_action (window->action_group, "close-other-tabs");
+  window->priv->action_prev_tab = gtk_action_group_get_action (window->action_group, "prev-tab");
+  window->priv->action_next_tab = gtk_action_group_get_action (window->action_group, "next-tab");
+  window->priv->action_move_tab_left = gtk_action_group_get_action (window->action_group, "move-tab-left");
+  window->priv->action_move_tab_right = gtk_action_group_get_action (window->action_group, "move-tab-right");
+  window->priv->action_copy = gtk_action_group_get_action (window->action_group, "copy");
+  window->priv->action_search_next = gtk_action_group_get_action (window->action_group, "search-next");
+  window->priv->action_search_prev = gtk_action_group_get_action (window->action_group, "search-prev");
   window->action_fullscreen = gtk_action_group_get_action (window->action_group, "fullscreen");
 
 #if defined(GDK_WINDOWING_X11)
@@ -449,13 +486,13 @@ terminal_window_finalize (GObject *object)
 
   g_object_unref (G_OBJECT (window->preferences));
   g_object_unref (G_OBJECT (window->action_group));
-  g_object_unref (G_OBJECT (window->ui_manager));
-  g_object_unref (G_OBJECT (window->encoding_action));
+  g_object_unref (G_OBJECT (window->priv->ui_manager));
+  g_object_unref (G_OBJECT (window->priv->encoding_action));
 
-  g_slist_free (window->tabs_menu_actions);
+  g_slist_free (window->priv->tabs_menu_actions);
   g_free (window->font);
-  g_queue_foreach (window->closed_tabs_list, (GFunc) terminal_window_tab_info_free, NULL);
-  g_queue_free (window->closed_tabs_list);
+  g_queue_foreach (window->priv->closed_tabs_list, (GFunc) terminal_window_tab_info_free, NULL);
+  g_queue_free (window->priv->closed_tabs_list);
 
   (*G_OBJECT_CLASS (terminal_window_parent_class)->finalize) (object);
 }
@@ -641,9 +678,9 @@ terminal_window_confirm_close (TerminalWindow *window)
         }
     }
   else if (response == GTK_RESPONSE_CLOSE
-           && window->active != NULL)
+           && window->priv->active != NULL)
     {
-      gtk_widget_destroy (GTK_WIDGET (window->active));
+      gtk_widget_destroy (GTK_WIDGET (window->priv->active));
     }
 
   gtk_widget_destroy (dialog);
@@ -658,11 +695,11 @@ terminal_window_size_push (TerminalWindow *window)
 {
   terminal_return_if_fail (TERMINAL_IS_WINDOW (window));
 
-  if (window->active != NULL)
+  if (window->priv->active != NULL)
     {
-      terminal_screen_get_size (window->active,
-                                &window->grid_width,
-                                &window->grid_height);
+      terminal_screen_get_size (window->priv->active,
+                                &window->priv->grid_width,
+                                &window->priv->grid_height);
     }
 }
 
@@ -675,11 +712,11 @@ terminal_window_size_pop (gpointer data)
 
   terminal_return_val_if_fail (TERMINAL_IS_WINDOW (window), FALSE);
 
-  if (window->active != NULL)
+  if (window->priv->active != NULL)
     {
-      terminal_window_set_size_force_grid (window, window->active,
-                                           window->grid_width,
-                                           window->grid_height);
+      terminal_window_set_size_force_grid (window, window->priv->active,
+                                           window->priv->grid_width,
+                                           window->priv->grid_height);
     }
 
   return FALSE;
@@ -714,7 +751,7 @@ terminal_window_accel_activate (GtkAccelGroup   *accel_group,
                                 GdkModifierType  accel_mods,
                                 TerminalWindow  *window)
 {
-  GtkAction   *actions[] = { window->action_prev_tab, window->action_next_tab };
+  GtkAction   *actions[] = { window->priv->action_prev_tab, window->priv->action_next_tab };
   guint        n;
   GtkAccelKey  key;
 
@@ -750,36 +787,36 @@ terminal_window_update_actions (TerminalWindow *window)
 
   /* "Detach Tab", "Close Other Tabs" and move tab actions are only sensitive
    * if we have at least two pages */
-  gtk_action_set_sensitive (window->action_detach_tab, (n_pages > 1));
-  gtk_action_set_sensitive (window->action_close_other_tabs, n_pages > 1);
-  gtk_action_set_sensitive (window->action_move_tab_left, n_pages > 1);
-  gtk_action_set_sensitive (window->action_move_tab_right, n_pages > 1);
+  gtk_action_set_sensitive (window->priv->action_detach_tab, (n_pages > 1));
+  gtk_action_set_sensitive (window->priv->action_close_other_tabs, n_pages > 1);
+  gtk_action_set_sensitive (window->priv->action_move_tab_left, n_pages > 1);
+  gtk_action_set_sensitive (window->priv->action_move_tab_right, n_pages > 1);
 
-  gtk_action_set_sensitive (window->action_undo_close_tab, !g_queue_is_empty (window->closed_tabs_list));
+  gtk_action_set_sensitive (window->priv->action_undo_close_tab, !g_queue_is_empty (window->priv->closed_tabs_list));
 
   /* update the actions for the current terminal screen */
-  if (G_LIKELY (window->active != NULL))
+  if (G_LIKELY (window->priv->active != NULL))
     {
-      page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (window->active));
+      page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (window->priv->active));
 
       g_object_get (G_OBJECT (window->preferences),
                     "misc-cycle-tabs", &cycle_tabs,
                     NULL);
 
-      gtk_action_set_sensitive (window->action_prev_tab,
+      gtk_action_set_sensitive (window->priv->action_prev_tab,
                                 (cycle_tabs && n_pages > 1) || (page_num > 0));
-      gtk_action_set_sensitive (window->action_next_tab,
+      gtk_action_set_sensitive (window->priv->action_next_tab,
                                 (cycle_tabs && n_pages > 1) || (page_num < n_pages - 1));
 
-      gtk_action_set_sensitive (window->action_copy,
-                                terminal_screen_has_selection (window->active));
+      gtk_action_set_sensitive (window->priv->action_copy,
+                                terminal_screen_has_selection (window->priv->active));
 
-      can_search = terminal_screen_search_has_gregex (window->active);
-      gtk_action_set_sensitive (window->action_search_next, can_search);
-      gtk_action_set_sensitive (window->action_search_prev, can_search);
+      can_search = terminal_screen_search_has_gregex (window->priv->active);
+      gtk_action_set_sensitive (window->priv->action_search_next, can_search);
+      gtk_action_set_sensitive (window->priv->action_search_prev, can_search);
 
       /* update the "Go" menu */
-      action = g_object_get_qdata (G_OBJECT (window->active), tabs_menu_action_quark);
+      action = g_object_get_qdata (G_OBJECT (window->priv->active), tabs_menu_action_quark);
       if (G_LIKELY (action != NULL))
         gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
     }
@@ -798,22 +835,22 @@ terminal_window_rebuild_tabs_menu (TerminalWindow *window)
   GSList         *lp;
   GtkAccelKey     key = {0};
 
-  if (window->tabs_menu_merge_id != 0)
+  if (window->priv->tabs_menu_merge_id != 0)
     {
       /* remove merge id */
-      gtk_ui_manager_remove_ui (window->ui_manager, window->tabs_menu_merge_id);
+      gtk_ui_manager_remove_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id);
 
       /* drop all the old accels from the action group */
-      for (lp = window->tabs_menu_actions; lp != NULL; lp = lp->next)
+      for (lp = window->priv->tabs_menu_actions; lp != NULL; lp = lp->next)
         gtk_action_group_remove_action (window->action_group, GTK_ACTION (lp->data));
 
-      g_slist_free (window->tabs_menu_actions);
-      window->tabs_menu_actions = NULL;
+      g_slist_free (window->priv->tabs_menu_actions);
+      window->priv->tabs_menu_actions = NULL;
     }
 
   /* create a new merge id */
-  window->tabs_menu_merge_id = gtk_ui_manager_new_merge_id (window->ui_manager);
-  terminal_assert (window->tabs_menu_actions == NULL);
+  window->priv->tabs_menu_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
+  terminal_assert (window->priv->tabs_menu_actions == NULL);
 
   /* walk the tabs */
   npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
@@ -840,14 +877,14 @@ terminal_window_rebuild_tabs_menu (TerminalWindow *window)
                                radio_action, g_object_unref);
 
       /* add action in the menu */
-      gtk_ui_manager_add_ui (window->ui_manager, window->tabs_menu_merge_id,
+      gtk_ui_manager_add_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id,
                              "/main-menu/tabs-menu/placeholder-tab-items",
                              name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
 
       if (npages > 1)
         {
           /* add to right-click tab menu */
-          gtk_ui_manager_add_ui (window->ui_manager, window->tabs_menu_merge_id,
+          gtk_ui_manager_add_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id,
                                  "/tab-menu/tabs-menu/placeholder-tab-items",
                                  name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
         }
@@ -858,7 +895,7 @@ terminal_window_rebuild_tabs_menu (TerminalWindow *window)
         gtk_action_set_accel_path (GTK_ACTION (radio_action), name);
 
       /* store */
-      window->tabs_menu_actions = g_slist_prepend (window->tabs_menu_actions, radio_action);
+      window->priv->tabs_menu_actions = g_slist_prepend (window->priv->tabs_menu_actions, radio_action);
     }
 }
 
@@ -881,14 +918,14 @@ terminal_window_notebook_page_switched (GtkNotebook     *notebook,
   terminal_return_if_fail (active == NULL || TERMINAL_IS_SCREEN (active));
 
   /* only update when really changed */
-  if (G_LIKELY (window->active != active))
+  if (G_LIKELY (window->priv->active != active))
     {
       /* check if we need to set the size or if this was already done
        * in the page add function */
-      was_null = (window->active == NULL);
+      was_null = (window->priv->active == NULL);
 
       /* set new active tab */
-      window->active = active;
+      window->priv->active = active;
 
       /* set the new window title */
       terminal_window_notify_title (active, NULL, window);
@@ -897,8 +934,8 @@ terminal_window_notebook_page_switched (GtkNotebook     *notebook,
       terminal_screen_reset_activity (active);
 
       /* set charset for menu */
-      encoding = terminal_screen_get_encoding (window->active);
-      terminal_encoding_action_set_charset (window->encoding_action, encoding);
+      encoding = terminal_screen_get_encoding (window->priv->active);
+      terminal_encoding_action_set_charset (window->priv->encoding_action, encoding);
 
       /* set the new geometry widget */
       if (G_LIKELY (!was_null))
@@ -951,10 +988,10 @@ terminal_window_notebook_page_added (GtkNotebook    *notebook,
   /* release to the grid size applies */
   gtk_widget_realize (GTK_WIDGET (screen));
 
-  if (G_LIKELY (window->active != NULL))
+  if (G_LIKELY (window->priv->active != NULL))
     {
       /* match the size of the active screen */
-      terminal_screen_get_size (window->active, &w, &h);
+      terminal_screen_get_size (window->priv->active, &w, &h);
       terminal_screen_set_size (screen, w, h);
 
       /* show the tabs when needed */
@@ -1021,7 +1058,7 @@ terminal_window_notebook_page_removed (GtkNotebook    *notebook,
   tab_info->working_directory = g_strdup (terminal_screen_get_working_directory (TERMINAL_SCREEN (child)));
   tab_info->custom_title = IS_STRING (terminal_screen_get_custom_title (TERMINAL_SCREEN (child))) ?
                            g_strdup (terminal_screen_get_custom_title (TERMINAL_SCREEN (child))) : NULL;
-  g_queue_push_tail (window->closed_tabs_list, tab_info);
+  g_queue_push_tail (window->priv->closed_tabs_list, tab_info);
 
   /* show the tabs when needed */
   terminal_window_notebook_show_tabs (window);
@@ -1079,7 +1116,7 @@ terminal_window_notebook_button_press_event (GtkNotebook    *notebook,
       if (event->type == GDK_2BUTTON_PRESS)
         {
           /* check if the user double-clicked on the label */
-          label = gtk_notebook_get_tab_label (notebook, GTK_WIDGET (window->active));
+          label = gtk_notebook_get_tab_label (notebook, GTK_WIDGET (window->priv->active));
           if (terminal_window_notebook_event_in_allocation (x, y, label))
             {
               terminal_window_action_set_title (NULL, window);
@@ -1116,7 +1153,7 @@ terminal_window_notebook_button_press_event (GtkNotebook    *notebook,
           gtk_notebook_set_current_page (notebook, page_num);
 
           /* show the tab menu */
-          menu = gtk_ui_manager_get_widget (window->ui_manager, "/tab-menu");
+          menu = gtk_ui_manager_get_widget (window->priv->ui_manager, "/tab-menu");
 #if GTK_CHECK_VERSION (3, 22, 0)
           gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL);
 #else
@@ -1140,8 +1177,8 @@ terminal_window_notebook_button_release_event (GtkNotebook    *notebook,
   terminal_return_val_if_fail (TERMINAL_IS_WINDOW (window), FALSE);
   terminal_return_val_if_fail (GTK_IS_NOTEBOOK (notebook), FALSE);
 
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_focus (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_focus (window->priv->active);
 
   return FALSE;
 }
@@ -1281,7 +1318,7 @@ terminal_window_notebook_drag_data_received (GtkWidget        *widget,
 
           /* erase last closed tabs entry from the original window as we don't want it on DND */
           orig_window = TERMINAL_WINDOW (gtk_widget_get_toplevel (notebook));
-          tab_info = g_queue_pop_tail (orig_window->closed_tabs_list);
+          tab_info = g_queue_pop_tail (orig_window->priv->closed_tabs_list);
           terminal_window_tab_info_free (tab_info);
           /* and update action to make the undo action inactive */
           terminal_window_update_actions (orig_window);
@@ -1335,7 +1372,7 @@ terminal_window_notebook_create_window (GtkNotebook    *notebook,
       g_object_unref (G_OBJECT (screen));
 
       /* erase last closed tabs entry as we don't want it on detach */
-      tab_info = g_queue_pop_tail (window->closed_tabs_list);
+      tab_info = g_queue_pop_tail (window->priv->closed_tabs_list);
       terminal_window_tab_info_free (tab_info);
       /* and update action to make the undo action inactive */
       terminal_window_update_actions (window);
@@ -1352,8 +1389,8 @@ terminal_window_get_context_menu (TerminalScreen  *screen,
 {
   GtkWidget *popup = NULL;
 
-  if (G_LIKELY (screen == window->active))
-    popup = gtk_ui_manager_get_widget (window->ui_manager, "/popup-menu");
+  if (G_LIKELY (screen == window->priv->active))
+    popup = gtk_ui_manager_get_widget (window->priv->ui_manager, "/popup-menu");
 
   return popup;
 }
@@ -1368,9 +1405,9 @@ terminal_window_notify_title (TerminalScreen *screen,
   gchar *title;
 
   /* update window title */
-  if (screen == window->active)
+  if (screen == window->priv->active)
     {
-      title = terminal_screen_get_title (window->active);
+      title = terminal_screen_get_title (window->priv->active);
       gtk_window_set_title (GTK_WINDOW (window), title);
       g_free (title);
     }
@@ -1385,13 +1422,13 @@ terminal_window_action_set_encoding (GtkAction      *action,
 {
   const gchar *new;
 
-  if (G_LIKELY (window->active != NULL))
+  if (G_LIKELY (window->priv->active != NULL))
     {
       /* set the charset */
-      terminal_screen_set_encoding (window->active, charset);
+      terminal_screen_set_encoding (window->priv->active, charset);
 
       /* update menu */
-      new = terminal_screen_get_encoding (window->active);
+      new = terminal_screen_get_encoding (window->priv->active);
       terminal_encoding_action_set_charset (action, new);
     }
 }
@@ -1411,8 +1448,8 @@ terminal_window_action_new_tab (GtkAction      *action,
 
   if (g_strcmp0 (default_dir, "") != 0)
     directory = default_dir;
-  else if (G_LIKELY (window->active != NULL))
-    directory = terminal_screen_get_working_directory (window->active);
+  else if (G_LIKELY (window->priv->active != NULL))
+    directory = terminal_screen_get_working_directory (window->priv->active);
 
   if (directory != NULL)
     terminal_screen_set_working_directory (terminal, directory);
@@ -1436,8 +1473,8 @@ terminal_window_action_new_window (GtkAction      *action,
 
   if (g_strcmp0 (default_dir, "") != 0)
     directory = default_dir;
-  else if (G_LIKELY (window->active != NULL))
-    directory = terminal_screen_get_working_directory (window->active);
+  else if (G_LIKELY (window->priv->active != NULL))
+    directory = terminal_screen_get_working_directory (window->priv->active);
 
   if (directory != NULL)
     g_signal_emit (G_OBJECT (window), window_signals[NEW_WINDOW], 0, directory);
@@ -1456,10 +1493,10 @@ terminal_window_action_undo_close_tab (GtkAction      *action,
 
   terminal = g_object_new (TERMINAL_TYPE_SCREEN, NULL);
 
-  if (G_LIKELY (!g_queue_is_empty (window->closed_tabs_list)))
+  if (G_LIKELY (!g_queue_is_empty (window->priv->closed_tabs_list)))
     {
       /* get info on the last closed tab and remove it from the list */
-      tab_info = g_queue_pop_tail (window->closed_tabs_list);
+      tab_info = g_queue_pop_tail (window->priv->closed_tabs_list);
 
       /* set info to the new tab */
       terminal_window_add (window, TERMINAL_SCREEN (terminal));
@@ -1484,9 +1521,9 @@ static void
 terminal_window_action_detach_tab (GtkAction      *action,
                                    TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
+  if (G_LIKELY (window->priv->active != NULL))
     terminal_window_notebook_create_window (GTK_NOTEBOOK (window->notebook),
-                                            GTK_WIDGET (window->active),
+                                            GTK_WIDGET (window->priv->active),
                                             -1, -1, window);
 }
 
@@ -1496,8 +1533,8 @@ static void
 terminal_window_action_close_tab (GtkAction      *action,
                                   TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    gtk_widget_destroy (GTK_WIDGET (window->active));
+  if (G_LIKELY (window->priv->active != NULL))
+    gtk_widget_destroy (GTK_WIDGET (window->priv->active));
 }
 
 
@@ -1536,8 +1573,8 @@ static void
 terminal_window_action_copy (GtkAction      *action,
                              TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_copy_clipboard (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_copy_clipboard (window->priv->active);
 }
 
 
@@ -1546,8 +1583,8 @@ static void
 terminal_window_action_paste (GtkAction      *action,
                               TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_paste_clipboard (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_paste_clipboard (window->priv->active);
 }
 
 
@@ -1556,8 +1593,8 @@ static void
 terminal_window_action_paste_selection (GtkAction      *action,
                                         TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_paste_primary (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_paste_primary (window->priv->active);
 }
 
 
@@ -1566,8 +1603,8 @@ static void
 terminal_window_action_select_all (GtkAction      *action,
                                    TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_select_all (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_select_all (window->priv->active);
 }
 
 
@@ -1615,7 +1652,7 @@ static void
 terminal_window_action_show_menubar (GtkToggleAction *action,
                                      TerminalWindow  *window)
 {
-  terminal_return_if_fail (GTK_IS_UI_MANAGER (window->ui_manager));
+  terminal_return_if_fail (GTK_IS_UI_MANAGER (window->priv->ui_manager));
 
   terminal_window_size_push (window);
 
@@ -1623,7 +1660,7 @@ terminal_window_action_show_menubar (GtkToggleAction *action,
     {
       if (G_LIKELY (window->menubar == NULL))
         {
-          window->menubar = gtk_ui_manager_get_widget (window->ui_manager, "/main-menu");
+          window->menubar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu");
           gtk_box_pack_start (GTK_BOX (window->vbox), window->menubar, FALSE, FALSE, 0);
           gtk_box_reorder_child (GTK_BOX (window->vbox), window->menubar, 0);
         }
@@ -1644,7 +1681,7 @@ static void
 terminal_window_action_show_toolbar (GtkToggleAction *action,
                                      TerminalWindow  *window)
 {
-  terminal_return_if_fail (GTK_IS_UI_MANAGER (window->ui_manager));
+  terminal_return_if_fail (GTK_IS_UI_MANAGER (window->priv->ui_manager));
   terminal_return_if_fail (GTK_IS_ACTION_GROUP (window->action_group));
 
   terminal_window_size_push (window);
@@ -1653,7 +1690,7 @@ terminal_window_action_show_toolbar (GtkToggleAction *action,
     {
       if (window->toolbar == NULL)
         {
-          window->toolbar = gtk_ui_manager_get_widget (window->ui_manager, "/main-toolbar");
+          window->toolbar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar");
           gtk_box_pack_start (GTK_BOX (window->vbox), window->toolbar, FALSE, FALSE, 0);
           gtk_box_reorder_child (GTK_BOX (window->vbox), window->toolbar, window->menubar != NULL ? 1 : 0);
         }
@@ -1698,14 +1735,14 @@ terminal_window_action_readonly (GtkToggleAction *action,
 {
   gboolean input_enabled;
 
-  terminal_return_if_fail (window->active != NULL);
+  terminal_return_if_fail (window->priv->active != NULL);
 
   input_enabled = !gtk_toggle_action_get_active (action);
   gtk_action_set_sensitive (gtk_action_group_get_action (window->action_group, "reset"),
                             input_enabled);
   gtk_action_set_sensitive (gtk_action_group_get_action (window->action_group, "reset-and-clear"),
                             input_enabled);
-  terminal_screen_set_input_enabled (window->active, input_enabled);
+  terminal_screen_set_input_enabled (window->priv->active, input_enabled);
 }
 
 
@@ -1714,7 +1751,7 @@ static void
 terminal_window_action_zoom_in (GtkAction     *action,
                                TerminalWindow *window)
 {
-  terminal_return_if_fail (window->active != NULL);
+  terminal_return_if_fail (window->priv->active != NULL);
 
   if (window->zoom < TERMINAL_ZOOM_LEVEL_MAXIMUM)
     {
@@ -1729,7 +1766,7 @@ static void
 terminal_window_action_zoom_out (GtkAction      *action,
                                  TerminalWindow *window)
 {
-  terminal_return_if_fail (window->active != NULL);
+  terminal_return_if_fail (window->priv->active != NULL);
 
   if (window->zoom > TERMINAL_ZOOM_LEVEL_MINIMUM)
     {
@@ -1744,7 +1781,7 @@ static void
 terminal_window_action_zoom_reset (GtkAction      *action,
                                    TerminalWindow *window)
 {
-  terminal_return_if_fail (window->active != NULL);
+  terminal_return_if_fail (window->priv->active != NULL);
 
   if (window->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT)
     {
@@ -1814,7 +1851,7 @@ static void
 title_dialog_close (GtkWidget      *dialog,
                     TerminalWindow *window)
 {
-  terminal_return_if_fail (window->title_dialog == dialog);
+  terminal_return_if_fail (window->priv->title_dialog == dialog);
 
   /* need for hiding on focus */
   if (window->drop_down)
@@ -1823,7 +1860,7 @@ title_dialog_close (GtkWidget      *dialog,
   /* close the dialog */
   window->n_child_windows--;
   gtk_widget_destroy (dialog);
-  window->title_dialog = NULL;
+  window->priv->title_dialog = NULL;
 }
 
 
@@ -1859,27 +1896,29 @@ terminal_window_action_set_title (GtkAction      *action,
   GtkWidget *label;
   GtkWidget *entry;
 
-  terminal_return_if_fail (window->active != NULL);
+  terminal_return_if_fail (window->priv->active != NULL);
 
-  if (window->title_dialog == NULL)
+  if (window->priv->title_dialog == NULL)
     {
-      window->title_dialog = gtk_dialog_new_with_buttons (Q_("Window Title|Set Title"),
-                                                          GTK_WINDOW (window),
-                                                          GTK_DIALOG_DESTROY_WITH_PARENT,
-                                                          NULL,
-                                                          NULL);
+      window->priv->title_dialog =
+          gtk_dialog_new_with_buttons (Q_("Window Title|Set Title"),
+                                       GTK_WINDOW (window),
+                                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                                       NULL,
+                                       NULL);
 
       /* set window height to minimum to fix huge size under wayland */
-      gtk_window_set_default_size (GTK_WINDOW (window->title_dialog), -1, 1);
+      gtk_window_set_default_size (GTK_WINDOW (window->priv->title_dialog), -1, 1);
 
       button = xfce_gtk_button_new_mixed ("window-close", _("_Close"));
       gtk_widget_set_can_default (button, TRUE);
-      gtk_dialog_add_action_widget (GTK_DIALOG (window->title_dialog), button, GTK_RESPONSE_CLOSE);
-      gtk_dialog_set_default_response (GTK_DIALOG (window->title_dialog), GTK_RESPONSE_CLOSE);
+      gtk_dialog_add_action_widget (GTK_DIALOG (window->priv->title_dialog), button, GTK_RESPONSE_CLOSE);
+      gtk_dialog_set_default_response (GTK_DIALOG (window->priv->title_dialog), GTK_RESPONSE_CLOSE);
 
       box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
       gtk_container_set_border_width (GTK_CONTAINER (box), 6);
-      gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window->title_dialog))), box, TRUE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window->priv->title_dialog))),
+                          box, TRUE, TRUE, 0);
 
       label = gtk_label_new_with_mnemonic (_("_Title:"));
       gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
@@ -1895,21 +1934,21 @@ terminal_window_action_set_title (GtkAction      *action,
       object = gtk_widget_get_accessible (entry);
       atk_object_set_description (object, _("Enter the title for the current terminal tab"));
 
-      g_object_bind_property (G_OBJECT (window->active), "custom-title",
+      g_object_bind_property (G_OBJECT (window->priv->active), "custom-title",
                               G_OBJECT (entry), "text",
                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
-      g_signal_connect (G_OBJECT (window->title_dialog), "response",
+      g_signal_connect (G_OBJECT (window->priv->title_dialog), "response",
                         G_CALLBACK (title_dialog_response), window);
-      g_signal_connect (G_OBJECT (window->title_dialog), "close",
+      g_signal_connect (G_OBJECT (window->priv->title_dialog), "close",
                         G_CALLBACK (title_dialog_close), window);
     }
 
-    if (!gtk_widget_get_visible (window->title_dialog))
+    if (!gtk_widget_get_visible (window->priv->title_dialog))
       window->n_child_windows++;
 
-    gtk_widget_show_all (window->title_dialog);
-    gtk_window_present (GTK_WINDOW (window->title_dialog));
+    gtk_widget_show_all (window->priv->title_dialog);
+    gtk_window_present (GTK_WINDOW (window->priv->title_dialog));
 }
 
 
@@ -1926,8 +1965,8 @@ terminal_window_action_search_response (GtkWidget      *dialog,
 
   terminal_return_if_fail (TERMINAL_IS_WINDOW (window));
   terminal_return_if_fail (TERMINAL_IS_SEARCH_DIALOG (dialog));
-  terminal_return_if_fail (TERMINAL_IS_SCREEN (window->active));
-  terminal_return_if_fail (window->search_dialog == dialog);
+  terminal_return_if_fail (TERMINAL_IS_SCREEN (window->priv->active));
+  terminal_return_if_fail (window->priv->search_dialog == dialog);
 
   if (response_id == TERMINAL_RESPONSE_SEARCH_NEXT
       || response_id == TERMINAL_RESPONSE_SEARCH_PREV)
@@ -1936,14 +1975,14 @@ terminal_window_action_search_response (GtkWidget      *dialog,
       if (G_LIKELY (error == NULL))
         {
           wrap_around = terminal_search_dialog_get_wrap_around (TERMINAL_SEARCH_DIALOG (dialog));
-          terminal_screen_search_set_gregex (window->active, regex, wrap_around);
+          terminal_screen_search_set_gregex (window->priv->active, regex, wrap_around);
           if (regex != NULL)
             g_regex_unref (regex);
 
           if (response_id == TERMINAL_RESPONSE_SEARCH_NEXT)
-            terminal_screen_search_find_next (window->active);
+            terminal_screen_search_find_next (window->priv->active);
           else
-            terminal_screen_search_find_previous (window->active);
+            terminal_screen_search_find_previous (window->priv->active);
         }
       else
         {
@@ -1963,9 +2002,9 @@ terminal_window_action_search_response (GtkWidget      *dialog,
     }
 
   /* update actions */
-  can_search = terminal_screen_search_has_gregex (window->active);
-  gtk_action_set_sensitive (window->action_search_next, can_search);
-  gtk_action_set_sensitive (window->action_search_prev, can_search);
+  can_search = terminal_screen_search_has_gregex (window->priv->active);
+  gtk_action_set_sensitive (window->priv->action_search_next, can_search);
+  gtk_action_set_sensitive (window->priv->action_search_prev, can_search);
 }
 
 
@@ -1974,20 +2013,20 @@ static void
 terminal_window_action_search (GtkAction      *action,
                                TerminalWindow *window)
 {
-  if (window->search_dialog == NULL)
+  if (window->priv->search_dialog == NULL)
     {
-      window->search_dialog = terminal_search_dialog_new (GTK_WINDOW (window));
-      g_signal_connect (G_OBJECT (window->search_dialog), "response",
+      window->priv->search_dialog = terminal_search_dialog_new (GTK_WINDOW (window));
+      g_signal_connect (G_OBJECT (window->priv->search_dialog), "response",
           G_CALLBACK (terminal_window_action_search_response), window);
-      g_signal_connect (G_OBJECT (window->search_dialog), "delete-event",
+      g_signal_connect (G_OBJECT (window->priv->search_dialog), "delete-event",
           G_CALLBACK (gtk_widget_hide_on_delete), NULL);
     }
 
   /* increase child counter */
-  if (!gtk_widget_get_visible (window->search_dialog))
+  if (!gtk_widget_get_visible (window->priv->search_dialog))
     window->n_child_windows++;
 
-  terminal_search_dialog_present (TERMINAL_SEARCH_DIALOG (window->search_dialog));
+  terminal_search_dialog_present (TERMINAL_SEARCH_DIALOG (window->priv->search_dialog));
 }
 
 
@@ -1996,8 +2035,8 @@ static void
 terminal_window_action_search_next (GtkAction      *action,
                                     TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_search_find_next (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_search_find_next (window->priv->active);
 }
 
 
@@ -2006,8 +2045,8 @@ static void
 terminal_window_action_search_prev (GtkAction      *action,
                                     TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_search_find_previous (window->active);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_search_find_previous (window->priv->active);
 }
 
 
@@ -2023,7 +2062,7 @@ terminal_window_action_save_contents (GtkAction      *action,
   gchar         *filename_uri;
   gint           response;
 
-  terminal_return_if_fail (window->active != NULL);
+  terminal_return_if_fail (window->priv->active != NULL);
 
   dialog = gtk_file_chooser_dialog_new (_("Save contents..."),
                                         GTK_WINDOW (window),
@@ -2035,7 +2074,7 @@ terminal_window_action_save_contents (GtkAction      *action,
 
   /* save to current working directory */
   gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
-                                       terminal_screen_get_working_directory (TERMINAL_SCREEN (window->active)));
+                                       terminal_screen_get_working_directory (TERMINAL_SCREEN (window->priv->active)));
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
   gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
@@ -2060,7 +2099,7 @@ terminal_window_action_save_contents (GtkAction      *action,
   stream = G_OUTPUT_STREAM (g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error));
   if (stream)
     {
-      terminal_screen_save_contents (TERMINAL_SCREEN (window->active), stream, error);
+      terminal_screen_save_contents (TERMINAL_SCREEN (window->priv->active), stream, error);
       g_object_unref (stream);
     }
 
@@ -2080,8 +2119,8 @@ static void
 terminal_window_action_reset (GtkAction      *action,
                               TerminalWindow *window)
 {
-  if (G_LIKELY (window->active != NULL))
-    terminal_screen_reset (window->active, FALSE);
+  if (G_LIKELY (window->priv->active != NULL))
+    terminal_screen_reset (window->priv->active, FALSE);
 }
 
 
@@ -2090,9 +2129,9 @@ static void
 terminal_window_action_reset_and_clear (GtkAction       *action,
                                         TerminalWindow  *window)
 {
-  if (G_LIKELY (window->active != NULL))
+  if (G_LIKELY (window->priv->active != NULL))
     {
-      terminal_screen_reset (window->active, TRUE);
+      terminal_screen_reset (window->priv->active, TRUE);
       terminal_window_update_actions (window);
     }
 }
@@ -2322,7 +2361,7 @@ TerminalScreen *
 terminal_window_get_active (TerminalWindow *window)
 {
   terminal_return_val_if_fail (TERMINAL_IS_WINDOW (window), NULL);
-  return window->active;
+  return window->priv->active;
 }
 
 
@@ -2383,9 +2422,9 @@ terminal_window_get_restart_command (TerminalWindow *window)
 
   terminal_return_val_if_fail (TERMINAL_IS_WINDOW (window), NULL);
 
-  if (G_LIKELY (window->active != NULL))
+  if (G_LIKELY (window->priv->active != NULL))
     {
-      terminal_screen_get_size (window->active, &w, &h);
+      terminal_screen_get_size (window->priv->active, &w, &h);
       result = g_slist_prepend (result, g_strdup_printf ("--geometry=%ldx%ld", w, h));
     }
 
@@ -2438,3 +2477,19 @@ terminal_window_get_restart_command (TerminalWindow *window)
 
   return g_slist_reverse (result);
 }
+
+
+/**
+ * terminal_window_set_grid_size:
+ * @window  : A #TerminalWindow.
+ * @width   : Window width.
+ * @height  : Window height.
+ **/
+void
+terminal_window_set_grid_size (TerminalWindow *window,
+                               glong           width,
+                               glong           height)
+{
+  window->priv->grid_width = width;
+  window->priv->grid_height = height;
+}
diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h
index 32dd86a..650e5be 100644
--- a/terminal/terminal-window.h
+++ b/terminal/terminal-window.h
@@ -33,6 +33,8 @@ G_BEGIN_DECLS
 #define TERMINAL_IS_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TERMINAL_TYPE_WINDOW))
 #define TERMINAL_WINDOW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TERMINAL_TYPE_WINDOW, TerminalWindowClass))
 
+typedef struct _TerminalWindowPrivate TerminalWindowPrivate;
+
 typedef struct
 {
   GtkWindowClass parent_class;
@@ -40,58 +42,32 @@ typedef struct
 
 typedef struct
 {
-  GtkWindow            parent_instance;
+  GtkWindow              parent_instance;
+
+  TerminalWindowPrivate *priv;
 
   /* if this is a TerminalWindowDropdown */
-  guint                drop_down : 1;
+  guint                  drop_down : 1;
 
   /* for the drop-down to keep open with dialogs */
-  guint                n_child_windows;
-
-  TerminalPreferences *preferences;
-  GtkWidget           *preferences_dialog;
-
-  GtkActionGroup      *action_group;
-  GtkUIManager        *ui_manager;
-
-  guint                tabs_menu_merge_id;
-  GSList              *tabs_menu_actions;
+  guint                  n_child_windows;
 
-  GtkWidget           *vbox;
-  GtkWidget           *menubar;
-  GtkWidget           *toolbar;
-  GtkWidget           *notebook;
+  TerminalPreferences   *preferences;
+  GtkWidget             *preferences_dialog;
 
-  GtkWidget           *search_dialog;
-  GtkWidget           *title_dialog;
+  GtkActionGroup        *action_group;
 
-  /* pushed size of screen */
-  glong                grid_width;
-  glong                grid_height;
+  GtkWidget             *vbox;
+  GtkWidget             *menubar;
+  GtkWidget             *toolbar;
+  GtkWidget             *notebook;
 
-  gchar               *font;
-  TerminalZoomLevel    zoom;
+  gchar                 *font;
+  TerminalZoomLevel      zoom;
 
-  GtkAction           *encoding_action;
+  GtkAction             *action_fullscreen;
 
-  TerminalScreen      *active;
-
-  /* cached actions to avoid lookups */
-  GtkAction           *action_undo_close_tab;
-  GtkAction           *action_detach_tab;
-  GtkAction           *action_close_other_tabs;
-  GtkAction           *action_prev_tab;
-  GtkAction           *action_next_tab;
-  GtkAction           *action_move_tab_left;
-  GtkAction           *action_move_tab_right;
-  GtkAction           *action_copy;
-  GtkAction           *action_search_next;
-  GtkAction           *action_search_prev;
-  GtkAction           *action_fullscreen;
-
-  GQueue              *closed_tabs_list;
-
-  TerminalVisibility   scrollbar_visibility;
+  TerminalVisibility     scrollbar_visibility;
 } TerminalWindow;
 
 GType           terminal_window_get_type            (void) G_GNUC_CONST;
@@ -111,6 +87,10 @@ void            terminal_window_notebook_show_tabs  (TerminalWindow     *window)
 
 GSList         *terminal_window_get_restart_command (TerminalWindow     *window);
 
+void            terminal_window_set_grid_size       (TerminalWindow     *window,
+                                                     glong               width,
+                                                     glong               height);
+
 G_END_DECLS
 
 #endif /* !TERMINAL_WINDOW_H */
-- 
cgit v0.10.1

From b74658ec81273d77e9ee021ccb8ec4a538dc8a2e Mon Sep 17 00:00:00 2001
From: Igor <f2404@yandex.ru>
Date: Thu, 3 Nov 2016 15:03:44 +0300
Subject: Continue moving TerminalWindow members to private struct


diff --git a/terminal/terminal-window-dropdown.c b/terminal/terminal-window-dropdown.c
index bea130c..3088789 100644
--- a/terminal/terminal-window-dropdown.c
+++ b/terminal/terminal-window-dropdown.c
@@ -240,7 +240,7 @@ terminal_window_dropdown_init (TerminalWindowDropdown *dropdown)
 
   /* adjust notebook for drop-down usage */
   gtk_notebook_set_tab_pos (GTK_NOTEBOOK (window->notebook), GTK_POS_BOTTOM);
-  g_object_get (G_OBJECT (window->preferences), "misc-borders-default", &show_borders, NULL);
+  g_object_get (terminal_window_get_preferences (window), "misc-borders-default", &show_borders, NULL);
   gtk_notebook_set_show_border (GTK_NOTEBOOK (window->notebook), show_borders);
   terminal_window_notebook_show_tabs (window);
 
@@ -262,7 +262,7 @@ terminal_window_dropdown_init (TerminalWindowDropdown *dropdown)
   gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE);
 #endif
 
-  g_object_get (G_OBJECT (window->preferences), "dropdown-keep-open-default", &keep_open, NULL);
+  g_object_get (terminal_window_get_preferences (window), "dropdown-keep-open-default", &keep_open, NULL);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), keep_open);
 
   img = gtk_image_new_from_icon_name ("go-bottom", GTK_ICON_SIZE_MENU);
@@ -289,7 +289,7 @@ terminal_window_dropdown_init (TerminalWindowDropdown *dropdown)
   for (n = 1; n < N_PROPERTIES; n++)
     {
       name = g_param_spec_get_name (dropdown_props[n]);
-      g_object_bind_property (G_OBJECT (window->preferences), name,
+      g_object_bind_property (terminal_window_get_preferences (window), name,
                               G_OBJECT (dropdown), name,
                               G_BINDING_SYNC_CREATE);
     }
@@ -357,8 +357,8 @@ terminal_window_dropdown_set_property (GObject      *object,
 
     case PROP_DROPDOWN_KEEP_ABOVE:
       gtk_window_set_keep_above (GTK_WINDOW (dropdown), g_value_get_boolean (value));
-      if (window->preferences_dialog != NULL)
-        terminal_util_activate_window (GTK_WINDOW (window->preferences_dialog));
+      if (terminal_window_get_preferences_dialog (window) != NULL)
+        terminal_util_activate_window (GTK_WINDOW (terminal_window_get_preferences_dialog (window)));
       return;
 
     case PROP_DROPDOWN_ANIMATION_TIME:
@@ -455,7 +455,7 @@ terminal_window_dropdown_focus_out_event (GtkWidget     *widget,
 
   /* check if keep open is not enabled */
   if (gtk_widget_get_visible (widget)
-      && TERMINAL_WINDOW (dropdown)->n_child_windows == 0
+      && !terminal_window_has_children (TERMINAL_WINDOW (dropdown))
       && gtk_grab_get_current () == NULL
       && dropdown->animation_dir != ANIMATION_DIR_UP) /* popup menu check */
     {
@@ -723,7 +723,7 @@ terminal_window_dropdown_show (TerminalWindowDropdown *dropdown,
       g_source_remove (dropdown->animation_timeout_id);
     }
 
-  g_object_get (G_OBJECT (window->preferences),
+  g_object_get (terminal_window_get_preferences (window),
                 "dropdown-move-to-active", &move_to_active,
                 NULL);
 
@@ -811,7 +811,7 @@ terminal_window_dropdown_show (TerminalWindowDropdown *dropdown,
     }
   else
     {
-      g_object_get (G_OBJECT (window->preferences),
+      g_object_get (terminal_window_get_preferences (window),
                     "dropdown-keep-above", &keep_above,
                     NULL);
       gtk_window_set_keep_above (GTK_WINDOW (dropdown), keep_above);
@@ -835,7 +835,9 @@ terminal_window_dropdown_toggle_real (TerminalWindowDropdown *dropdown,
       && gdk_window_is_visible (gtk_widget_get_window (GTK_WIDGET (dropdown)))
       && dropdown->animation_dir != ANIMATION_DIR_UP)
     {
-      g_object_get (G_OBJECT (window->preferences), "dropdown-toggle-focus", &toggle_focus, NULL);
+      g_object_get (terminal_window_get_preferences (window),
+                    "dropdown-toggle-focus", &toggle_focus,
+                    NULL);
 
       /* if the focus was lost for 0.1 second and toggle-focus is used, we had
        * focus until the shortcut was pressed, and then we hide the window */
@@ -919,7 +921,7 @@ terminal_window_dropdown_new (const gchar        *role,
   window = g_object_new (TERMINAL_TYPE_WINDOW_DROPDOWN, "role", role, NULL);
 
   /* read default preferences */
-  g_object_get (G_OBJECT (window->preferences),
+  g_object_get (terminal_window_get_preferences (window),
                 "misc-menubar-default", &show_menubar,
                 "misc-toolbar-default", &show_toolbar,
                 NULL);
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index 3028b5a..4c6e80f 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -222,35 +222,41 @@ static void         terminal_window_tab_info_free                 (TerminalWindo
 
 struct _TerminalWindowPrivate
 {
-  GtkUIManager   *ui_manager;
+  GtkUIManager        *ui_manager;
 
-  guint           tabs_menu_merge_id;
-  GSList         *tabs_menu_actions;
+  /* for the drop-down to keep open with dialogs */
+  guint                n_child_windows;
 
-  GtkWidget      *search_dialog;
-  GtkWidget      *title_dialog;
+  guint                tabs_menu_merge_id;
+  GSList              *tabs_menu_actions;
+
+  TerminalPreferences *preferences;
+  GtkWidget           *preferences_dialog;
+
+  GtkWidget           *search_dialog;
+  GtkWidget           *title_dialog;
 
   /* pushed size of screen */
-  glong           grid_width;
-  glong           grid_height;
+  glong                grid_width;
+  glong                grid_height;
 
-  GtkAction      *encoding_action;
+  GtkAction           *encoding_action;
 
-  TerminalScreen *active;
+  TerminalScreen      *active;
 
   /* cached actions to avoid lookups */
-  GtkAction      *action_undo_close_tab;
-  GtkAction      *action_detach_tab;
-  GtkAction      *action_close_other_tabs;
-  GtkAction      *action_prev_tab;
-  GtkAction      *action_next_tab;
-  GtkAction      *action_move_tab_left;
-  GtkAction      *action_move_tab_right;
-  GtkAction      *action_copy;
-  GtkAction      *action_search_next;
-  GtkAction      *action_search_prev;
-
-  GQueue         *closed_tabs_list;
+  GtkAction           *action_undo_close_tab;
+  GtkAction           *action_detach_tab;
+  GtkAction           *action_close_other_tabs;
+  GtkAction           *action_prev_tab;
+  GtkAction           *action_next_tab;
+  GtkAction           *action_move_tab_left;
+  GtkAction           *action_move_tab_right;
+  GtkAction           *action_copy;
+  GtkAction           *action_search_next;
+  GtkAction           *action_search_prev;
+
+  GQueue              *closed_tabs_list;
 };
 
 static guint   window_signals[LAST_SIGNAL];
@@ -372,7 +378,7 @@ terminal_window_init (TerminalWindow *window)
 
   window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, TERMINAL_TYPE_WINDOW, TerminalWindowPrivate);
 
-  window->preferences = terminal_preferences_get ();
+  window->priv->preferences = terminal_preferences_get ();
 
   window->font = NULL;
   window->zoom = TERMINAL_ZOOM_LEVEL_DEFAULT;
@@ -416,7 +422,7 @@ terminal_window_init (TerminalWindow *window)
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_BACKGROUND);
 
   /* allocate the notebook for the terminal screens */
-  g_object_get (G_OBJECT (window->preferences), "misc-always-show-tabs", &always_show_tabs, NULL);
+  g_object_get (G_OBJECT (window->priv->preferences), "misc-always-show-tabs", &always_show_tabs, NULL);
   window->notebook = g_object_new (GTK_TYPE_NOTEBOOK,
                                    "scrollable", TRUE,
                                    "show-border", FALSE,
@@ -484,7 +490,7 @@ terminal_window_finalize (GObject *object)
 {
   TerminalWindow *window = TERMINAL_WINDOW (object);
 
-  g_object_unref (G_OBJECT (window->preferences));
+  g_object_unref (G_OBJECT (window->priv->preferences));
   g_object_unref (G_OBJECT (window->action_group));
   g_object_unref (G_OBJECT (window->priv->ui_manager));
   g_object_unref (G_OBJECT (window->priv->encoding_action));
@@ -575,7 +581,7 @@ terminal_window_scroll_event (GtkWidget      *widget,
   gboolean mouse_wheel_zoom;
   TerminalWindow *window = TERMINAL_WINDOW (widget);
 
-  g_object_get (G_OBJECT (window->preferences),
+  g_object_get (G_OBJECT (window->priv->preferences),
                 "misc-mouse-wheel-zoom", &mouse_wheel_zoom, NULL);
 
   if (mouse_wheel_zoom && event->state == (GDK_SHIFT_MASK | GDK_CONTROL_MASK)
@@ -617,7 +623,7 @@ terminal_window_confirm_close (TerminalWindow *window)
   if (G_UNLIKELY (n_tabs < 2))
     return TRUE;
 
-  g_object_get (G_OBJECT (window->preferences), "misc-confirm-close", &confirm_close, NULL);
+  g_object_get (G_OBJECT (window->priv->preferences), "misc-confirm-close", &confirm_close, NULL);
   if (!confirm_close)
     return TRUE;
 
@@ -672,7 +678,7 @@ terminal_window_confirm_close (TerminalWindow *window)
     {
       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox)))
         {
-          g_object_set (G_OBJECT (window->preferences),
+          g_object_set (G_OBJECT (window->priv->preferences),
                         "misc-confirm-close", FALSE,
                         NULL);
         }
@@ -799,7 +805,7 @@ terminal_window_update_actions (TerminalWindow *window)
     {
       page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (window->priv->active));
 
-      g_object_get (G_OBJECT (window->preferences),
+      g_object_get (G_OBJECT (window->priv->preferences),
                     "misc-cycle-tabs", &cycle_tabs,
                     NULL);
 
@@ -1142,7 +1148,7 @@ terminal_window_notebook_button_press_event (GtkNotebook    *notebook,
       if (event->button == 2)
         {
           /* close the tab on middle click */
-          g_object_get (G_OBJECT (window->preferences),
+          g_object_get (G_OBJECT (window->priv->preferences),
                         "misc-tab-close-middle-click", &close_middle_click, NULL);
           if (close_middle_click)
             gtk_widget_destroy (page);
@@ -1444,7 +1450,7 @@ terminal_window_action_new_tab (GtkAction      *action,
   TerminalScreen *terminal;
 
   terminal = TERMINAL_SCREEN (g_object_new (TERMINAL_TYPE_SCREEN, NULL));
-  g_object_get (G_OBJECT (window->preferences), "misc-default-working-dir", &default_dir, NULL);
+  g_object_get (G_OBJECT (window->priv->preferences), "misc-default-working-dir", &default_dir, NULL);
 
   if (g_strcmp0 (default_dir, "") != 0)
     directory = default_dir;
@@ -1469,7 +1475,7 @@ terminal_window_action_new_window (GtkAction      *action,
   const gchar *directory = NULL;
   gchar       *default_dir;
 
-  g_object_get (G_OBJECT (window->preferences), "misc-default-working-dir", &default_dir, NULL);
+  g_object_get (G_OBJECT (window->priv->preferences), "misc-default-working-dir", &default_dir, NULL);
 
   if (g_strcmp0 (default_dir, "") != 0)
     directory = default_dir;
@@ -1615,8 +1621,8 @@ terminal_window_action_prefs_died (gpointer  user_data,
 {
   TerminalWindow *window = TERMINAL_WINDOW (user_data);
 
-  window->preferences_dialog = NULL;
-  window->n_child_windows--;
+  window->priv->preferences_dialog = NULL;
+  window->priv->n_child_windows--;
 
   if (window->drop_down)
     terminal_util_activate_window (GTK_WINDOW (window));
@@ -1628,21 +1634,21 @@ static void
 terminal_window_action_prefs (GtkAction      *action,
                               TerminalWindow *window)
 {
-  if (window->preferences_dialog == NULL)
+  if (window->priv->preferences_dialog == NULL)
     {
-      window->preferences_dialog = terminal_preferences_dialog_new (window->drop_down);
-      if (G_LIKELY (window->preferences_dialog != NULL))
+      window->priv->preferences_dialog = terminal_preferences_dialog_new (window->drop_down);
+      if (G_LIKELY (window->priv->preferences_dialog != NULL))
         {
-          window->n_child_windows++;
-          g_object_weak_ref (G_OBJECT (window->preferences_dialog),
+          window->priv->n_child_windows++;
+          g_object_weak_ref (G_OBJECT (window->priv->preferences_dialog),
                              terminal_window_action_prefs_died, window);
         }
     }
 
-  if (window->preferences_dialog != NULL)
+  if (window->priv->preferences_dialog != NULL)
     {
-      gtk_window_set_transient_for (GTK_WINDOW (window->preferences_dialog), GTK_WINDOW (window));
-      gtk_window_present (GTK_WINDOW (window->preferences_dialog));
+      gtk_window_set_transient_for (GTK_WINDOW (window->priv->preferences_dialog), GTK_WINDOW (window));
+      gtk_window_present (GTK_WINDOW (window->priv->preferences_dialog));
     }
 }
 
@@ -1858,7 +1864,7 @@ title_dialog_close (GtkWidget      *dialog,
     terminal_util_activate_window (GTK_WINDOW (window));
 
   /* close the dialog */
-  window->n_child_windows--;
+  window->priv->n_child_windows--;
   gtk_widget_destroy (dialog);
   window->priv->title_dialog = NULL;
 }
@@ -1945,7 +1951,7 @@ terminal_window_action_set_title (GtkAction      *action,
     }
 
     if (!gtk_widget_get_visible (window->priv->title_dialog))
-      window->n_child_windows++;
+      window->priv->n_child_windows++;
 
     gtk_widget_show_all (window->priv->title_dialog);
     gtk_window_present (GTK_WINDOW (window->priv->title_dialog));
@@ -1997,7 +2003,7 @@ terminal_window_action_search_response (GtkWidget      *dialog,
         terminal_util_activate_window (GTK_WINDOW (window));
 
       /* hide dialog */
-      window->n_child_windows--;
+      window->priv->n_child_windows--;
       gtk_widget_hide (dialog);
     }
 
@@ -2024,7 +2030,7 @@ terminal_window_action_search (GtkAction      *action,
 
   /* increase child counter */
   if (!gtk_widget_get_visible (window->priv->search_dialog))
-    window->n_child_windows++;
+    window->priv->n_child_windows++;
 
   terminal_search_dialog_present (TERMINAL_SEARCH_DIALOG (window->priv->search_dialog));
 }
@@ -2263,7 +2269,7 @@ terminal_window_new (const gchar       *role,
   window = g_object_new (TERMINAL_TYPE_WINDOW, "role", role, NULL);
 
   /* read default preferences */
-  g_object_get (G_OBJECT (window->preferences),
+  g_object_get (G_OBJECT (window->priv->preferences),
                 "misc-menubar-default", &show_menubar,
                 "misc-toolbar-default", &show_toolbar,
                 "misc-borders-default", &show_borders,
@@ -2292,7 +2298,7 @@ terminal_window_new (const gchar       *role,
   gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), show_borders);
 
   /* property that is not suitable for init */
-  g_object_bind_property (G_OBJECT (window->preferences), "misc-tab-position",
+  g_object_bind_property (G_OBJECT (window->priv->preferences), "misc-tab-position",
                           G_OBJECT (window->notebook), "tab-pos",
                           G_BINDING_SYNC_CREATE);
 
@@ -2379,7 +2385,7 @@ terminal_window_notebook_show_tabs (TerminalWindow *window)
   npages = gtk_notebook_get_n_pages (notebook);
   if (npages < 2)
     {
-      g_object_get (G_OBJECT (window->preferences),
+      g_object_get (G_OBJECT (window->priv->preferences),
                     window->drop_down ? "dropdown-always-show-tabs" :
                     "misc-always-show-tabs", &show_tabs, NULL);
     }
@@ -2493,3 +2499,39 @@ terminal_window_set_grid_size (TerminalWindow *window,
   window->priv->grid_width = width;
   window->priv->grid_height = height;
 }
+
+
+
+/**
+ * terminal_window_has_children:
+ * @window  : A #TerminalWindow.
+ **/
+gboolean
+terminal_window_has_children (TerminalWindow *window)
+{
+  return window->priv->n_child_windows != 0;
+}
+
+
+
+/**
+ * terminal_window_get_preferences:
+ * @window  : A #TerminalWindow.
+ **/
+GObject*
+terminal_window_get_preferences (TerminalWindow *window)
+{
+  return G_OBJECT (window->priv->preferences);
+}
+
+
+
+/**
+ * terminal_window_get_preferences_dialog:
+ * @window  : A #TerminalWindow.
+ **/
+GtkWidget*
+terminal_window_get_preferences_dialog (TerminalWindow *window)
+{
+  return window->priv->preferences_dialog;
+}
diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h
index 650e5be..5ae7255 100644
--- a/terminal/terminal-window.h
+++ b/terminal/terminal-window.h
@@ -49,12 +49,6 @@ typedef struct
   /* if this is a TerminalWindowDropdown */
   guint                  drop_down : 1;
 
-  /* for the drop-down to keep open with dialogs */
-  guint                  n_child_windows;
-
-  TerminalPreferences   *preferences;
-  GtkWidget             *preferences_dialog;
-
   GtkActionGroup        *action_group;
 
   GtkWidget             *vbox;
@@ -70,26 +64,32 @@ typedef struct
   TerminalVisibility     scrollbar_visibility;
 } TerminalWindow;
 
-GType           terminal_window_get_type            (void) G_GNUC_CONST;
+GType           terminal_window_get_type               (void) G_GNUC_CONST;
+
+GtkWidget      *terminal_window_new                    (const gchar        *role,
+                                                        gboolean            fullscreen,
+                                                        TerminalVisibility  menubar,
+                                                        TerminalVisibility  borders,
+                                                        TerminalVisibility  toolbar);
+
+void            terminal_window_add                    (TerminalWindow     *window,
+                                                        TerminalScreen     *screen);
+
+TerminalScreen *terminal_window_get_active             (TerminalWindow     *window);
 
-GtkWidget      *terminal_window_new                 (const gchar        *role,
-                                                     gboolean            fullscreen,
-                                                     TerminalVisibility  menubar,
-                                                     TerminalVisibility  borders,
-                                                     TerminalVisibility  toolbar);
+void            terminal_window_notebook_show_tabs     (TerminalWindow     *window);
 
-void            terminal_window_add                 (TerminalWindow     *window,
-                                                     TerminalScreen     *screen);
+GSList         *terminal_window_get_restart_command    (TerminalWindow     *window);
 
-TerminalScreen *terminal_window_get_active          (TerminalWindow     *window);
+void            terminal_window_set_grid_size          (TerminalWindow     *window,
+                                                        glong               width,
+                                                        glong               height);
 
-void            terminal_window_notebook_show_tabs  (TerminalWindow     *window);
+gboolean        terminal_window_has_children           (TerminalWindow     *window);
 
-GSList         *terminal_window_get_restart_command (TerminalWindow     *window);
+GObject        *terminal_window_get_preferences        (TerminalWindow     *window);
 
-void            terminal_window_set_grid_size       (TerminalWindow     *window,
-                                                     glong               width,
-                                                     glong               height);
+GtkWidget      *terminal_window_get_preferences_dialog (TerminalWindow     *window);
 
 G_END_DECLS
 
-- 
cgit v0.10.1

From cae2ed79c5bf21dce43d3c608dc7976c5fb0b7ad Mon Sep 17 00:00:00 2001
From: Igor <f2404@yandex.ru>
Date: Tue, 15 Nov 2016 15:10:56 +0200
Subject: Fix Alt+n shortcuts when starting with several tabs


diff --git a/terminal/terminal-app.c b/terminal/terminal-app.c
index e66a84f..8a8f939 100644
--- a/terminal/terminal-app.c
+++ b/terminal/terminal-app.c
@@ -56,6 +56,7 @@
 static void     terminal_app_finalize                 (GObject            *object);
 static void     terminal_app_update_accels            (TerminalApp        *app);
 static void     terminal_app_update_mnemonics         (TerminalApp        *app);
+static void     terminal_app_update_windows_accels    (gpointer            user_data);
 static gboolean terminal_app_accel_map_load           (gpointer            user_data);
 static gboolean terminal_app_accel_map_save           (gpointer            user_data);
 static gboolean terminal_app_unset_urgent_bell        (TerminalWindow     *window,
@@ -143,8 +144,9 @@ terminal_app_init (TerminalApp *app)
   terminal_app_update_accels (app);
   terminal_app_update_mnemonics (app);
 
-  /* schedule accel map load */
-  app->accel_map_load_id = g_idle_add_full (G_PRIORITY_LOW, terminal_app_accel_map_load, app, NULL);
+  /* schedule accel map load and update windows when finished */
+  app->accel_map_load_id = g_idle_add_full (G_PRIORITY_LOW, terminal_app_accel_map_load, app,
+                                            terminal_app_update_windows_accels);
 }
 
 
@@ -228,6 +230,20 @@ terminal_app_update_mnemonics (TerminalApp *app)
 
 
 
+static void
+terminal_app_update_windows_accels (gpointer user_data)
+{
+  TerminalApp *app = TERMINAL_APP (user_data);
+  GSList      *lp;
+
+  for (lp = app->windows; lp != NULL; lp = lp->next)
+    terminal_window_rebuild_tabs_menu (TERMINAL_WINDOW (lp->data));
+
+  app->accel_map_load_id = 0;
+}
+
+
+
 static gboolean
 terminal_app_accel_map_save (gpointer user_data)
 {
@@ -274,8 +290,6 @@ terminal_app_accel_map_load (gpointer user_data)
   gchar        name[50];
   guint        i;
 
-  app->accel_map_load_id = 0;
-
   path = xfce_resource_lookup (XFCE_RESOURCE_CONFIG, ACCEL_MAP_PATH);
   if (G_LIKELY (path != NULL))
     {
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index 4c6e80f..5ad13e5 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -93,7 +93,6 @@ static gboolean     terminal_window_accel_activate                (GtkAccelGroup
                                                                    GdkModifierType         accel_mods,
                                                                    TerminalWindow         *window);
 static void         terminal_window_update_actions                (TerminalWindow         *window);
-static void         terminal_window_rebuild_tabs_menu             (TerminalWindow         *window);
 static void         terminal_window_notebook_page_switched        (GtkNotebook            *notebook,
                                                                    GtkWidget              *page,
                                                                    guint                   page_num,
@@ -831,83 +830,6 @@ terminal_window_update_actions (TerminalWindow *window)
 
 
 static void
-terminal_window_rebuild_tabs_menu (TerminalWindow *window)
-{
-  gint            npages, n;
-  GtkWidget      *page;
-  GSList         *group = NULL;
-  GtkRadioAction *radio_action;
-  gchar           name[50];
-  GSList         *lp;
-  GtkAccelKey     key = {0};
-
-  if (window->priv->tabs_menu_merge_id != 0)
-    {
-      /* remove merge id */
-      gtk_ui_manager_remove_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id);
-
-      /* drop all the old accels from the action group */
-      for (lp = window->priv->tabs_menu_actions; lp != NULL; lp = lp->next)
-        gtk_action_group_remove_action (window->action_group, GTK_ACTION (lp->data));
-
-      g_slist_free (window->priv->tabs_menu_actions);
-      window->priv->tabs_menu_actions = NULL;
-    }
-
-  /* create a new merge id */
-  window->priv->tabs_menu_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
-  terminal_assert (window->priv->tabs_menu_actions == NULL);
-
-  /* walk the tabs */
-  npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
-  for (n = 0; n < npages; n++)
-    {
-      page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), n);
-
-      g_snprintf (name, sizeof (name), "goto-tab-%d", n + 1);
-
-      /* create action */
-      radio_action = gtk_radio_action_new (name, NULL, NULL, NULL, n);
-      gtk_action_set_sensitive (GTK_ACTION (radio_action), npages > 1);
-      g_object_bind_property (G_OBJECT (page), "title",
-                              G_OBJECT (radio_action), "label",
-                              G_BINDING_SYNC_CREATE);
-      gtk_radio_action_set_group (radio_action, group);
-      group = gtk_radio_action_get_group (radio_action);
-      gtk_action_group_add_action (window->action_group, GTK_ACTION (radio_action));
-      g_signal_connect (G_OBJECT (radio_action), "activate",
-          G_CALLBACK (terminal_window_action_goto_tab), window->notebook);
-
-      /* connect action to the page so we can active it when a tab is switched */
-      g_object_set_qdata_full (G_OBJECT (page), tabs_menu_action_quark,
-                               radio_action, g_object_unref);
-
-      /* add action in the menu */
-      gtk_ui_manager_add_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id,
-                             "/main-menu/tabs-menu/placeholder-tab-items",
-                             name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
-
-      if (npages > 1)
-        {
-          /* add to right-click tab menu */
-          gtk_ui_manager_add_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id,
-                                 "/tab-menu/tabs-menu/placeholder-tab-items",
-                                 name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
-        }
-
-      /* set an accelerator path */
-      g_snprintf (name, sizeof (name), "<Actions>/terminal-window/goto-tab-%d", n + 1);
-      if (gtk_accel_map_lookup_entry (name, &key) && key.accel_key != 0)
-        gtk_action_set_accel_path (GTK_ACTION (radio_action), name);
-
-      /* store */
-      window->priv->tabs_menu_actions = g_slist_prepend (window->priv->tabs_menu_actions, radio_action);
-    }
-}
-
-
-
-static void
 terminal_window_notebook_page_switched (GtkNotebook     *notebook,
                                         GtkWidget       *page,
                                         guint            page_num,
@@ -2535,3 +2457,84 @@ terminal_window_get_preferences_dialog (TerminalWindow *window)
 {
   return window->priv->preferences_dialog;
 }
+
+
+
+/**
+ * terminal_window_rebuild_tabs_menu:
+ * @window  : A #TerminalWindow.
+ **/
+void
+terminal_window_rebuild_tabs_menu (TerminalWindow *window)
+{
+  gint            npages, n;
+  GtkWidget      *page;
+  GSList         *group = NULL;
+  GtkRadioAction *radio_action;
+  gchar           name[50];
+  GSList         *lp;
+  GtkAccelKey     key = {0};
+
+  if (window->priv->tabs_menu_merge_id != 0)
+    {
+      /* remove merge id */
+      gtk_ui_manager_remove_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id);
+
+      /* drop all the old accels from the action group */
+      for (lp = window->priv->tabs_menu_actions; lp != NULL; lp = lp->next)
+        gtk_action_group_remove_action (window->action_group, GTK_ACTION (lp->data));
+
+      g_slist_free (window->priv->tabs_menu_actions);
+      window->priv->tabs_menu_actions = NULL;
+    }
+
+  /* create a new merge id */
+  window->priv->tabs_menu_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
+  terminal_assert (window->priv->tabs_menu_actions == NULL);
+
+  /* walk the tabs */
+  npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
+  for (n = 0; n < npages; n++)
+    {
+      page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), n);
+
+      g_snprintf (name, sizeof (name), "goto-tab-%d", n + 1);
+
+      /* create action */
+      radio_action = gtk_radio_action_new (name, NULL, NULL, NULL, n);
+      gtk_action_set_sensitive (GTK_ACTION (radio_action), npages > 1);
+      g_object_bind_property (G_OBJECT (page), "title",
+                              G_OBJECT (radio_action), "label",
+                              G_BINDING_SYNC_CREATE);
+      gtk_radio_action_set_group (radio_action, group);
+      group = gtk_radio_action_get_group (radio_action);
+      gtk_action_group_add_action (window->action_group, GTK_ACTION (radio_action));
+      g_signal_connect (G_OBJECT (radio_action), "activate",
+          G_CALLBACK (terminal_window_action_goto_tab), window->notebook);
+
+      /* connect action to the page so we can active it when a tab is switched */
+      g_object_set_qdata_full (G_OBJECT (page), tabs_menu_action_quark,
+                               radio_action, g_object_unref);
+
+      /* add action in the menu */
+      gtk_ui_manager_add_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id,
+                             "/main-menu/tabs-menu/placeholder-tab-items",
+                             name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
+
+      if (npages > 1)
+        {
+          /* add to right-click tab menu */
+          gtk_ui_manager_add_ui (window->priv->ui_manager, window->priv->tabs_menu_merge_id,
+                                 "/tab-menu/tabs-menu/placeholder-tab-items",
+                                 name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
+        }
+
+      /* set an accelerator path */
+      g_snprintf (name, sizeof (name), "<Actions>/terminal-window/goto-tab-%d", n + 1);
+      if (gtk_accel_map_lookup_entry (name, &key) && key.accel_key != 0)
+        gtk_action_set_accel_path (GTK_ACTION (radio_action), name);
+
+      /* store */
+      window->priv->tabs_menu_actions = g_slist_prepend (window->priv->tabs_menu_actions, radio_action);
+    }
+}
diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h
index 5ae7255..aa84bab 100644
--- a/terminal/terminal-window.h
+++ b/terminal/terminal-window.h
@@ -91,6 +91,8 @@ GObject        *terminal_window_get_preferences        (TerminalWindow     *wind
 
 GtkWidget      *terminal_window_get_preferences_dialog (TerminalWindow     *window);
 
+void            terminal_window_rebuild_tabs_menu      (TerminalWindow     *window);
+
 G_END_DECLS
 
 #endif /* !TERMINAL_WINDOW_H */
-- 
cgit v0.10.1