add the "if" action
This commit is contained in:
parent
52b63adfe1
commit
cf640af0ea
5 changed files with 136 additions and 96 deletions
|
@ -173,6 +173,7 @@ openbox_openbox_SOURCES = \
|
|||
openbox/actions/fullscreen.c \
|
||||
openbox/actions/growtoedge.c \
|
||||
openbox/actions/iconify.c \
|
||||
openbox/actions/if.c \
|
||||
openbox/actions/kill.c \
|
||||
openbox/actions/layer.c \
|
||||
openbox/actions/lower.c \
|
||||
|
|
|
@ -17,78 +17,6 @@
|
|||
See the COPYING file for a copy of the GNU General Public License.
|
||||
*/
|
||||
|
||||
#include "debug.h"
|
||||
#include "client.h"
|
||||
#include "focus.h"
|
||||
#include "focus_cycle.h"
|
||||
#include "moveresize.h"
|
||||
#include "menu.h"
|
||||
#include "prop.h"
|
||||
#include "stacking.h"
|
||||
#include "screen.h"
|
||||
#include "action.h"
|
||||
#include "openbox.h"
|
||||
#include "grab.h"
|
||||
#include "keyboard.h"
|
||||
#include "event.h"
|
||||
#include "dock.h"
|
||||
#include "config.h"
|
||||
#include "mainloop.h"
|
||||
#include "startupnotify.h"
|
||||
#include "gettext.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
|
||||
|
||||
|
||||
void setup_action_growtoedge_north(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.diraction.direction = OB_DIRECTION_NORTH;
|
||||
}
|
||||
|
||||
void setup_action_growtoedge_south(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
|
||||
}
|
||||
|
||||
void setup_action_growtoedge_east(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.diraction.direction = OB_DIRECTION_EAST;
|
||||
}
|
||||
|
||||
void setup_action_growtoedge_west(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.diraction.direction = OB_DIRECTION_WEST;
|
||||
}
|
||||
|
||||
void setup_action_top_layer(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.layer.layer = 1;
|
||||
}
|
||||
|
||||
void setup_action_normal_layer(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.layer.layer = 0;
|
||||
}
|
||||
|
||||
void setup_action_bottom_layer(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
(*a)->data.layer.layer = -1;
|
||||
}
|
||||
|
||||
void setup_client_action(ObAction **a, ObUserAction uact)
|
||||
{
|
||||
(*a)->data.any.client_action = OB_CLIENT_ACTION_ALWAYS;
|
||||
}
|
||||
|
||||
ActionString actionstrings[] =
|
||||
{
|
||||
{
|
||||
|
@ -101,26 +29,6 @@ ActionString actionstrings[] =
|
|||
action_unshaderaise,
|
||||
setup_client_action
|
||||
},
|
||||
{
|
||||
"growtoedgenorth",
|
||||
action_growtoedge,
|
||||
setup_action_growtoedge_north
|
||||
},
|
||||
{
|
||||
"growtoedgesouth",
|
||||
action_growtoedge,
|
||||
setup_action_growtoedge_south
|
||||
},
|
||||
{
|
||||
"growtoedgewest",
|
||||
action_growtoedge,
|
||||
setup_action_growtoedge_west
|
||||
},
|
||||
{
|
||||
"growtoedgeeast",
|
||||
action_growtoedge,
|
||||
setup_action_growtoedge_east
|
||||
},
|
||||
{
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -143,7 +51,3 @@ void action_shadelower(union ActionData *data)
|
|||
else
|
||||
action_shade(data);
|
||||
}
|
||||
|
||||
void action_growtoedge(union ActionData *data)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -40,4 +40,5 @@ void action_all_startup()
|
|||
action_layer_startup();
|
||||
action_movetofromedge_startup();
|
||||
action_growtoedge_startup();
|
||||
action_if_startup();
|
||||
}
|
||||
|
|
|
@ -41,5 +41,6 @@ void action_dockautohide_startup();
|
|||
void action_layer_startup();
|
||||
void action_movetofromedge_startup();
|
||||
void action_growtoedge_startup();
|
||||
void action_if_startup();
|
||||
|
||||
#endif
|
||||
|
|
133
openbox/actions/if.c
Normal file
133
openbox/actions/if.c
Normal file
|
@ -0,0 +1,133 @@
|
|||
#include "openbox/actions.h"
|
||||
#include "openbox/misc.h"
|
||||
#include "openbox/client.h"
|
||||
#include "openbox/frame.h"
|
||||
#include "openbox/screen.h"
|
||||
#include <glib.h>
|
||||
|
||||
typedef struct {
|
||||
gboolean shaded_on;
|
||||
gboolean shaded_off;
|
||||
gboolean maxvert_on;
|
||||
gboolean maxvert_off;
|
||||
gboolean maxhorz_on;
|
||||
gboolean maxhorz_off;
|
||||
gboolean maxfull_on;
|
||||
gboolean maxfull_off;
|
||||
gboolean iconic_on;
|
||||
gboolean iconic_off;
|
||||
GSList *thenacts;
|
||||
GSList *elseacts;
|
||||
} Options;
|
||||
|
||||
static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
|
||||
static void free_func(gpointer options);
|
||||
static gboolean run_func(ObActionsData *data, gpointer options);
|
||||
|
||||
void action_if_startup()
|
||||
{
|
||||
actions_register("If",
|
||||
setup_func,
|
||||
free_func,
|
||||
run_func,
|
||||
NULL, NULL);
|
||||
}
|
||||
|
||||
static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
|
||||
{
|
||||
xmlNodePtr n;
|
||||
Options *o;
|
||||
|
||||
o = g_new0(Options, 1);
|
||||
|
||||
if ((n = parse_find_node("shaded", node))) {
|
||||
if (parse_bool(doc, n))
|
||||
o->shaded_on = TRUE;
|
||||
else
|
||||
o->shaded_off = TRUE;
|
||||
}
|
||||
if ((n = parse_find_node("maximized", node))) {
|
||||
if (parse_bool(doc, n))
|
||||
o->maxfull_on = TRUE;
|
||||
else
|
||||
o->maxfull_off = TRUE;
|
||||
}
|
||||
if ((n = parse_find_node("maximizedhorizontal", node))) {
|
||||
if (parse_bool(doc, n))
|
||||
o->maxhorz_on = TRUE;
|
||||
else
|
||||
o->maxhorz_off = TRUE;
|
||||
}
|
||||
if ((n = parse_find_node("maximizedvertical", node))) {
|
||||
if (parse_bool(doc, n))
|
||||
o->maxvert_on = TRUE;
|
||||
else
|
||||
o->maxvert_off = TRUE;
|
||||
}
|
||||
if ((n = parse_find_node("iconified", node))) {
|
||||
if (parse_bool(doc, n))
|
||||
o->iconic_on = TRUE;
|
||||
else
|
||||
o->iconic_off = TRUE;
|
||||
}
|
||||
|
||||
if ((n = parse_find_node("then", node))) {
|
||||
xmlNodePtr m;
|
||||
|
||||
m = parse_find_node("action", n->xmlChildrenNode);
|
||||
while (m) {
|
||||
ObActionsAct *action = actions_parse(i, doc, m);
|
||||
if (action) o->thenacts = g_slist_prepend(o->thenacts, action);
|
||||
m = parse_find_node("action", m->next);
|
||||
}
|
||||
}
|
||||
if ((n = parse_find_node("else", node))) {
|
||||
xmlNodePtr m;
|
||||
|
||||
m = parse_find_node("action", n->xmlChildrenNode);
|
||||
while (m) {
|
||||
ObActionsAct *action = actions_parse(i, doc, m);
|
||||
if (action) o->elseacts = g_slist_prepend(o->elseacts, action);
|
||||
m = parse_find_node("action", m->next);
|
||||
}
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
static void free_func(gpointer options)
|
||||
{
|
||||
Options *o = options;
|
||||
|
||||
g_free(o);
|
||||
}
|
||||
|
||||
/* Always return FALSE because its not interactive */
|
||||
static gboolean run_func(ObActionsData *data, gpointer options)
|
||||
{
|
||||
Options *o = 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))))
|
||||
{
|
||||
acts = o->thenacts;
|
||||
}
|
||||
else
|
||||
acts = o->elseacts;
|
||||
|
||||
actions_run_acts(acts, data->uact, data->state,
|
||||
data->x, data->y, data->button,
|
||||
data->context, data->client);
|
||||
|
||||
return FALSE;
|
||||
}
|
Loading…
Reference in a new issue