well.. it compiles..

This commit is contained in:
Dana Jansens 2007-06-22 03:05:02 +00:00
parent ae624a1487
commit 780d1b0961
12 changed files with 92 additions and 265 deletions

View file

@ -19,6 +19,7 @@
#include "actions.h"
#include "gettext.h"
#include "grab.h"
#include "screen.h"
static void actions_definition_ref(ObActionsDefinition *def);
static void actions_definition_unref(ObActionsDefinition *def);
@ -54,12 +55,12 @@ static GSList *registered = NULL;
void actions_startup(gboolean reconfig)
{
if (reconfig) return;
}
void actions_shutdown(gboolean reconfig)
{
actions_interactive_cancel_act();
if (reconfig) return;
/* free all the registered actions */
@ -205,6 +206,14 @@ void actions_run_acts(GSList *acts,
{
GSList *it;
/* Don't allow saving the initial state when running things from the
menu */
if (uact == OB_USER_ACTION_MENU_SELECTION)
state = 0;
/* If x and y are < 0 then use the current pointer position */
if (x < 0 && y < 0)
screen_pointer_pos(&x, &y);
for (it = acts; it; it = g_slist_next(it)) {
ObActionsData data;
ObActionsAct *act = it->data;

View file

@ -20,7 +20,6 @@
#include "openbox.h"
#include "menu.h"
#include "menuframe.h"
#include "action.h"
#include "screen.h"
#include "client.h"
#include "focus.h"
@ -38,7 +37,6 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
ObMenu *menu = frame->menu;
ObMenuEntry *e;
GList *it;
gint i;
guint desktop;
menu_clear_entries(menu);
@ -48,33 +46,22 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
gboolean onlyiconic = TRUE;
menu_add_separator(menu, -1, screen_desktop_names[desktop]);
for (it = focus_order, i = 0; it; it = g_list_next(it), ++i) {
for (it = focus_order; it; it = g_list_next(it)) {
ObClient *c = it->data;
if (client_normal(c) && (!c->skip_taskbar || c->iconic) &&
(c->desktop == desktop || c->desktop == DESKTOP_ALL))
{
GSList *acts = NULL;
ObAction* act;
const ObClientIcon *icon;
empty = FALSE;
act = action_from_string("Activate",
OB_USER_ACTION_MENU_SELECTION);
act->data.activate.any.c = c;
acts = g_slist_append(acts, act);
act = action_from_string("Desktop",
OB_USER_ACTION_MENU_SELECTION);
act->data.desktop.desk = desktop;
acts = g_slist_append(acts, act);
if (c->iconic) {
gchar *title = g_strdup_printf("(%s)", c->icon_title);
e = menu_add_normal(menu, i, title, acts, FALSE);
e = menu_add_normal(menu, -1, title, NULL, FALSE);
g_free(title);
} else {
onlyiconic = FALSE;
e = menu_add_normal(menu, i, c->title, acts, FALSE);
e = menu_add_normal(menu, -1, c->title, NULL, FALSE);
}
if (config_menu_client_list_icons
@ -85,23 +72,20 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
e->data.normal.icon_alpha =
c->iconic ? OB_ICONIC_ALPHA : 0xff;
}
e->data.normal.data = c;
}
}
if (empty || onlyiconic) {
ObMenuEntry *e;
/* no entries or only iconified windows, so add a
* way to go to this desktop without uniconifying a window */
if (!empty)
menu_add_separator(menu, -1, NULL);
GSList *acts = NULL;
ObAction* act;
ObMenuEntry *e;
act = action_from_string("Desktop", OB_USER_ACTION_MENU_SELECTION);
act->data.desktop.desk = desktop;
acts = g_slist_append(acts, act);
e = menu_add_normal(menu, 0, _("Go there..."), acts, TRUE);
e = menu_add_normal(menu, desktop, _("Go there..."), NULL, TRUE);
if (desktop == screen_desktop)
e->data.normal.enabled = FALSE;
}
@ -109,18 +93,16 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
return TRUE; /* always show the menu */
}
/* executes it using the client in the actions, since we set that
when we make the actions! */
static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
ObClient *c, guint state, gpointer data,
Time time)
{
ObAction *a;
if (self->data.normal.actions) {
a = self->data.normal.actions->data;
action_run(self->data.normal.actions, a->data.any.c, state, time);
if (self->id == -1) {
if (self->data.normal.data) /* it's set to NULL if its destroyed */
client_activate(self->data.normal.data, FALSE, TRUE);
}
else
screen_set_desktop(self->id, TRUE);
}
static void client_dest(ObClient *client, gpointer data)
@ -132,12 +114,9 @@ static void client_dest(ObClient *client, gpointer data)
for (eit = combined_menu->entries; eit; eit = g_list_next(eit)) {
ObMenuEntry *meit = eit->data;
if (meit->type == OB_MENU_ENTRY_TYPE_NORMAL &&
meit->data.normal.actions)
meit->data.normal.data == client)
{
ObAction *a = meit->data.normal.actions->data;
ObClient *c = a->data.any.c;
if (c == client)
a->data.any.c = NULL;
meit->data.normal.data = NULL;
}
}
}

View file

@ -20,7 +20,6 @@
#include "openbox.h"
#include "menu.h"
#include "menuframe.h"
#include "action.h"
#include "screen.h"
#include "client.h"
#include "focus.h"
@ -43,40 +42,28 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data)
ObMenu *menu = frame->menu;
DesktopData *d = data;
GList *it;
gint i;
gboolean empty = TRUE;
gboolean onlyiconic = TRUE;
menu_clear_entries(menu);
for (it = focus_order, i = 0; it; it = g_list_next(it), ++i) {
for (it = focus_order; it; it = g_list_next(it)) {
ObClient *c = it->data;
if (client_normal(c) && (!c->skip_taskbar || c->iconic) &&
(c->desktop == d->desktop || c->desktop == DESKTOP_ALL))
{
GSList *acts = NULL;
ObAction* act;
ObMenuEntry *e;
const ObClientIcon *icon;
empty = FALSE;
act = action_from_string("Activate",
OB_USER_ACTION_MENU_SELECTION);
act->data.activate.any.c = c;
acts = g_slist_append(acts, act);
act = action_from_string("Desktop",
OB_USER_ACTION_MENU_SELECTION);
act->data.desktop.desk = d->desktop;
acts = g_slist_append(acts, act);
if (c->iconic) {
gchar *title = g_strdup_printf("(%s)", c->icon_title);
e = menu_add_normal(menu, i, title, acts, FALSE);
e = menu_add_normal(menu, -1, title, NULL, FALSE);
g_free(title);
} else {
onlyiconic = FALSE;
e = menu_add_normal(menu, i, c->title, acts, FALSE);
e = menu_add_normal(menu, -1, c->title, NULL, FALSE);
}
if (config_menu_client_list_icons
@ -86,41 +73,36 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data)
e->data.normal.icon_data = icon->data;
e->data.normal.icon_alpha = c->iconic ? OB_ICONIC_ALPHA : 0xff;
}
e->data.normal.data = c;
}
}
if (empty || onlyiconic) {
ObMenuEntry *e;
/* no entries or only iconified windows, so add a
* way to go to this desktop without uniconifying a window */
if (!empty)
menu_add_separator(menu, -1, NULL);
GSList *acts = NULL;
ObAction* act;
ObMenuEntry *e;
act = action_from_string("Desktop", OB_USER_ACTION_MENU_SELECTION);
act->data.desktop.desk = d->desktop;
acts = g_slist_append(acts, act);
e = menu_add_normal(menu, 0, _("Go there..."), acts, TRUE);
e = menu_add_normal(menu, d->desktop, _("Go there..."), NULL, TRUE);
if (d->desktop == screen_desktop)
e->data.normal.enabled = FALSE;
}
return TRUE; /* always show */
}
/* executes it using the client in the actions, since we set that
when we make the actions! */
static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
ObClient *c, guint state, gpointer data,
Time time)
{
ObAction *a;
if (self->data.normal.actions) {
a = self->data.normal.actions->data;
action_run(self->data.normal.actions, a->data.any.c, state, time);
if (self->id == -1) {
if (self->data.normal.data) /* it's set to NULL if its destroyed */
client_activate(self->data.normal.data, FALSE, TRUE);
}
else
screen_set_desktop(self->id, TRUE);
}
static void desk_menu_destroy(ObMenu *menu, gpointer data)
@ -176,11 +158,10 @@ static void client_dest(ObClient *client, gpointer data)
GList *eit;
for (eit = mit->entries; eit; eit = g_list_next(eit)) {
ObMenuEntry *meit = eit->data;
if (meit->type == OB_MENU_ENTRY_TYPE_NORMAL) {
ObAction *a = meit->data.normal.actions->data;
ObClient *c = a->data.any.c;
if (c == client)
a->data.any.c = NULL;
if (meit->type == OB_MENU_ENTRY_TYPE_NORMAL &&
meit->data.normal.data == client)
{
meit->data.normal.data = NULL;
}
}
}

View file

@ -22,6 +22,7 @@
#include "window.h"
#include "openbox.h"
#include "dock.h"
#include "actions.h"
#include "client.h"
#include "xerror.h"
#include "prop.h"

View file

@ -38,16 +38,8 @@
#include <glib.h>
typedef struct {
gboolean active;
guint state;
ObClient *client;
ObActionsAct *action;
} ObInteractiveState;
KeyBindingTree *keyboard_firstnode = NULL;
static ObPopup *popup = NULL;
static ObInteractiveState istate;
static KeyBindingTree *curpos;
static void grab_keys(gboolean grab)
@ -178,64 +170,7 @@ gboolean keyboard_bind(GList *keylist, ObActionsAct *action)
return TRUE;
}
static void keyboard_interactive_end(guint state, gboolean cancel, Time time,
gboolean ungrab)
{
#if 0
GSList *alist;
g_assert(istate.active);
/* ungrab first so they won't be NotifyWhileGrabbed */
if (ungrab)
ungrab_keyboard();
/* set this before running the actions so they know the keyboard is not
grabbed */
istate.active = FALSE;
alist = g_slist_append(NULL, istate.action);
action_run_interactive(alist, istate.client, state, time, cancel, TRUE);
g_slist_free(alist);
keyboard_reset_chains(0);
#endif
}
static void keyboard_interactive_end_client(ObClient *client, gpointer data)
{
if (istate.active && istate.client == client)
istate.client = NULL;
}
void keyboard_interactive_cancel()
{
keyboard_interactive_end(0, TRUE, event_curtime, TRUE);
}
gboolean keyboard_interactive_grab(guint state, ObClient *client,
ObActionsAct *action)
{
#if 0
g_assert(action->data.any.interactive);
if (!istate.active) {
if (!grab_keyboard())
return FALSE;
} else if (action->func != istate.action->func) {
keyboard_interactive_end(state, TRUE, action->data.any.time, FALSE);
}
istate.active = TRUE;
istate.state = state;
istate.client = client;
istate.action = action;
#endif
return TRUE;
}
gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
{
gboolean handled = FALSE;
@ -268,6 +203,7 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
return handled;
}
#endif
void keyboard_event(ObClient *client, const XEvent *e)
{
@ -312,17 +248,16 @@ void keyboard_event(ObClient *client, const XEvent *e)
set_curpos(p);
else {
GSList *it;
gboolean inter = FALSE;
for (it = p->actions; it && !inter; it = g_slist_next(it))
if (((ObActionsAct*)it->data)->data.any.interactive)
inter = TRUE;
if (!inter) /* don't reset if the action is interactive */
for (it = p->actions; it; it = g_slist_next(it))
if (actions_act_is_interactive(it->data)) break;
if (it == NULL) /* reset if the actions are not interactive */
keyboard_reset_chains(0);
action_run_key(p->actions, client, e->xkey.state,
actions_run_acts(p->actions, OB_USER_ACTION_KEYBOARD_KEY,
e->xkey.time, e->xkey.state,
e->xkey.x_root, e->xkey.y_root,
e->xkey.time);
OB_FRAME_CONTEXT_NONE, client);
}
break;
}
@ -330,29 +265,15 @@ void keyboard_event(ObClient *client, const XEvent *e)
}
}
gboolean keyboard_interactively_grabbed()
{
return istate.active;
}
void keyboard_startup(gboolean reconfig)
{
grab_keys(TRUE);
popup = popup_new(FALSE);
popup_set_text_align(popup, RR_JUSTIFY_CENTER);
if (!reconfig)
client_add_destroy_notify(keyboard_interactive_end_client, NULL);
}
void keyboard_shutdown(gboolean reconfig)
{
if (!reconfig)
client_remove_destroy_notify(keyboard_interactive_end_client);
if (istate.active)
keyboard_interactive_cancel();
ob_main_loop_timeout_remove(ob_main_loop, chain_timeout);
keyboard_unbind_all();

View file

@ -43,12 +43,4 @@ void keyboard_event(struct _ObClient *client, const XEvent *e);
*/
void keyboard_reset_chains(gint break_chroots);
gboolean keyboard_interactive_grab(guint state, struct _ObClient *client,
struct _ObActionsAct *action);
gboolean keyboard_process_interactive_grab(const XEvent *e,
struct _ObClient **client);
gboolean keyboard_interactively_grabbed();
void keyboard_interactive_cancel();
#endif

View file

@ -19,6 +19,7 @@
#include "keyboard.h"
#include "translate.h"
#include "actions.h"
#include <glib.h>
void tree_destroy(KeyBindingTree *tree)
@ -35,7 +36,7 @@ void tree_destroy(KeyBindingTree *tree)
g_free(it->data);
g_list_free(tree->keylist);
for (sit = tree->actions; sit != NULL; sit = sit->next)
action_unref(sit->data);
actions_act_unref(sit->data);
g_slist_free(tree->actions);
}
g_free(tree);

