X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions%2Fmaximize.c;h=db7c36bb8aaebb9fd9d47a7eea41768bb40d5662;hb=HEAD;hp=508c2d375d0c4a85651ecb424703ac9f849001f5;hpb=ee6671c3fac371b7d631976953e304e1f761e928;p=chaz%2Fopenbox diff --git a/openbox/actions/maximize.c b/openbox/actions/maximize.c index 508c2d37..db7c36bb 100644 --- a/openbox/actions/maximize.c +++ b/openbox/actions/maximize.c @@ -1,26 +1,140 @@ #include "openbox/actions.h" #include "openbox/client.h" -static gboolean run_func(ObActionsData *data, gpointer options); +/* These match the values for client_maximize */ +typedef enum { + BOTH = 0, + HORZ = 1, + VERT = 2 +} MaxDirection; -void action_maximize_startup() +typedef struct { + MaxDirection dir; +} Options; + +static gpointer setup_func(xmlNodePtr node); +static void free_func(gpointer o); +static gboolean run_func_on(ObActionsData *data, gpointer options); +static gboolean run_func_off(ObActionsData *data, gpointer options); +static gboolean run_func_toggle(ObActionsData *data, gpointer options); +/* 3.4-compatibility */ +static gpointer setup_both_func(xmlNodePtr node); +static gpointer setup_horz_func(xmlNodePtr node); +static gpointer setup_vert_func(xmlNodePtr node); + +void action_maximize_startup(void) +{ + actions_register("Maximize", setup_func, free_func, run_func_on); + actions_register("Unmaximize", setup_func, free_func, run_func_off); + actions_register("ToggleMaximize", setup_func, free_func, run_func_toggle); + /* 3.4-compatibility */ + actions_register("MaximizeFull", setup_both_func, free_func, + run_func_on); + actions_register("UnmaximizeFull", setup_both_func, free_func, + run_func_off); + actions_register("ToggleMaximizeFull", setup_both_func, free_func, + run_func_toggle); + actions_register("MaximizeHorz", setup_horz_func, free_func, + run_func_on); + actions_register("UnmaximizeHorz", setup_horz_func, free_func, + run_func_off); + actions_register("ToggleMaximizeHorz", setup_horz_func, free_func, + run_func_toggle); + actions_register("MaximizeVert", setup_vert_func, free_func, + run_func_on); + actions_register("UnmaximizeVert", setup_vert_func, free_func, + run_func_off); + actions_register("ToggleMaximizeVert", setup_vert_func, free_func, + run_func_toggle); +} + +static gpointer setup_func(xmlNodePtr node) +{ + xmlNodePtr n; + Options *o; + + o = g_slice_new0(Options); + o->dir = BOTH; + + if ((n = obt_xml_find_node(node, "direction"))) { + gchar *s = obt_xml_node_string(n); + if (!g_ascii_strcasecmp(s, "vertical") || + !g_ascii_strcasecmp(s, "vert")) + o->dir = VERT; + else if (!g_ascii_strcasecmp(s, "horizontal") || + !g_ascii_strcasecmp(s, "horz")) + o->dir = HORZ; + g_free(s); + } + + return o; +} + +static void free_func(gpointer o) { - actions_register("Maximize", - NULL, NULL, - run_func, - NULL, NULL); + g_slice_free(Options, o); } /* Always return FALSE because its not interactive */ -static gboolean run_func(ObActionsData *data, gpointer options) +static gboolean run_func_on(ObActionsData *data, gpointer options) { + Options *o = options; if (data->client) { actions_client_move(data, TRUE); - client_maximize(data->client, - !(data->client->max_horz || data->client->max_vert), - 0); + client_maximize(data->client, TRUE, o->dir); actions_client_move(data, FALSE); } + return FALSE; +} +/* Always return FALSE because its not interactive */ +static gboolean run_func_off(ObActionsData *data, gpointer options) +{ + Options *o = options; + if (data->client) { + actions_client_move(data, TRUE); + client_maximize(data->client, FALSE, o->dir); + actions_client_move(data, FALSE); + } return FALSE; } + +/* Always return FALSE because its not interactive */ +static gboolean run_func_toggle(ObActionsData *data, gpointer options) +{ + Options *o = options; + if (data->client) { + gboolean toggle; + actions_client_move(data, TRUE); + toggle = ((o->dir == HORZ && !data->client->max_horz) || + (o->dir == VERT && !data->client->max_vert) || + (o->dir == BOTH && + !(data->client->max_horz && data->client->max_vert))); + client_maximize(data->client, toggle, o->dir); + actions_client_move(data, FALSE); + } + return FALSE; +} + +/* 3.4-compatibility */ +static gpointer setup_both_func(xmlNodePtr node) +{ + Options *o = g_slice_new0(Options); + o->dir = BOTH; + return o; +} + +static gpointer setup_horz_func(xmlNodePtr node) +{ + Options *o = g_slice_new0(Options); + o->dir = HORZ; + return o; +} + +static gpointer setup_vert_func(xmlNodePtr node) +{ + Options *o = g_slice_new0(Options); + o->dir = VERT; + return o; +} +