diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:02:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:02:09 +0000 |
commit | 0f7ab3dc0ed5cfddfc3002992f0525756b6b670e (patch) | |
tree | 4f520e757f99f136e01abe1dd2e0d1fad5c3cd11 /src/terminal-headerbar.cc | |
parent | Initial commit. (diff) | |
download | gnome-terminal-upstream/3.46.8.tar.xz gnome-terminal-upstream/3.46.8.zip |
Adding upstream version 3.46.8.upstream/3.46.8upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/terminal-headerbar.cc')
-rw-r--r-- | src/terminal-headerbar.cc | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/terminal-headerbar.cc b/src/terminal-headerbar.cc new file mode 100644 index 0000000..38bae5a --- /dev/null +++ b/src/terminal-headerbar.cc @@ -0,0 +1,170 @@ +/* + * Copyright © 2018 Christian Persch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <glib/gi18n.h> + +#include "terminal-headerbar.hh" +#include "terminal-app.hh" +#include "terminal-libgsystem.hh" + +typedef struct _TerminalHeaderbarPrivate TerminalHeaderbarPrivate; + +struct _TerminalHeaderbar +{ + GtkHeaderBar parent_instance; +}; + +struct _TerminalHeaderbarClass +{ + GtkHeaderBarClass parent_class; +}; + +struct _TerminalHeaderbarPrivate +{ + GtkWidget *profilebutton; + GtkWidget *menubutton; +}; + +enum { + PROP_0, + LAST_PROP +}; + +enum { + LAST_SIGNAL +}; + +/* static guint signals[LAST_SIGNAL]; */ +/* static GParamSpec *pspecs[LAST_PROP]; */ + +G_DEFINE_TYPE_WITH_PRIVATE (TerminalHeaderbar, terminal_headerbar, GTK_TYPE_HEADER_BAR) + +#define PRIV(obj) ((TerminalHeaderbarPrivate *) terminal_headerbar_get_instance_private ((TerminalHeaderbar *)(obj))) + +static void +profilemenu_items_changed_cb (GMenuModel *menu, + int position G_GNUC_UNUSED, + int removed G_GNUC_UNUSED, + int added G_GNUC_UNUSED, + TerminalHeaderbarPrivate *priv) +{ + if (g_menu_model_get_n_items (menu) > 0) + gtk_widget_show (priv->profilebutton); + else + gtk_widget_hide (priv->profilebutton); +} + +/* Class implementation */ + +static void +terminal_headerbar_init (TerminalHeaderbar *headerbar) +{ + + TerminalHeaderbarPrivate *priv = PRIV (headerbar); + GtkWidget *widget = GTK_WIDGET (headerbar); + TerminalApp *app = terminal_app_get (); + GMenuModel *profilemenu; + + gtk_widget_init_template (widget); + + gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (priv->menubutton), + terminal_app_get_headermenu (app)); + + profilemenu = terminal_app_get_profilemenu (app); + gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (priv->profilebutton), + profilemenu); + + g_signal_connect (profilemenu, "items-changed", + G_CALLBACK (profilemenu_items_changed_cb), priv); + profilemenu_items_changed_cb (profilemenu, 0, 0, 0, priv); +} + +static void +terminal_headerbar_dispose (GObject *object) +{ + TerminalHeaderbar *headerbar = TERMINAL_HEADERBAR (object); + TerminalHeaderbarPrivate *priv = PRIV (headerbar); + TerminalApp *app = terminal_app_get (); + + GMenuModel *profilemenu = terminal_app_get_profilemenu (app); + g_signal_handlers_disconnect_by_func (profilemenu, + (void*)profilemenu_items_changed_cb, + priv); + + G_OBJECT_CLASS (terminal_headerbar_parent_class)->dispose (object); +} + +static void +terminal_headerbar_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + // TerminalHeaderbar *headerbar = TERMINAL_HEADERBAR (object); + + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +terminal_headerbar_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +terminal_headerbar_class_init (TerminalHeaderbarClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gobject_class->dispose = terminal_headerbar_dispose; + gobject_class->get_property = terminal_headerbar_get_property; + gobject_class->set_property = terminal_headerbar_set_property; + + /* g_object_class_install_properties (gobject_class, G_N_ELEMENTS (pspecs), pspecs); */ + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/terminal/ui/headerbar.ui"); + gtk_widget_class_bind_template_child_private (widget_class, TerminalHeaderbar, menubutton); + gtk_widget_class_bind_template_child_private (widget_class, TerminalHeaderbar, profilebutton); +} + +/* public API */ + +/** + * terminal_headerbar_new: + * + * Returns: a new #TerminalHeaderbar + */ +GtkWidget * +terminal_headerbar_new (void) +{ + return reinterpret_cast<GtkWidget*> + (g_object_new (TERMINAL_TYPE_HEADERBAR, nullptr)); +} |