File: plugin.c

package info (click to toggle)
lxappearance 0.6.3-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid, stretch
  • size: 1,624 kB
  • ctags: 199
  • sloc: ansic: 1,745; sh: 1,232; makefile: 112; xml: 44; python: 28
file content (93 lines) | stat: -rw-r--r-- 2,868 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//      plugin.c
//
//      Copyright 2010 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
//
//      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, write to the Free Software
//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
//      MA 02110-1301, USA.

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "plugin.h"
#include "lxappearance.h"
#include <gmodule.h>

#define PLUGIN_DIR  PACKAGE_LIB_DIR"/lxappearance/plugins"

typedef gboolean (*PluginLoadFunc)(LXAppearance*, GtkBuilder*);
typedef void (*PluginUnloadFunc)(LXAppearance*);

typedef struct _Plugin Plugin;
struct _Plugin
{
    GModule* module;
    PluginLoadFunc load;
    PluginUnloadFunc unload;
};

static GSList* plugins = NULL;

void plugins_init(GtkBuilder* builder)
{
    GDir* dir = g_dir_open(PLUGIN_DIR, 0, NULL);
    const char* name = NULL;
    if(!dir)
        return;
    while ((name = g_dir_read_name(dir)))
    {
        if(g_str_has_suffix(name, ".so"))
        {
            char* file = g_build_filename(PLUGIN_DIR, name, NULL);
            GModule* mod = g_module_open(file, 0);
            g_free(file);
            if(mod)
            {
                PluginLoadFunc load;
                gboolean loaded = FALSE;
                g_debug("module: %s", g_module_name(mod));
                if(g_module_symbol(mod, "plugin_load", (gpointer*)&load))
                    loaded = load(&app, builder);
                if(loaded)
                {
                    Plugin* plugin = g_slice_new0(Plugin);
                    plugin->module = mod;
                    plugin->load = load;
                    g_module_symbol(mod, "plugin_unload", (gpointer*)&plugin->unload);
                    plugins = g_slist_prepend(plugins, plugin);
                }
                else
                    g_module_close(mod);
            }
            else
                g_debug("open failed: %s\n%s", name, g_module_error());
        }
    }
    g_dir_close(dir);
}

void plugins_finalize()
{
    GSList* l;
    for(l = plugins; l; l=l->next)
    {
        Plugin* plugin = (Plugin*)l->data;
        if(plugin->unload)
            plugin->unload(&app);
        g_module_close(plugin->module);
        g_slice_free(Plugin, plugin);
    }
    g_slist_free(plugins);
}