Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #pragma once
5 : :
6 : : #include "valent-component.h"
7 : : #include "valent-context.h"
8 : :
9 : : #define VALENT_PLUGIN_SCHEMA "ca.andyholmes.Valent.Plugin"
10 : :
11 : : G_BEGIN_DECLS
12 : :
13 : : /*< private >
14 : : * ValentPlugin:
15 : : * @parent: (type GObject.Object): the owner of the plugin
16 : : * @context: the plugin context
17 : : * @info: the plugin info
18 : : * @extension: the plugin extension
19 : : * @cancellable: the initialization cancellable
20 : : * @settings: the plugin settings
21 : : *
22 : : * A `struct` for representing a plugin pod.
23 : : */
24 : : typedef struct
25 : : {
26 : : gpointer parent;
27 : : ValentContext *context;
28 : : PeasPluginInfo *info;
29 : : GObject *extension;
30 : : GCancellable *cancellable;
31 : :
32 : : /*< private >*/
33 : : GSettings *settings;
34 : : } ValentPlugin;
35 : :
36 : :
37 : : /*< private >
38 : : * valent_plugin_new:
39 : : * @parent: (type GObject.Object): the parent
40 : : * @parent_context: the parent context
41 : : * @info: the plugin info
42 : : *
43 : : * Create a new `ValentPlugin`.
44 : : *
45 : : * Returns: (transfer full): a new `ValentPlugin`
46 : : */
47 : : static inline ValentPlugin *
48 : 299 : valent_plugin_new (gpointer parent,
49 : : ValentContext *parent_context,
50 : : PeasPluginInfo *info,
51 : : GCallback enable_func)
52 : : {
53 : 299 : ValentPlugin *plugin = NULL;
54 : :
55 [ + - ]: 299 : g_assert (G_IS_OBJECT (parent));
56 [ - + ]: 299 : g_assert (VALENT_IS_CONTEXT (parent_context));
57 [ - + ]: 299 : g_assert (info != NULL);
58 : :
59 : 299 : plugin = g_new0 (ValentPlugin, 1);
60 : 299 : plugin->parent = parent;
61 : 299 : plugin->info = g_object_ref (info);
62 : 299 : plugin->context = valent_context_get_plugin_context (parent_context, info);
63 : 299 : plugin->settings = valent_context_create_settings (plugin->context,
64 : : VALENT_PLUGIN_SCHEMA);
65 : :
66 : 299 : g_signal_connect_swapped (plugin->settings,
67 : : "changed::enabled",
68 : : enable_func,
69 : : plugin);
70 : :
71 : 299 : return g_steal_pointer (&plugin);
72 : : }
73 : :
74 : : /*< private >
75 : : * valent_plugin_get_enabled:
76 : : * @data: a `ValentPlugin`
77 : : *
78 : : * Get whether the plugin is enabled.
79 : : *
80 : : * Returns: %TRUE if enabled, %FALSE if not
81 : : */
82 : : static inline gboolean
83 : 307 : valent_plugin_get_enabled (ValentPlugin *plugin)
84 : : {
85 [ + - ]: 307 : g_assert (plugin != NULL);
86 : :
87 : 307 : return g_settings_get_boolean (plugin->settings, "enabled");
88 : : }
89 : :
90 : : /*< private >
91 : : * valent_plugin_free:
92 : : * @data: a `ValentPlugin`
93 : : *
94 : : * Free a `ValentPlugin`.
95 : : */
96 : : static inline void
97 : 278 : valent_plugin_free (gpointer data)
98 : : {
99 : 278 : ValentPlugin *plugin = (ValentPlugin *)data;
100 : :
101 [ + - ]: 278 : g_assert (data != NULL);
102 : :
103 : 278 : g_cancellable_cancel (plugin->cancellable);
104 : 278 : g_signal_handlers_disconnect_by_data (plugin->settings, plugin);
105 : :
106 : 278 : plugin->parent = NULL;
107 [ + - ]: 278 : g_clear_object (&plugin->info);
108 [ + + ]: 278 : g_clear_object (&plugin->cancellable);
109 [ + - ]: 278 : g_clear_object (&plugin->context);
110 [ + + ]: 278 : g_clear_object (&plugin->extension);
111 [ + - ]: 278 : g_clear_object (&plugin->settings);
112 : 278 : g_clear_pointer (&plugin, g_free);
113 : 278 : }
114 : :
115 : : G_END_DECLS
116 : :
|