[ekg2-commit] r3709 - trunk/plugins/ruby: trunk/plugins/ruby/ruby_ekg.c
svn w toxygen.net
svn w toxygen.net
Nie, 27 Sty 2008, 23:15:05 CET
Author: darkjames
Date: 2008-01-27 23:15:04 +0100 (Sun, 27 Jan 2008)
New Revision: 3709
Modified:
trunk/plugins/ruby/ruby_ekg.c
Log:
- dont deinit ruby, at /script:reset [because ruby doesn't support reseting, and will segv!]
- init themes in proper ekg2-way.
Modified: trunk/plugins/ruby/ruby_ekg.c
===================================================================
--- trunk/plugins/ruby/ruby_ekg.c 2008-01-27 21:37:01 UTC (rev 3708)
+++ trunk/plugins/ruby/ruby_ekg.c 2008-01-27 22:15:04 UTC (rev 3709)
@@ -31,8 +31,14 @@
static int ruby_variable_changed(script_t *scr, script_var_t *scr_var, char *what);
static int ruby_watches(script_t *scr, script_watch_t *scr_wat, int type, int fd, int watch);
-PLUGIN_DEFINE(ruby, PLUGIN_SCRIPTING, NULL);
+static int ruby_script_theme_init(script_t *scr);
+static int allow_deinit = 0;
+
+static int ruby_theme_init();
+
+PLUGIN_DEFINE(ruby, PLUGIN_SCRIPTING, ruby_theme_init);
+
scriptlang_t ruby_lang = { /* SCRIPT_DEFINE(ruby, ".rb"); */
name: "ruby",
plugin: &ruby_plugin,
@@ -55,26 +61,39 @@
static VALUE ekg2_ruby_script;
static int ruby_finalize_wrapper() {
+ if (!allow_deinit) {
+ debug_error("NOT allow_deinit, but ruby_finalize_wrapper() called /script:reset ?\n");
+ return 0;
+ }
+
ruby_finalize();
return 0;
}
static VALUE ekg2_scripts_initialize(VALUE self) {
+ script_t *scr;
+
if (!last_scr) {
rb_raise(RUBY_EKG_INTERNAL_ERROR, "@ initialize internal error");
return Qnil; /* ??? */
}
- last_scr->private = (void *) self;
- last_scr = NULL;
+ scr = last_scr; last_scr = NULL;
+ scr->private = (void *) self;
+
+ ruby_script_theme_init(scr);
+
return ekg2_ruby_script;
}
-static VALUE ekg2_scripts_finalize(VALUE self) {
+static VALUE ekg2_scripts_return_qnil(VALUE self) {
return Qnil;
}
+#define ekg2_scripts_finalize ekg2_scripts_return_qnil
+#define ekg2_scripts_init_theme ekg2_scripts_return_qnil
+
static VALUE ruby_command_bind(int argc, VALUE *argv, VALUE self) {
script_t *scr = ruby_find_script(self);
@@ -186,6 +205,14 @@
extern void ruby_define_theme_methods(VALUE module); /* ruby_theme.c */
static int ruby_initialize() {
+ static int once = 0;
+
+ if (once) {
+ print("generic_error", "Try not to use /script:reset when you're using ruby plugin. Instead do: /plugin -ruby /plugin +ruby");
+ return 0;
+ }
+ once = 1;
+
ruby_init();
ruby_init_loadpath();
ruby_script("ekg2");
@@ -196,6 +223,7 @@
rb_define_method(ekg2_ruby_script, "initialize", ekg2_scripts_initialize, 0);
rb_define_method(ekg2_ruby_script, "finalize", ekg2_scripts_finalize, 0);
+ rb_define_method(ekg2_ruby_script, "theme_init", ekg2_scripts_init_theme, -1);
rb_define_method(ekg2_ruby_script, "command_bind", ruby_command_bind, -1);
rb_define_method(ekg2_ruby_script, "handler_bind", ruby_handler_bind, -1);
@@ -203,6 +231,7 @@
rb_define_method(ekg2_ruby_script, "watch_add", ruby_watch_add, -1);
rb_define_method(ekg2_ruby_script, "variable_add", ruby_variable_add, -1);
+
rb_define_const(ekg2_ruby_script, "WATCH_READ", INT2FIX(WATCH_READ));
ruby_define_theme_methods(ekg2_ruby_script);
@@ -469,13 +498,42 @@
return 0;
}
+static int ruby_script_theme_init(script_t *scr) {
+ ruby_helper_t ruby_theme;
+
+ ruby_theme.class = (VALUE) scr->private;
+ ruby_theme.func = "theme_init";
+ ruby_theme.argc = 0;
+ ruby_theme.argv = NULL;
+
+ ruby_funcall(&ruby_theme);
+ return 1;
+}
+
+static int ruby_theme_init() {
+ list_t l;
+
+ for (l = scripts; l; l = l->next) {
+ script_t *scr = l->data;
+
+ if (scr->lang == &ruby_lang)
+ ruby_script_theme_init(scr);
+ }
+
+ return 0;
+}
+
EXPORT int ruby_plugin_init(int prio) {
+ allow_deinit = 0;
+
plugin_register(&ruby_plugin, prio);
scriptlang_register(&ruby_lang);
return 0;
}
static int ruby_plugin_destroy() {
+ allow_deinit = 1;
+
scriptlang_unregister(&ruby_lang);
plugin_unregister(&ruby_plugin);
return 0;
Więcej informacji o liście dyskusyjnej ekg2-commit