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 : 298 : valent_plugin_new (gpointer parent,
49 : : ValentContext *parent_context,
50 : : PeasPluginInfo *info,
51 : : GCallback enable_func)
52 : : {
53 : 298 : ValentPlugin *plugin = NULL;
54 : :
55 [ + - ]: 298 : g_assert (G_IS_OBJECT (parent));
56 [ - + ]: 298 : g_assert (VALENT_IS_CONTEXT (parent_context));
57 [ - + ]: 298 : g_assert (info != NULL);
58 : :
59 : 298 : plugin = g_new0 (ValentPlugin, 1);
60 : 298 : plugin->parent = parent;
61 : 298 : plugin->info = g_object_ref (info);
62 : 298 : plugin->context = valent_context_get_plugin_context (parent_context, info);
63 : 298 : plugin->settings = valent_context_create_settings (plugin->context,
64 : : VALENT_PLUGIN_SCHEMA);
65 : :
66 : 298 : g_signal_connect_swapped (plugin->settings,
67 : : "changed::enabled",
68 : : enable_func,
69 : : plugin);
70 : :
71 : 298 : 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 : 306 : valent_plugin_get_enabled (ValentPlugin *plugin)
84 : : {
85 [ + - ]: 306 : g_assert (plugin != NULL);
86 : :
87 : 306 : 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 : 274 : valent_plugin_free (gpointer data)
98 : : {
99 : 274 : ValentPlugin *plugin = (ValentPlugin *)data;
100 : :
101 [ + - ]: 274 : g_assert (data != NULL);
102 : :
103 : 274 : g_cancellable_cancel (plugin->cancellable);
104 : 274 : g_signal_handlers_disconnect_by_data (plugin->settings, plugin);
105 : :
106 [ + + ]: 274 : if (VALENT_IS_OBJECT (plugin->extension))
107 : : {
108 : 265 : valent_object_destroy (VALENT_OBJECT (plugin->extension));
109 [ + - ]: 265 : g_clear_object (&plugin->extension);
110 : : }
111 : :
112 : 274 : plugin->parent = NULL;
113 [ + - ]: 274 : g_clear_object (&plugin->info);
114 [ + + ]: 274 : g_clear_object (&plugin->cancellable);
115 [ + - ]: 274 : g_clear_object (&plugin->context);
116 [ - + ]: 274 : g_clear_object (&plugin->extension);
117 [ + - ]: 274 : g_clear_object (&plugin->settings);
118 : 274 : g_clear_pointer (&plugin, g_free);
119 : 274 : }
120 : :
121 : : G_END_DECLS
122 : :
|