View file

@ -18,8 +18,6 @@
*/
#include "mainloop.h"
#include "action.h"
#include "client.h"
#include "event.h"
#include <stdio.h>
@ -90,8 +88,6 @@ struct _ObMainLoop
gboolean signal_fired;
guint signals_fired[NUM_SIGNALS];
GSList *signal_handlers[NUM_SIGNALS];
GSList *action_queue;
};
struct _ObMainLoopTimer
@ -182,8 +178,6 @@ ObMainLoop *ob_main_loop_new(Display *display)
all_loops = g_slist_prepend(all_loops, loop);
loop->action_queue = NULL;
return loop;
}
@ -234,10 +228,6 @@ void ob_main_loop_destroy(ObMainLoop *loop)
}
}
for (it = loop->action_queue; it; it = g_slist_next(it))
action_unref(it->data);
g_slist_free(loop->action_queue);
g_free(loop);
}
}
@ -253,37 +243,16 @@ static void fd_handle_foreach(gpointer key,
h->func(h->fd, h->data);
}
void ob_main_loop_queue_action(ObMainLoop *loop, ObAction *act)
{
loop->action_queue = g_slist_append(loop->action_queue, action_copy(act));
}
static void ob_main_loop_client_destroy(ObClient *client, gpointer data)
{
ObMainLoop *loop = data;
GSList *it;
for (it = loop->action_queue; it; it = g_slist_next(it)) {
ObAction *act = it->data;
if (act->data.any.c == client)
act->data.any.c = NULL;
}
}
void ob_main_loop_run(ObMainLoop *loop)
{
XEvent e;
struct timeval *wait;
fd_set selset;
GSList *it;
ObAction *act;
loop->run = TRUE;
loop->running = TRUE;
client_add_destroy_notify(ob_main_loop_client_destroy, loop);
while (loop->run) {
if (loop->signal_fired) {
guint i;
@ -315,33 +284,6 @@ void ob_main_loop_run(ObMainLoop *loop)
h->func(&e, h->data);
}
} while (XPending(loop->display) && loop->run);
} else if (loop->action_queue) {
/* only fire off one action at a time, then go back for more
X events, since the action might cause some X events (like
FocusIn :) */
do {
act = loop->action_queue->data;
if (act->data.any.client_action == OB_CLIENT_ACTION_ALWAYS &&
!act->data.any.c)
{
loop->action_queue =
g_slist_delete_link(loop->action_queue,
loop->action_queue);
action_unref(act);
act = NULL;
}
} while (!act && loop->action_queue && loop->run);
if (act) {
event_curtime = act->data.any.time;
act->func(&act->data);
event_curtime = CurrentTime;
loop->action_queue =
g_slist_delete_link(loop->action_queue,
loop->action_queue);
action_unref(act);
}
} else {
/* this only runs if there were no x events received */
@ -365,8 +307,6 @@ void ob_main_loop_run(ObMainLoop *loop)
}
}
client_remove_destroy_notify(ob_main_loop_client_destroy);
loop->running = FALSE;
}

