guint config_keyboard_reset_keycode;
guint config_keyboard_reset_state;
-gint config_mouse_threshold;
-gint config_mouse_dclicktime;
-gint config_mouse_screenedgetime;
+gint config_mouse_threshold;
+gint config_mouse_dclicktime;
+gint config_mouse_screenedgetime;
+gboolean config_mouse_screenedgewarp;
guint config_menu_hide_delay;
gboolean config_menu_middle;
guint config_submenu_show_delay;
guint config_submenu_hide_delay;
-gboolean config_menu_client_list_icons;
gboolean config_menu_manage_desktops;
+gboolean config_menu_show_icons;
GSList *config_menu_files;
ObAppSettings* config_create_app_settings(void)
{
- ObAppSettings *settings = g_new0(ObAppSettings, 1);
+ ObAppSettings *settings = g_slice_new0(ObAppSettings);
settings->type = -1;
settings->decor = -1;
settings->shade = -1;
+ settings->monitor_type = 0;
settings->monitor = -1;
settings->focus = -1;
settings->desktop = 0;
copy_if(type, (ObClientType)-1);
copy_if(decor, -1);
copy_if(shade, -1);
+ copy_if(monitor_type, 0);
copy_if(monitor, -1);
copy_if(focus, -1);
copy_if(desktop, 0);
dst->pos_given = TRUE;
dst->pos_force = src->pos_force;
dst->position = src->position;
- dst->monitor = src->monitor;
+ /* monitor is copied above */
}
}
-static void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c)
+void config_parse_relative_number(gchar *s, gint *num, gint *denom)
+{
+ *num = strtol(s, &s, 10);
+
+ if (*s == '%') {
+ *denom = 100;
+ } else if (*s == '/') {
+ *denom = atoi(s+1);
+ }
+}
+
+void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c)
{
gchar *s = obt_xml_node_string(node);
if (!g_ascii_strcasecmp(s, "center"))
c->center = TRUE;
else {
+ gchar *ps = s;
if (s[0] == '-')
c->opposite = TRUE;
if (s[0] == '-' || s[0] == '+')
- c->pos = atoi(s+1);
- else
- c->pos = atoi(s);
+ ps++;
+ config_parse_relative_number(ps, &c->pos, &c->denom);
}
g_free(s);
}
/* Manages settings for individual applications.
Some notes: monitor is the screen number in a multi monitor
- (Xinerama) setup (starting from 0) or mouse, meaning the
- monitor the pointer is on. Default: mouse.
+ (Xinerama) setup (starting from 0), or mouse: the monitor the pointer
+ is on, active: the active monitor, primary: the primary monitor.
Layer can be three values, above (Always on top), below
(Always on bottom) and everything else (normal behaviour).
Positions can be an integer value or center, which will
static void parse_per_app_settings(xmlNodePtr node, gpointer d)
{
xmlNodePtr app = obt_xml_find_node(node->children, "application");
- gchar *name = NULL, *class = NULL, *role = NULL, *type = NULL;
- gboolean name_set, class_set, type_set;
+ gchar *name = NULL, *class = NULL, *role = NULL, *title = NULL,
+ *type_str = NULL;
+ gboolean name_set, class_set, type_set, role_set, title_set;
+ ObClientType type;
gboolean x_pos_given;
while (app) {
class_set = obt_xml_attr_string(app, "class", &class);
name_set = obt_xml_attr_string(app, "name", &name);
- type_set = obt_xml_attr_string(app, "type", &type);
- if (class_set || name_set) {
+ type_set = obt_xml_attr_string(app, "type", &type_str);
+ role_set = obt_xml_attr_string(app, "role", &role);
+ title_set = obt_xml_attr_string(app, "title", &title);
+
+ /* validate the type tho */
+ if (type_set) {
+ if (!g_ascii_strcasecmp(type_str, "normal"))
+ type = OB_CLIENT_TYPE_NORMAL;
+ else if (!g_ascii_strcasecmp(type_str, "dialog"))
+ type = OB_CLIENT_TYPE_DIALOG;
+ else if (!g_ascii_strcasecmp(type_str, "splash"))
+ type = OB_CLIENT_TYPE_SPLASH;
+ else if (!g_ascii_strcasecmp(type_str, "utility"))
+ type = OB_CLIENT_TYPE_UTILITY;
+ else if (!g_ascii_strcasecmp(type_str, "menu"))
+ type = OB_CLIENT_TYPE_MENU;
+ else if (!g_ascii_strcasecmp(type_str, "toolbar"))
+ type = OB_CLIENT_TYPE_TOOLBAR;
+ else if (!g_ascii_strcasecmp(type_str, "dock"))
+ type = OB_CLIENT_TYPE_DOCK;
+ else if (!g_ascii_strcasecmp(type_str, "desktop"))
+ type = OB_CLIENT_TYPE_DESKTOP;
+ else
+ type_set = FALSE; /* not valid! */
+ }
+
+ if (class_set || name_set || role_set || title_set || type_set) {
xmlNodePtr n, c;
- ObAppSettings *settings = config_create_app_settings();;
+ ObAppSettings *settings = config_create_app_settings();
if (name_set)
settings->name = g_pattern_spec_new(name);
if (class_set)
settings->class = g_pattern_spec_new(class);
- if (type_set) {
- if (!g_ascii_strcasecmp(type, "normal"))
- settings->type = OB_CLIENT_TYPE_NORMAL;
- else if (!g_ascii_strcasecmp(type, "dialog"))
- settings->type = OB_CLIENT_TYPE_DIALOG;
- else if (!g_ascii_strcasecmp(type, "splash"))
- settings->type = OB_CLIENT_TYPE_SPLASH;
- else if (!g_ascii_strcasecmp(type, "utility"))
- settings->type = OB_CLIENT_TYPE_UTILITY;
- else if (!g_ascii_strcasecmp(type, "menu"))
- settings->type = OB_CLIENT_TYPE_MENU;
- else if (!g_ascii_strcasecmp(type, "toolbar"))
- settings->type = OB_CLIENT_TYPE_TOOLBAR;
- else if (!g_ascii_strcasecmp(type, "dock"))
- settings->type = OB_CLIENT_TYPE_DOCK;
- else if (!g_ascii_strcasecmp(type, "desktop"))
- settings->type = OB_CLIENT_TYPE_DESKTOP;
- }
-
- if (obt_xml_attr_string(app, "role", &role))
+ if (role_set)
settings->role = g_pattern_spec_new(role);
+ if (title_set)
+ settings->title = g_pattern_spec_new(title);
+
+ if (type_set)
+ settings->type = type;
+
if ((n = obt_xml_find_node(app->children, "decor")))
if (!obt_xml_node_contains(n, "default"))
settings->decor = obt_xml_node_bool(n);
if (!obt_xml_node_contains(c, "default")) {
gchar *s = obt_xml_node_string(c);
if (!g_ascii_strcasecmp(s, "mouse"))
- settings->monitor = 0;
+ settings->monitor_type =
+ OB_APP_SETTINGS_MONITOR_MOUSE;
+ else if (!g_ascii_strcasecmp(s, "active"))
+ settings->monitor_type =
+ OB_APP_SETTINGS_MONITOR_ACTIVE;
+ else if (!g_ascii_strcasecmp(s, "primary"))
+ settings->monitor_type =
+ OB_APP_SETTINGS_MONITOR_PRIMARY;
else
settings->monitor = obt_xml_node_int(c);
g_free(s);
}
config_per_app_settings = g_slist_append(config_per_app_settings,
- (gpointer) settings);
+ (gpointer) settings);
g_free(name);
g_free(class);
g_free(role);
- name = class = role = NULL;
+ g_free(title);
+ g_free(type_str);
+ name = class = role = title = type_str = NULL;
}
app = obt_xml_find_node(app->next, "application");
static void parse_key(xmlNodePtr node, GList *keylist)
{
- gchar *key;
+ gchar *keystring, **keys, **key;
xmlNodePtr n;
gboolean is_chroot = FALSE;
- if (!obt_xml_attr_string(node, "key", &key))
+ if (!obt_xml_attr_string(node, "key", &keystring))
return;
obt_xml_attr_bool(node, "chroot", &is_chroot);
- keylist = g_list_append(keylist, key);
+ keys = g_strsplit(keystring, " ", 0);
+ for (key = keys; *key; ++key) {
+ keylist = g_list_append(keylist, *key);
- if ((n = obt_xml_find_node(node->children, "keybind"))) {
- while (n) {
- parse_key(n, keylist);
- n = obt_xml_find_node(n->next, "keybind");
+ if ((n = obt_xml_find_node(node->children, "keybind"))) {
+ while (n) {
+ parse_key(n, keylist);
+ n = obt_xml_find_node(n->next, "keybind");
+ }
}
- }
- else if ((n = obt_xml_find_node(node->children, "action"))) {
- while (n) {
- ObActionsAct *action;
+ else if ((n = obt_xml_find_node(node->children, "action"))) {
+ while (n) {
+ ObActionsAct *action;
- action = actions_parse(n);
- if (action)
- keyboard_bind(keylist, action);
- n = obt_xml_find_node(n->next, "action");
+ action = actions_parse(n);
+ if (action)
+ keyboard_bind(keylist, action);
+ n = obt_xml_find_node(n->next, "action");
+ }
}
- }
- if (is_chroot)
- keyboard_chroot(keylist);
- g_free(key);
- keylist = g_list_delete_link(keylist, g_list_last(keylist));
+ if (is_chroot)
+ keyboard_chroot(keylist);
+ keylist = g_list_delete_link(keylist, g_list_last(keylist));
+ }
+
+ g_strfreev(keys);
+ g_free(keystring);
}
static void parse_keyboard(xmlNodePtr node, gpointer d)
{
xmlNodePtr n, nbut, nact;
gchar *buttonstr;
- gchar *contextstr;
+ gchar *cxstr;
ObMouseAction mact;
mouse_unbind_all();
if (config_mouse_screenedgetime && config_mouse_screenedgetime < 25)
config_mouse_screenedgetime = 25;
}
+ if ((n = obt_xml_find_node(node, "screenEdgeWarpMouse")))
+ config_mouse_screenedgewarp = obt_xml_node_bool(n);
n = obt_xml_find_node(node, "context");
while (n) {
- if (!obt_xml_attr_string(n, "name", &contextstr))
+ gchar *modcxstr;
+ ObFrameContext cx;
+
+ if (!obt_xml_attr_string(n, "name", &cxstr))
goto next_n;
- nbut = obt_xml_find_node(n->children, "mousebind");
- while (nbut) {
- if (!obt_xml_attr_string(nbut, "button", &buttonstr))
- goto next_nbut;
- if (obt_xml_attr_contains(nbut, "action", "press")) {
- mact = OB_MOUSE_ACTION_PRESS;
- } else if (obt_xml_attr_contains(nbut, "action", "release")) {
- mact = OB_MOUSE_ACTION_RELEASE;
- } else if (obt_xml_attr_contains(nbut, "action", "click")) {
- mact = OB_MOUSE_ACTION_CLICK;
- } else if (obt_xml_attr_contains(nbut, "action","doubleclick")) {
- mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
- } else if (obt_xml_attr_contains(nbut, "action", "drag")) {
- mact = OB_MOUSE_ACTION_MOTION;
- } else
- goto next_nbut;
- nact = obt_xml_find_node(nbut->children, "action");
- while (nact) {
- ObActionsAct *action;
- if ((action = actions_parse(nact)))
- mouse_bind(buttonstr, contextstr, mact, action);
- nact = obt_xml_find_node(nact->next, "action");
+ modcxstr = g_strdup(cxstr); /* make a copy to mutilate */
+ while (frame_next_context_from_string(modcxstr, &cx)) {
+ if (!cx) {
+ gchar *s = strchr(modcxstr, ' ');
+ if (s) {
+ *s = '\0';
+ g_message(_("Invalid context \"%s\" in mouse binding"),
+ modcxstr);
+ *s = ' ';
+ }
+ continue;
}
+
+ nbut = obt_xml_find_node(n->children, "mousebind");
+ while (nbut) {
+ if (!obt_xml_attr_string(nbut, "button", &buttonstr))
+ goto next_nbut;
+ if (obt_xml_attr_contains(nbut, "action", "press"))
+ mact = OB_MOUSE_ACTION_PRESS;
+ else if (obt_xml_attr_contains(nbut, "action", "release"))
+ mact = OB_MOUSE_ACTION_RELEASE;
+ else if (obt_xml_attr_contains(nbut, "action", "click"))
+ mact = OB_MOUSE_ACTION_CLICK;
+ else if (obt_xml_attr_contains(nbut, "action","doubleclick"))
+ mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
+ else if (obt_xml_attr_contains(nbut, "action", "drag"))
+ mact = OB_MOUSE_ACTION_MOTION;
+ else
+ goto next_nbut;
+
+ nact = obt_xml_find_node(nbut->children, "action");
+ while (nact) {
+ ObActionsAct *action;
+
+ if ((action = actions_parse(nact)))
+ mouse_bind(buttonstr, cx, mact, action);
+ nact = obt_xml_find_node(nact->next, "action");
+ }
g_free(buttonstr);
- next_nbut:
+ next_nbut:
nbut = obt_xml_find_node(nbut->next, "mousebind");
+ }
}
- g_free(contextstr);
+ g_free(modcxstr);
+ g_free(cxstr);
next_n:
n = obt_xml_find_node(n->next, "context");
}
config_place_monitor = OB_PLACE_MONITOR_ACTIVE;
else if (obt_xml_node_contains(n, "mouse"))
config_place_monitor = OB_PLACE_MONITOR_MOUSE;
+ else if (obt_xml_node_contains(n, "any"))
+ config_place_monitor = OB_PLACE_MONITOR_ANY;
}
if ((n = obt_xml_find_node(node, "primaryMonitor"))) {
config_primary_monitor_index = obt_xml_node_int(n);
config_submenu_show_delay = obt_xml_node_int(n);
if ((n = obt_xml_find_node(node, "submenuHideDelay")))
config_submenu_hide_delay = obt_xml_node_int(n);
- if ((n = obt_xml_find_node(node, "applicationIcons")))
- config_menu_client_list_icons = obt_xml_node_bool(n);
if ((n = obt_xml_find_node(node, "manageDesktops")))
config_menu_manage_desktops = obt_xml_node_bool(n);
+ if ((n = obt_xml_find_node(node, "showIcons"))) {
+ config_menu_show_icons = obt_xml_node_bool(n);
+#ifndef USE_IMLIB2
+ if (config_menu_show_icons)
+ g_message(_("Openbox was compiled without Imlib2 image loading support. Icons in menus will not be loaded."));
+#endif
+ }
while ((node = obt_xml_find_node(node, "file"))) {
gchar *c = obt_xml_node_string(node);
};
for (it = binds; it->button; ++it)
- mouse_bind(it->button, it->context, it->mact,
- actions_parse_string(it->actname));
+ mouse_bind(it->button, frame_context_from_string(it->context),
+ it->mact, actions_parse_string(it->actname));
}
void config_startup(ObtXmlInst *i)
config_place_policy = OB_PLACE_POLICY_SMART;
config_place_center = TRUE;
- config_place_monitor = OB_PLACE_MONITOR_ANY;
+ config_place_monitor = OB_PLACE_MONITOR_PRIMARY;
config_primary_monitor_index = 1;
config_primary_monitor = OB_PLACE_MONITOR_ACTIVE;
config_font_inactivewindow = NULL;
config_font_menuitem = NULL;
config_font_menutitle = NULL;
+ config_font_activeosd = NULL;
+ config_font_inactiveosd = NULL;
obt_xml_register(i, "theme", parse_theme, NULL);
obt_xml_register(i, "keyboard", parse_keyboard, NULL);
config_mouse_threshold = 8;
- config_mouse_dclicktime = 200;
+ config_mouse_dclicktime = 500;
config_mouse_screenedgetime = 400;
+ config_mouse_screenedgewarp = FALSE;
bind_default_mouse();
config_menu_hide_delay = 250;
config_menu_middle = FALSE;
- config_submenu_show_delay = 200;
+ config_submenu_show_delay = 100;
config_submenu_hide_delay = 400;
- config_menu_client_list_icons = TRUE;
config_menu_manage_desktops = TRUE;
config_menu_files = NULL;
+ config_menu_show_icons = TRUE;
obt_xml_register(i, "menu", parse_menu, NULL);
ObAppSettings *itd = (ObAppSettings *)it->data;
if (itd->name) g_pattern_spec_free(itd->name);
if (itd->role) g_pattern_spec_free(itd->role);
+ if (itd->title) g_pattern_spec_free(itd->title);
if (itd->class) g_pattern_spec_free(itd->class);
- g_free(it->data);
+ g_slice_free(ObAppSettings, it->data);
}
g_slist_free(config_per_app_settings);
}