Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/nemo-notebook.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ nemo_notebook_insert_page (GtkNotebook *gnotebook,
gtk_notebook_set_show_tabs (gnotebook,
gtk_notebook_get_n_pages (gnotebook) > 1);
gtk_notebook_set_tab_reorderable (gnotebook, tab_widget, TRUE);
gtk_notebook_set_tab_detachable (gnotebook, tab_widget, TRUE);

return position;
}
Expand Down
19 changes: 19 additions & 0 deletions src/nemo-view.c
Original file line number Diff line number Diff line change
Expand Up @@ -2343,6 +2343,22 @@ slot_inactive (NemoWindowSlot *slot,
remove_update_menus_timeout_callback (view);
}

static void slot_changed_pane (NemoWindowSlot *slot,
NemoView *view)
{
g_signal_handlers_disconnect_matched (view->details->window,
G_SIGNAL_MATCH_DATA, 0, 0,
NULL, NULL, view);

view->details->window = nemo_window_slot_get_window (slot);
schedule_update_menus (view);

g_signal_connect_object (view->details->window,
"hidden-files-mode-changed", G_CALLBACK (hidden_files_mode_changed),
view, 0);
hidden_files_mode_changed (view->details->window, view);
}

void
nemo_view_grab_focus (NemoView *view)
{
Expand Down Expand Up @@ -9539,6 +9555,9 @@ nemo_view_set_property (GObject *object,
g_signal_connect_object (directory_view->details->slot,
"inactive", G_CALLBACK (slot_inactive),
directory_view, 0);
g_signal_connect_object (directory_view->details->slot,
"changed-pane", G_CALLBACK (slot_changed_pane),
directory_view, 0);

g_signal_connect_object (directory_view->details->window,
"hidden-files-mode-changed", G_CALLBACK (hidden_files_mode_changed),
Expand Down
108 changes: 108 additions & 0 deletions src/nemo-window-pane.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "nemo-window-pane.h"

#include "nemo-actions.h"
#include "nemo-application.h"
#include "nemo-location-bar.h"
#include "nemo-notebook.h"
#include "nemo-pathbar.h"
Expand Down Expand Up @@ -612,6 +613,103 @@ notebook_switch_page_cb (GtkNotebook *notebook,
return FALSE;
}

static void
notebook_page_removed_cb (GtkNotebook *notebook,
GtkWidget *page,
guint page_num,
gpointer user_data)
{
NemoWindowPane *pane = user_data;
NemoWindowSlot *slot = NEMO_WINDOW_SLOT (page), *next_slot;
gboolean dnd_slot;

dnd_slot = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (slot), "dnd-window-slot"));
if (!dnd_slot) {
return;
}

if (pane->active_slot == slot) {
next_slot = get_first_inactive_slot (pane);
nemo_window_set_active_slot (pane->window, next_slot);
}

nemo_window_manage_views_close_slot (slot);
pane->slots = g_list_remove (pane->slots, slot);
}

static void
notebook_page_added_cb (GtkNotebook *notebook,
GtkWidget *page,
guint page_num,
gpointer user_data)
{
NemoWindowPane *pane;
NemoWindowSlot *slot;
NemoWindowSlot *dummy_slot;
gboolean dnd_slot;

pane = NEMO_WINDOW_PANE (user_data);
slot = NEMO_WINDOW_SLOT (page);

//Slot has been dropped onto another pane (new window or tab bar of other window)
//So reassociate the pane if needed.
if (slot->pane != pane) {
slot->pane->slots = g_list_remove (slot->pane->slots, slot);
slot->pane = pane;
pane->slots = g_list_append (pane->slots, slot);
g_signal_emit_by_name (slot, "changed-pane");
nemo_window_set_active_slot (nemo_window_slot_get_window (slot), slot);
}

dnd_slot = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (slot), "dnd-window-slot"));

if (!dnd_slot) {
//Slot does not come from dnd window creation.
return;
}

g_object_set_data (G_OBJECT (page), "dnd-window-slot",
GINT_TO_POINTER (FALSE));

dummy_slot = g_list_nth_data (pane->slots, 0);
if (dummy_slot != NULL) {
nemo_window_pane_close_slot (dummy_slot->pane, dummy_slot);
}

gtk_widget_show (GTK_WIDGET (pane));
gtk_widget_show (GTK_WIDGET (pane->window));
}

static GtkNotebook *
notebook_create_window_cb (GtkNotebook *notebook,
GtkWidget *page,
gint x,
gint y,
gpointer user_data)
{
NemoApplication *app;
NemoWindow *new_window;
NemoWindowPane *new_pane;
NemoWindowSlot *slot;

if (!NEMO_IS_WINDOW_SLOT (page)) {
return NULL;
}

app = NEMO_APPLICATION (g_application_get_default ());
new_window = nemo_application_create_window
(app, gtk_widget_get_screen (GTK_WIDGET (notebook)));

slot = NEMO_WINDOW_SLOT (page);
g_object_set_data (G_OBJECT (slot), "dnd-window-slot",
GINT_TO_POINTER (TRUE));

gtk_window_set_position (GTK_WINDOW (new_window), GTK_WIN_POS_MOUSE);

new_pane = nemo_window_get_active_pane (new_window);
return GTK_NOTEBOOK (new_pane->notebook);
}

static void
action_show_hide_search_callback (GtkAction *action,
gpointer user_data)
Expand Down Expand Up @@ -820,9 +918,19 @@ nemo_window_pane_constructed (GObject *obj)
"switch-page",
G_CALLBACK (notebook_switch_page_cb),
pane);
g_signal_connect (pane->notebook, "create-window",
G_CALLBACK (notebook_create_window_cb),
pane);
g_signal_connect (pane->notebook, "page-added",
G_CALLBACK (notebook_page_added_cb),
pane);
g_signal_connect (pane->notebook, "page-removed",
G_CALLBACK (notebook_page_removed_cb),
pane);

gtk_notebook_set_show_tabs (GTK_NOTEBOOK (pane->notebook), FALSE);
gtk_notebook_set_show_border (GTK_NOTEBOOK (pane->notebook), FALSE);
gtk_notebook_set_group_name (GTK_NOTEBOOK (pane->notebook), "nemo-slots");
gtk_widget_show (pane->notebook);
gtk_container_set_border_width (GTK_CONTAINER (pane->notebook), 0);

Expand Down
10 changes: 10 additions & 0 deletions src/nemo-window-slot.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ G_DEFINE_TYPE (NemoWindowSlot, nemo_window_slot, GTK_TYPE_BOX);
enum {
ACTIVE,
INACTIVE,
CHANGED_PANE,
LAST_SIGNAL
};

Expand Down Expand Up @@ -296,6 +297,15 @@ nemo_window_slot_class_init (NemoWindowSlotClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);

signals[CHANGED_PANE] =
g_signal_new ("changed-pane",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NemoWindowSlotClass, changed_pane),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
}

GFile *
Expand Down
5 changes: 3 additions & 2 deletions src/nemo-window-slot.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ struct NemoWindowSlotClass {
GtkBoxClass parent_class;

/* wrapped NemoWindowInfo signals, for overloading */
void (* active) (NemoWindowSlot *slot);
void (* inactive) (NemoWindowSlot *slot);
void (* active) (NemoWindowSlot *slot);
void (* inactive) (NemoWindowSlot *slot);
void (* changed_pane) (NemoWindowSlot *slot);
};

/* Each NemoWindowSlot corresponds to
Expand Down