Add some more conditions to the If action
It can now match on window titles, virtual desktop (number, "current", "other"), demands_attention, and undecoratedness.
This commit is contained in:
parent
9734564889
commit
46ca54fd81
1 changed files with 73 additions and 12 deletions
|
@ -19,6 +19,16 @@ typedef struct {
|
|||
gboolean iconic_off;
|
||||
gboolean focused;
|
||||
gboolean unfocused;
|
||||
gboolean urgent_on;
|
||||
gboolean urgent_off;
|
||||
gboolean decor_off;
|
||||
gboolean decor_on;
|
||||
gboolean omnipresent_on;
|
||||
gboolean omnipresent_off;
|
||||
gboolean desktop_current;
|
||||
gboolean desktop_other;
|
||||
guint desktop_number;
|
||||
GPatternSpec *matchtitle;
|
||||
GSList *thenacts;
|
||||
GSList *elseacts;
|
||||
} Options;
|
||||
|
@ -75,6 +85,40 @@ static gpointer setup_func(xmlNodePtr node)
|
|||
else
|
||||
o->unfocused = TRUE;
|
||||
}
|
||||
if ((n = obt_xml_find_node(node, "urgent"))) {
|
||||
if (obt_xml_node_bool(n))
|
||||
o->urgent_on = TRUE;
|
||||
else
|
||||
o->urgent_off = TRUE;
|
||||
}
|
||||
if ((n = obt_xml_find_node(node, "undecorated"))) {
|
||||
if (obt_xml_node_bool(n))
|
||||
o->decor_off = TRUE;
|
||||
else
|
||||
o->decor_on = TRUE;
|
||||
}
|
||||
if ((n = obt_xml_find_node(node, "desktop"))) {
|
||||
gchar *s = obt_xml_node_string(n);
|
||||
if (!g_ascii_strcasecmp(s, "current"))
|
||||
o->desktop_current = TRUE;
|
||||
if (!g_ascii_strcasecmp(s, "other"))
|
||||
o->desktop_other = TRUE;
|
||||
else
|
||||
o->desktop_number = atoi(s);
|
||||
}
|
||||
if ((n = obt_xml_find_node(node, "omnipresent"))) {
|
||||
if (obt_xml_node_bool(n))
|
||||
o->omnipresent_on = TRUE;
|
||||
else
|
||||
o->omnipresent_off = TRUE;
|
||||
}
|
||||
if ((n = obt_xml_find_node(node, "title"))) {
|
||||
gchar *s;
|
||||
if ((s = obt_xml_node_string(n))) {
|
||||
o->matchtitle = g_pattern_spec_new(s);
|
||||
g_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
if ((n = obt_xml_find_node(node, "then"))) {
|
||||
xmlNodePtr m;
|
||||
|
@ -112,6 +156,8 @@ static void free_func(gpointer options)
|
|||
actions_act_unref(o->elseacts->data);
|
||||
o->elseacts = g_slist_delete_link(o->elseacts, o->elseacts);
|
||||
}
|
||||
if (o->matchtitle)
|
||||
g_pattern_spec_free(o->matchtitle);
|
||||
|
||||
g_slice_free(Options, o);
|
||||
}
|
||||
|
@ -123,18 +169,33 @@ static gboolean run_func(ObActionsData *data, gpointer options)
|
|||
GSList *acts;
|
||||
ObClient *c = data->client;
|
||||
|
||||
if ((!o->shaded_on || (c && c->shaded)) &&
|
||||
(!o->shaded_off || (c && !c->shaded)) &&
|
||||
(!o->iconic_on || (c && c->iconic)) &&
|
||||
(!o->iconic_off || (c && !c->iconic)) &&
|
||||
(!o->maxhorz_on || (c && c->max_horz)) &&
|
||||
(!o->maxhorz_off || (c && !c->max_horz)) &&
|
||||
(!o->maxvert_on || (c && c->max_vert)) &&
|
||||
(!o->maxvert_off || (c && !c->max_vert)) &&
|
||||
(!o->maxfull_on || (c && c->max_vert && c->max_horz)) &&
|
||||
(!o->maxfull_off || (c && !(c->max_vert && c->max_horz))) &&
|
||||
(!o->focused || (c && (c == focus_client))) &&
|
||||
(!o->unfocused || (c && !(c == focus_client))))
|
||||
if (c &&
|
||||
(!o->shaded_on || c->shaded) &&
|
||||
(!o->shaded_off || !c->shaded) &&
|
||||
(!o->iconic_on || c->iconic) &&
|
||||
(!o->iconic_off || !c->iconic) &&
|
||||
(!o->maxhorz_on || c->max_horz) &&
|
||||
(!o->maxhorz_off || !c->max_horz) &&
|
||||
(!o->maxvert_on || c->max_vert) &&
|
||||
(!o->maxvert_off || !c->max_vert) &&
|
||||
(!o->maxfull_on || (c->max_vert && c->max_horz)) &&
|
||||
(!o->maxfull_off || !(c->max_vert && c->max_horz)) &&
|
||||
(!o->focused || (c == focus_client)) &&
|
||||
(!o->unfocused || !(c == focus_client)) &&
|
||||
(!o->urgent_on || (c->urgent || c->demands_attention)) &&
|
||||
(!o->urgent_off || !(c->urgent || c->demands_attention)) &&
|
||||
(!o->decor_off || (c->undecorated || !(c->decorations & OB_FRAME_DECOR_TITLEBAR))) &&
|
||||
(!o->decor_on || (!c->undecorated && (c->decorations & OB_FRAME_DECOR_TITLEBAR))) &&
|
||||
(!o->omnipresent_on || (c->desktop == DESKTOP_ALL)) &&
|
||||
(!o->omnipresent_off || (c->desktop != DESKTOP_ALL)) &&
|
||||
(!o->desktop_current || ((c->desktop == screen_desktop) ||
|
||||
(c->desktop == DESKTOP_ALL))) &&
|
||||
(!o->desktop_other || ((c->desktop != screen_desktop) &&
|
||||
(c->desktop != DESKTOP_ALL))) &&
|
||||
(!o->desktop_number || ((c->desktop == o->desktop_number - 1) ||
|
||||
(c->desktop == DESKTOP_ALL))) &&
|
||||
(!o->matchtitle ||
|
||||
(g_pattern_match_string(o->matchtitle, c->original_title))))
|
||||
{
|
||||
acts = o->thenacts;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue