summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-07-29 18:07:24 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-07-31 13:38:13 -0300
commit9c4f013e99dbfcafbfbce790e4e425a3f92928ca (patch)
tree4af621e74e3f45c90984e9e52a2b9604bf240315
parentba2da7b800e14f22e509161c5c038642c30f9b60 (diff)
downloadnautilus-9c4f013e99dbfcafbfbce790e4e425a3f92928ca.tar.gz
project: simplify focus chain
Nautilus classes add custom methods to grab the focus differently according to the class. The problem with this approach, however, is that we end up with more code coupling, since it's necessary to include more headers to use the custom grab methods. To fix that, make classes override GtkWidget::grab_focus method and remove the custom methods, so widgets can simply call gtk_widget_grab_focus.
-rw-r--r--src/nautilus-query-editor.c2
-rw-r--r--src/nautilus-toolbar.c8
-rw-r--r--src/nautilus-view.c11
-rw-r--r--src/nautilus-view.h1
-rw-r--r--src/nautilus-window-slot.c23
-rw-r--r--src/nautilus-window.c24
-rw-r--r--src/nautilus-window.h1
7 files changed, 43 insertions, 27 deletions
diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c
index 0e07bb29c..ccdb55bed 100644
--- a/src/nautilus-query-editor.c
+++ b/src/nautilus-query-editor.c
@@ -903,7 +903,7 @@ entry_key_press_event_cb (GtkWidget *widget,
NautilusQueryEditor *editor)
{
if (event->keyval == GDK_KEY_Down) {
- nautilus_window_grab_focus (NAUTILUS_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (widget))));
+ gtk_widget_grab_focus (gtk_widget_get_toplevel (GTK_WIDGET (widget)));
}
return FALSE;
}
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index 5d67c833f..3e33d2840 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -426,13 +426,7 @@ static void
view_menu_popover_closed (GtkPopover *popover,
NautilusToolbar *self)
{
- NautilusWindowSlot *slot;
- NautilusView *view;
-
- slot = nautilus_window_get_active_slot (self->priv->window);
- view = nautilus_window_slot_get_current_view (slot);
-
- nautilus_view_grab_focus (view);
+ gtk_widget_grab_focus (GTK_WIDGET (self->priv->window));
}
static gboolean
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index da3583e6c..8aa68192d 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -2697,12 +2697,18 @@ slot_inactive (NautilusWindowSlot *slot,
remove_update_context_menus_timeout_callback (view);
}
-void
-nautilus_view_grab_focus (NautilusView *view)
+static void
+nautilus_view_grab_focus (GtkWidget *widget)
{
/* focus the child of the scrolled window if it exists */
+ NautilusView *view;
GtkWidget *child;
+
+ view = NAUTILUS_VIEW (widget);
child = gtk_bin_get_child (GTK_BIN (view->details->scrolled_window));
+
+ GTK_WIDGET_CLASS (nautilus_view_parent_class)->grab_focus (widget);
+
if (child) {
gtk_widget_grab_focus (GTK_WIDGET (child));
}
@@ -7744,6 +7750,7 @@ nautilus_view_class_init (NautilusViewClass *klass)
widget_class->destroy = nautilus_view_destroy;
widget_class->scroll_event = nautilus_view_scroll_event;
widget_class->parent_set = nautilus_view_parent_set;
+ widget_class->grab_focus = nautilus_view_grab_focus;
g_type_class_add_private (klass, sizeof (NautilusViewDetails));
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 95770f72e..5bd42d944 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -380,7 +380,6 @@ gboolean nautilus_view_can_zoom_out (NautilusView *v
void nautilus_view_pop_up_pathbar_context_menu (NautilusView *view,
GdkEventButton *event,
const char *location);
-void nautilus_view_grab_focus (NautilusView *view);
void nautilus_view_update_menus (NautilusView *view);
void nautilus_view_update_context_menus (NautilusView *view);
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index 7c1daf9e1..f87b14b99 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -385,7 +385,7 @@ nautilus_window_slot_set_search_visible (NautilusWindowSlot *slot,
}
if (active_slot) {
- nautilus_window_grab_focus (slot->details->window);
+ gtk_widget_grab_focus (GTK_WIDGET (slot->details->window));
}
/* Now hide the editor and clear its state */
@@ -2376,9 +2376,28 @@ nautilus_window_slot_dispose (GObject *object)
}
static void
+nautilus_window_slot_grab_focus (GtkWidget *widget)
+{
+ NautilusWindowSlot *slot;
+
+ slot = NAUTILUS_WINDOW_SLOT (widget);
+
+ GTK_WIDGET_CLASS (nautilus_window_slot_parent_class)->grab_focus (widget);
+
+ if (slot->details->search_visible) {
+ gtk_widget_grab_focus (GTK_WIDGET (slot->details->query_editor));
+ } else if (slot->details->content_view) {
+ gtk_widget_grab_focus (GTK_WIDGET (slot->details->content_view));
+ } else if (slot->details->new_content_view) {
+ gtk_widget_grab_focus (GTK_WIDGET (slot->details->new_content_view));
+ }
+}
+
+static void
nautilus_window_slot_class_init (NautilusWindowSlotClass *klass)
{
GObjectClass *oclass = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
klass->active = real_active;
klass->inactive = real_inactive;
@@ -2388,6 +2407,8 @@ nautilus_window_slot_class_init (NautilusWindowSlotClass *klass)
oclass->set_property = nautilus_window_slot_set_property;
oclass->get_property = nautilus_window_slot_get_property;
+ widget_class->grab_focus = nautilus_window_slot_grab_focus;
+
signals[ACTIVE] =
g_signal_new ("active",
G_TYPE_FROM_CLASS (klass),
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index e3c3f25cf..1b8d9d04f 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -590,17 +590,17 @@ remember_focus_widget (NautilusWindow *window)
}
}
-void
-nautilus_window_grab_focus (NautilusWindow *window)
+static void
+nautilus_window_grab_focus (GtkWidget *widget)
{
NautilusWindowSlot *slot;
- NautilusView *view;
- slot = nautilus_window_get_active_slot (window);
- view = nautilus_window_slot_get_view (slot);
+ slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (widget));
- if (view) {
- nautilus_view_grab_focus (view);
+ GTK_WIDGET_CLASS (nautilus_window_parent_class)->grab_focus (widget);
+
+ if (slot) {
+ gtk_widget_grab_focus (GTK_WIDGET (slot));
}
}
@@ -608,12 +608,7 @@ static void
restore_focus_widget (NautilusWindow *window)
{
if (window->priv->last_focus_widget != NULL) {
- if (NAUTILUS_IS_VIEW (window->priv->last_focus_widget)) {
- nautilus_view_grab_focus (NAUTILUS_VIEW (window->priv->last_focus_widget));
- } else {
- gtk_widget_grab_focus (window->priv->last_focus_widget);
- }
-
+ gtk_widget_grab_focus (window->priv->last_focus_widget);
unset_focus_widget (window);
}
}
@@ -2285,7 +2280,7 @@ nautilus_window_view_visible (NautilusWindow *window,
nautilus_window_slot_update_title (slot);
}
- nautilus_window_grab_focus (window);
+ gtk_widget_grab_focus (GTK_WIDGET (window));
/* All slots, show window */
gtk_widget_show (GTK_WIDGET (window));
@@ -2623,6 +2618,7 @@ nautilus_window_class_init (NautilusWindowClass *class)
wclass->window_state_event = nautilus_window_state_event;
wclass->button_press_event = nautilus_window_button_press_event;
wclass->delete_event = nautilus_window_delete_event;
+ wclass->grab_focus = nautilus_window_grab_focus;
class->close = real_window_close;
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 4b16bf752..ed102d89f 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -122,7 +122,6 @@ void nautilus_window_slot_close (NautilusWindow *wind
NautilusWindowSlot *slot);
void nautilus_window_sync_location_widgets (NautilusWindow *window);
-void nautilus_window_grab_focus (NautilusWindow *window);
void nautilus_window_hide_sidebar (NautilusWindow *window);
void nautilus_window_show_sidebar (NautilusWindow *window);