diff --git a/src/favorites.c b/src/favorites.c index 62baf86f5b30c94b979fcdf49cc00e671e1beb05..70ecf2de1ee1864602ba55d86f1b126563d790ab 100644 --- a/src/favorites.c +++ b/src/favorites.c @@ -19,6 +19,7 @@ enum { APP_LAUNCHED, + SELECTION_ABORTED, N_SIGNALS }; static guint signals[N_SIGNALS] = { 0 }; @@ -26,7 +27,8 @@ static guint signals[N_SIGNALS] = { 0 }; typedef struct { GtkWidget *scroll; - GtkWidget *favorites; + GtkWidget *evbox; + GtkWidget *flowbox; GSettings *settings; } PhoshFavoritesPrivate; @@ -126,7 +128,7 @@ add_weston_terminal (PhoshFavorites *self) "circular"); g_signal_connect_swapped (btn, "clicked", G_CALLBACK (term_btn_clicked), self); - gtk_flow_box_insert (GTK_FLOW_BOX (priv->favorites), btn, -1); + gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1); } @@ -140,14 +142,14 @@ favorites_changed (GSettings *settings, GtkWidget *btn; /* Remove all favorites first */ - gtk_container_foreach (GTK_CONTAINER (priv->favorites), + gtk_container_foreach (GTK_CONTAINER (priv->flowbox), (GtkCallback) gtk_widget_destroy, NULL); for (gint i = 0; i < g_strv_length (favorites); i++) { gchar *fav = favorites[i]; btn = add_favorite (self, fav); if (btn) - gtk_flow_box_insert (GTK_FLOW_BOX (priv->favorites), btn, -1); + gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1); } g_strfreev (favorites); add_weston_terminal (self); @@ -164,6 +166,14 @@ draw_cb (GtkWidget *widget, cairo_t *cr, gpointer unused) } +static gboolean +evbox_button_press_event_cb (PhoshFavorites *self, GdkEventButton *event) +{ + g_signal_emit(self, signals[SELECTION_ABORTED], 0); + return FALSE; +} + + static void phosh_favorites_constructed (GObject *object) { @@ -190,23 +200,32 @@ phosh_favorites_constructed (GObject *object) gtk_widget_get_style_context (GTK_WIDGET (self)), "phosh-favorites"); - priv->favorites = gtk_widget_new (GTK_TYPE_FLOW_BOX, + /* Flowbox */ + priv->flowbox = gtk_widget_new (GTK_TYPE_FLOW_BOX, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_CENTER, "selection-mode", GTK_SELECTION_NONE, "orientation", GTK_ORIENTATION_VERTICAL, NULL); + gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX(priv->flowbox), G_MAXINT); + gtk_flow_box_set_homogeneous (GTK_FLOW_BOX(priv->flowbox), TRUE); + /* Scrolled window */ priv->scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); + gtk_container_add (GTK_CONTAINER (priv->scroll), priv->flowbox); - gtk_container_add (GTK_CONTAINER (priv->scroll), priv->favorites); - gtk_container_add (GTK_CONTAINER (self), priv->scroll); + /* Eventbox */ + priv->evbox = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (priv->evbox), priv->scroll); + g_signal_connect_swapped (priv->evbox, "button_press_event", + G_CALLBACK (evbox_button_press_event_cb), + self); + gtk_widget_set_events (priv->evbox, GDK_BUTTON_PRESS_MASK); - gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX(priv->favorites), G_MAXINT); - gtk_flow_box_set_homogeneous (GTK_FLOW_BOX(priv->favorites), TRUE); + gtk_container_add (GTK_CONTAINER (self), priv->evbox); priv->settings = g_settings_new ("sm.puri.phosh"); g_signal_connect (priv->settings, "changed::favorites", @@ -238,6 +257,9 @@ phosh_favorites_class_init (PhoshFavoritesClass *klass) signals[APP_LAUNCHED] = g_signal_new ("app-launched", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); + signals[SELECTION_ABORTED] = g_signal_new ("selection-aborted", + G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, + NULL, G_TYPE_NONE, 0); } diff --git a/src/phosh.c b/src/phosh.c index 246e2013be6501552e8a8fbaeb21021eb613e19c..62d457d58ff3069ca5fbf888a50b9a70cc42e06d 100644 --- a/src/phosh.c +++ b/src/phosh.c @@ -220,6 +220,17 @@ app_launched_cb (PhoshShell *self, } +static void +favorites_selection_aborted (PhoshShell *self, + PhoshFavorites *favorites) +{ + PhoshShellPrivate *priv = phosh_shell_get_instance_private (self); + + g_return_if_fail (priv->favorites); + close_menu (&priv->favorites); +} + + static void xdg_surface_handle_configure(void *data, struct xdg_surface *xdg_surface, @@ -314,6 +325,10 @@ favorites_activated_cb (PhoshShell *self, "app-launched", G_CALLBACK(app_launched_cb), self); + g_signal_connect_swapped (priv->favorites->window, + "selection-aborted", + G_CALLBACK(favorites_selection_aborted), + self); }