Snippets

Mijo Medvedec 76qk: Untitled snippet

Created by Mijo Medvedec
--- a/thunar/thunar-window.c	2015-05-04 13:11:41.000000000 +0200
+++ b/thunar/thunar-window.c	2015-05-09 23:33:43.985747528 +0200
@@ -81,6 +81,7 @@ enum
 enum
 {
   BACK,
+  PANE_WINDOW,
   RELOAD,
   TOGGLE_SIDEPANE,
   TOGGLE_MENUBAR,
@@ -104,6 +105,7 @@ static void     thunar_window_set_proper
                                                            const GValue           *value,
                                                            GParamSpec             *pspec);
 static gboolean thunar_window_back                        (ThunarWindow           *window);
+static gboolean thunar_window_pane_window                 (ThunarWindow           *window);
 static gboolean thunar_window_reload                      (ThunarWindow           *window,
                                                            gboolean                reload_info);
 static gboolean thunar_window_toggle_sidepane             (ThunarWindow           *window);
@@ -249,6 +251,9 @@ static gboolean thunar_window_save_geome
 static void     thunar_window_save_geometry_timer_destroy (gpointer                user_data);
 static void     thunar_window_set_zoom_level              (ThunarWindow           *window,
                                                            ThunarZoomLevel         zoom_level);
+static gboolean thunar_window_notebook_select             (GtkWidget              *notebook,
+							   GdkEvent               *event,
+							   ThunarWindow           *window);
 
 
 
@@ -258,6 +263,7 @@ struct _ThunarWindowClass
 
   /* internal action signals */
   gboolean (*back)            (ThunarWindow *window);
+  gboolean (*pane_window)     (ThunarWindow *window);
   gboolean (*reload)          (ThunarWindow *window,
                                gboolean      reload_info);
   gboolean (*toggle_sidepane) (ThunarWindow *window);
@@ -311,9 +317,12 @@ struct _ThunarWindow
   GtkWidget              *menubar;
   GtkWidget              *spinner;
   GtkWidget              *paned;
+  GtkWidget              *panes;
   GtkWidget              *sidepane;
   GtkWidget              *view_box;
   GtkWidget              *notebook;
+  GtkWidget              *notebook1;
+  GtkWidget              *notebook2;
   GtkWidget              *view;
   GtkWidget              *statusbar;
 
@@ -420,6 +429,7 @@ thunar_window_class_init (ThunarWindowCl
   gtkwidget_class->configure_event = thunar_window_configure_event;
 
   klass->back = thunar_window_back;
+  klass->pane_window = thunar_window_pane_window;
   klass->reload = thunar_window_reload;
   klass->toggle_sidepane = thunar_window_toggle_sidepane;
   klass->toggle_menubar = thunar_window_toggle_menubar;
@@ -503,6 +513,23 @@ thunar_window_class_init (ThunarWindowCl
                   G_TYPE_BOOLEAN, 0);
 
   /**
+   * ThunarWindow::pane-window:
+   * @window : a #ThunarWindow instance.
+   *
+   * Emitted whenever the user requests to pane the window
+   * of the currently displayed folder. This is an internal
+   * signal used to bind the action to keys.
+   **/
+  window_signals[PANE_WINDOW] =
+    g_signal_new (I_("pane-window"),
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (ThunarWindowClass, pane_window),
+                  g_signal_accumulator_true_handled, NULL,
+                  _thunar_marshal_BOOLEAN__VOID,
+                  G_TYPE_BOOLEAN, 0);
+
+  /**
    * ThunarWindow::reload:
    * @window : a #ThunarWindow instance.
    *
@@ -623,6 +650,7 @@ thunar_window_class_init (ThunarWindowCl
   /* setup the key bindings for the windows */
   binding_set = gtk_binding_set_by_class (klass);
   gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, 0, "back", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_F3, 0, "pane-window", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_F5, 0, "reload", 1, G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_F9, 0, "toggle-sidepane", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_F10, 0, "toggle-menubar", 0);
