Author: iratqq
Date: Mon Dec 31 18:32:52 2007
New Revision: 5082
Modified:
trunk/notify/uim-knotify.cc
trunk/notify/uim-libnotify.c
trunk/scm/im-custom.scm
trunk/uim/uim-notify.c
trunk/uim/uim-notify.h
trunk/uim/uim-util.c
Log:
* uim/uim-notify.c
- (uim_notify_get_desc): New function.
* uim/uim-notify.c
- (uim_notify_load_stderr): Initialize notify_desc.
* uim/uim-notify.c
- (uim_notify_stderr_get_desc): New function.
* notify/uim-libnotify.c
- (uim_notify_plugin_get_desc): ditto.
* notify/uim-knotify.cc
- (uim_notify_plugin_get_desc): ditto.
* uim/uim-notify.c
- (uim_notify_stderr_init, uim_notify_stderr_quit)
(uim_notify_stderr_info, uim_notify_stderr_fatal):
Make global.
* uim/uim-notify.h
- ditto.
* uim/uim-util.c
- (uim_scm_notify_get_plugins): Change return values as
'(name "name" "description").
Get description from uim_notify_plugin_get_desc() via dlopen.
* scm/im-custom.scm
- (notify-agent): Remove kludge.
Modified: trunk/notify/uim-knotify.cc
==============================================================================
--- trunk/notify/uim-knotify.cc (original)
+++ trunk/notify/uim-knotify.cc Mon Dec 31 18:32:52 2007
@@ -42,7 +42,20 @@
#include "config.h"
#include "uim-notify.h"
+
static int inited = 0;
+
+static uim_notify_desc uim_notify_knotify_desc = {
+ "knotify",
+ "Output via knotify",
+};
+
+uim_notify_desc*
+uim_notify_plugin_get_desc(void)
+{
+ return &uim_notify_knotify_desc;
+}
+
int
uim_notify_plugin_init()
{
Modified: trunk/notify/uim-libnotify.c
==============================================================================
--- trunk/notify/uim-libnotify.c (original)
+++ trunk/notify/uim-libnotify.c Mon Dec 31 18:32:52 2007
@@ -87,6 +87,17 @@
/*
interface
*/
+static uim_notify_desc uim_notify_libnotify_desc = {
+ "libnotify",
+ "Output via libnotify",
+};
+
+uim_notify_desc*
+uim_notify_plugin_get_desc(void)
+{
+ return &uim_notify_libnotify_desc;
+}
+
int
uim_notify_plugin_init(void)
{
Modified: trunk/scm/im-custom.scm
==============================================================================
--- trunk/scm/im-custom.scm (original)
+++ trunk/scm/im-custom.scm Mon Dec 31 18:32:52 2007
@@ -552,9 +552,7 @@
(define-custom 'notify-agent 'stderr
'(notify)
`(choice
- ,@(map (lambda (str)
- (list (string->symbol str) str str))
- (uim-notify-get-plugins)))
+ ,@(uim-notify-get-plugins))
(N_ "Notify agent name")
(N_ "long description will be here."))
Modified: trunk/uim/uim-notify.c
==============================================================================
--- trunk/uim/uim-notify.c (original)
+++ trunk/uim/uim-notify.c Mon Dec 31 18:32:52 2007
@@ -55,23 +55,21 @@
#define dlfunc dlsym
#endif
-static int uim_notify_stderr_init(void);
-static void uim_notify_stderr_quit(void);
-static int uim_notify_stderr_info(const char *);
-static int uim_notify_stderr_fatal(const char *);
+static uim_notify_desc uim_notify_stderr_desc;
+static uim_notify_desc* (*uim_notify_get_desc_func)(void) =
uim_notify_stderr_get_desc;
static int (*uim_notify_init_func)(void) = uim_notify_stderr_init;
static void (*uim_notify_quit_func)(void) = uim_notify_stderr_quit;
static int (*uim_notify_info_func)(const char *) = uim_notify_stderr_info;
static int (*uim_notify_fatal_func)(const char *) = uim_notify_stderr_fatal;
static void *notify_dlhandle = NULL;
-static char notify_agent_name[PATH_MAX];
+static uim_notify_desc* notify_desc = &uim_notify_stderr_desc;
static void
uim_notify_load_stderr()
{
- strlcpy(notify_agent_name, "stderr", sizeof(notify_agent_name));
+ notify_desc = &uim_notify_stderr_desc;
uim_notify_init_func = uim_notify_stderr_init;
uim_notify_quit_func = uim_notify_stderr_quit;
uim_notify_info_func = uim_notify_stderr_info;
@@ -94,7 +92,7 @@
if (strcmp(name, "stderr") == 0) {
uim_notify_load_stderr();
- } else if (strcmp(notify_agent_name, name) == 0) {
+ } else if (strcmp(notify_desc->name, name) == 0) {
return 1;
} else {
char path[PATH_MAX];
@@ -108,6 +106,13 @@
uim_notify_load_stderr();
return 0;
}
+ uim_notify_get_desc_func = (uim_notify_desc*
(*)(void))(intptr_t)dlfunc(notify_dlhandle, "uim_notify_plugin_get_desc");
+ if (!uim_notify_get_desc_func) {
+ fprintf(stderr, "uim-notify: cannot
found 'uim_notify_get_desc()' in %s\n", path);
+ dlclose(notify_dlhandle);
+ uim_notify_load_stderr();
+ return 0;
+ }
uim_notify_init_func = (int (*)(void))(intptr_t)dlfunc(notify_dlhandle,
"uim_notify_plugin_init");
if (!uim_notify_init_func) {
fprintf(stderr, "uim-notify: cannot found 'uim_notify_init()'
in %s\n", path);
@@ -137,13 +142,18 @@
return 0;
}
+ notify_desc = uim_notify_get_desc_func();
uim_notify_init_func();
-
- strlcpy(notify_agent_name, name, sizeof(notify_agent_name));
}
return 1;
}
+uim_notify_desc*
+uim_notify_get_desc(void)
+{
+ return uim_notify_get_desc_func();
+}
+
int
uim_notify_init(void)
{
@@ -188,25 +198,36 @@
/*
* builtin functions
*/
-static int
+static uim_notify_desc uim_notify_stderr_desc = {
+ "stderr",
+ "Standard Error output",
+};
+
+uim_notify_desc*
+uim_notify_stderr_get_desc(void)
+{
+ return &uim_notify_stderr_desc;
+}
+
+int
uim_notify_stderr_init(void)
{
return 1;
}
-static void
+void
uim_notify_stderr_quit(void)
{
return;
}
-static int
+int
uim_notify_stderr_info(const char *msg)
{
return fprintf(stderr, "uim [Info]: %s", msg);
}
-static int
+int
uim_notify_stderr_fatal(const char *msg)
{
return fprintf(stderr, "uim [Fatal]: %s", msg);
Modified: trunk/uim/uim-notify.h
==============================================================================
--- trunk/uim/uim-notify.h (original)
+++ trunk/uim/uim-notify.h Mon Dec 31 18:32:52 2007
@@ -21,17 +21,31 @@
extern "C" {
#endif
+typedef struct {
+ char *name;
+ char *desc;
+} uim_notify_desc;
+
+uim_notify_desc* uim_notify_get_desc(void);
int uim_notify_load(const char *);
int uim_notify_init(void);
void uim_notify_quit(void);
int uim_notify_info(const char *, ...);
int uim_notify_fatal(const char *, ...);
+uim_notify_desc* uim_notify_plugin_get_desc(void);
int uim_notify_plugin_load(const char *);
int uim_notify_plugin_init(void);
void uim_notify_plugin_quit(void);
int uim_notify_plugin_info(const char *);
int uim_notify_plugin_fatal(const char *);
+
+/* builtin notify module */
+uim_notify_desc* uim_notify_stderr_get_desc(void);
+int uim_notify_stderr_init(void);
+void uim_notify_stderr_quit(void);
+int uim_notify_stderr_info(const char *);
+int uim_notify_stderr_fatal(const char *);
#ifdef __cplusplus
}
Modified: trunk/uim/uim-util.c
==============================================================================
--- trunk/uim/uim-util.c (original)
+++ trunk/uim/uim-util.c Mon Dec 31 18:32:52 2007
@@ -40,6 +40,7 @@
#include <string.h>
#include <assert.h>
#include <dirent.h>
+#include <dlfcn.h>
#include "uim-internal.h"
#include "uim-scm.h"
@@ -285,6 +286,10 @@
return MAKE_BOOL(uim_issetugid());
}
+#ifndef HAVE_DLFUNC
+#define dlfunc dlsym
+#endif
+
static uim_lisp
uim_scm_notify_get_plugins(void)
{
@@ -292,11 +297,19 @@
DIR *dirp;
struct dirent *dp;
int plen, slen;
+ uim_notify_desc* desc;
+ void *handle;
+ uim_notify_desc* (*desc_func)(void);
+ char *str;
plen = strlen(NOTIFY_PLUGIN_PREFIX);
slen = strlen(NOTIFY_PLUGIN_SUFFIX);
- ret_ = CONS(MAKE_STR("stderr"), uim_scm_null());
+ desc = uim_notify_stderr_get_desc();
+ ret_ = CONS(LIST3(MAKE_SYM(desc->name),
+ MAKE_STR(desc->name),
+ MAKE_STR(desc->desc)),
+ uim_scm_null());
dirp = opendir(NOTIFY_PLUGIN_PATH);
if (dirp) {
while ((dp = readdir(dirp)) != NULL) {
@@ -308,8 +321,26 @@
(strcmp(dp->d_name + len - slen, NOTIFY_PLUGIN_SUFFIX) != 0))
continue;
- strlcpy(name, dp->d_name + plen, len - plen - slen + 1);
- ret_ = CONS(MAKE_STR(name), ret_);
+ handle = dlopen(dp->d_name, RTLD_NOW);
+ if ((str = dlerror()) != NULL) {
+ fprintf(stderr, "load failed %s(%s)\n", dp->d_name, str);
+ continue;
+ }
+ desc_func = (uim_notify_desc* (*)(void))(intptr_t)dlfunc(handle,
"uim_notify_plugin_get_desc");
+ if (!desc_func) {
+ fprintf(stderr, "cannot found 'uim_notify_get_desc()' in %s\n",
dp->d_name);
+ dlclose(handle);
+ continue;
+ }
+
+ desc = desc_func();
+
+ ret_ = CONS(LIST3(MAKE_SYM(desc->name),
+ MAKE_STR(desc->name),
+ MAKE_STR(desc->desc)),
+ ret_);
+
+ dlclose(handle);
}
(void)closedir(dirp);
}