View file

@ -70,12 +70,6 @@ void ob_main_loop_timeout_remove_data(ObMainLoop *loop,
gpointer data,
gboolean cancel_dest);
struct _ObAction;
/*! Queues an action, which will be run when there are no more X events
to process */
void ob_main_loop_queue_action(ObMainLoop *loop, struct _ObAction *act);
void ob_main_loop_run(ObMainLoop *loop);
void ob_main_loop_exit(ObMainLoop *loop);

View file

@ -22,8 +22,10 @@
#include "openbox.h"
#include "mainloop.h"
#include "stacking.h"
#include "grab.h"
#include "client.h"
#include "config.h"
#include "actions.h"
#include "screen.h"
#include "menuframe.h"
#include "keyboard.h"
@ -263,8 +265,7 @@ static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
for (node = node->children; node; node = node->next)
if (!xmlStrcasecmp(node->name, (const xmlChar*) "action")) {
ObAction *a = action_parse
(i, doc, node, OB_USER_ACTION_MENU_SELECTION);
ObActionsAct *a = actions_parse(i, doc, node);
if (a)
acts = g_slist_append(acts, a);
}
@ -411,8 +412,8 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
ObMenu *self;
ObMenuFrame *frame;
if (!(self = menu_from_name(name))
|| keyboard_interactively_grabbed()) return;
if (!(self = menu_from_name(name)) ||
grab_on_keyboard() || grab_on_pointer()) return;
/* if the requested menu is already the top visible menu, then don't
bother */
@ -430,7 +431,8 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
frame = menu_frame_new(self, 0, client);
if (!menu_frame_show_topmenu(frame, x, y, button))
menu_frame_free(frame);
else if (!button) {
else {
if (!button) {
/* select the first entry if it's not a submenu and we opened
* the menu with the keyboard, and skip all headers */
GList *it = frame->entries;
@ -446,6 +448,7 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
}
}
/* reset the hide timer */
if (!button)
menu_can_hide = TRUE;
else {
@ -455,6 +458,7 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
menu_hide_delay_func,
NULL, g_direct_equal, NULL);
}
}
}
gboolean menu_hide_delay_reached()
@ -498,7 +502,7 @@ void menu_entry_unref(ObMenuEntry *self)
case OB_MENU_ENTRY_TYPE_NORMAL:
g_free(self->data.normal.label);
while (self->data.normal.actions) {
action_unref(self->data.normal.actions->data);
actions_act_unref(self->data.normal.actions->data);
self->data.normal.actions =
g_slist_delete_link(self->data.normal.actions,
self->data.normal.actions);

View file

@ -125,6 +125,8 @@ struct _ObNormalMenuEntry {
RrColor *mask_selected_color;
RrColor *mask_disabled_color;
RrColor *mask_disabled_selected_color;
gpointer data;
};
struct _ObSubmenuMenuEntry {

View file

@ -21,6 +21,7 @@
#include "client.h"
#include "menu.h"
#include "screen.h"
#include "actions.h"
#include "grab.h"
#include "openbox.h"
#include "mainloop.h"
@ -1201,7 +1202,9 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time)
if (func)
func(entry, frame, client, state, data, time);
else
action_run(acts, client, state, time);
actions_run_acts(acts, OB_USER_ACTION_MENU_SELECTION,
time, state, -1, -1, OB_FRAME_CONTEXT_NONE,
client);
}
}