summaryrefslogtreecommitdiff
path: root/endless
diff options
context:
space:
mode:
Diffstat (limited to 'endless')
-rw-r--r--endless/eostopbar-private.h3
-rw-r--r--endless/eostopbar.c302
-rw-r--r--endless/eoswindow.c57
3 files changed, 47 insertions, 315 deletions
diff --git a/endless/eostopbar-private.h b/endless/eostopbar-private.h
index aa6e44b..a152255 100644
--- a/endless/eostopbar-private.h
+++ b/endless/eostopbar-private.h
@@ -54,9 +54,6 @@ void eos_top_bar_set_left_widget (EosTopBar *self,
void eos_top_bar_set_center_widget (EosTopBar *self,
GtkWidget *center_top_bar_widget);
-void eos_top_bar_update_window_maximized (EosTopBar *self,
- gboolean is_maximized);
-
gboolean eos_top_bar_get_show_credits_button (EosTopBar *self);
void eos_top_bar_set_show_credits_button (EosTopBar *self,
diff --git a/endless/eostopbar.c b/endless/eostopbar.c
index 3f9dbdf..1debdee 100644
--- a/endless/eostopbar.c
+++ b/endless/eostopbar.c
@@ -11,42 +11,20 @@
* @short_description: The top bar of the window, above the main area of your
* application.
* @title: TopBar
- *
- * 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", "maximize" and "close" buttons.
+ *
+ * The #EosTopBar has two different areas that can be managed through this
+ * class: a left widget and a center widget, which can both contain any other
+ * widget.
*/
-#define _EOS_STYLE_CLASS_TOP_BAR "top-bar"
-#define _EOS_STYLE_CLASS_UNMAXIMIZED "unmaximized"
#define _EOS_TOP_BAR_HEIGHT_PX 36
-#define _EOS_TOP_BAR_BUTTON_PADDING_PX 4
-#define _EOS_TOP_BAR_ICON_SIZE_PX 16
-#define _EOS_TOP_BAR_HORIZONTAL_BUTTON_MARGIN_PX 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 "window-maximize-symbolic"
-#define _EOS_TOP_BAR_UNMAXIMIZE_ICON_NAME "window-restore-symbolic"
-#define _EOS_TOP_BAR_CLOSE_ICON_NAME "window-close-symbolic"
-#define _EOS_TOP_BAR_CREDITS_ICON_NAME "user-info-symbolic"
typedef struct {
- GtkWidget *actions_grid;
- GtkWidget *left_top_bar_attach;
- GtkWidget *center_top_bar_attach;
-
+ GtkWidget *center_top_bar_attach; /* needed to suppress default title */
GtkWidget *left_top_bar_widget;
GtkWidget *center_top_bar_widget;
- GtkWidget *minimize_button;
- GtkWidget *minimize_icon;
- GtkWidget *maximize_button;
- GtkWidget *maximize_icon;
- GtkWidget *close_button;
- GtkWidget *close_icon;
- GtkWidget *credits_button;
- GtkWidget *credits_icon;
+ /* This works like a revealer but it's really a GtkStack so that it takes up
+ space and presents a target even when it's not shown. */
GtkWidget *credits_stack;
gboolean show_credits_button;
@@ -54,12 +32,9 @@ typedef struct {
guint credits_leave_handler;
} EosTopBarPrivate;
-G_DEFINE_TYPE_WITH_PRIVATE (EosTopBar, eos_top_bar, GTK_TYPE_EVENT_BOX)
+G_DEFINE_TYPE_WITH_PRIVATE (EosTopBar, eos_top_bar, GTK_TYPE_HEADER_BAR)
enum {
- CLOSE_CLICKED,
- MINIMIZE_CLICKED,
- MAXIMIZE_CLICKED,
CREDITS_CLICKED,
LAST_SIGNAL
};
@@ -75,6 +50,15 @@ enum {
static GParamSpec *eos_top_bar_props[NPROPS] = { NULL, };
static void
+eos_top_bar_constructed (GObject *object)
+{
+ EosTopBar *self = EOS_TOP_BAR (object);
+ EosTopBarPrivate *priv = eos_top_bar_get_instance_private (self);
+ gtk_header_bar_set_custom_title (GTK_HEADER_BAR (self),
+ priv->center_top_bar_attach);
+}
+
+static void
eos_top_bar_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -175,48 +159,33 @@ eos_top_bar_draw (GtkWidget *self_widget,
}
static void
+on_credits_clicked (GtkButton *button,
+ EosTopBar *self)
+{
+ g_signal_emit (self, top_bar_signals[CREDITS_CLICKED], 0);
+}
+
+static void
eos_top_bar_class_init (EosTopBarClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->constructed = eos_top_bar_constructed;
object_class->get_property = eos_top_bar_get_property;
object_class->set_property = eos_top_bar_set_property;
widget_class->get_preferred_height = eos_top_bar_get_preferred_height;
widget_class->draw = eos_top_bar_draw;
- /*
- * Emitted when the minimize button has been activated.
- */
- top_bar_signals[MINIMIZE_CLICKED] =
- g_signal_new ("minimize-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 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.
- */
- top_bar_signals[CLOSE_CLICKED] =
- g_signal_new ("close-clicked",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- 0,
- NULL, NULL, NULL,
- G_TYPE_NONE, 0);
+ gtk_widget_class_set_template_from_resource (widget_class,
+ "/com/endlessm/sdk/widgets/topbar.ui");
+ gtk_widget_class_bind_template_child_internal_private (widget_class,
+ EosTopBar,
+ center_top_bar_attach);
+ gtk_widget_class_bind_template_child_internal_private (widget_class,
+ EosTopBar,
+ credits_stack);
+ gtk_widget_class_bind_template_callback (widget_class, on_credits_clicked);
top_bar_signals[CREDITS_CLICKED] =
g_signal_new ("credits-clicked", G_OBJECT_CLASS_TYPE (object_class),
@@ -232,174 +201,24 @@ eos_top_bar_class_init (EosTopBarClass *klass)
g_object_class_install_properties (object_class, NPROPS, eos_top_bar_props);
}
-static void
-on_minimize_clicked_cb (GtkButton *button,
- gpointer user_data)
-{
- EosTopBar *self = EOS_TOP_BAR (user_data);
- 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)
-{
- EosTopBar *self = EOS_TOP_BAR (user_data);
- g_signal_emit (self, top_bar_signals[CLOSE_CLICKED], 0);
-}
-
static gboolean
-on_stack_hover (GtkStack *stack,
- GdkEvent *event,
- gpointer data)
+on_stack_hover (GtkStack *stack,
+ GdkEventCrossing *event,
+ gpointer data)
{
gboolean show = GPOINTER_TO_INT (data);
- gtk_stack_set_visible_child_name (stack, show ? "button" : "blank");
+ if (event->window == gtk_widget_get_window (GTK_WIDGET (stack)))
+ gtk_stack_set_visible_child_name (stack, show ? "button" : "blank");
return GDK_EVENT_PROPAGATE;
}
static void
-on_credits_clicked (GtkButton *button,
- EosTopBar *self)
-{
- g_signal_emit (self, top_bar_signals[CREDITS_CLICKED], 0);
-}
-
-static void
eos_top_bar_init (EosTopBar *self)
{
- GtkStyleContext *context;
EosTopBarPrivate *priv = eos_top_bar_get_instance_private (self);
- context = gtk_widget_get_style_context (GTK_WIDGET (self));
- gtk_style_context_add_class (context, _EOS_STYLE_CLASS_TOP_BAR);
-
- gtk_widget_set_hexpand (GTK_WIDGET (self), TRUE);
-
- priv->actions_grid =
- g_object_new (GTK_TYPE_GRID,
- "orientation", GTK_ORIENTATION_HORIZONTAL,
- "hexpand", TRUE,
- "halign", GTK_ALIGN_FILL,
- "column-spacing", _EOS_TOP_BAR_BUTTON_SEPARATION_PX,
- "margin-top", _EOS_TOP_BAR_VERTICAL_BUTTON_MARGIN_PX,
- "margin-bottom", _EOS_TOP_BAR_VERTICAL_BUTTON_MARGIN_PX,
- "margin-start", _EOS_TOP_BAR_HORIZONTAL_BUTTON_MARGIN_PX,
- "margin-end", _EOS_TOP_BAR_HORIZONTAL_BUTTON_MARGIN_PX,
- NULL);
-
- priv->left_top_bar_attach = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
- priv->center_top_bar_attach = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
- gtk_widget_set_hexpand (priv->center_top_bar_attach, TRUE);
- gtk_widget_set_halign (priv->center_top_bar_attach, GTK_ALIGN_CENTER);
- gtk_widget_set_vexpand (priv->left_top_bar_attach, TRUE);
- gtk_widget_set_vexpand (priv->center_top_bar_attach, TRUE);
-
- /* TODO implement adding actions and widgets to the actions_grid */
-
- priv->minimize_button =
- g_object_new (GTK_TYPE_BUTTON,
- "can-focus", FALSE,
- "halign", GTK_ALIGN_END,
- "valign", GTK_ALIGN_CENTER,
- NULL);
- priv->minimize_icon =
- gtk_image_new_from_icon_name (_EOS_TOP_BAR_MINIMIZE_ICON_NAME,
- GTK_ICON_SIZE_SMALL_TOOLBAR);
- g_object_set(priv->minimize_icon,
- "pixel-size", _EOS_TOP_BAR_ICON_SIZE_PX,
- "margin", _EOS_TOP_BAR_BUTTON_PADDING_PX,
- NULL);
- gtk_container_add (GTK_CONTAINER (priv->minimize_button),
- priv->minimize_icon);
-
- priv->maximize_button =
- g_object_new (GTK_TYPE_BUTTON,
- "can-focus", FALSE,
- "halign", GTK_ALIGN_END,
- "valign", GTK_ALIGN_CENTER,
- NULL);
- priv->maximize_icon = gtk_image_new ();
- eos_top_bar_update_window_maximized (self, TRUE);
- 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,
- "can-focus", FALSE,
- "halign", GTK_ALIGN_END,
- "valign", GTK_ALIGN_CENTER,
- NULL);
- priv->close_icon =
- gtk_image_new_from_icon_name (_EOS_TOP_BAR_CLOSE_ICON_NAME,
- GTK_ICON_SIZE_SMALL_TOOLBAR);
- g_object_set(priv->close_icon,
- "pixel-size", _EOS_TOP_BAR_ICON_SIZE_PX,
- "margin", _EOS_TOP_BAR_BUTTON_PADDING_PX,
- NULL);
- gtk_container_add (GTK_CONTAINER (priv->close_button),
- priv->close_icon);
+ gtk_widget_init_template (GTK_WIDGET (self));
- /* This works like a revealer but it's really a GtkStack so that it takes up
- space and presents a target even when it's not shown. */
- priv->credits_stack = gtk_stack_new ();
- gtk_stack_set_transition_type (GTK_STACK (priv->credits_stack),
- GTK_STACK_TRANSITION_TYPE_CROSSFADE);
- gtk_widget_add_events (priv->credits_stack,
- GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
- gtk_stack_add_named (GTK_STACK (priv->credits_stack),
- gtk_event_box_new (), "blank");
- priv->credits_button = g_object_new (GTK_TYPE_BUTTON,
- "can-focus", FALSE,
- "halign", GTK_ALIGN_END,
- "valign", GTK_ALIGN_CENTER,
- NULL);
- priv->credits_icon =
- gtk_image_new_from_icon_name (_EOS_TOP_BAR_CREDITS_ICON_NAME,
- GTK_ICON_SIZE_SMALL_TOOLBAR);
- g_object_set (priv->credits_icon,
- "pixel-size", _EOS_TOP_BAR_ICON_SIZE_PX,
- "margin", _EOS_TOP_BAR_BUTTON_PADDING_PX,
- NULL);
- gtk_container_add (GTK_CONTAINER (priv->credits_button), priv->credits_icon);
- gtk_stack_add_named (GTK_STACK (priv->credits_stack),
- priv->credits_button, "button");
-
- gtk_container_add (GTK_CONTAINER (priv->actions_grid),
- priv->left_top_bar_attach);
- gtk_container_add (GTK_CONTAINER (priv->actions_grid),
- priv->center_top_bar_attach);
- gtk_container_add (GTK_CONTAINER (priv->actions_grid), priv->credits_stack);
- 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);
-
- gtk_container_add (GTK_CONTAINER (self), priv->actions_grid);
-
- gtk_widget_set_hexpand (GTK_WIDGET (self), TRUE);
- gtk_widget_set_halign (GTK_WIDGET (self), GTK_ALIGN_FILL);
-
- 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);
priv->credits_enter_handler =
g_signal_connect (priv->credits_stack, "enter-notify-event",
G_CALLBACK (on_stack_hover), GINT_TO_POINTER (TRUE));
@@ -408,8 +227,6 @@ eos_top_bar_init (EosTopBar *self)
G_CALLBACK (on_stack_hover), GINT_TO_POINTER (FALSE));
g_signal_handler_block (priv->credits_stack, priv->credits_enter_handler);
g_signal_handler_block (priv->credits_stack, priv->credits_leave_handler);
- g_signal_connect (priv->credits_button, "clicked",
- G_CALLBACK (on_credits_clicked), self);
}
GtkWidget *
@@ -438,14 +255,16 @@ eos_top_bar_set_left_widget (EosTopBar *self,
return;
if (priv->left_top_bar_widget)
- gtk_container_remove (GTK_CONTAINER (priv->left_top_bar_attach),
- priv->left_top_bar_widget);
+ {
+ gtk_container_remove (GTK_CONTAINER (self), priv->left_top_bar_widget);
+ }
priv->left_top_bar_widget = left_top_bar_widget;
if (left_top_bar_widget)
{
- gtk_container_add (GTK_CONTAINER (priv->left_top_bar_attach),
- priv->left_top_bar_widget);
+ gtk_widget_set_valign (priv->left_top_bar_widget, GTK_ALIGN_CENTER);
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (self),
+ priv->left_top_bar_widget);
}
}
@@ -477,38 +296,11 @@ eos_top_bar_set_center_widget (EosTopBar *self,
{
gtk_container_add (GTK_CONTAINER (priv->center_top_bar_attach),
priv->center_top_bar_widget);
+ gtk_widget_show (priv->center_top_bar_widget);
}
}
/*
- * eos_top_bar_update_window_maximized:
- * @self: the top bar
- * @is_maximized: whether the window is currently maximized
- *
- * Private method for eos_window to update the topbar on the window maximized
- * state. The top bar will flip the asset of the maximized button depending on
- * the state
- */
-void
-eos_top_bar_update_window_maximized (EosTopBar *self,
- gboolean is_maximized)
-{
- g_return_if_fail (EOS_IS_TOP_BAR (self));
- EosTopBarPrivate *priv = eos_top_bar_get_instance_private (self);
-
- gchar *icon_name = is_maximized ? _EOS_TOP_BAR_UNMAXIMIZE_ICON_NAME : _EOS_TOP_BAR_MAXIMIZE_ICON_NAME;
- gtk_image_set_from_icon_name (GTK_IMAGE (priv->maximize_icon),
- icon_name,
- GTK_ICON_SIZE_SMALL_TOOLBAR);
-
- GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (self));
- if (!is_maximized)
- gtk_style_context_add_class (context, _EOS_STYLE_CLASS_UNMAXIMIZED);
- else
- gtk_style_context_remove_class (context, _EOS_STYLE_CLASS_UNMAXIMIZED);
-}
-
-/*
* eos_top_bar_get_show_credits_button:
* @self: the top bar
*
diff --git a/endless/eoswindow.c b/endless/eoswindow.c
index 2a24de2..75f213d 100644
--- a/endless/eoswindow.c
+++ b/endless/eoswindow.c
@@ -96,8 +96,6 @@ typedef struct {
EosPageManager *page_manager;
- gboolean maximized;
-
/* For scaling base font-size */
GtkCssProvider *font_size_provider;
gboolean font_scaling_active;
@@ -532,15 +530,6 @@ eos_window_size_allocate (GtkWidget *window, GtkAllocation *allocation)
GTK_WIDGET_CLASS (eos_window_parent_class)->size_allocate (window, allocation);
}
-/* Our default delete event handler destroys the window. */
-static gboolean
-eos_window_default_delete (GtkWidget* window,
- gpointer user_data)
-{
- gtk_widget_destroy (GTK_WIDGET (window));
- return FALSE;
-}
-
static void
eos_window_class_init (EosWindowClass *klass)
{
@@ -644,32 +633,6 @@ eos_window_class_init (EosWindowClass *klass)
}
static void
-on_minimize_clicked_cb (GtkWidget *top_bar,
- EosWindow *self)
-{
- gtk_window_iconify (GTK_WINDOW (self));
-}
-
-static void
-on_maximize_clicked_cb (GtkWidget *top_bar,
- EosWindow *self)
-{
- EosWindowPrivate *priv = eos_window_get_instance_private (self);
-
- 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,
- EosWindow *self)
-{
- gtk_window_close (GTK_WINDOW (self));
-}
-
-static void
on_credits_clicked (GtkWidget *top_bar,
EosWindow *self)
{
@@ -679,18 +642,6 @@ on_credits_clicked (GtkWidget *top_bar,
NULL);
}
-static gboolean
-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 = event->new_window_state;
- priv->maximized = window_state & GDK_WINDOW_STATE_MAXIMIZED;
- eos_top_bar_update_window_maximized (EOS_TOP_BAR (priv->top_bar), priv->maximized);
- return FALSE;
-}
-
/* Draw the edge finishing on the two lines on top of the window's content;
see eos_top_bar_draw() for the two lines inside the top bar */
static gboolean
@@ -777,16 +728,8 @@ eos_window_init (EosWindow *self)
gtk_window_maximize (GTK_WINDOW (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), 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), self);
g_signal_connect (priv->top_bar, "credits-clicked",
G_CALLBACK (on_credits_clicked), 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 ()));