From ec3ef0d0a3f38c22bae7c5f03b98622699af7ba0 Mon Sep 17 00:00:00 2001 From: Kevin Lopez Date: Thu, 4 May 2017 04:12:43 +0200 Subject: [PATCH] search-view: hide if click is performed outside Result drop down should disappear when any click is performed outside that drop down. https://bugzilla.gnome.org/show_bug.cgi?id=74796 https://bugzilla.gnome.org/show_bug.cgi?id=747962 --- src/gcal-window.c | 41 +++++++++++++++++++++++++++++++++++- src/views/gcal-month-view.c | 2 +- src/views/gcal-week-grid.c | 2 +- src/views/gcal-week-header.c | 2 +- src/views/gcal-year-view.c | 4 ++-- 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/gcal-window.c b/src/gcal-window.c index e20bb7bb..6007c878 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -163,6 +163,10 @@ struct _GcalWindow /* temp to keep event_creation */ gboolean open_edit_dialog; + + /* handler for the searh_view */ + gint click_outside_handler_id; + }; enum @@ -209,6 +213,27 @@ static const GActionEntry actions[] = { /* * Auxiliary methods */ + +static gboolean +hide_search_view_on_click_outside (GcalWindow *window, + GdkEventButton *event, + GtkPopover *popover) +{ + GdkWindow *search_view_window; + + search_view_window = gtk_widget_get_window (GTK_WIDGET (popover)); + + /* If the event is not produced in the search view widget, we hide the search_bar */ + if (event->window != search_view_window) + { + gtk_popover_popdown (popover); + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (window->search_bar), FALSE); + } + + return GDK_EVENT_PROPAGATE; +} + + static void update_today_button_sensitive (GcalWindow *window) { @@ -1143,7 +1168,21 @@ search_toggled (GObject *object, /* update header_bar widget */ if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (window->search_bar))) - gcal_search_view_search (GCAL_SEARCH_VIEW (window->search_view), NULL, NULL); + { + gcal_search_view_search (GCAL_SEARCH_VIEW (window->search_view), NULL, NULL); + + /* When the search button is toogled we connect the signal */ + window->click_outside_handler_id = g_signal_connect (window, + "button-press-event", + G_CALLBACK (hide_search_view_on_click_outside), + window->search_view); + } + else + { + /* When the search mode is false we disconnect the handler */ + g_signal_handler_disconnect (window, window->click_outside_handler_id); + } + } static void diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c index 8cb77c0e..80db0d81 100644 --- a/src/views/gcal-month-view.c +++ b/src/views/gcal-month-view.c @@ -1973,7 +1973,7 @@ gcal_month_view_button_press (GtkWidget *widget, if (pressed_indicator && g_hash_table_contains (ppriv->overflow_cells, GINT_TO_POINTER (clicked_cell))) self->pressed_overflow_indicator = clicked_cell; - return TRUE; + return GDK_EVENT_PROPAGATE; } /** diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c index 4607a310..68d0d871 100644 --- a/src/views/gcal-week-grid.c +++ b/src/views/gcal-week-grid.c @@ -798,7 +798,7 @@ gcal_week_grid_button_press (GtkWidget *widget, gtk_widget_queue_draw (widget); - return GDK_EVENT_STOP; + return GDK_EVENT_PROPAGATE; } static gboolean diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c index 3aa179e7..1736268a 100644 --- a/src/views/gcal-week-header.c +++ b/src/views/gcal-week-header.c @@ -140,7 +140,7 @@ on_button_pressed (GcalWeekHeader *self, gtk_widget_queue_draw (GTK_WIDGET (self)); - return GDK_EVENT_STOP; + return GDK_EVENT_PROPAGATE; } static gboolean diff --git a/src/views/gcal-year-view.c b/src/views/gcal-year-view.c index 72bd59a1..982c0c66 100644 --- a/src/views/gcal-year-view.c +++ b/src/views/gcal-year-view.c @@ -1135,7 +1135,7 @@ navigator_button_press_cb (GcalYearView *year_view, gboolean is_title = FALSE; if (!calculate_day_month_for_coord (year_view, event->x, event->y, &day, &month, &is_title)) - return FALSE; + return GDK_EVENT_PROPAGATE; if (is_title) day = 1; @@ -1144,7 +1144,7 @@ navigator_button_press_cb (GcalYearView *year_view, year_view->selected_data->start_day = day; year_view->selected_data->start_month = month; - return TRUE; + return GDK_EVENT_PROPAGATE; } static gboolean