Snippets

Mijo Medvedec 76qk: Untitled snippet

Created by Mijo Medvedec

File thunar-window.patch Added

  • Ignore whitespace
  • Hide word diff
+--- 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);
+ }
HTTPS SSH

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