LDFLAGS = -export-dynamic
target = openbox3
-sources = action.c client.c config.c dispatch.c engine.c event.c \
+sources = action.c client.c dispatch.c engine.c event.c \
extensions.c focus.c frame.c grab.c menu.c openbox.c \
parse.c plugin.c prop.c screen.c stacking.c timer.c xerror.c \
parse.lex.c parse.tab.c
#include "obtheme.h"
#include "obrender.h"
#include "obengine.h"
-#include "../../kernel/openbox.h"
-#include "../../kernel/extensions.h"
-#include "../../kernel/dispatch.h"
-#include "../../kernel/config.h"
+#include "kernel/openbox.h"
+#include "kernel/extensions.h"
+#include "kernel/dispatch.h"
+#include "kernel/engine.h"
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
color_rgb *ob_s_titlebut_unfocused_color;
/* style settings - fonts */
int ob_s_winfont_height;
-int ob_s_winfont_shadow;
-int ob_s_winfont_shadow_offset;
-int ob_s_winfont_shadow_tint;
ObFont *ob_s_winfont;
/* style settings - masks */
pixmap_mask *ob_s_max_set_mask;
char *lc;
int x;
gboolean n, d, i, l, m, c, s;
- ConfigValue layout;
n = d = i = l = m = c = s = FALSE;
- if (!config_get("titlebar.layout", Config_String, &layout))
- g_assert_not_reached();
-
/* figure out whats being shown, and the width of the label */
self->label_width = self->width - (ob_s_bevel + 1) * 2;
- for (lc = layout.string; *lc != '\0'; ++lc) {
+ for (lc = engine_layout; *lc != '\0'; ++lc) {
switch (*lc) {
case 'N':
if (!(self->frame.client->decorations & Decor_Icon)) break;
if (!c) XUnmapWindow(ob_display, self->close);
x = ob_s_bevel + 1;
- for (lc = layout.string; *lc != '\0'; ++lc) {
+ for (lc = engine_layout; *lc != '\0'; ++lc) {
switch (*lc) {
case 'N':
if (!n) break;
extern color_rgb *ob_s_titlebut_unfocused_color;
extern int ob_s_winfont_height;
-extern int ob_s_winfont_shadow;
-extern int ob_s_winfont_shadow_offset;
-extern int ob_s_winfont_shadow_tint;
extern ObFont *ob_s_winfont;
extern pixmap_mask *ob_s_max_set_mask;
#include "obengine.h"
-#include "../../kernel/config.h"
-#include "../../kernel/openbox.h"
+#include "kernel/openbox.h"
+#include "kernel/engine.h"
#include <glib.h>
#include <X11/Xlib.h>
int hx, hy; /* ignored */
unsigned int w, h;
unsigned char *b;
- ConfigValue theme;
if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
retvalue.addr != NULL) {
- if (!config_get("theme", Config_String, &theme))
- g_assert_not_reached(); /* where's the default!? its not set? */
- button_dir = g_strdup_printf("%s_buttons", theme.string);
+ button_dir = g_strdup_printf("%s_buttons", engine_theme);
s = g_build_filename(g_get_home_dir(), ".openbox", "themes",
"openbox", button_dir, retvalue.addr, NULL);
char *themename;
g_free(s);
- themename = g_path_get_basename(theme.string);
- s = g_strdup_printf("%s_buttons/%s", theme.string,
+ themename = g_path_get_basename(engine_theme);
+ s = g_strdup_printf("%s_buttons/%s", engine_theme,
themename);
g_free(themename);
if (XReadBitmapFileData(s, &w, &h, &b, &hx, &hy) ==
XrmDatabase db = NULL;
Justify winjust;
char *winjuststr;
- ConfigValue theme, shadow, offset, font, tint;
- if (config_get("theme", Config_String, &theme)) {
- db = loaddb(theme.string);
+ if (engine_theme) {
+ db = loaddb(engine_theme);
if (db == NULL) {
- g_warning("Failed to load the theme '%s'", theme.string);
+ g_warning("Failed to load the theme '%s'", engine_theme);
g_message("Falling back to the default: '%s'", DEFAULT_THEME);
}
}
g_warning("Failed to load the theme '%s'.", DEFAULT_THEME);
return FALSE;
}
- /* change to reflect what was actually loaded */
- theme.string = DEFAULT_THEME;
- config_set("theme", Config_String, theme);
+ /* set it to what was loaded */
+ g_free(engine_theme);
+ engine_theme = g_strdup(DEFAULT_THEME);
}
/* load the font, not from the theme file tho, its in the config */
- if (!config_get("font.shadow", Config_Bool, &shadow))
- g_assert_not_reached();
- ob_s_winfont_shadow = shadow.bool;
- if (!config_get("font.shadow.offset", Config_Integer, &offset))
- g_assert_not_reached();
- ob_s_winfont_shadow_offset = offset.integer;
- if (!config_get("font.shadow.tint", Config_Integer, &tint))
- g_assert_not_reached();
- /* XXX put these checks into the config system somehow!!! */
- if (tint.integer < -100) tint.integer = -100;
- if (tint.integer > 100) tint.integer = 100;
- config_set("font.shadow.tint", Config_Integer, tint);
- ob_s_winfont_shadow_tint = tint.integer;
- if (!config_get("font", Config_String, &font))
- g_assert_not_reached();
- ob_s_winfont = font_open(font.string);
- ob_s_winfont_height = font_height(ob_s_winfont, ob_s_winfont_shadow,
- ob_s_winfont_shadow_offset);
+ ob_s_winfont = font_open(engine_font);
+ ob_s_winfont_height = font_height(ob_s_winfont, engine_shadow,
+ engine_shadow_offset);
winjust = Justify_Left;
if (read_string(db, "window.justify", &winjuststr)) {
ob_a_focused_label->texture[0].type = Text;
ob_a_focused_label->texture[0].data.text.justify = winjust;
ob_a_focused_label->texture[0].data.text.font = ob_s_winfont;
- ob_a_focused_label->texture[0].data.text.shadow = ob_s_winfont_shadow;
- ob_a_focused_label->texture[0].data.text.offset =
- ob_s_winfont_shadow_offset;
- ob_a_focused_label->texture[0].data.text.tint = ob_s_winfont_shadow_tint;
+ ob_a_focused_label->texture[0].data.text.shadow = engine_shadow;
+ ob_a_focused_label->texture[0].data.text.offset = engine_shadow_offset;
+ ob_a_focused_label->texture[0].data.text.tint = engine_shadow_tint;
ob_a_focused_label->texture[0].data.text.color = ob_s_title_focused_color;
ob_a_unfocused_label->texture[0].type = Text;
ob_a_unfocused_label->texture[0].data.text.justify = winjust;
ob_a_unfocused_label->texture[0].data.text.font = ob_s_winfont;
- ob_a_unfocused_label->texture[0].data.text.shadow = ob_s_winfont_shadow;
- ob_a_unfocused_label->texture[0].data.text.offset =
- ob_s_winfont_shadow_offset;
- ob_a_unfocused_label->texture[0].data.text.tint = ob_s_winfont_shadow_tint;
+ ob_a_unfocused_label->texture[0].data.text.shadow = engine_shadow;
+ ob_a_unfocused_label->texture[0].data.text.offset = engine_shadow_offset;
+ ob_a_unfocused_label->texture[0].data.text.tint = engine_shadow_tint;
ob_a_unfocused_label->texture[0].data.text.color =
ob_s_title_unfocused_color;
a = action_new(action_restart);
} else if (!g_ascii_strcasecmp(name, "exit")) {
a = action_new(action_exit);
- }
- else if (!g_ascii_strcasecmp(name, "showmenu")) {
+ } else if (!g_ascii_strcasecmp(name, "showmenu")) {
a = action_new(action_showmenu);
+ } else if (!g_ascii_strcasecmp(name, "nextwindowlinear")) {
+ a = action_new(action_cycle_windows);
+ a->data.cycle.linear = TRUE;
+ a->data.cycle.forward = TRUE;
+ } else if (!g_ascii_strcasecmp(name, "previouswindowlinear")) {
+ a = action_new(action_cycle_windows);
+ a->data.cycle.linear = TRUE;
+ a->data.cycle.forward = FALSE;
}
return a;
{
g_message(__FUNCTION__);
}
+
+void action_cycle_windows(union ActionData *data)
+{
+ if (data->cycle.linear) {
+ if (!data->cycle.final) {
+ GList *it, *start;
+
+ start = it = g_list_find(client_list, data->cycle.c);
+ do {
+ if (data->cycle.forward) {
+ it = it->next;
+ if (it == NULL) it = client_list;
+ } else {
+ it = it->prev;
+ if (it == NULL) it = g_list_last(client_list);
+ }
+ if (client_focus(it->data))
+ break;
+ } while (it != start);
+ }
+ } else {
+ }
+}
+
struct ShowMenu {
Client *c;
- char * menuName;
+ char *menuName;
+};
+
+struct CycleWindows {
+ Client *c;
+ gboolean linear;
+ gboolean forward;
+ gboolean final;
};
union ActionData {
struct Move move;
struct Resize resize;
struct ShowMenu showMenu;
+ struct CycleWindows cycle;
};
typedef struct {
void action_exit(union ActionData *data);
/* ShowMenu */
void action_showmenu(union ActionData *data);
+/* CycleWindows */
+void action_cycle_windows(union ActionData *data);
#endif
#include "screen.h"
#include "prop.h"
#include "extensions.h"
-#include "config.h"
#include "frame.h"
#include "engine.h"
#include "event.h"
#define CLIENT_NOPROPAGATEMASK (ButtonPressMask | ButtonReleaseMask | \
ButtonMotionMask)
-GSList *client_list = NULL;
+GList *client_list = NULL;
GHashTable *client_map = NULL;
static Window *client_startup_stack_order = NULL;
void client_set_list()
{
Window *windows, *win_it;
- GSList *it;
- guint size = g_slist_length(client_list);
+ GList *it;
+ guint size = g_list_length(client_list);
/* create an array of the window ids */
if (size > 0) {
void client_manage_all()
{
- ConfigValue focus_new;
unsigned int i, j, nchild;
Window w, *children;
XWMHints *wmhints;
client_startup_stack_order = NULL;
client_startup_stack_size = 0;
- if (!config_get("focusNew", Config_Bool, &focus_new))
- g_assert_not_reached();
- if (focus_new.bool)
+ if (focus_new)
focus_fallback(FALSE);
}
XSetWindowAttributes attrib_set;
/* XWMHints *wmhint; */
guint i;
- ConfigValue focus_new;
grab_server(TRUE);
grab_server(FALSE);
- client_list = g_slist_append(client_list, client);
+ client_list = g_list_append(client_list, client);
stacking_list = g_list_append(stacking_list, client);
g_assert(!g_hash_table_lookup(client_map, &client->window));
g_hash_table_insert(client_map, &client->window, client);
dispatch_client(Event_Client_Mapped, client, 0, 0);
- if (!config_get("focusNew", Config_Bool, &focus_new))
- g_assert_not_reached();
- if (ob_state != State_Starting && focus_new.bool)
+ if (ob_state != State_Starting && focus_new)
client_focus(client);
/* update the list hints */
engine_frame_hide(client->frame);
- client_list = g_slist_remove(client_list, client);
+ client_list = g_list_remove(client_list, client);
stacking_list = g_list_remove(stacking_list, client);
g_hash_table_remove(client_map, &client->window);
void client_set_desktop(Client *self, guint target, gboolean donthide)
{
guint old, i;
- ConfigValue focus_new;
if (target == self->desktop) return;
screen_update_struts();
/* update the focus lists */
- if (!config_get("focusNew", Config_Bool, &focus_new))
- g_assert_not_reached();
if (old == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i)
focus_order[i] = g_list_remove(focus_order[i], self);
focus_order[old] = g_list_remove(focus_order[old], self);
if (target == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i) {
- if (focus_new.bool)
+ if (focus_new)
focus_order[i] = g_list_prepend(focus_order[i], self);
else
focus_order[i] = g_list_append(focus_order[i], self);
}
} else {
- if (focus_new.bool)
+ if (focus_new)
focus_order[target] = g_list_prepend(focus_order[target], self);
else
focus_order[target] = g_list_append(focus_order[target], self);
Pixmap pixmap_icon_mask;
} Client;
-extern GSList *client_list;
+extern GList *client_list;
extern GHashTable *client_map;
void client_startup();
+++ /dev/null
-#include "config.h"
-
-#ifdef HAVE_STDIO_H
-# include <stdio.h>
-#endif
-
-static void config_free_entry(ConfigEntry *entry);
-static void config_set_entry(char *name, ConfigValueType type,
- ConfigValue value);
-static void config_def_free(ConfigDefEntry *entry);
-
-static GData *config = NULL;
-static GData *config_def = NULL;
-
-/* provided by cparse.l */
-void cparse_go(char *filename, FILE *);
-
-
-void config_startup()
-{
- ConfigValue val;
-
- /* set up options exported by the kernel */
- config_def_set(config_def_new("engine", Config_String,
- "Engine",
- "The name of the theming engine to be used "
- "to decorate windows."));
-
- config_def_set(config_def_new("theme", Config_String,
- "Theme",
- "The name of the theme to load with the "
- "chosen engine."));
-
- config_def_set(config_def_new("font", Config_String,
- "Titlebar Font",
- "The fontstring specifying the font to "
- "be used in window titlebars."));
- val.string = "Sans-7";
- config_set("font", Config_String, val);
-
- config_def_set(config_def_new("font.shadow", Config_Bool,
- "Titlebar Font Shadow",
- "Whether or not the text in the window "
- "titlebars gets a drop shadow."));
- val.bool = FALSE;
- config_set("font.shadow", Config_Bool, val);
-
- config_def_set(config_def_new("font.shadow.offset", Config_Integer,
- "Titlebar Font Shadow Offset",
- "The offset of the drop shadow for text "
- "in the window titlebars."));
- val.integer = 1;
- config_set("font.shadow.offset", Config_Integer, val);
-
- config_def_set(config_def_new("font.shadow.tint", Config_Integer,
- "Titlebar Font Shadow Tint",
- "The percentage of tint/opacity to give the "
- "the shadow(from -100(white) to "
- "100(black))."));
- val.integer = 25;
- config_set("font.shadow.tint", Config_Integer, val);
-
- config_def_set(config_def_new("titlebar.layout", Config_String,
- "Titlebar Layout",
- "The ordering of the elements in the "
- "window titlebars."));
- val.string = "NDSLIMC";
- config_set("titlebar.layout", Config_String, val);
-
- config_def_set(config_def_new("focusNew", Config_Bool,
- "Focus New Windows",
- "Focus windows when they first appear."));
- val.bool = TRUE;
- config_set("focusNew", Config_Bool, val);
-
- config_def_set(config_def_new("focusFollowsMouse", Config_Bool,
- "Focus Follows Mouse",
- "Focus windows when the mouse pointer "
- "enters them."));
- val.bool = TRUE;
- config_set("focusFollowsMouse", Config_Bool, val);
-}
-
-void config_shutdown()
-{
- g_datalist_clear(&config);
- g_datalist_clear(&config_def);
-}
-
-gboolean config_set(char *name, ConfigValueType type, ConfigValue value)
-{
- ConfigDefEntry *def;
- gboolean ret = FALSE;
-
- name = g_ascii_strdown(name, -1);
-
- def = g_datalist_get_data(&config_def, name);
-
- if (def == NULL) {
- g_warning("Invalid config option '%s'", name);
- } else {
- if (def->hasList) {
- gboolean found = FALSE;
- GSList *it;
-
- it = def->values;
- g_assert(it != NULL);
- do {
- if (g_ascii_strcasecmp(it->data, value.string) == 0) {
- found = TRUE;
- break;
- }
- } while ((it = it->next));
-
- if (!found)
- g_warning("Invalid value '%s' for config option '%s'",
- value.string, name);
- else
- ret = TRUE;
- } else if (type != def->type) {
- g_warning("Incorrect type of value for config option '%s'", name);
- } else
- ret = TRUE;
-
- }
-
- if (ret)
- config_set_entry(name, type, value);
- else
- g_free(name);
-
- return ret;
-}
-
-gboolean config_get(char *name, ConfigValueType type, ConfigValue *value)
-{
- ConfigEntry *entry;
- gboolean ret = FALSE;
-
- name = g_ascii_strdown(name, -1);
- entry = g_datalist_get_data(&config, name);
- if (entry != NULL && entry->type == type) {
- *value = entry->value;
- ret = TRUE;
- }
- g_free(name);
- return ret;
-}
-
-static void config_set_entry(char *name, ConfigValueType type,
- ConfigValue value)
-{
- ConfigEntry *entry = NULL;
-
- entry = g_new(ConfigEntry, 1);
- entry->name = name;
- entry->type = type;
- if (type == Config_String)
- entry->value.string = g_strdup(value.string);
- else
- entry->value = value;
-
- g_datalist_set_data_full(&config, name, entry,
- (GDestroyNotify)config_free_entry);
-}
-
-static void config_free_entry(ConfigEntry *entry)
-{
- g_free(entry->name);
- entry->name = NULL;
- if(entry->type == Config_String) {
- g_free(entry->value.string);
- entry->value.string = NULL;
- }
- g_free(entry);
-}
-
-ConfigDefEntry *config_def_new(char *name, ConfigValueType type,
- char *descriptive_name, char *long_description)
-{
- ConfigDefEntry *entry;
-
- entry = g_new(ConfigDefEntry, 1);
- entry->name = g_ascii_strdown(name, -1);
- entry->descriptive_name = g_strdup(descriptive_name);
- entry->long_description = g_strdup(long_description);
- entry->hasList = FALSE;
- entry->type = type;
- entry->values = NULL;
- return entry;
-}
-
-static void config_def_free(ConfigDefEntry *entry)
-{
- GSList *it;
-
- g_free(entry->name);
- g_free(entry->descriptive_name);
- g_free(entry->long_description);
- if (entry->hasList) {
- for (it = entry->values; it != NULL; it = it->next)
- g_free(it->data);
- g_slist_free(entry->values);
- }
- g_free(entry);
-}
-
-gboolean config_def_add_value(ConfigDefEntry *entry, char *value)
-{
- if (entry->type != Config_String) {
- g_warning("Tried adding value to non-string config definition");
- return FALSE;
- }
-
- entry->hasList = TRUE;
- entry->values = g_slist_append(entry->values, g_ascii_strdown(value, -1));
- return TRUE;
-}
-
-gboolean config_def_set(ConfigDefEntry *entry)
-{
- gboolean ret = FALSE;
- ConfigDefEntry *def;
-
- if ((def = g_datalist_get_data(&config_def, entry->name))) {
- g_assert(def != entry); /* adding it twice!? */
- g_warning("Definition already set for config option '%s'. ",
- entry->name);
- config_def_free(entry);
- } else {
- g_datalist_set_data_full(&config_def, entry->name, entry,
- (GDestroyNotify)config_def_free);
- ret = TRUE;
- }
-
- return ret;
-}
+++ /dev/null
-#ifndef __config_h
-#define __config_h
-
-#include <glib.h>
-
-typedef enum {
- Config_String,
- Config_Integer,
- Config_Bool
-} ConfigValueType;
-
-typedef union {
- char *string;
- int integer;
- gboolean bool;
-} ConfigValue;
-
-typedef struct {
- char *name;
- ConfigValueType type;
- ConfigValue value;
-} ConfigEntry;
-
-typedef struct {
- char *name;
- char *descriptive_name; /* user friendly name */
- char *long_description; /* text description of option */
- ConfigValueType type;
- /* if it is a string type optionally provide a list of valid strings */
- gboolean hasList;
- GSList *values;
-} ConfigDefEntry;
-
-void config_startup();
-void config_shutdown();
-
-/* Set a config variable's value. The variable must have already been defined
- with a call to config_def_set */
-gboolean config_set(char *name, ConfigValueType type, ConfigValue value);
-
-/* Get a config variable's value. Returns FALSE if the value has not been
- set. */
-gboolean config_get(char *name, ConfigValueType type, ConfigValue *value);
-
-/* Create a new config definition to add to the config system */
-ConfigDefEntry *config_def_new(char *name, ConfigValueType type,
- char *descriptive_name, char *long_description);
-
-/* Add a value to a String type config definition */
-gboolean config_def_add_value(ConfigDefEntry *entry, char *value);
-
-/* Sets up the definition in the config system, Don't free or touch the entry
- after setting it with this. It is invalidated even if the function returns
- FALSE. */
-gboolean config_def_set(ConfigDefEntry *entry);
-
-#endif
#include "engine.h"
-#include "config.h"
#include <glib.h>
#include <gmodule.h>
# include <stdlib.h>
#endif
-static GModule *module;
-static EngineStartup *estartup;
-static EngineShutdown *eshutdown;
+char *engine_name = NULL;
+char *engine_theme = NULL;
+char *engine_layout = "NDSLIMC";
+char *engine_font = "Sans-7";
+gboolean engine_shadow = FALSE;
+int engine_shadow_offset = 1;
+int engine_shadow_tint = 25;
+
+static GModule *module = NULL;
+static EngineStartup *estartup = NULL;
+static EngineShutdown *eshutdown = NULL;
#define LOADSYM(name, var) \
if (!g_module_symbol(module, #name, (gpointer*)&var)) { \
void engine_startup()
{
- ConfigValue engine;
-
module = NULL;
+}
- if (config_get("engine", Config_String, &engine)) {
- if (load(engine.string))
- return;
- g_warning("Failed to load the engine '%s'", engine.string);
- 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 (!load(DEFAULT_ENGINE)) {
g_critical("Failed to load the engine '%s'. Aborting", DEFAULT_ENGINE);
exit(1);
void engine_shutdown()
{
+ g_free(engine_name);
if (module != NULL) {
eshutdown();
g_module_close(module);
#include "../engines/engineinterface.h"
+/* The engine to load */
+extern char *engine_name;
+/* The theme to load */
+extern char *engine_theme;
+/* The titlebar layout */
+extern char *engine_layout;
+/* The titlebar font */
+extern char *engine_font;
+/* The titlebar font's shadow */
+extern gboolean engine_shadow;
+/* The titlebar font's shadow offset */
+extern int engine_shadow_offset;
+/* The titlebar font's shadow transparency */
+extern int engine_shadow_tint;
+
void engine_startup();
+void engine_load();
void engine_shutdown();
EngineFrameNew *engine_frame_new;
#include "openbox.h"
#include "client.h"
-#include "config.h"
#include "xerror.h"
#include "prop.h"
#include "screen.h"
XEvent ce;
Atom msgtype;
int i=0;
- ConfigValue focus_follow;
switch (e->type) {
case FocusIn:
client);
focus_order[desktop] = g_list_prepend(focus_order[desktop],
client);
- } else {
- if (!config_get("focusFollowsMouse",Config_Bool,&focus_follow))
- g_assert_not_reached();
- if (focus_follow.bool)
- client_focus(client);
- }
+ } else if (focus_follow)
+ client_focus(client);
}
break;
case ConfigureRequest:
#include "event.h"
-#include "config.h"
#include "openbox.h"
#include "client.h"
#include "frame.h"
sets the number of desktops */
Window focus_backup = None;
+gboolean focus_new = TRUE;
+gboolean focus_follow = TRUE;
void focus_startup()
{
XSetWindowAttributes attrib;
focus_client = NULL;
+ focus_new = TRUE;
+ focus_follow = TRUE;
attrib.override_redirect = TRUE;
focus_backup = XCreateWindow(ob_display, ob_root,
void focus_fallback(gboolean switching_desks)
{
- ConfigValue focus_follow;
GList *it;
gboolean under = FALSE;
Client *old = NULL;
/* don't skip any windows when switching desktops */
old = NULL;
} else {
- if (!config_get("focusFollowsMouse", Config_Bool, &focus_follow))
- g_assert_not_reached();
- if (focus_follow.bool)
+ if (focus_follow)
under = focus_under_pointer();
}
/*! The recent focus order on each desktop */
extern GList **focus_order;
+/*! Should new windows be focused */
+extern gboolean focus_new;
+/*! Should focus follow the mouse pointer */
+extern gboolean focus_follow;
+
void focus_startup();
void focus_shutdown();
#include "screen.h"
#include "focus.h"
#include "extensions.h"
-#include "config.h"
#include "parse.h"
#include "grab.h"
#include "engine.h"
if (screen_annex()) { /* it will be ours! */
timer_startup();
- config_startup();
render_startup();
font_startup();
event_startup();
grab_startup();
+ engine_startup();
plugin_startup();
/* startup the parsing so plugins can register sections of the rc */
/* we're done with parsing now, kill it */
parse_shutdown();
- engine_startup();
+ /* load the engine specified in the rc */
+ engine_load();
+
screen_startup();
focus_startup();
client_startup();
grab_shutdown();
event_shutdown();
render_shutdown();
- config_shutdown();
timer_shutdown();
}
#include "parse.h"
-#include "config.h"
-static GHashTable *reg = NULL;
-static ParseFunc func = NULL;
+static GHashTable *reg = NULL;
-/* parse tokens from the [openbox] section of the rc file */
-static void parse_rc_token(ParseToken *token);
+struct Functions {
+ ParseFunc func;
+ AssignParseFunc afunc;
+} *funcs;
-void destkey(gpointer key) { g_free(key); }
+void destshit(gpointer key) { g_free(key); }
void parse_startup()
{
- reg = g_hash_table_new_full(g_str_hash, g_str_equal, destkey, NULL);
- func = NULL;
-
- parse_reg_section("openbox", parse_rc_token);
+ reg = g_hash_table_new_full(g_str_hash, g_str_equal, destshit, destshit);
+ funcs = NULL;
}
void parse_shutdown()
g_hash_table_destroy(reg);
}
-void parse_reg_section(char *section, ParseFunc func)
+void parse_reg_section(char *section, ParseFunc func, AssignParseFunc afunc)
{
if (g_hash_table_lookup(reg, section) != NULL)
g_warning("duplicate request for section '%s' in the rc file",
section);
- else
- g_hash_table_insert(reg, g_ascii_strdown(section, -1), (void*)func);
+ else {
+ struct Functions *f = g_new(struct Functions, 1);
+ f->func = func;
+ f->afunc = afunc;
+ g_hash_table_insert(reg, g_ascii_strdown(section, -1), f);
+ }
}
void parse_free_token(ParseToken *token)
case TOKEN_BOOL:
case TOKEN_LBRACE:
case TOKEN_RBRACE:
- case TOKEN_EQUALS:
case TOKEN_COMMA:
case TOKEN_NEWLINE:
break;
void parse_set_section(char *section)
{
- func = (ParseFunc)g_hash_table_lookup(reg, section);
+ funcs = g_hash_table_lookup(reg, section);
}
void parse_token(ParseToken *token)
{
- if (func != NULL)
- func(token);
+ if (funcs) {
+ if (funcs->func != NULL)
+ funcs->func(token);
+ else if (token->type != TOKEN_NEWLINE)
+ yyerror("syntax error");
+ }
}
-static void parse_rc_token(ParseToken *token)
+void parse_assign(char *name, ParseToken *value)
{
- static int got_eq = FALSE;
- static ParseTokenType got_val = 0;
- static char *id = NULL, *s = NULL;
- static int i;
- static gboolean b;
-
- if (id == NULL) {
- if (token->type == TOKEN_IDENTIFIER) {
- id = token->data.identifier;
- return;
- } else {
- yyerror("syntax error");
- }
- } else if (!got_eq) {
- if (token->type == TOKEN_EQUALS) {
- got_eq = TRUE;
- return;
- } else {
- yyerror("syntax error");
- }
- } else if (!got_val) {
- if (token->type == TOKEN_STRING) {
- s = token->data.string;
- got_val = token->type;
- return;
- } else if (token->type == TOKEN_BOOL) {
- b = token->data.bool;
- got_val = token->type;
- return;
- } else if (token->type == TOKEN_INTEGER) {
- i = token->data.integer;
- got_val = token->type;
- return;
- } else
+ if (funcs) {
+ if (funcs->afunc != NULL)
+ funcs->afunc(name, value);
+ else
yyerror("syntax error");
- } else if (token->type != TOKEN_NEWLINE) {
- yyerror("syntax error");
- } else {
- ConfigValue v;
-
- switch (got_val) {
- case TOKEN_STRING:
- v.string = s;
- if (!config_set(id, Config_String, v))
- yyerror("invalid value type");
- break;
- case TOKEN_BOOL:
- v.bool = b;
- if (!config_set(id, Config_Bool, v))
- yyerror("invalid value type");
- break;
- case TOKEN_INTEGER:
- v.integer = i;
- if (!config_set(id, Config_Integer, v))
- yyerror("invalid value type");
- break;
- default:
- g_assert_not_reached(); /* unhandled type got parsed */
- }
}
-
- g_free(id);
- g_free(s);
- id = s = NULL;
- got_eq = FALSE;
- got_val = 0;
- parse_free_token(token);
}
TOKEN_LIST,
TOKEN_LBRACE = '{',
TOKEN_RBRACE = '}',
- TOKEN_EQUALS = '=',
TOKEN_COMMA = ',',
TOKEN_NEWLINE = '\n'
} ParseTokenType;
} ParseToken;
typedef void (*ParseFunc)(ParseToken *token);
+typedef void (*AssignParseFunc)(char *name, ParseToken *value);
void parse_startup();
void parse_shutdown();
*/
void parse_rc();
-void parse_reg_section(char *section, ParseFunc func);
+void parse_reg_section(char *section, ParseFunc func, AssignParseFunc afunc);
/* Free a parsed token's allocated memory */
}
{identifier} { yylval.identifier = g_strdup(yytext); return IDENTIFIER; }
[{}()\[\]=,] { yylval.character = *yytext; return *yytext; }
-\n { yylval.character = *yytext; ++yylineno; return *yytext; }
+\n { yylval.character = *yytext; return *yytext; }
. { return INVALID; }
%%
/* in parse.c */
void parse_token(ParseToken *token);
+void parse_assign(char *name, ParseToken *token);
void parse_set_section(char *section);
%}
%%
sections:
- | sections '[' IDENTIFIER ']' { parse_set_section($3); } '\n' lines
+ | sections '[' IDENTIFIER ']' { parse_set_section($3); } '\n'
+ { ++yylineno; } lines
;
lines:
- | lines tokens '\n' { t.type = $3; t.data.character = $3; parse_token(&t); }
+ | lines tokens { t.type='\n'; t.data.character='\n'; parse_token(&t); } '\n'
+ { ++yylineno; }
+ | lines IDENTIFIER '=' listtoken { parse_assign($2, &t); } '\n'
+ { ++yylineno; }
;
tokens:
- tokens token
- | token
+ tokens token { parse_token(&t); }
+ | token { parse_token(&t); }
;
token:
- REAL { t.type = TOKEN_REAL; t.data.real = $1; parse_token(&t); }
- | INTEGER { t.type = TOKEN_INTEGER; t.data.integer = $1;
- parse_token(&t); }
- | STRING { t.type = TOKEN_STRING; t.data.string = $1; parse_token(&t); }
- | IDENTIFIER { t.type = TOKEN_IDENTIFIER; t.data.identifier = $1;
- parse_token(&t);}
- | BOOL { t.type = TOKEN_BOOL; t.data.bool = $1; parse_token(&t); }
- | list { t.type = TOKEN_LIST; t.data.list = $1; parse_token(&t); }
- | '{' { t.type = $1; t.data.character = $1; parse_token(&t); }
- | '}' { t.type = $1; t.data.character = $1; parse_token(&t); }
- | '=' { t.type = $1; t.data.character = $1; parse_token(&t); }
- | ',' { t.type = $1; t.data.character = $1; parse_token(&t); }
+ REAL { t.type = TOKEN_REAL; t.data.real = $1; }
+ | INTEGER { t.type = TOKEN_INTEGER; t.data.integer = $1; }
+ | STRING { t.type = TOKEN_STRING; t.data.string = $1; }
+ | IDENTIFIER { t.type = TOKEN_IDENTIFIER; t.data.identifier = $1; }
+ | BOOL { t.type = TOKEN_BOOL; t.data.bool = $1; }
+ | list { t.type = TOKEN_LIST; t.data.list = $1; }
+ | '{' { t.type = $1; t.data.character = $1; }
+ | '}' { t.type = $1; t.data.character = $1; }
+ | ',' { t.type = $1; t.data.character = $1; }
;
list:
| list { t.type = TOKEN_LIST; t.data.list = $1; }
| '{' { t.type = $1; t.data.character = $1; }
| '}' { t.type = $1; t.data.character = $1; }
- | '=' { t.type = $1; t.data.character = $1; }
| ',' { t.type = $1; t.data.character = $1; }
;
{
guint i, old;
gulong *viewport;
- GSList *it;
+ GList *it;
g_assert(num > 0);
void screen_update_struts()
{
- GSList *it;
+ GList *it;
guint i;
g_free(strut);
*/
if (!RECT_EQUAL(old_area, area[i])) {
/* the area has changed, adjust all the maximized windows */
- GSList *it;
+ GList *it;
for (it = client_list; it; it = it->next) {
Client *c = it->data;
if (i < screen_num_desktops) {
void plugin_setup_config()
{
- parse_reg_section("keyboard", keyparse);
+ parse_reg_section("keyboard", keyparse, NULL);
}
KeyBindingTree *firstnode = NULL;
#include "kernel/frame.h"
#include "kernel/grab.h"
#include "kernel/engine.h"
-#include "kernel/config.h"
#include "kernel/parse.h"
#include "kernel/frame.h"
#include "translate.h"
#include "mouseparse.h"
#include <glib.h>
+static int threshold;
+static int dclicktime;
+
+static void parse_assign(char *name, ParseToken *value)
+{
+ if (!g_ascii_strcasecmp(name, "dragthreshold")) {
+ if (value->type != TOKEN_INTEGER)
+ yyerror("invalid value");
+ else {
+ if (value->data.integer >= 0)
+ threshold = value->data.integer;
+ }
+ } else if (!g_ascii_strcasecmp(name, "doubleclicktime")) {
+ if (value->type != TOKEN_INTEGER)
+ yyerror("invalid value");
+ else {
+ if (value->data.integer >= 0)
+ dclicktime = value->data.integer;
+ }
+ } else
+ yyerror("invalid option");
+ parse_free_token(value);
+}
+
void plugin_setup_config()
{
- config_def_set(config_def_new("mouse.dragThreshold", Config_Integer,
- "Drag Threshold",
- "The drag threshold in pixels before a Drag "
- "event starts."));
- config_def_set(config_def_new("mouse.doubleClickTime", Config_Integer,
- "Double Click Interval",
- "The amount of time (in milliseconds) in "
- "which two clicks must occur to cause a "
- "DoubleClick event."));
-
- parse_reg_section("mouse", mouseparse);
+ threshold = 3;
+ dclicktime = 200;
+ parse_reg_section("mouse", mouseparse, parse_assign);
}
/* Array of GSList*s of PointerBinding*s. */
static void grab_all_clients(gboolean grab)
{
- GSList *it;
+ GList *it;
for (it = client_list; it != NULL; it = it->next)
grab_for_client(it->data, grab);
static guint button = 0, lbutton = 0;
static gboolean drag = FALSE, drag_used = FALSE;
static Corner corner = Corner_TopLeft;
- ConfigValue doubleclicktime;
- ConfigValue dragthreshold;
gboolean click = FALSE;
gboolean dclick = FALSE;
Context context;
- if (!config_get("mouse.dragThreshold", Config_Integer, &dragthreshold))
- dragthreshold.integer = 3; /* default */
- if (!config_get("mouse.doubleClickTime", Config_Integer, &doubleclicktime))
- doubleclicktime.integer = 200; /* default */
-
switch (e->type) {
case Event_Client_Mapped:
grab_for_client(e->data.c.client, TRUE);
click = TRUE;
/* double clicks happen if there were 2 in a row! */
if (lbutton == button &&
- e->data.x.e->xbutton.time - doubleclicktime.integer <=
- ltime) {
+ e->data.x.e->xbutton.time - dclicktime <= ltime) {
dclick = TRUE;
lbutton = 0;
} else
dx = e->data.x.e->xmotion.x_root - px;
dy = e->data.x.e->xmotion.y_root - py;
if (!drag &&
- (ABS(dx) >= dragthreshold.integer ||
- ABS(dy) >= dragthreshold.integer))
+ (ABS(dx) >= threshold || ABS(dy) >= threshold))
drag = TRUE;
if (drag) {
context = engine_get_context(e->data.x.client,
-#include "../../kernel/openbox.h"
-#include "../../kernel/dispatch.h"
-#include "../../kernel/frame.h"
-#include "../../kernel/client.h"
+#include "kernel/openbox.h"
+#include "kernel/dispatch.h"
+#include "kernel/frame.h"
+#include "kernel/client.h"
#include <glib.h>
#include <string.h>
#ifdef HAVE_STDLIB_H
-#include "../../kernel/dispatch.h"
-#include "../../kernel/client.h"
-#include "../../kernel/frame.h"
-#include "../../kernel/screen.h"
-#include "../../kernel/openbox.h"
-#include "../../kernel/config.h"
+#include "kernel/dispatch.h"
+#include "kernel/client.h"
+#include "kernel/frame.h"
+#include "kernel/screen.h"
+#include "kernel/openbox.h"
+#include "kernel/parse.h"
#include "history.h"
#include <glib.h>
-gboolean history = TRUE;
+static gboolean history;
+
+static void parse_assign(char *name, ParseToken *value)
+{
+ if (!g_ascii_strcasecmp(name, "remember")) {
+ if (value->type != TOKEN_BOOL)
+ yyerror("invalid value");
+ else
+ history = value->data.bool;
+ } else
+ yyerror("invalid option");
+ parse_free_token(value);
+}
void plugin_setup_config()
{
- ConfigValue val;
-
- config_def_set(config_def_new("placement.remember", Config_Bool,
- "Remember Window Positions",
- "Place windows where they last were "
- "positioned."));
- val.bool = TRUE;
- config_set("placement.remember", Config_Bool, val);
+ history = TRUE;
+
+ parse_reg_section("placement", NULL, parse_assign);
}
static void place_random(Client *c)
static void event(ObEvent *e, void *foo)
{
- ConfigValue remember;
-
g_assert(e->type == Event_Client_New);
/* requested a position */
if (e->data.c.client->positioned) return;
- if (!config_get("placement.remember", Config_Bool, &remember))
- g_assert_not_reached();
-
- if (!remember.bool || !place_history(e->data.c.client))
+ if (!history || !place_history(e->data.c.client))
place_random(e->data.c.client);
}
-#include "../kernel/dispatch.h"
-#include "../kernel/client.h"
-#include "../kernel/frame.h"
-#include "../kernel/stacking.h"
-#include "../kernel/screen.h"
-#include "../kernel/config.h"
+#include "kernel/dispatch.h"
+#include "kernel/client.h"
+#include "kernel/frame.h"
+#include "kernel/parse.h"
+#include "kernel/stacking.h"
+#include "kernel/screen.h"
#include <glib.h>
-#define DEFAULT_RESISTANCE 10
+static int resistance;
+static gboolean resist_windows;
+
+static void parse_assign(char *name, ParseToken *value)
+{
+ if (!g_ascii_strcasecmp(name, "strength")) {
+ if (value->type != TOKEN_INTEGER)
+ yyerror("invalid value");
+ else {
+ if (value->data.integer >= 0)
+ resistance = value->data.integer;
+ }
+ } else if (!g_ascii_strcasecmp(name, "windows")) {
+ if (value->type != TOKEN_BOOL)
+ yyerror("invalid value");
+ else
+ resist_windows = value->data.bool;
+ } else
+ yyerror("invalid option");
+ parse_free_token(value);
+}
void plugin_setup_config()
{
- ConfigValue val;
+ resistance = 10;
+ resist_windows = TRUE;
- config_def_set(config_def_new("resistance", Config_Integer,
- "Edge Resistance",
- "The amount of resistance to provide when "
- "moving windows past edges."
- "positioned."));
- config_def_set(config_def_new("resistance.windows", Config_Bool,
- "Edge Resistance On Windows",
- "Whether to provide edge resistance when "
- "moving windows past the edge of another "
- "window."));
- val.bool = TRUE;
- config_set("resistance.windows", Config_Bool, val);
+ parse_reg_section("resistance", NULL, parse_assign);
}
static void resist_move(Client *c, int *x, int *y)
int cl, ct, cr, cb; /* current edges */
int w, h; /* current size */
Client *snapx = NULL, *snapy = NULL;
- ConfigValue resist, window_resist;
-
- if (!config_get("resistance", Config_Integer, &resist) ||
- resist.integer < 0) {
- resist.integer = DEFAULT_RESISTANCE;
- config_set("resistance", Config_Integer, resist);
- }
- if (!config_get("resistance.windows", Config_Bool, &window_resist))
- g_assert_not_reached();
w = c->frame->area.width;
h = c->frame->area.height;
cb = ct + c->frame->area.height - 1;
/* snap to other clients */
- if (window_resist.bool)
+ if (resist_windows)
for (it = stacking_list; it != NULL; it = it->next) {
Client *target;
int tl, tt, tr, tb; /* 1 past the target's edges on each side */
*/
if (snapx == NULL) {
if (ct < tb && cb > tt) {
- if (cl >= tr && l < tr && l >= tr - resist.integer)
+ if (cl >= tr && l < tr && l >= tr - resistance)
*x = tr, snapx = target;
- else if (cr <= tl && r > tl && r <= tl + resist.integer)
+ else if (cr <= tl && r > tl && r <= tl + resistance)
*x = tl - w + 1, snapx = target;
if (snapx != NULL) {
/* try to corner snap to the window */
- if (ct > tt && t <= tt && t > tt - resist.integer)
+ if (ct > tt && t <= tt && t > tt - resistance)
*y = tt + 1, snapy = target;
- else if (cb < tb && b >= tb && b < tb + resist.integer)
+ else if (cb < tb && b >= tb && b < tb + resistance)
*y = tb - h, snapy = target;
}
}
}
if (snapy == NULL) {
if (cl < tr && cr > tl) {
- if (ct >= tb && t < tb && t >= tb - resist.integer)
+ if (ct >= tb && t < tb && t >= tb - resistance)
*y = tb, snapy = target;
- else if (cb <= tt && b > tt && b <= tt + resist.integer)
+ else if (cb <= tt && b > tt && b <= tt + resistance)
*y = tt - h + 1, snapy = target;
if (snapy != NULL) {
/* try to corner snap to the window */
- if (cl > tl && l <= tl && l > tl - resist.integer)
+ if (cl > tl && l <= tl && l > tl - resistance)
*x = tl + 1, snapx = target;
- else if (cr < tr && r >= tr && r < tr + resist.integer)
+ else if (cr < tr && r >= tr && r < tr + resistance)
*x = tr - w, snapx = target;
}
}
ab = at + area->height - 1;
/* snap to screen edges */
- if (cl >= al && l < al && l >= al - resist.integer)
+ if (cl >= al && l < al && l >= al - resistance)
*x = al;
- else if (cr <= ar && r > ar && r <= ar + resist.integer)
+ else if (cr <= ar && r > ar && r <= ar + resistance)
*x = ar - w + 1;
- if (ct >= at && t < at && t >= at - resist.integer)
+ if (ct >= at && t < at && t >= at - resistance)
*y = at;
- else if (cb <= ab && b > ab && b < ab + resist.integer)
+ else if (cb <= ab && b > ab && b < ab + resistance)
*y = ab - h + 1;
}
Rect *area;
int al, at, ar, ab; /* screen boundaries */
Client *snapx = NULL, *snapy = NULL;
- ConfigValue resist, window_resist;
-
- if (!config_get("resistance", Config_Integer, &resist) ||
- resist.integer < 0) {
- resist.integer = DEFAULT_RESISTANCE;
- config_set("resistance", Config_Integer, resist);
- }
- if (!config_get("resistance.windows", Config_Bool, &window_resist))
- g_assert_not_reached();
l = c->frame->area.x;
r = l + c->frame->area.width - 1;
ab = at + area->height - 1;
/* snap to other windows */
- if (window_resist.bool) {
+ if (resist_windows) {
for (it = stacking_list; it != NULL; it = it->next) {
target = it->data;
case Corner_BottomLeft:
dlt = l;
drb = r + *w - c->frame->area.width;
- if (r < tl && drb >= tl && drb < tl + resist.integer)
+ if (r < tl && drb >= tl && drb < tl + resistance)
*w = tl - l, snapx = target;
break;
case Corner_TopRight:
case Corner_BottomRight:
dlt = l - *w + c->frame->area.width;
drb = r;
- if (l > tr && dlt <= tr && dlt > tr - resist.integer)
+ if (l > tr && dlt <= tr && dlt > tr - resistance)
*w = r - tr, snapx = target;
break;
}
case Corner_TopRight:
dlt = t;
drb = b + *h - c->frame->area.height;
- if (b < tt && drb >= tt && drb < tt + resist.integer)
+ if (b < tt && drb >= tt && drb < tt + resistance)
*h = tt - t, snapy = target;
break;
case Corner_BottomLeft:
case Corner_BottomRight:
dlt = t - *h + c->frame->area.height;
drb = b;
- if (t > tb && dlt <= tb && dlt > tb - resist.integer)
+ if (t > tb && dlt <= tb && dlt > tb - resistance)
*h = b - tb, snapy = target;
break;
}
case Corner_BottomLeft:
dlt = l;
drb = r + *w - c->frame->area.width;
- if (r <= ar && drb > ar && drb <= ar + resist.integer)
+ if (r <= ar && drb > ar && drb <= ar + resistance)
*w = ar - l + 1;
break;
case Corner_TopRight:
case Corner_BottomRight:
dlt = l - *w + c->frame->area.width;
drb = r;
- if (l >= al && dlt < al && dlt >= al - resist.integer)
+ if (l >= al && dlt < al && dlt >= al - resistance)
*w = r - al + 1;
break;
}
case Corner_TopRight:
dlt = t;
drb = b + *h - c->frame->area.height;
- if (b <= ab && drb > ab && drb <= ab + resist.integer)
+ if (b <= ab && drb > ab && drb <= ab + resistance)
*h = ab - t + 1;
break;
case Corner_BottomLeft:
case Corner_BottomRight:
dlt = t - *h + c->frame->area.height;
drb = b;
- if (t >= at && dlt < at && dlt >= at - resist.integer)
+ if (t >= at && dlt < at && dlt >= at - resistance)
*h = b - at + 1;
break;
}