diff --git a/src/favorites.c b/src/favorites.c index edb64c5fca277c0b116b8686ddc3f8654abe2585..70ecf2de1ee1864602ba55d86f1b126563d790ab 100644 --- a/src/favorites.c +++ b/src/favorites.c @@ -13,18 +13,22 @@ #include "config.h" #include "favorites.h" +#include "phosh.h" #include <gio/gdesktopappinfo.h> enum { APP_LAUNCHED, + SELECTION_ABORTED, N_SIGNALS }; static guint signals[N_SIGNALS] = { 0 }; typedef struct { - GtkWidget *grid; + GtkWidget *scroll; + GtkWidget *evbox; + GtkWidget *flowbox; GSettings *settings; } PhoshFavoritesPrivate; @@ -34,7 +38,7 @@ struct _PhoshFavorites GtkWindowClass parent; }; -G_DEFINE_TYPE_WITH_PRIVATE(PhoshFavorites, phosh_favorites, GTK_TYPE_WINDOW) +G_DEFINE_TYPE_WITH_PRIVATE(PhoshFavorites, phosh_favorites, GTK_TYPE_WINDOW) static void @@ -89,6 +93,9 @@ add_favorite (PhoshFavorites *self, gtk_style_context_add_class (gtk_widget_get_style_context (btn), "phosh-favorite"); + gtk_style_context_add_class (gtk_widget_get_style_context( GTK_WIDGET(btn) ), + "circular"); + gtk_button_set_image (GTK_BUTTON (btn), image); g_object_set (image, "margin", 20, NULL); @@ -101,7 +108,7 @@ add_favorite (PhoshFavorites *self, /* Add weston terminal as band aid in case all else fails for now */ static void -add_weston_terminal (PhoshFavorites *self, gint row) +add_weston_terminal (PhoshFavorites *self) { PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self); GIcon *icon; @@ -117,8 +124,11 @@ add_weston_terminal (PhoshFavorites *self, gint row) g_object_set (image, "margin", 20, NULL); gtk_button_set_image (GTK_BUTTON (btn), image); + gtk_style_context_add_class (gtk_widget_get_style_context( GTK_WIDGET(btn) ), + "circular"); + g_signal_connect_swapped (btn, "clicked", G_CALLBACK (term_btn_clicked), self); - gtk_grid_attach (GTK_GRID (priv->grid), btn, 1, row++, 1, 1); + gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1); } @@ -130,20 +140,37 @@ favorites_changed (GSettings *settings, PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self); gchar **favorites = g_settings_get_strv (settings, key); GtkWidget *btn; - guint row = 1; /* Remove all favorites first */ - gtk_container_foreach (GTK_CONTAINER (priv->grid), + gtk_container_foreach (GTK_CONTAINER (priv->flowbox), (GtkCallback) gtk_widget_destroy, NULL); - add_weston_terminal (self, row++); for (gint i = 0; i < g_strv_length (favorites); i++) { gchar *fav = favorites[i]; btn = add_favorite (self, fav); if (btn) - gtk_grid_attach (GTK_GRID (priv->grid), btn, 1, row++, 1, 1); + gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1); } g_strfreev (favorites); + add_weston_terminal (self); +} + + +static gboolean +draw_cb (GtkWidget *widget, cairo_t *cr, gpointer unused) +{ + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.1); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + return FALSE; +} + + +static gboolean +evbox_button_press_event_cb (PhoshFavorites *self, GdkEventButton *event) +{ + g_signal_emit(self, signals[SELECTION_ABORTED], 0); + return FALSE; } @@ -152,23 +179,53 @@ phosh_favorites_constructed (GObject *object) { PhoshFavorites *self = PHOSH_FAVORITES (object); PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self); + gint width, height; G_OBJECT_CLASS (phosh_favorites_parent_class)->constructed (object); /* window properties */ + phosh_shell_get_usable_area (phosh(), NULL, NULL, &width, &height); gtk_window_set_title (GTK_WINDOW (self), "phosh favorites"); gtk_window_set_decorated (GTK_WINDOW (self), FALSE); - gtk_window_resize (GTK_WINDOW (self), 100, 250); + gtk_window_resize (GTK_WINDOW (self), width, height); gtk_widget_realize(GTK_WIDGET (self)); + gtk_widget_set_app_paintable(GTK_WIDGET (self), TRUE); + + g_signal_connect (G_OBJECT(self), + "draw", + G_CALLBACK(draw_cb), + NULL); gtk_style_context_add_class ( gtk_widget_get_style_context (GTK_WIDGET (self)), "phosh-favorites"); - priv->grid = gtk_widget_new (GTK_TYPE_GRID, "halign", - GTK_ALIGN_CENTER, "valign", - GTK_ALIGN_CENTER, NULL); - gtk_container_add (GTK_CONTAINER (self), priv->grid); + /* 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); + + /* 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_container_add (GTK_CONTAINER (self), priv->evbox); priv->settings = g_settings_new ("sm.puri.phosh"); g_signal_connect (priv->settings, "changed::favorites", @@ -200,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 313f6832f669aa56fad21975eec9396206b3f5c6..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); } @@ -782,7 +797,7 @@ phosh_shell_constructed (GObject *object) gtk_icon_theme_add_resource_path (gtk_icon_theme_get_default (), "/sm/puri/phosh/icons"); - + env_setup (); css_setup (self); panel_create (self); diff --git a/tests/meson.build b/tests/meson.build index 3c998a49948b5cf89ee0b49c532896dd43c79e54..63d560362124774422db27a5f8107785e30dd42f 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -20,6 +20,10 @@ test_link_args = [ '-fPIC', ] +test_stubs = [ + 'phoshstub.c', +] + cls_names = [ 'favorites', ] @@ -27,7 +31,8 @@ cls_names = [ foreach cls_name : cls_names t = executable('test-@0@'.format(cls_name), ['test-@0@.c'.format(cls_name), - '../src/@0@.c'.format(cls_name)], + '../src/@0@.c'.format(cls_name), + test_stubs], c_args: test_cflags, link_args: test_link_args, dependencies: phosh_deps, diff --git a/tests/phoshstub.c b/tests/phoshstub.c new file mode 100644 index 0000000000000000000000000000000000000000..ff886475ecda2600132f516d6f752bc3809cf86c --- /dev/null +++ b/tests/phoshstub.c @@ -0,0 +1,23 @@ +/* Stubs so we don't need to run the shell */ + +#include <glib.h> + +gpointer +phosh () +{ + return NULL; +} + +void +phosh_shell_get_usable_area (gpointer *self, gint *x, gint *y, gint *width, gint *height) +{ + if (x) + *x = 16; + if (y) + *y = 32; + if (width) + *width = 64; + if (height) + *height = 128; + return; +}