Python: Allow unhooking commands and prints by name
This commit is contained in:
parent
66bb79ef10
commit
fd71bb768a
@ -249,6 +249,7 @@ typedef struct {
|
|||||||
PyObject *plugin;
|
PyObject *plugin;
|
||||||
PyObject *callback;
|
PyObject *callback;
|
||||||
PyObject *userdata;
|
PyObject *userdata;
|
||||||
|
char *name;
|
||||||
void *data; /* A handle, when type == HOOK_XCHAT */
|
void *data; /* A handle, when type == HOOK_XCHAT */
|
||||||
} Hook;
|
} Hook;
|
||||||
|
|
||||||
@ -283,7 +284,8 @@ static PyObject *Plugin_New(char *filename, PyObject *xcoobj);
|
|||||||
static PyObject *Plugin_GetCurrent();
|
static PyObject *Plugin_GetCurrent();
|
||||||
static PluginObject *Plugin_ByString(char *str);
|
static PluginObject *Plugin_ByString(char *str);
|
||||||
static Hook *Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
|
static Hook *Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
|
||||||
PyObject *userdata, void *data);
|
PyObject *userdata, char *name, void *data);
|
||||||
|
static Hook *Plugin_FindHook(PyObject *plugin, char *name);
|
||||||
static void Plugin_RemoveHook(PyObject *plugin, Hook *hook);
|
static void Plugin_RemoveHook(PyObject *plugin, Hook *hook);
|
||||||
static void Plugin_RemoveAllHooks(PyObject *plugin);
|
static void Plugin_RemoveAllHooks(PyObject *plugin);
|
||||||
|
|
||||||
@ -1166,7 +1168,7 @@ Plugin_ByString(char *str)
|
|||||||
|
|
||||||
static Hook *
|
static Hook *
|
||||||
Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
|
Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
|
||||||
PyObject *userdata, void *data)
|
PyObject *userdata, char *name, void *data)
|
||||||
{
|
{
|
||||||
Hook *hook = (Hook *) g_malloc(sizeof(Hook));
|
Hook *hook = (Hook *) g_malloc(sizeof(Hook));
|
||||||
if (hook == NULL) {
|
if (hook == NULL) {
|
||||||
@ -1179,6 +1181,7 @@ Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
|
|||||||
hook->callback = callback;
|
hook->callback = callback;
|
||||||
Py_INCREF(userdata);
|
Py_INCREF(userdata);
|
||||||
hook->userdata = userdata;
|
hook->userdata = userdata;
|
||||||
|
hook->name = g_strdup (name);
|
||||||
hook->data = NULL;
|
hook->data = NULL;
|
||||||
Plugin_SetHooks(plugin, g_slist_append(Plugin_GetHooks(plugin),
|
Plugin_SetHooks(plugin, g_slist_append(Plugin_GetHooks(plugin),
|
||||||
hook));
|
hook));
|
||||||
@ -1186,6 +1189,26 @@ Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
|
|||||||
return hook;
|
return hook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Hook *
|
||||||
|
Plugin_FindHook(PyObject *plugin, char *name)
|
||||||
|
{
|
||||||
|
Hook *hook = NULL;
|
||||||
|
GSList *plugin_hooks = Plugin_GetHooks(plugin);
|
||||||
|
|
||||||
|
while (plugin_hooks)
|
||||||
|
{
|
||||||
|
if (g_strcmp0 (((Hook *)plugin_hooks->data)->name, name) == 0)
|
||||||
|
{
|
||||||
|
hook = (Hook *)plugin_hooks->data;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin_hooks = g_slist_next(plugin_hooks);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hook;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Plugin_RemoveHook(PyObject *plugin, Hook *hook)
|
Plugin_RemoveHook(PyObject *plugin, Hook *hook)
|
||||||
{
|
{
|
||||||
@ -1205,6 +1228,8 @@ Plugin_RemoveHook(PyObject *plugin, Hook *hook)
|
|||||||
hook));
|
hook));
|
||||||
Py_DECREF(hook->callback);
|
Py_DECREF(hook->callback);
|
||||||
Py_DECREF(hook->userdata);
|
Py_DECREF(hook->userdata);
|
||||||
|
if (hook->name)
|
||||||
|
g_free(hook->name);
|
||||||
g_free(hook);
|
g_free(hook);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1223,6 +1248,8 @@ Plugin_RemoveAllHooks(PyObject *plugin)
|
|||||||
}
|
}
|
||||||
Py_DECREF(hook->callback);
|
Py_DECREF(hook->callback);
|
||||||
Py_DECREF(hook->userdata);
|
Py_DECREF(hook->userdata);
|
||||||
|
if (hook->name)
|
||||||
|
g_free(hook->name);
|
||||||
g_free(hook);
|
g_free(hook);
|
||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
@ -1694,7 +1721,7 @@ Module_hexchat_hook_command(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
|
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, name, NULL);
|
||||||
if (hook == NULL)
|
if (hook == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -1730,7 +1757,7 @@ Module_hexchat_hook_server(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
|
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL, NULL);
|
||||||
if (hook == NULL)
|
if (hook == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -1766,7 +1793,7 @@ Module_hexchat_hook_print(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
|
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, name, NULL);
|
||||||
if (hook == NULL)
|
if (hook == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -1801,7 +1828,7 @@ Module_hexchat_hook_timer(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
|
hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL, NULL);
|
||||||
if (hook == NULL)
|
if (hook == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -1834,7 +1861,7 @@ Module_hexchat_hook_unload(PyObject *self, PyObject *args, PyObject *kwargs)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hook = Plugin_AddHook(HOOK_UNLOAD, plugin, callback, userdata, NULL);
|
hook = Plugin_AddHook(HOOK_UNLOAD, plugin, callback, userdata, NULL, NULL);
|
||||||
if (hook == NULL)
|
if (hook == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -1845,13 +1872,29 @@ static PyObject *
|
|||||||
Module_hexchat_unhook(PyObject *self, PyObject *args)
|
Module_hexchat_unhook(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *plugin;
|
PyObject *plugin;
|
||||||
|
PyObject *obj;
|
||||||
Hook *hook;
|
Hook *hook;
|
||||||
if (!PyArg_ParseTuple(args, "l:unhook", &hook))
|
if (!PyArg_ParseTuple(args, "O:unhook", &obj))
|
||||||
return NULL;
|
return NULL;
|
||||||
plugin = Plugin_GetCurrent();
|
plugin = Plugin_GetCurrent();
|
||||||
if (plugin == NULL)
|
if (plugin == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
Plugin_RemoveHook(plugin, hook);
|
|
||||||
|
if (PyUnicode_Check (obj))
|
||||||
|
{
|
||||||
|
hook = Plugin_FindHook(plugin, PyUnicode_AsUTF8 (obj));
|
||||||
|
while (hook)
|
||||||
|
{
|
||||||
|
Plugin_RemoveHook(plugin, hook);
|
||||||
|
hook = Plugin_FindHook(plugin, PyUnicode_AsUTF8 (obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hook = (Hook *)PyLong_AsLong(obj);
|
||||||
|
Plugin_RemoveHook(plugin, hook);
|
||||||
|
}
|
||||||
|
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user