summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2021-11-11 15:30:44 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2021-12-14 22:34:21 -0300
commit3f322e85530899ecfeafe48770b63543e9d2a704 (patch)
treeee991ee2f4b0030e5857e6c6a4e1fa1e1a22ee8d /shell
parentd00cc3929edbc689afffa0b7f1fc676ed819855a (diff)
shell: Allow panels set custom titlebars
This will be used by the Display panel to add a different titlebar when confirming a new display configuration.
Diffstat (limited to 'shell')
-rw-r--r--shell/cc-shell.c9
-rw-r--r--shell/cc-shell.h5
-rw-r--r--shell/cc-window.c28
-rw-r--r--shell/cc-window.ui68
4 files changed, 80 insertions, 30 deletions
diff --git a/shell/cc-shell.c b/shell/cc-shell.c
index ffab0a68d..416f00394 100644
--- a/shell/cc-shell.c
+++ b/shell/cc-shell.c
@@ -173,3 +173,12 @@ cc_shell_embed_widget_in_header (CcShell *shell,
iface->embed_widget_in_header (shell, widget, position);
}
}
+
+void
+cc_shell_set_custom_titlebar (CcShell *self,
+ GtkWidget *titlebar)
+{
+ g_return_if_fail (CC_IS_SHELL (self));
+
+ CC_SHELL_GET_IFACE (self)->set_custom_titlebar (self, titlebar);
+}
diff --git a/shell/cc-shell.h b/shell/cc-shell.h
index f5d35dbe6..96d0ca30c 100644
--- a/shell/cc-shell.h
+++ b/shell/cc-shell.h
@@ -57,6 +57,8 @@ struct _CcShellInterface
void (*embed_widget_in_header) (CcShell *shell,
GtkWidget *widget,
GtkPositionType position);
+ void (*set_custom_titlebar) (CcShell *self,
+ GtkWidget *titlebar);
};
GType cc_shell_get_type (void) G_GNUC_CONST;
@@ -74,4 +76,7 @@ void cc_shell_embed_widget_in_header (CcShell *shell,
GtkWidget *widget,
GtkPositionType position);
+void cc_shell_set_custom_titlebar (CcShell *self,
+ GtkWidget *titlebar);
+
G_END_DECLS
diff --git a/shell/cc-window.c b/shell/cc-window.c
index a3de5c134..dad3fc24d 100644
--- a/shell/cc-window.c
+++ b/shell/cc-window.c
@@ -58,6 +58,7 @@ struct _CcWindow
AdwHeaderBar *panel_headerbar;
CcPanelList *panel_list;
AdwWindowTitle *panel_title_widget;
+ GtkStack *panel_titlebar_stack;
GtkButton *previous_button;
GtkSearchBar *search_bar;
GtkToggleButton *search_button;
@@ -73,6 +74,7 @@ struct _CcWindow
GQueue *previous_panels;
GPtrArray *custom_widgets;
+ GtkWidget *custom_titlebar;
CcShellModel *store;
@@ -189,6 +191,7 @@ activate_panel (CcWindow *self,
/* clear any custom widgets */
remove_all_custom_widgets (self);
+ cc_shell_set_custom_titlebar (CC_SHELL (self), NULL);
timer = g_timer_new ();
@@ -682,11 +685,35 @@ cc_window_get_toplevel (CcShell *self)
}
static void
+cc_window_set_custom_titlebar (CcShell *shell,
+ GtkWidget *titlebar)
+{
+ CcWindow *self = CC_WINDOW (shell);
+
+ /* Remove the current custom titlebar */
+ if (self->custom_titlebar)
+ {
+ gtk_stack_set_visible_child (self->panel_titlebar_stack,
+ GTK_WIDGET (self->panel_headerbar));
+ gtk_stack_remove (self->panel_titlebar_stack, self->custom_titlebar);
+ }
+
+ g_set_object (&self->custom_titlebar, titlebar);
+
+ if (titlebar)
+ {
+ gtk_stack_add_named (self->panel_titlebar_stack, titlebar, "custom");
+ gtk_stack_set_visible_child (self->panel_titlebar_stack, titlebar);
+ }
+}
+
+static void
cc_shell_iface_init (CcShellInterface *iface)
{
iface->set_active_panel_from_id = cc_window_set_active_panel_from_id;
iface->embed_widget_in_header = cc_window_embed_widget_in_header;
iface->get_toplevel = cc_window_get_toplevel;
+ iface->set_custom_titlebar = cc_window_set_custom_titlebar;
}
/* GtkWidget overrides */
@@ -881,6 +908,7 @@ cc_window_class_init (CcWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcWindow, panel_headerbar);
gtk_widget_class_bind_template_child (widget_class, CcWindow, panel_list);
gtk_widget_class_bind_template_child (widget_class, CcWindow, panel_title_widget);
+ gtk_widget_class_bind_template_child (widget_class, CcWindow, panel_titlebar_stack);
gtk_widget_class_bind_template_child (widget_class, CcWindow, previous_button);
gtk_widget_class_bind_template_child (widget_class, CcWindow, search_bar);
gtk_widget_class_bind_template_child (widget_class, CcWindow, search_button);
diff --git a/shell/cc-window.ui b/shell/cc-window.ui
index c03a66944..70fbcb00e 100644
--- a/shell/cc-window.ui
+++ b/shell/cc-window.ui
@@ -114,46 +114,54 @@
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
+
+ <!-- Panel titlebar -->
<child>
- <object class="AdwHeaderBar" id="panel_headerbar">
- <property name="visible">True</property>
+ <object class="GtkStack" id="panel_titlebar_stack">
<property name="hexpand">True</property>
- <property name="show-start-title-buttons" bind-source="main_leaflet" bind-property="folded" bind-flags="sync-create"/>
- <property name="show-end-title-buttons">True</property>
- <property name="title-widget">
- <object class="AdwWindowTitle" id="panel_title_widget" />
- </property>
<child>
- <object class="GtkRevealer" id="back_revealer">
- <property name="transition-type">crossfade</property>
- <property name="transition-duration" bind-source="main_leaflet" bind-property="mode-transition-duration" bind-flags="bidirectional|sync-create"/>
- <property name="visible" bind-source="main_leaflet" bind-property="folded" bind-flags="sync-create"/>
- <property name="reveal-child" bind-source="main_leaflet" bind-property="folded" bind-flags="sync-create"/>
+ <object class="AdwHeaderBar" id="panel_headerbar">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="show-start-title-buttons" bind-source="main_leaflet" bind-property="folded" bind-flags="sync-create"/>
+ <property name="show-end-title-buttons">True</property>
+ <property name="title-widget">
+ <object class="AdwWindowTitle" id="panel_title_widget" />
+ </property>
<child>
- <object class="GtkButton" id="back">
- <property name="visible">True</property>
- <property name="receives_default">False</property>
- <property name="valign">center</property>
- <property name="icon-name">go-previous-symbolic</property>
- <signal name="clicked" handler="back_button_clicked_cb" object="CcWindow" swapped="yes" />
- <style>
- <class name="image-button"/>
- </style>
- <accessibility>
- <property name="label" translatable="yes">Back</property>
- </accessibility>
+ <object class="GtkRevealer" id="back_revealer">
+ <property name="transition-type">crossfade</property>
+ <property name="transition-duration" bind-source="main_leaflet" bind-property="mode-transition-duration" bind-flags="bidirectional|sync-create"/>
+ <property name="visible" bind-source="main_leaflet" bind-property="folded" bind-flags="sync-create"/>
+ <property name="reveal-child" bind-source="main_leaflet" bind-property="folded" bind-flags="sync-create"/>
+ <child>
+ <object class="GtkButton" id="back">
+ <property name="visible">True</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="icon-name">go-previous-symbolic</property>
+ <signal name="clicked" handler="back_button_clicked_cb" object="CcWindow" swapped="yes" />
+ <style>
+ <class name="image-button"/>
+ </style>
+ <accessibility>
+ <property name="label" translatable="yes">Back</property>
+ </accessibility>
+ </object>
+ </child>
</object>
</child>
+ <child>
+ <object class="GtkBox" id="top_left_box" />
+ </child>
+ <child type="end">
+ <object class="GtkBox" id="top_right_box" />
+ </child>
</object>
</child>
- <child>
- <object class="GtkBox" id="top_left_box" />
- </child>
- <child type="end">
- <object class="GtkBox" id="top_right_box" />
- </child>
</object>
</child>
+
<child>
<object class="GtkStack" id="stack">
<property name="hexpand">True</property>