mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Merge branch 'master' into plugins
Conflicts: src/plugins/profapi.h
This commit is contained in:
commit
98a6df8d81
@ -46,7 +46,8 @@ core_sources = \
|
||||
src/plugins/api.h src/plugins/api.c \
|
||||
src/plugins/callbacks.h src/plugins/callbacks.c \
|
||||
src/plugins/autocompleters.c src/plugins/autocompleters.h \
|
||||
src/plugins/themes.c src/plugins/themes.h
|
||||
src/plugins/themes.c src/plugins/themes.h \
|
||||
src/plugins/settings.c src/plugins/settings.h
|
||||
|
||||
unittest_sources = \
|
||||
src/contact.c src/contact.h src/common.c \
|
||||
@ -79,6 +80,7 @@ unittest_sources = \
|
||||
src/plugins/callbacks.h src/plugins/callbacks.c \
|
||||
src/plugins/autocompleters.c src/plugins/autocompleters.h \
|
||||
src/plugins/themes.c src/plugins/themes.h \
|
||||
src/plugins/settings.c src/plugins/settings.h \
|
||||
src/window_list.c src/window_list.h \
|
||||
src/event/server_events.c src/event/server_events.h \
|
||||
src/event/client_events.c src/event/client_events.h \
|
||||
|
@ -1,3 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0' $@
|
||||
./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0' --enable-python-plugins $@
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "plugins/callbacks.h"
|
||||
#include "plugins/autocompleters.h"
|
||||
#include "plugins/themes.h"
|
||||
#include "plugins/settings.h"
|
||||
#include "profanity.h"
|
||||
#include "ui/ui.h"
|
||||
#include "config/theme.h"
|
||||
@ -332,3 +333,38 @@ api_send_stanza(const char *const stanza)
|
||||
return jabber_send_stanza(stanza);
|
||||
}
|
||||
|
||||
gboolean
|
||||
api_settings_get_boolean(const char *const group, const char *const key, gboolean def)
|
||||
{
|
||||
return plugin_settings_get_boolean(group, key, def);
|
||||
}
|
||||
|
||||
void
|
||||
api_settings_set_boolean(const char *const group, const char *const key, gboolean value)
|
||||
{
|
||||
plugin_settings_set_boolean(group, key, value);
|
||||
}
|
||||
|
||||
char*
|
||||
api_settings_get_string(const char *const group, const char *const key, const char *const def)
|
||||
{
|
||||
return plugin_settings_get_string(group, key, def);
|
||||
}
|
||||
|
||||
void
|
||||
api_settings_set_string(const char *const group, const char *const key, const char *const value)
|
||||
{
|
||||
plugin_settings_set_string(group, key, value);
|
||||
}
|
||||
|
||||
int
|
||||
api_settings_get_int(const char *const group, const char *const key, int def)
|
||||
{
|
||||
return plugin_settings_get_int(group, key, def);
|
||||
}
|
||||
|
||||
void
|
||||
api_settings_set_int(const char *const group, const char *const key, int value)
|
||||
{
|
||||
plugin_settings_set_int(group, key, value);
|
||||
}
|
||||
|
@ -72,4 +72,11 @@ int api_win_show_themed(const char *tag, const char *const group, const char *co
|
||||
|
||||
int api_send_stanza(const char *const stanza);
|
||||
|
||||
gboolean api_settings_get_boolean(const char *const group, const char *const key, gboolean def);
|
||||
void api_settings_set_boolean(const char *const group, const char *const key, gboolean value);
|
||||
char* api_settings_get_string(const char *const group, const char *const key, const char *const def);
|
||||
void api_settings_set_string(const char *const group, const char *const key, const char *const value);
|
||||
int api_settings_get_int(const char *const group, const char *const key, int def);
|
||||
void api_settings_set_int(const char *const group, const char *const key, int value);
|
||||
|
||||
#endif
|
||||
|
@ -194,6 +194,42 @@ c_api_send_stanza(char *stanza)
|
||||
return api_send_stanza(stanza);
|
||||
}
|
||||
|
||||
static int
|
||||
c_api_settings_get_boolean(char *group, char *key, int def)
|
||||
{
|
||||
return api_settings_get_boolean(group, key, def);
|
||||
}
|
||||
|
||||
static void
|
||||
c_api_settings_set_boolean(char *group, char *key, int value)
|
||||
{
|
||||
api_settings_set_boolean(group, key, value);
|
||||
}
|
||||
|
||||
static char*
|
||||
c_api_settings_get_string(char *group, char *key, char *def)
|
||||
{
|
||||
return api_settings_get_string(group, key, def);
|
||||
}
|
||||
|
||||
static void
|
||||
c_api_settings_set_string(char *group, char *key, char *value)
|
||||
{
|
||||
api_settings_set_string(group, key, value);
|
||||
}
|
||||
|
||||
static int
|
||||
c_api_settings_get_int(char *group, char *key, int def)
|
||||
{
|
||||
return api_settings_get_int(group, key, def);
|
||||
}
|
||||
|
||||
static void
|
||||
c_api_settings_set_int(char *group, char *key, int value)
|
||||
{
|
||||
api_settings_set_int(group, key, value);
|
||||
}
|
||||
|
||||
void
|
||||
c_command_callback(PluginCommand *command, gchar **args)
|
||||
{
|
||||
@ -243,4 +279,10 @@ c_api_init(void)
|
||||
prof_win_show = c_api_win_show;
|
||||
prof_win_show_themed = c_api_win_show_themed;
|
||||
prof_send_stanza = c_api_send_stanza;
|
||||
prof_settings_get_boolean = c_api_settings_get_boolean;
|
||||
prof_settings_set_boolean = c_api_settings_set_boolean;
|
||||
prof_settings_get_string = c_api_settings_get_string;
|
||||
prof_settings_set_string = c_api_settings_set_string;
|
||||
prof_settings_get_int = c_api_settings_get_int;
|
||||
prof_settings_set_int = c_api_settings_set_int;
|
||||
}
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include "plugins/api.h"
|
||||
#include "plugins/plugins.h"
|
||||
#include "plugins/themes.h"
|
||||
#include "plugins/settings.h"
|
||||
|
||||
#ifdef PROF_HAVE_PYTHON
|
||||
#include "plugins/python_plugins.h"
|
||||
@ -90,6 +91,7 @@ plugins_init(void)
|
||||
#endif
|
||||
|
||||
plugin_themes_init();
|
||||
plugin_settings_init();
|
||||
|
||||
// load plugins
|
||||
gchar **plugins_load = prefs_get_plugins();
|
||||
@ -489,6 +491,7 @@ plugins_shutdown(void)
|
||||
|
||||
autocompleters_destroy();
|
||||
plugin_themes_close();
|
||||
plugin_settings_close();
|
||||
callbacks_close();
|
||||
}
|
||||
|
||||
|
@ -70,3 +70,10 @@ int (*prof_win_show)(PROF_WIN_TAG win, char *line) = NULL;
|
||||
int (*prof_win_show_themed)(PROF_WIN_TAG tag, char *group, char *key, char *def, char *line) = NULL;
|
||||
|
||||
int (*prof_send_stanza)(char *stanza) = NULL;
|
||||
|
||||
int (*prof_settings_get_boolean)(char *group, char *key, int def) = NULL;
|
||||
void (*prof_settings_set_boolean)(char *group, char *key, int value) = NULL;
|
||||
char* (*prof_settings_get_string)(char *group, char *key, char *def) = NULL;
|
||||
void (*prof_settings_set_string)(char *group, char *key, char *value) = NULL;
|
||||
int (*prof_settings_get_int)(char *group, char *key, int def) = NULL;
|
||||
void (*prof_settings_set_int)(char *group, char *key, int value) = NULL;
|
||||
|
@ -71,4 +71,11 @@ int (*prof_win_show_themed)(PROF_WIN_TAG tag, char *group, char *key, char *def,
|
||||
|
||||
int (*prof_send_stanza)(char *stanza);
|
||||
|
||||
int (*prof_settings_get_boolean)(char *group, char *key, int def);
|
||||
void (*prof_settings_set_boolean)(char *group, char *key, int value);
|
||||
char* (*prof_settings_get_string)(char *group, char *key, char *def);
|
||||
void (*prof_settings_set_string)(char *group, char *key, char *value);
|
||||
int (*prof_settings_get_int)(char *group, char *key, int def);
|
||||
void (*prof_settings_set_int)(char *group, char *key, int value);
|
||||
|
||||
#endif
|
||||
|
@ -355,9 +355,9 @@ python_api_win_exists(PyObject *self, PyObject *args)
|
||||
disable_python_threads();
|
||||
|
||||
if (exists) {
|
||||
return Py_BuildValue("i", 1);
|
||||
return Py_BuildValue("O", Py_True);
|
||||
} else {
|
||||
return Py_BuildValue("i", 0);
|
||||
return Py_BuildValue("O", Py_False);
|
||||
}
|
||||
}
|
||||
|
||||
@ -438,19 +438,139 @@ python_api_send_stanza(PyObject *self, PyObject *args)
|
||||
{
|
||||
const char *stanza = NULL;
|
||||
if (!PyArg_ParseTuple(args, "s", &stanza)) {
|
||||
return Py_BuildValue("i", 0);
|
||||
return Py_BuildValue("O", Py_False);
|
||||
}
|
||||
|
||||
allow_python_threads();
|
||||
int res = api_send_stanza(stanza);
|
||||
disable_python_threads();
|
||||
if (res) {
|
||||
return Py_BuildValue("i", 1);
|
||||
return Py_BuildValue("O", Py_True);
|
||||
} else {
|
||||
return Py_BuildValue("i", 0);
|
||||
return Py_BuildValue("O", Py_False);
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
python_api_settings_get_boolean(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *group = NULL;
|
||||
char *key = NULL;
|
||||
PyObject *defobj = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ssO!", &group, &key, &PyBool_Type, &defobj)) {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
int def = PyObject_IsTrue(defobj);
|
||||
|
||||
allow_python_threads();
|
||||
int res = api_settings_get_boolean(group, key, def);
|
||||
disable_python_threads();
|
||||
|
||||
if (res) {
|
||||
return Py_BuildValue("O", Py_True);
|
||||
} else {
|
||||
return Py_BuildValue("O", Py_False);
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
python_api_settings_set_boolean(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *group = NULL;
|
||||
char *key = NULL;
|
||||
PyObject *valobj = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ssO!", &group, &key, &PyBool_Type, &valobj)) {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
int val = PyObject_IsTrue(valobj);
|
||||
|
||||
allow_python_threads();
|
||||
api_settings_set_boolean(group, key, val);
|
||||
disable_python_threads();
|
||||
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
python_api_settings_get_string(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *group = NULL;
|
||||
char *key = NULL;
|
||||
char *def = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ssz", &group, &key, &def)) {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
allow_python_threads();
|
||||
char *res = api_settings_get_string(group, key, def);
|
||||
disable_python_threads();
|
||||
|
||||
if (res) {
|
||||
return Py_BuildValue("s", res);
|
||||
} else {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
python_api_settings_set_string(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *group = NULL;
|
||||
char *key = NULL;
|
||||
char *val = NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "sss", &group, &key, &val)) {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
allow_python_threads();
|
||||
api_settings_set_string(group, key, val);
|
||||
disable_python_threads();
|
||||
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
python_api_settings_get_int(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *group = NULL;
|
||||
char *key = NULL;
|
||||
int def = 0;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ssi", &group, &key, &def)) {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
allow_python_threads();
|
||||
int res = api_settings_get_int(group, key, def);
|
||||
disable_python_threads();
|
||||
|
||||
return Py_BuildValue("i", res);
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
python_api_settings_set_int(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *group = NULL;
|
||||
char *key = NULL;
|
||||
int val = 0;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ssi", &group, &key, &val)) {
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
allow_python_threads();
|
||||
api_settings_set_int(group, key, val);
|
||||
disable_python_threads();
|
||||
|
||||
return Py_BuildValue("");
|
||||
}
|
||||
|
||||
void
|
||||
python_command_callback(PluginCommand *command, gchar **args)
|
||||
{
|
||||
@ -541,6 +661,12 @@ static PyMethodDef apiMethods[] = {
|
||||
{ "win_show", python_api_win_show, METH_VARARGS, "Show text in the window." },
|
||||
{ "win_show_themed", python_api_win_show_themed, METH_VARARGS, "Show themed text in the window." },
|
||||
{ "send_stanza", python_api_send_stanza, METH_VARARGS, "Send an XMPP stanza." },
|
||||
{ "settings_get_boolean", python_api_settings_get_boolean, METH_VARARGS, "Get a boolean setting" },
|
||||
{ "settings_set_boolean", python_api_settings_set_boolean, METH_VARARGS, "Set a boolean setting" },
|
||||
{ "settings_get_string", python_api_settings_get_string, METH_VARARGS, "Get a string setting" },
|
||||
{ "settings_set_string", python_api_settings_set_string, METH_VARARGS, "Set a string setting" },
|
||||
{ "settings_get_int", python_api_settings_get_int, METH_VARARGS, "Get a integer setting" },
|
||||
{ "settings_set_int", python_api_settings_set_int, METH_VARARGS, "Set a integer setting" },
|
||||
{ NULL, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
|
152
src/plugins/settings.c
Normal file
152
src/plugins/settings.c
Normal file
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* settings.c
|
||||
*
|
||||
* Copyright (C) 2012 - 2016 James Booth <boothj5@gmail.com>
|
||||
*
|
||||
* This file is part of Profanity.
|
||||
*
|
||||
* Profanity 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.
|
||||
*
|
||||
* Profanity 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 Profanity. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link the code of portions of this program with the OpenSSL library under
|
||||
* certain conditions as described in each individual source file, and
|
||||
* distribute linked combinations including the two.
|
||||
*
|
||||
* You must obey the GNU General Public License in all respects for all of the
|
||||
* code used other than OpenSSL. If you modify file(s) with this exception, you
|
||||
* may extend this exception to your version of the file(s), but you are not
|
||||
* obligated to do so. If you do not wish to do so, delete this exception
|
||||
* statement from your version. If you delete this exception statement from all
|
||||
* source files in the program, then also delete it here.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gstdio.h>
|
||||
|
||||
#include "config/theme.h"
|
||||
#include "common.h"
|
||||
|
||||
static GKeyFile *settings;
|
||||
|
||||
static void _save_settings(void);
|
||||
|
||||
void
|
||||
plugin_settings_init(void)
|
||||
{
|
||||
gchar *xdg_data = xdg_get_data_home();
|
||||
GString *fileloc = g_string_new(xdg_data);
|
||||
g_string_append(fileloc, "/profanity/plugin_settings");
|
||||
g_free(xdg_data);
|
||||
|
||||
if (g_file_test(fileloc->str, G_FILE_TEST_EXISTS)) {
|
||||
g_chmod(fileloc->str, S_IRUSR | S_IWUSR);
|
||||
}
|
||||
|
||||
settings = g_key_file_new();
|
||||
g_key_file_load_from_file(settings, fileloc->str, G_KEY_FILE_KEEP_COMMENTS, NULL);
|
||||
|
||||
gsize g_data_size;
|
||||
gchar *g_data = g_key_file_to_data(settings, &g_data_size, NULL);
|
||||
g_file_set_contents(fileloc->str, g_data, g_data_size, NULL);
|
||||
g_chmod(fileloc->str, S_IRUSR | S_IWUSR);
|
||||
g_free(g_data);
|
||||
g_string_free(fileloc, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
plugin_settings_close(void)
|
||||
{
|
||||
g_key_file_free(settings);
|
||||
settings = NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
plugin_settings_get_boolean(const char *const group, const char *const key, gboolean def)
|
||||
{
|
||||
if (group && key && g_key_file_has_key(settings, group, key, NULL)) {
|
||||
return g_key_file_get_boolean(settings, group, key, NULL);
|
||||
} else {
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
plugin_settings_set_boolean(const char *const group, const char *const key, gboolean value)
|
||||
{
|
||||
g_key_file_set_boolean(settings, group, key, value);
|
||||
_save_settings();
|
||||
}
|
||||
|
||||
char*
|
||||
plugin_settings_get_string(const char *const group, const char *const key, const char *const def)
|
||||
{
|
||||
if (group && key && g_key_file_has_key(settings, group, key, NULL)) {
|
||||
return g_key_file_get_string(settings, group, key, NULL);
|
||||
} else if (def) {
|
||||
return strdup(def);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
plugin_settings_set_string(const char *const group, const char *const key, const char *const value)
|
||||
{
|
||||
g_key_file_set_string(settings, group, key, value);
|
||||
_save_settings();
|
||||
}
|
||||
|
||||
int
|
||||
plugin_settings_get_int(const char *const group, const char *const key, int def)
|
||||
{
|
||||
if (group && key && g_key_file_has_key(settings, group, key, NULL)) {
|
||||
return g_key_file_get_integer(settings, group, key, NULL);
|
||||
} else {
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
plugin_settings_set_int(const char *const group, const char *const key, int value)
|
||||
{
|
||||
g_key_file_set_integer(settings, group, key, value);
|
||||
_save_settings();
|
||||
}
|
||||
|
||||
static void
|
||||
_save_settings(void)
|
||||
{
|
||||
gsize g_data_size;
|
||||
gchar *g_data = g_key_file_to_data(settings, &g_data_size, NULL);
|
||||
|
||||
gchar *xdg_data = xdg_get_data_home();
|
||||
GString *fileloc = g_string_new(xdg_data);
|
||||
g_free(xdg_data);
|
||||
|
||||
g_string_append(fileloc, "/profanity/");
|
||||
char *base = strdup(fileloc->str);
|
||||
g_string_append(fileloc, "plugin_settings");
|
||||
|
||||
gchar *true_loc = get_file_or_linked(fileloc->str, base);
|
||||
free(base);
|
||||
g_file_set_contents(true_loc, g_data, g_data_size, NULL);
|
||||
free(true_loc);
|
||||
g_free(g_data);
|
||||
g_chmod(fileloc->str, S_IRUSR | S_IWUSR);
|
||||
g_string_free(fileloc, TRUE);
|
||||
}
|
48
src/plugins/settings.h
Normal file
48
src/plugins/settings.h
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* settings.h
|
||||
*
|
||||
* Copyright (C) 2012 - 2016 James Booth <boothj5@gmail.com>
|
||||
*
|
||||
* This file is part of Profanity.
|
||||
*
|
||||
* Profanity 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.
|
||||
*
|
||||
* Profanity 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 Profanity. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link the code of portions of this program with the OpenSSL library under
|
||||
* certain conditions as described in each individual source file, and
|
||||
* distribute linked combinations including the two.
|
||||
*
|
||||
* You must obey the GNU General Public License in all respects for all of the
|
||||
* code used other than OpenSSL. If you modify file(s) with this exception, you
|
||||
* may extend this exception to your version of the file(s), but you are not
|
||||
* obligated to do so. If you do not wish to do so, delete this exception
|
||||
* statement from your version. If you delete this exception statement from all
|
||||
* source files in the program, then also delete it here.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PLUGIN_SETTINGS_H
|
||||
#define PLUGIN_SETTINGS_H
|
||||
|
||||
void plugin_settings_init(void);
|
||||
void plugin_settings_close(void);
|
||||
|
||||
gboolean plugin_settings_get_boolean(const char *const group, const char *const key, gboolean def);
|
||||
void plugin_settings_set_boolean(const char *const group, const char *const key, gboolean value);
|
||||
char* plugin_settings_get_string(const char *const group, const char *const key, const char *const def);
|
||||
void plugin_settings_set_string(const char *const group, const char *const key, const char *const value);
|
||||
int plugin_settings_get_int(const char *const group, const char *const key, int def);
|
||||
void plugin_settings_set_int(const char *const group, const char *const key, int value);
|
||||
|
||||
#endif
|
@ -32,6 +32,11 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PLUGIN_THEMES_H
|
||||
#define PLUGIN_THEMES_H
|
||||
|
||||
void plugin_themes_init(void);
|
||||
void plugin_themes_close(void);
|
||||
theme_item_t plugin_themes_get(const char *const group, const char *const key, const char *const def);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user