@@ -861,31 +889,44 @@ thunar_window_init (ThunarWindow *window
   g_signal_connect_swapped (window->paned, "button-release-event", G_CALLBACK (thunar_window_save_paned), window);
 
   window->view_box = gtk_table_new (3, 1, FALSE);
-  gtk_paned_pack2 (GTK_PANED (window->paned), window->view_box, TRUE, FALSE);
+  gtk_paned_add2 (GTK_PANED (window->paned), window->view_box);
   gtk_widget_show (window->view_box);
 
+  /* Create panes when the notebook will be */
+  window->panes = gtk_hpaned_new ();
+  gtk_widget_add_events (window->panes, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK);
+  gtk_table_attach (GTK_TABLE (window->view_box), window->panes, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+  gtk_widget_show (window->panes);
+
   /* tabs */
-  window->notebook = gtk_notebook_new ();
-  gtk_table_attach (GTK_TABLE (window->view_box), window->notebook, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-  g_signal_connect (G_OBJECT (window->notebook), "switch-page", G_CALLBACK (thunar_window_notebook_switch_page), window);
-  g_signal_connect (G_OBJECT (window->notebook), "page-added", G_CALLBACK (thunar_window_notebook_page_added), window);
-  g_signal_connect (G_OBJECT (window->notebook), "page-removed", G_CALLBACK (thunar_window_notebook_page_removed), window);
-  g_signal_connect_after (G_OBJECT (window->notebook), "button-press-event", G_CALLBACK (thunar_window_notebook_button_press_event), window);
-  g_signal_connect (G_OBJECT (window->notebook), "popup-menu", G_CALLBACK (thunar_window_notebook_popup_menu), window);
-  g_signal_connect (G_OBJECT (window->notebook), "create-window", G_CALLBACK (thunar_window_notebook_create_window), window);
-  gtk_notebook_set_show_border (GTK_NOTEBOOK (window->notebook), FALSE);
-  gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK (window->notebook), TRUE);
-  gtk_notebook_set_scrollable (GTK_NOTEBOOK (window->notebook), TRUE);
-  gtk_container_set_border_width (GTK_CONTAINER (window->notebook), 0);
-  gtk_notebook_set_group_name (GTK_NOTEBOOK (window->notebook), "thunar-tabs");
-  gtk_widget_show (window->notebook);
+  // notebook1
+  window->notebook1 = gtk_notebook_new ();
+  gtk_paned_pack1 (GTK_PANED (window->panes), window->notebook1, TRUE, FALSE);
+  g_signal_connect (G_OBJECT (window->notebook1), "switch-page", G_CALLBACK (thunar_window_notebook_switch_page), window);
+  g_signal_connect (G_OBJECT (window->notebook1), "page-added", G_CALLBACK (thunar_window_notebook_page_added), window);
+  g_signal_connect (G_OBJECT (window->notebook1), "page-removed", G_CALLBACK (thunar_window_notebook_page_removed), window);
+  g_signal_connect_after (G_OBJECT (window->notebook1), "button-press-event", G_CALLBACK (thunar_window_notebook_button_press_event), window);
+  g_signal_connect (G_OBJECT (window->notebook1), "popup-menu", G_CALLBACK (thunar_window_notebook_popup_menu), window);
+  g_signal_connect (G_OBJECT (window->notebook1), "create-window", G_CALLBACK (thunar_window_notebook_create_window), window);
+  gtk_notebook_set_show_border (GTK_NOTEBOOK (window->notebook1), FALSE);
+  gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK (window->notebook1), TRUE);
+  gtk_notebook_set_scrollable (GTK_NOTEBOOK (window->notebook1), TRUE);
+  gtk_container_set_border_width (GTK_CONTAINER (window->notebook1), 0);
+  gtk_notebook_set_group_name (GTK_NOTEBOOK (window->notebook1), "thunar-tabs");
+  gtk_widget_show (window->notebook1);
 
   /* drop the notebook borders */
   style = gtk_rc_style_new ();
   style->xthickness = style->ythickness = 0;
-  gtk_widget_modify_style (window->notebook, style);
+  gtk_widget_modify_style (window->notebook1, style);
   g_object_unref (G_OBJECT (style));
 
+  // notebook2
+  window->notebook2 = NULL;
+
+  /* The notebook selected and actived */
+  window->notebook = window->notebook1;
+
   /* determine the selected location selector */
   if (exo_str_is_equal (last_location_bar, g_type_name (THUNAR_TYPE_LOCATION_BUTTONS)))
     type = THUNAR_TYPE_LOCATION_BUTTONS;
@@ -1392,6 +1433,130 @@ thunar_window_binding_create (ThunarWind
 
 
 
+static gboolean
+thunar_window_pane_window (ThunarWindow *window)
+{
+  ThunarFile *directory;
+  GtkRcStyle *style;
+
+  _thunar_return_val_if_fail (THUNAR_IS_WINDOW (window), FALSE);
+  _thunar_return_val_if_fail (window->view_type != G_TYPE_NONE, FALSE);
+
+  /* if two panes are showed then remove not selected one */
+  if (window->notebook1 != NULL && window->notebook2 != NULL)
+    {
+      /* notebook1 is the selected notebook so it destroys notebook2 */
+      if (window->notebook == window->notebook1)
+	{
+	  gtk_widget_destroy (window->notebook2);
+	  window->notebook2 = NULL;
+	}
+      /* notebook2 is the selected notebook so it destroys notebook1 */
+      else
+	{
+	  gtk_widget_destroy (window->notebook1);
+	  window->notebook1 = NULL;
+	}
+    }
+  /* notebook1 is null so it crates it */
+  else if (window->notebook1 == NULL)
+    {
+      /* create the notebook1 */
+      window->notebook1 = gtk_notebook_new ();
+      gtk_paned_pack1 (GTK_PANED (window->panes), window->notebook1, TRUE, FALSE);
+      g_signal_connect (G_OBJECT (window->notebook1), "switch-page", G_CALLBACK (thunar_window_notebook_switch_page), window);
+      g_signal_connect (G_OBJECT (window->notebook1), "page-added", G_CALLBACK (thunar_window_notebook_page_added), window);
+      g_signal_connect (G_OBJECT (window->notebook1), "page-removed", G_CALLBACK (thunar_window_notebook_page_removed), window);
+      g_signal_connect_after (G_OBJECT (window->notebook1), "button-press-event", G_CALLBACK (thunar_window_notebook_button_press_event), window);
+      g_signal_connect (G_OBJECT (window->notebook1), "popup-menu", G_CALLBACK (thunar_window_notebook_popup_menu), window);
+      g_signal_connect (G_OBJECT (window->notebook1), "create-window", G_CALLBACK (thunar_window_notebook_create_window), window);
+      gtk_notebook_set_show_border (GTK_NOTEBOOK (window->notebook1), FALSE);
+      gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK (window->notebook1), TRUE);
+      gtk_notebook_set_scrollable (GTK_NOTEBOOK (window->notebook1), TRUE);
+      gtk_container_set_border_width (GTK_CONTAINER (window->notebook1), 0);
+      gtk_notebook_set_group_name (GTK_NOTEBOOK (window->notebook1), "thunar-tabs");
+      gtk_widget_show (window->notebook1);
+
+      /* drop the notebook borders */
+      style = gtk_rc_style_new ();
+      style->xthickness = style->ythickness = 0;
+      gtk_widget_modify_style (window->notebook1, style);
+      g_object_unref (G_OBJECT (style));
+
+      /* set notebook2 to selected notebook */
+      window->notebook = window->notebook1;
+      directory = thunar_window_get_current_directory (window);
+      thunar_window_notebook_insert (window, directory);
+    }
+  /* Otherwise notebook2 is null so it creates it */
+  else
+    {
+      /* create the notebook2 */
+      window->notebook2 = gtk_notebook_new ();
+      gtk_paned_pack2 (GTK_PANED (window->panes), window->notebook2, TRUE, FALSE);
+      g_signal_connect (G_OBJECT (window->notebook2), "switch-page", G_CALLBACK (thunar_window_notebook_switch_page), window);
+      g_signal_connect (G_OBJECT (window->notebook2), "page-added", G_CALLBACK (thunar_window_notebook_page_added), window);
+      g_signal_connect (G_OBJECT (window->notebook2), "page-removed", G_CALLBACK (thunar_window_notebook_page_removed), window);
+      g_signal_connect_after (G_OBJECT (window->notebook2), "button-press-event", G_CALLBACK (thunar_window_notebook_button_press_event), window);
+      g_signal_connect (G_OBJECT (window->notebook2), "popup-menu", G_CALLBACK (thunar_window_notebook_popup_menu), window);
+      g_signal_connect (G_OBJECT (window->notebook2), "create-window", G_CALLBACK (thunar_window_notebook_create_window), window);
+      gtk_notebook_set_show_border (GTK_NOTEBOOK (window->notebook2), FALSE);
+      gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK (window->notebook2), TRUE);
+      gtk_notebook_set_scrollable (GTK_NOTEBOOK (window->notebook2), TRUE);
+      gtk_container_set_border_width (GTK_CONTAINER (window->notebook2), 0);
+      gtk_notebook_set_group_name (GTK_NOTEBOOK (window->notebook2), "thunar-tabs");
+      gtk_widget_show (window->notebook2);
+
+      /* drop the notebook borders */
+      style = gtk_rc_style_new ();
+      style->xthickness = style->ythickness = 0;
+      gtk_widget_modify_style (window->notebook2, style);
+      g_object_unref (G_OBJECT (style));
+
+      /* set notebook2 to selected notebook */
+      window->notebook = window->notebook2;
+      directory = thunar_window_get_current_directory (window);
+      thunar_window_notebook_insert (window, directory);
+    }
+
+  return TRUE;
+}
+
+
+
+static gboolean
+thunar_window_notebook_select (GtkWidget     *view, 
+			       GdkEvent      *event, 
+			       ThunarWindow  *window)
+{
+  GtkWidget  *selected_notebook;
+  gint        current_page_n;
+  GtkWidget  *current_page;
+
+  /* if there is not two panes (notebook2 == NULL) nothing to do */
+  if (window->notebook2 == NULL)
+    return FALSE;
+
+  /* notebook selected */
+  selected_notebook = gtk_widget_get_ancestor (view, GTK_TYPE_NOTEBOOK);
+
+  /* if the notebook selected is the same than the current notebook selected nothing to do */
+  if (selected_notebook == window->notebook)
+    return FALSE;
+
+  /* select and activate selected notebook */
+  window->notebook = selected_notebook;
+  current_page_n = gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook));
+  current_page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), current_page_n);
+  thunar_component_set_ui_manager (THUNAR_COMPONENT (window->view), NULL);
+  window->view = NULL;
+  thunar_window_notebook_switch_page (window->notebook, current_page, current_page_n, window);
+
+  return FALSE;
+}
+
+
+
 static void
 thunar_window_notebook_switch_page (GtkWidget    *notebook,
                                     GtkWidget    *page,
@@ -1405,7 +1570,8 @@ thunar_window_notebook_switch_page (GtkW
   _thunar_return_if_fail (THUNAR_IS_WINDOW (window));
   _thunar_return_if_fail (GTK_IS_NOTEBOOK (notebook));
   _thunar_return_if_fail (THUNAR_IS_VIEW (page));
-  _thunar_return_if_fail (window->notebook == notebook);
+  _thunar_return_if_fail (window->notebook1 == notebook ||
+			  window->notebook2 == notebook);
 
   /* leave if nothing changed */
   if (window->view == page)
@@ -1553,7 +1719,7 @@ thunar_window_notebook_page_removed (Gtk
   thunar_component_set_ui_manager (THUNAR_COMPONENT (page), NULL);
 
   n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook));
-  if (n_pages == 0)
+  if (n_pages == 0 && window->notebook2 == NULL)
     {
       /* destroy the window */
       gtk_widget_destroy (GTK_WIDGET (window));
@@ -1784,6 +1950,11 @@ thunar_window_notebook_insert (ThunarWin
   gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (window->notebook), view, TRUE);
   gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (window->notebook), view, TRUE);
 
+  /* connect signal view */
+  gtk_widget_add_events (GTK_WIDGET (view), GDK_BUTTON_PRESS_MASK);
+  g_signal_connect (G_OBJECT (GTK_BIN (view)->child), "button-press-event", G_CALLBACK (thunar_window_notebook_select), window);
+  g_signal_connect (G_OBJECT (GTK_BIN (view)->child), "button-release-event", G_CALLBACK (thunar_window_notebook_select), window);
+
   /* take focus on the view */
   gtk_widget_grab_focus (view);
 }

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.