diff -Nru thunar-1.6.3/debian/changelog thunar-1.6.3/debian/changelog --- thunar-1.6.3/debian/changelog 2014-10-30 11:00:04.000000000 +0100 +++ thunar-1.6.3/debian/changelog 2014-11-13 03:27:01.000000000 +0100 @@ -1,3 +1,12 @@ +thunar (1.6.3-2.1) UNRELEASED; urgency=medium + + * Non-maintainer upload. + * debian/patches: + - 03_add-split-view-support.patch added, adds the split view support for + the thunar file manager + + -- Mijo Medvedec Thu, 13 Nov 2014 03:24:42 +0100 + thunar (1.6.3-2) unstable; urgency=medium [ Evgeni Golov ] diff -Nru thunar-1.6.3/debian/patches/03_add-split-view-support.patch thunar-1.6.3/debian/patches/03_add-split-view-support.patch --- thunar-1.6.3/debian/patches/03_add-split-view-support.patch 1970-01-01 01:00:00.000000000 +0100 +++ thunar-1.6.3/debian/patches/03_add-split-view-support.patch 2014-11-13 03:28:12.000000000 +0100 @@ -0,0 +1,309 @@ +Index: thunar-1.6.3/thunar/thunar-window.c +=================================================================== +--- thunar-1.6.3.orig/thunar/thunar-window.c 2014-11-13 03:28:04.854832881 +0100 ++++ thunar-1.6.3/thunar/thunar-window.c 2014-11-13 03:28:04.850832881 +0100 +@@ -80,6 +80,7 @@ + enum + { + BACK, ++ PANE_WINDOW, + RELOAD, + TOGGLE_SIDEPANE, + TOGGLE_MENUBAR, +@@ -103,6 +104,7 @@ + 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); + static gboolean thunar_window_toggle_sidepane (ThunarWindow *window); + static gboolean thunar_window_toggle_menubar (ThunarWindow *window); +@@ -247,6 +249,9 @@ + 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); + + + +@@ -256,6 +261,7 @@ + + /* internal action signals */ + gboolean (*back) (ThunarWindow *window); ++ gboolean (*pane_window) (ThunarWindow *window); + gboolean (*reload) (ThunarWindow *window); + gboolean (*toggle_sidepane) (ThunarWindow *window); + gboolean (*toggle_menubar) (ThunarWindow *window); +@@ -308,9 +314,12 @@ + GtkWidget *menubar; + GtkWidget *spinner; + GtkWidget *paned; ++ GtkWidget *panes; + GtkWidget *sidepane; + GtkWidget *view_box; + GtkWidget *notebook; ++ GtkWidget *notebook1; ++ GtkWidget *notebook2; + GtkWidget *view; + GtkWidget *statusbar; + +@@ -417,6 +426,7 @@ + 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; +@@ -500,6 +510,23 @@ + 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. + * +@@ -619,6 +646,7 @@ + /* 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); +@@ -860,28 +888,41 @@ + gtk_paned_pack2 (GTK_PANED (window->paned), window->view_box, TRUE, FALSE); + gtk_widget_show (window->view_box); + ++ /* create panes when the two notebooks 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; +@@ -1387,6 +1428,130 @@ + + + ++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, +@@ -1539,7 +1704,8 @@ + _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); + + /* drop connected signals */ + g_signal_handlers_disconnect_matched (page, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, window); +@@ -1548,7 +1714,7 @@ + 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)); +@@ -1770,6 +1936,10 @@ + 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); ++ + /* take focus on the view */ + gtk_widget_grab_focus (view); + } diff -Nru thunar-1.6.3/debian/patches/series thunar-1.6.3/debian/patches/series --- thunar-1.6.3/debian/patches/series 2014-10-30 10:59:05.000000000 +0100 +++ thunar-1.6.3/debian/patches/series 2014-11-13 03:27:35.000000000 +0100 @@ -1,2 +1,3 @@ 01_support-non-multiarch-modules.patch 02_fix-default-application-selection.patch +03_add-split-view-support.patch