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); }
gboolean nemo_window_slot_should_close_with_mount (NemoWindowSlot *slot, GMount *mount) { GFile *mount_location; gboolean close_with_mount; mount_location = g_mount_get_root (mount); close_with_mount = g_file_has_prefix (NEMO_WINDOW_SLOT (slot)->location, mount_location) || g_file_equal (NEMO_WINDOW_SLOT (slot)->location, mount_location); g_object_unref (mount_location); return close_with_mount; }
static inline NemoWindowSlot * get_first_inactive_slot (NemoWindowPane *pane) { GList *l; NemoWindowSlot *slot; for (l = pane->slots; l != NULL; l = l->next) { slot = NEMO_WINDOW_SLOT (l->data); if (slot != pane->active_slot) { return slot; } } return NULL; }
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 gboolean notebook_switch_page_cb (GtkNotebook *notebook, GtkWidget *page, unsigned int page_num, NemoWindowPane *pane) { NemoWindowSlot *slot; GtkWidget *widget; widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (pane->notebook), page_num); g_assert (widget != NULL); /* find slot corresponding to the target page */ slot = NEMO_WINDOW_SLOT (widget); g_assert (slot != NULL); nemo_window_set_active_slot (nemo_window_slot_get_window (slot), slot); 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 nemo_window_slot_dispose (GObject *object) { NemoWindowSlot *slot; GtkWidget *widget; slot = NEMO_WINDOW_SLOT (object); nemo_window_slot_clear_forward_list (slot); nemo_window_slot_clear_back_list (slot); nemo_window_slot_remove_extra_location_widgets (slot); if (slot->content_view) { widget = GTK_WIDGET (slot->content_view); gtk_widget_destroy (widget); g_object_unref (slot->content_view); slot->content_view = NULL; } if (slot->new_content_view) { widget = GTK_WIDGET (slot->new_content_view); gtk_widget_destroy (widget); g_object_unref (slot->new_content_view); slot->new_content_view = NULL; } if (slot->set_status_timeout_id != 0) { g_source_remove (slot->set_status_timeout_id); slot->set_status_timeout_id = 0; } if (slot->loading_timeout_id != 0) { g_source_remove (slot->loading_timeout_id); slot->loading_timeout_id = 0; } nemo_window_slot_set_viewed_file (slot, NULL); /* TODO? why do we unref here? the file is NULL. * It was already here before the slot move, though */ nemo_file_unref (slot->viewed_file); if (slot->location) { /* TODO? why do we ref here, instead of unreffing? * It was already here before the slot migration, though */ g_object_ref (slot->location); } g_list_free_full (slot->pending_selection, g_object_unref); slot->pending_selection = NULL; g_clear_object (&slot->current_location_bookmark); g_clear_object (&slot->last_location_bookmark); if (slot->find_mount_cancellable != NULL) { g_cancellable_cancel (slot->find_mount_cancellable); slot->find_mount_cancellable = NULL; } slot->pane = NULL; g_free (slot->title); slot->title = NULL; g_free (slot->status_text); slot->status_text = NULL; G_OBJECT_CLASS (nemo_window_slot_parent_class)->dispose (object); }