add the "if" action

This commit is contained in:
Dana Jansens 2007-06-23 15:43:35 +00:00
parent 52b63adfe1
commit cf640af0ea
5 changed files with 136 additions and 96 deletions

View file

@ -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 \

View file

@ -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)
{
}

View file

@ -40,4 +40,5 @@ void action_all_startup()
action_layer_startup();
action_movetofromedge_startup();
action_growtoedge_startup();
action_if_startup();
}

View file

@ -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
View 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;
}