diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2021-05-08 18:19:52 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2021-05-10 18:47:03 +0300 |
commit | 1d3ae4cca97eddf45ff635ab3a3a16b169532788 (patch) | |
tree | 99bb402383ff46789f52a660342848ab541d11ab | |
parent | c786d24b37b17c65869e4f2a7c282fbf32bca601 (diff) | |
download | libwnck-1d3ae4cca97eddf45ff635ab3a3a16b169532788.tar.gz |
add private WnckHandle object
WnckHandle in future will be used as main entry point into library.
This will allow to have multiple tasklists in same process with
different settings. Also this will allow to cleanup resources
without worrying that calling wnck_shutdown might affect other
applets or plugins that might use libwnck in same process.
https://gitlab.gnome.org/GNOME/libwnck/-/issues/136
-rw-r--r-- | libwnck/meson.build | 2 | ||||
-rw-r--r-- | libwnck/private.h | 3 | ||||
-rw-r--r-- | libwnck/util.c | 29 | ||||
-rw-r--r-- | libwnck/wnck-handle-private.h | 33 | ||||
-rw-r--r-- | libwnck/wnck-handle.c | 137 | ||||
-rw-r--r-- | meson.build | 2 |
6 files changed, 198 insertions, 8 deletions
diff --git a/libwnck/meson.build b/libwnck/meson.build index 0cd68fc..04f30d6 100644 --- a/libwnck/meson.build +++ b/libwnck/meson.build @@ -37,6 +37,8 @@ sources = [ 'util.c', 'window-action-menu.c', 'window.c', + 'wnck-handle-private.h', + 'wnck-handle.c', 'wnck-image-menu-item-private.h', 'wnck-image-menu-item.c', 'workspace.c', diff --git a/libwnck/private.h b/libwnck/private.h index 492fd2c..f1a4af2 100644 --- a/libwnck/private.h +++ b/libwnck/private.h @@ -30,6 +30,7 @@ #include "xutils.h" #include "pager.h" #include "util.h" +#include "wnck-handle-private.h" #ifdef HAVE_STARTUP_NOTIFICATION #include <libsn/sn.h> #endif @@ -38,6 +39,8 @@ G_BEGIN_DECLS #define WNCK_ACTIVATE_TIMEOUT 1 +WnckHandle *_wnck_get_handle (void); + WnckClientType _wnck_get_client_type (void); gsize _wnck_get_default_icon_size (void); diff --git a/libwnck/util.c b/libwnck/util.c index c8e0e6e..b3d8750 100644 --- a/libwnck/util.c +++ b/libwnck/util.c @@ -655,16 +655,29 @@ wnck_set_client_type (WnckClientType ewmh_sourceindication_client_type) client_type = ewmh_sourceindication_client_type; } +static WnckHandle *wnck_handle = NULL; + +WnckHandle * +_wnck_get_handle (void) +{ + if (wnck_handle == NULL) + { + /* If the type hasn't been set yet, use the default--treat it as a + * normal application. + */ + if (client_type == 0) + client_type = WNCK_CLIENT_TYPE_APPLICATION; + + wnck_handle = _wnck_handle_new (client_type); + } + + return wnck_handle; +} + WnckClientType _wnck_get_client_type (void) { - /* If the type hasn't been set yet, use the default--treat it as a - * normal application. - */ - if (client_type == 0) - client_type = WNCK_CLIENT_TYPE_APPLICATION; - - return client_type; + return _wnck_handle_get_client_type (_wnck_get_handle ()); } static gsize default_icon_size = WNCK_DEFAULT_ICON_SIZE; @@ -844,6 +857,8 @@ wnck_shutdown (void) _wnck_screen_shutdown_all (); _wnck_window_shutdown_all (); + g_clear_object (&wnck_handle); + #ifdef HAVE_XRES if (xres_removeid != 0) g_source_remove (xres_removeid); diff --git a/libwnck/wnck-handle-private.h b/libwnck/wnck-handle-private.h new file mode 100644 index 0000000..156821a --- /dev/null +++ b/libwnck/wnck-handle-private.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Alberts Muktupāvels + * + * 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 2 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/>. + */ + +#ifndef WNCK_HANDLE_PRIVATE_H +#define WNCK_HANDLE_PRIVATE_H + +#include "util.h" + +G_BEGIN_DECLS + +typedef struct _WnckHandle WnckHandle; + +WnckHandle *_wnck_handle_new (WnckClientType client_type); + +WnckClientType _wnck_handle_get_client_type (WnckHandle *self); + +G_END_DECLS + +#endif diff --git a/libwnck/wnck-handle.c b/libwnck/wnck-handle.c new file mode 100644 index 0000000..c49a640 --- /dev/null +++ b/libwnck/wnck-handle.c @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2021 Alberts Muktupāvels + * + * 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 2 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 "wnck-handle-private.h" + +#include "wnck-enum-types.h" + +#define WNCK_TYPE_HANDLE (wnck_handle_get_type ()) +G_DECLARE_FINAL_TYPE (WnckHandle, wnck_handle, WNCK, HANDLE, GObject) + +struct _WnckHandle +{ + GObject parent; + + WnckClientType client_type; +}; + +enum +{ + PROP_0, + + PROP_CLIENT_TYPE, + + LAST_PROP +}; + +static GParamSpec *handle_properties[LAST_PROP] = { NULL }; + +G_DEFINE_TYPE (WnckHandle, wnck_handle, G_TYPE_OBJECT) + +static void +wnck_handle_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + WnckHandle *self; + + self = WNCK_HANDLE (object); + + switch (property_id) + { + case PROP_CLIENT_TYPE: + g_value_set_enum (value, self->client_type); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +wnck_handle_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + WnckHandle *self; + + self = WNCK_HANDLE (object); + + switch (property_id) + { + case PROP_CLIENT_TYPE: + self->client_type = g_value_get_enum (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +install_properties (GObjectClass *object_class) +{ + handle_properties[PROP_CLIENT_TYPE] = + g_param_spec_enum ("client-type", + "client-type", + "client-type", + WNCK_TYPE_CLIENT_TYPE, + WNCK_CLIENT_TYPE_APPLICATION, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, + LAST_PROP, + handle_properties); +} + +static void +wnck_handle_class_init (WnckHandleClass *self_class) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (self_class); + + object_class->get_property = wnck_handle_get_property; + object_class->set_property = wnck_handle_set_property; + + install_properties (object_class); +} + +static void +wnck_handle_init (WnckHandle *self) +{ +} + +WnckHandle +*_wnck_handle_new (WnckClientType client_type) +{ + return g_object_new (WNCK_TYPE_HANDLE, + "client-type", client_type, + NULL); +} + +WnckClientType +_wnck_handle_get_client_type (WnckHandle *self) +{ + return self->client_type; +} diff --git a/meson.build b/meson.build index 11f7b3d..b2a1711 100644 --- a/meson.build +++ b/meson.build @@ -40,7 +40,7 @@ XRES_PACKAGE = 'xres' pkg_deps = [ {'name': 'cairo-xlib-xrender', 'required': false}, - {'name': 'glib-2.0', 'version': '>= 2.34' }, + {'name': 'glib-2.0', 'version': '>= 2.44' }, {'name': 'gobject-2.0', 'version': '>= 2.13.0' }, {'name': 'gtk+-3.0', 'version': '>= 3.22.0' }, {'name': STARTUP_NOTIFICATION_PACKAGE, 'version': '>= 0.4', 'required': get_option('startup_notification')}, |