From add9956bde3185af9c9125278664c1006b884046 Mon Sep 17 00:00:00 2001 From: Matt Watson Date: Thu, 16 Jan 2014 11:54:18 -0800 Subject: Added a maximize button to eos-topbar Which toggles the application between a maximized and unmaximized state. All applications will still start maximized by default. [endlessm/eos-sdk#477] --- endless/eostopbar.c | 44 +++++++++++++++++++++++++++++++++++++++++++- endless/eoswindow.c | 47 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 82 insertions(+), 9 deletions(-) diff --git a/endless/eostopbar.c b/endless/eostopbar.c index 6975e39..8da01e6 100644 --- a/endless/eostopbar.c +++ b/endless/eostopbar.c @@ -15,7 +15,7 @@ * The #EosTopBar has three different areas that can be managed through this * class: a left widget, center widget, and action buttons area. * - * The action buttons area contain "minimize" and "close" buttons. + * The action buttons area contain "minimize", "maximize" and "close" buttons. */ #define _EOS_STYLE_CLASS_TOP_BAR "top-bar" #define _EOS_TOP_BAR_HEIGHT_PX 36 @@ -25,6 +25,7 @@ #define _EOS_TOP_BAR_BUTTON_SEPARATION_PX 8 #define _EOS_TOP_BAR_VERTICAL_BUTTON_MARGIN_PX 6 #define _EOS_TOP_BAR_MINIMIZE_ICON_NAME "window-minimize-symbolic" +#define _EOS_TOP_BAR_MAXIMIZE_ICON_NAME "face-monkey" #define _EOS_TOP_BAR_CLOSE_ICON_NAME "window-close-symbolic" typedef struct { @@ -37,6 +38,8 @@ typedef struct { GtkWidget *minimize_button; GtkWidget *minimize_icon; + GtkWidget *maximize_button; + GtkWidget *maximize_icon; GtkWidget *close_button; GtkWidget *close_icon; } EosTopBarPrivate; @@ -46,6 +49,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (EosTopBar, eos_top_bar, GTK_TYPE_EVENT_BOX) enum { CLOSE_CLICKED, MINIMIZE_CLICKED, + MAXIMIZE_CLICKED, LAST_SIGNAL }; @@ -106,6 +110,17 @@ eos_top_bar_class_init (EosTopBarClass *klass) NULL, NULL, NULL, G_TYPE_NONE, 0); + /* + * Emitted when the maximize button has been activated. + */ + top_bar_signals[MAXIMIZE_CLICKED] = + g_signal_new ("maximize-clicked", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + /* * Emitted when the close button has been activated. */ @@ -126,6 +141,14 @@ on_minimize_clicked_cb (GtkButton *button, g_signal_emit (self, top_bar_signals[MINIMIZE_CLICKED], 0); } +static void +on_maximize_clicked_cb (GtkButton *button, + gpointer user_data) +{ + EosTopBar *self = EOS_TOP_BAR (user_data); + g_signal_emit (self, top_bar_signals[MAXIMIZE_CLICKED], 0); +} + static void on_close_clicked_cb (GtkButton *button, gpointer user_data) @@ -179,6 +202,21 @@ eos_top_bar_init (EosTopBar *self) gtk_container_add (GTK_CONTAINER (priv->minimize_button), priv->minimize_icon); + priv->maximize_button = + g_object_new (GTK_TYPE_BUTTON, + "halign", GTK_ALIGN_END, + "valign", GTK_ALIGN_CENTER, + NULL); + priv->maximize_icon = + gtk_image_new_from_icon_name (_EOS_TOP_BAR_MAXIMIZE_ICON_NAME, + GTK_ICON_SIZE_SMALL_TOOLBAR); + g_object_set(priv->maximize_icon, + "pixel-size", _EOS_TOP_BAR_ICON_SIZE_PX, + "margin", _EOS_TOP_BAR_BUTTON_PADDING_PX, + NULL); + gtk_container_add (GTK_CONTAINER (priv->maximize_button), + priv->maximize_icon); + priv->close_button = g_object_new (GTK_TYPE_BUTTON, "halign", GTK_ALIGN_END, @@ -200,6 +238,8 @@ eos_top_bar_init (EosTopBar *self) priv->center_top_bar_attach); gtk_container_add (GTK_CONTAINER (priv->actions_grid), priv->minimize_button); + gtk_container_add (GTK_CONTAINER (priv->actions_grid), + priv->maximize_button); gtk_container_add (GTK_CONTAINER (priv->actions_grid), priv->close_button); @@ -210,6 +250,8 @@ eos_top_bar_init (EosTopBar *self) g_signal_connect (priv->minimize_button, "clicked", G_CALLBACK (on_minimize_clicked_cb), self); + g_signal_connect (priv->maximize_button, "clicked", + G_CALLBACK (on_maximize_clicked_cb), self); g_signal_connect (priv->close_button, "clicked", G_CALLBACK (on_close_clicked_cb), self); } diff --git a/endless/eoswindow.c b/endless/eoswindow.c index 42b3cae..361c6b9 100644 --- a/endless/eoswindow.c +++ b/endless/eoswindow.c @@ -95,6 +95,8 @@ typedef struct { EosPageManager *page_manager; + gboolean maximized; + /* For scaling base font-size */ GtkCssProvider *font_size_provider; gboolean font_scaling_active; @@ -701,19 +703,44 @@ eos_window_class_init (EosWindowClass *klass) } static void -on_minimize_clicked_cb (GtkWidget* top_bar) +on_minimize_clicked_cb (GtkWidget* top_bar, + gpointer data) +{ + EosWindow *self = (EosWindow *)data; + + gtk_window_iconify (GTK_WINDOW (self)); +} + +static void +on_maximize_clicked_cb (GtkWidget* top_bar, + gpointer data) { - GtkWidget *window = gtk_widget_get_toplevel (top_bar); + EosWindow *self = (EosWindow *)data; + EosWindowPrivate *priv = eos_window_get_instance_private (self); - gtk_window_iconify (GTK_WINDOW (window)); + if (priv->maximized) + gtk_window_unmaximize (GTK_WINDOW (self)); + else + gtk_window_maximize (GTK_WINDOW (self)); } static void -on_close_clicked_cb (GtkWidget* top_bar) +on_close_clicked_cb (GtkWidget* top_bar, + gpointer data) { - GtkWidget *window = gtk_widget_get_toplevel (top_bar); + EosWindow *self = (EosWindow *)data; + + gtk_window_close (GTK_WINDOW (self)); +} - gtk_window_close (GTK_WINDOW (window)); +static void +on_window_state_event_cb (GtkWidget* widget, + GdkEvent* event) +{ + EosWindow *self = EOS_WINDOW (widget); + EosWindowPrivate *priv = eos_window_get_instance_private (self); + GdkWindowState window_state = ((GdkEventWindowState *)event)->new_window_state; + priv->maximized = window_state & GDK_WINDOW_STATE_MAXIMIZED; } /* Make sure that the edge finishing does not catch input events */ @@ -818,9 +845,13 @@ eos_window_init (EosWindow *self) gtk_window_set_default_size (GTK_WINDOW (self), DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT); g_signal_connect (priv->top_bar, "minimize-clicked", - G_CALLBACK (on_minimize_clicked_cb), NULL); + G_CALLBACK (on_minimize_clicked_cb), self); + g_signal_connect (priv->top_bar, "maximize-clicked", + G_CALLBACK (on_maximize_clicked_cb), self); g_signal_connect (priv->top_bar, "close-clicked", - G_CALLBACK (on_close_clicked_cb), NULL); + G_CALLBACK (on_close_clicked_cb), self); + g_signal_connect (self, "window-state-event", + G_CALLBACK (on_window_state_event_cb), NULL); eos_window_set_page_manager (self, EOS_PAGE_MANAGER (eos_page_manager_new ())); -- cgit v1.2.3 From c317a0c874c33872ca3c8d916393658ebefc390a Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Fri, 17 Jan 2014 18:34:00 -0200 Subject: Implement code review comments Spacing fixes [endlessm/eos-sdk#477] --- endless/eostopbar.c | 2 +- endless/eoswindow.c | 23 +++++++++-------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/endless/eostopbar.c b/endless/eostopbar.c index 8da01e6..6d98090 100644 --- a/endless/eostopbar.c +++ b/endless/eostopbar.c @@ -143,7 +143,7 @@ on_minimize_clicked_cb (GtkButton *button, static void on_maximize_clicked_cb (GtkButton *button, - gpointer user_data) + gpointer user_data) { EosTopBar *self = EOS_TOP_BAR (user_data); g_signal_emit (self, top_bar_signals[MAXIMIZE_CLICKED], 0); diff --git a/endless/eoswindow.c b/endless/eoswindow.c index 361c6b9..6917a5a 100644 --- a/endless/eoswindow.c +++ b/endless/eoswindow.c @@ -703,19 +703,16 @@ eos_window_class_init (EosWindowClass *klass) } static void -on_minimize_clicked_cb (GtkWidget* top_bar, - gpointer data) +on_minimize_clicked_cb (GtkWidget *top_bar, + EosWindow *self) { - EosWindow *self = (EosWindow *)data; - gtk_window_iconify (GTK_WINDOW (self)); } static void -on_maximize_clicked_cb (GtkWidget* top_bar, - gpointer data) +on_maximize_clicked_cb (GtkWidget *top_bar, + EosWindow *self) { - EosWindow *self = (EosWindow *)data; EosWindowPrivate *priv = eos_window_get_instance_private (self); if (priv->maximized) @@ -725,21 +722,19 @@ on_maximize_clicked_cb (GtkWidget* top_bar, } static void -on_close_clicked_cb (GtkWidget* top_bar, - gpointer data) +on_close_clicked_cb (GtkWidget *top_bar, + EosWindow *self) { - EosWindow *self = (EosWindow *)data; - gtk_window_close (GTK_WINDOW (self)); } static void -on_window_state_event_cb (GtkWidget* widget, - GdkEvent* event) +on_window_state_event_cb (GtkWidget *widget, + GdkEventWindowState *event) { EosWindow *self = EOS_WINDOW (widget); EosWindowPrivate *priv = eos_window_get_instance_private (self); - GdkWindowState window_state = ((GdkEventWindowState *)event)->new_window_state; + GdkWindowState window_state = event->new_window_state; priv->maximized = window_state & GDK_WINDOW_STATE_MAXIMIZED; } -- cgit v1.2.3