Skip to content

Instantly share code, notes, and snippets.

Created April 24, 2015 01:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/959cd4a1367680b4c6a5 to your computer and use it in GitHub Desktop.
Save anonymous/959cd4a1367680b4c6a5 to your computer and use it in GitHub Desktop.
diff -rupN Thunar-1.6.7/thunar/thunar-standard-view.c Thunar-1.6.7-splitview/thunar/thunar-standard-view.c
--- Thunar-1.6.7/thunar/thunar-standard-view.c 2015-04-18 16:25:18.000000000 +0200
+++ Thunar-1.6.7-splitview/thunar/thunar-standard-view.c 2015-04-24 02:08:46.234849486 +0200
@@ -4262,8 +4262,8 @@ thunar_standard_view_queue_popup (Thunar
standard_view, thunar_standard_view_drag_timer_destroy);
/* register the motion notify and the button release events on the real view */
- g_signal_connect (G_OBJECT (view), "button-release-event", G_CALLBACK (thunar_standard_view_button_release_event), standard_view);
- g_signal_connect (G_OBJECT (view), "motion-notify-event", G_CALLBACK (thunar_standard_view_motion_notify_event), standard_view);
+ g_signal_connect_after (G_OBJECT (view), "button-release-event", G_CALLBACK (thunar_standard_view_button_release_event), standard_view);
+ g_signal_connect_after (G_OBJECT (view), "motion-notify-event", G_CALLBACK (thunar_standard_view_motion_notify_event), standard_view);
}
}
diff -rupN Thunar-1.6.7/thunar/thunar-window.c Thunar-1.6.7-splitview/thunar/thunar-window.c
--- Thunar-1.6.7/thunar/thunar-window.c 2015-04-18 16:25:18.000000000 +0200
+++ Thunar-1.6.7-splitview/thunar/thunar-window.c 2015-04-24 02:28:18.421547235 +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", 0);
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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment