X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fengine.c;h=66d305805a155c48f137a4e6c1c5321899edfb8d;hb=f278ec41e4c310da218563e7d443df32783e26e4;hp=b1873abc9ba939307558a930e920320a11d813c1;hpb=bfea000a7407e51b5659590415e410a47f6f046b;p=chaz%2Fopenbox diff --git a/openbox/engine.c b/openbox/engine.c index b1873abc..66d30580 100644 --- a/openbox/engine.c +++ b/openbox/engine.c @@ -1,4 +1,5 @@ #include "engine.h" +#include "parse.h" #include #include @@ -6,9 +7,32 @@ # include #endif -static GModule *module; -static EngineStartup *estartup; -static EngineShutdown *eshutdown; +char *engine_name; +char *engine_theme; +char *engine_layout; +char *engine_font; +gboolean engine_shadow; +int engine_shadow_offset; +int engine_shadow_tint; + +EngineFrameNew *engine_frame_new; +EngineFrameGrabClient *engine_frame_grab_client; +EngineFrameReleaseClient *engine_frame_release_client; +EngineFrameAdjustArea *engine_frame_adjust_area; +EngineFrameAdjustShape *engine_frame_adjust_shape; +EngineFrameAdjustState *engine_frame_adjust_state; +EngineFrameAdjustFocus *engine_frame_adjust_focus; +EngineFrameAdjustTitle *engine_frame_adjust_title; +EngineFrameAdjustIcon *engine_frame_adjust_icon; +EngineFrameShow *engine_frame_show; +EngineFrameHide *engine_frame_hide; +EngineGetContext *engine_get_context; +EngineRenderLabel *engine_render_label; +EngineSizeLabel *engine_size_label; + +static GModule *module = NULL; +static EngineStartup *estartup = NULL; +static EngineShutdown *eshutdown = NULL; #define LOADSYM(name, var) \ if (!g_module_symbol(module, #name, (gpointer*)&var)) { \ @@ -22,19 +46,21 @@ static gboolean load(char *name) g_assert(module == NULL); - path = g_build_filename(ENGINEDIR, name, NULL); + path = g_build_filename(g_get_home_dir(), ".openbox", "engines", name, + NULL); module = g_module_open(path, 0); g_free(path); if (module == NULL) { - path = g_build_filename(g_get_home_dir(), ".openbox", "engines", name, - NULL); - module = g_module_open(path, 0); - g_free(path); + path = g_build_filename(ENGINEDIR, name, NULL); + module = g_module_open(path, 0); + g_free(path); } - if (module == NULL) + if (module == NULL) { + g_warning(g_module_error()); return FALSE; + } /* load the engine's symbols */ LOADSYM(startup, estartup); @@ -42,8 +68,7 @@ static gboolean load(char *name) LOADSYM(frame_new, engine_frame_new); LOADSYM(frame_grab_client, engine_frame_grab_client); LOADSYM(frame_release_client, engine_frame_release_client); - LOADSYM(frame_adjust_size, engine_frame_adjust_size); - LOADSYM(frame_adjust_position, engine_frame_adjust_position); + LOADSYM(frame_adjust_area, engine_frame_adjust_area); LOADSYM(frame_adjust_shape, engine_frame_adjust_shape); LOADSYM(frame_adjust_state, engine_frame_adjust_state); LOADSYM(frame_adjust_focus, engine_frame_adjust_focus); @@ -52,6 +77,8 @@ static gboolean load(char *name) LOADSYM(frame_show, engine_frame_show); LOADSYM(frame_hide, engine_frame_hide); LOADSYM(get_context, engine_get_context); + LOADSYM(render_label, engine_render_label); + LOADSYM(size_label, engine_size_label); if (!estartup()) return FALSE; @@ -59,15 +86,84 @@ static gboolean load(char *name) return TRUE; } -void engine_startup(char *engine) +static void parse_assign(char *name, ParseToken *value) +{ + if (!g_ascii_strcasecmp(name, "engine")) { + if (value->type != TOKEN_STRING) + yyerror("invalid value"); + else { + g_free(engine_name); + engine_name = g_strdup(value->data.string); + } + } else if (!g_ascii_strcasecmp(name, "theme")) { + if (value->type != TOKEN_STRING) + yyerror("invalid value"); + else { + g_free(engine_theme); + engine_theme = g_strdup(value->data.string); + } + } else if (!g_ascii_strcasecmp(name, "titlebarlayout")) { + if (value->type != TOKEN_STRING) + yyerror("invalid value"); + else { + g_free(engine_layout); + engine_layout = g_strdup(value->data.string); + } + } else if (!g_ascii_strcasecmp(name, "font.title")) { + if (value->type != TOKEN_STRING) + yyerror("invalid value"); + else { + g_free(engine_font); + engine_font = g_strdup(value->data.string); + } + } else if (!g_ascii_strcasecmp(name, "font.title.shadow")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + engine_shadow = value->data.bool; + } + } else if (!g_ascii_strcasecmp(name, "font.title.shadow.offset")) { + if (value->type != TOKEN_INTEGER) + yyerror("invalid value"); + else { + engine_shadow_offset = value->data.integer; + } + } else if (!g_ascii_strcasecmp(name, "font.title.shadow.tint")) { + if (value->type != TOKEN_INTEGER) + yyerror("invalid value"); + else { + engine_shadow_tint = value->data.integer; + if (engine_shadow_tint < -100) engine_shadow_tint = -100; + else if (engine_shadow_tint > 100) engine_shadow_tint = 100; + } + } else + yyerror("invalid option"); + parse_free_token(value); +} + +void engine_startup() { module = NULL; + engine_name = g_strdup(DEFAULT_ENGINE); + engine_theme = NULL; + engine_layout = g_strdup("NLIMC"); + engine_font = g_strdup("Sans-7"); + engine_shadow = FALSE; + engine_shadow_offset = 1; + engine_shadow_tint = 25; + + parse_reg_section("engine", NULL, parse_assign); +} - if (engine != NULL) { - if (load(engine)) - return; - g_warning("Failed to load the engine '%s'", engine); - g_message("Falling back to the default: '%s'", DEFAULT_ENGINE); +void engine_load() +{ + if (load(engine_name)) + return; + g_warning("Failed to load the engine '%s'", engine_name); + g_message("Falling back to the default: '%s'", DEFAULT_ENGINE); + if (module != NULL) { + g_module_close(module); + module = NULL; } if (!load(DEFAULT_ENGINE)) { g_critical("Failed to load the engine '%s'. Aborting", DEFAULT_ENGINE); @@ -77,6 +173,7 @@ void engine_startup(char *engine) void engine_shutdown() { + g_free(engine_name); if (module != NULL) { eshutdown(); g_module_close(module);