summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-03-02 02:23:00 +0000
committerDana Jansens <danakj@orodu.net>2007-03-02 02:23:00 +0000
commit78af5d15e9dd94959786811e9eddfa1e5024067c (patch)
tree99609d208f06c9a97108fc881d736baa5912e547 /openbox
parent2b99b62abf3441bc69c7c189da05a709edbb49f3 (diff)
this includes a number of things since my magnificent return....
1. some random compiling/style cleanups 2. some bigfixes - mislogic in per-window-settings and focusing new windows - use client_can_focus rather than checking variables for directional focus - MAYBE fix all those lock-ups forever. using event_curtime (a new variable) now instead of event_lasttime. event_lasttime is still used however when the event being processed did not have a time associated with it. this may or may not be a problem, and will be seen. 3. um.. i forget 4. oh yeah, 3rd party docks are now treated like the internal ob dock irt focus. that is, clicking on them won't pass them focus. this is going to be ratified as expected behavior in the wm-spec just now. if docks/panels want focus they can request it with _net_active_window, and then they can have all the focus they want! one day alt-tabbing around dock windows might be nice. but not until the ob dock is moved out into a separate application. going to have to add a wmapp selection and stuff for that though... ugly. who uses wmdockapps anymore !? someone must.. *sigh*
Diffstat (limited to 'openbox')
-rw-r--r--openbox/action.c26
-rw-r--r--openbox/client.c44
-rw-r--r--openbox/client.h4
-rw-r--r--openbox/client_list_combined_menu.h4
-rw-r--r--openbox/config.c6
-rw-r--r--openbox/config.h2
-rw-r--r--openbox/dock.c4
-rw-r--r--openbox/event.c28
-rw-r--r--openbox/event.h2
-rw-r--r--openbox/focus.c13
-rw-r--r--openbox/grab.c12
-rw-r--r--openbox/mainloop.c3
-rw-r--r--openbox/menuframe.c2
-rw-r--r--openbox/mouse.c2
-rw-r--r--openbox/place.c5
15 files changed, 105 insertions, 52 deletions
diff --git a/openbox/action.c b/openbox/action.c
index 9350c3ce..8ad60931 100644
--- a/openbox/action.c
+++ b/openbox/action.c
@@ -1034,7 +1034,7 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context,
it won't work right unless we XUngrabKeyboard first,
even though we grabbed the key/button Asychronously.
e.g. "gnome-panel-control --main-menu" */
- XUngrabKeyboard(ob_display, event_lasttime);
+ XUngrabKeyboard(ob_display, event_curtime);
}
for (it = acts; it; it = g_slist_next(it)) {
@@ -1111,16 +1111,30 @@ void action_execute(union ActionData *data)
void action_activate(union ActionData *data)
{
- client_activate(data->activate.any.c, data->activate.here);
+ /* similar to the openbox dock for dockapps, don't let user actions give
+ focus to 3rd-party docks (panels) either (unless they ask for it
+ themselves). */
+ if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) {
+ /* if using focus_delay, stop the timer now so that focus doesn't go
+ moving on us */
+ event_halt_focus_delay();
+
+ client_activate(data->activate.any.c, data->activate.here, TRUE);
+ }
}
void action_focus(union ActionData *data)
{
- /* if using focus_delay, stop the timer now so that focus doesn't go moving
- on us */
- event_halt_focus_delay();
+ /* similar to the openbox dock for dockapps, don't let user actions give
+ focus to 3rd-party docks (panels) either (unless they ask for it
+ themselves). */
+ if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) {
+ /* if using focus_delay, stop the timer now so that focus doesn't go
+ moving on us */
+ event_halt_focus_delay();
- client_focus(data->client.any.c);
+ client_focus(data->client.any.c);
+ }
}
void action_unfocus (union ActionData *data)
diff --git a/openbox/client.c b/openbox/client.c
index 88eecf14..efd5dbc9 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -371,8 +371,9 @@ void client_manage(Window window)
/* focus the new window? */
if (ob_state() != OB_STATE_STARTING &&
- (config_focus_new || client_search_focus_parent(self)) ||
- (settings && settings->focus == TRUE) &&
+ ((settings && settings->focus == TRUE) ||
+ (!settings && (config_focus_new ||
+ client_search_focus_parent(self)))) &&
/* note the check against Type_Normal/Dialog, not client_normal(self),
which would also include other types. in this case we want more
strict rules for focus */
@@ -810,20 +811,22 @@ static void client_toggle_border(ObClient *self, gboolean show)
static void client_get_all(ObClient *self)
{
client_get_area(self);
- client_update_transient_for(self);
- client_update_wmhints(self);
- client_get_startup_id(self);
- client_get_desktop(self);
- client_get_shaped(self);
-
client_get_mwm_hints(self);
- client_get_type(self);/* this can change the mwmhints for special cases */
/* The transient hint is used to pick a type, but the type can also affect
- transiency (dialogs are always made transients). This is Havoc's idea,
- but it is needed to make some apps work right (eg tsclient). */
+ transiency (dialogs are always made transients of their group if they
+ have one). This is Havoc's idea, but it is needed to make some apps
+ work right (eg tsclient). */
+ client_update_transient_for(self);
+ client_get_type(self);/* this can change the mwmhints for special cases */
client_update_transient_for(self);
+ client_update_wmhints(self);
+ client_get_startup_id(self);
+ client_get_desktop(self);/* uses transient data/group/startup id if a
+ desktop is not specified */
+ client_get_shaped(self);
+
client_get_state(self);
{
@@ -1303,6 +1306,7 @@ void client_setup_decor_and_functions(ObClient *self)
if (! (self->mwmhints.decorations & OB_MWM_DECOR_ALL)) {
if (! ((self->mwmhints.decorations & OB_MWM_DECOR_HANDLE) ||
(self->mwmhints.decorations & OB_MWM_DECOR_TITLE)))
+ {
/* if the mwm hints request no handle or title, then all
decorations are disabled, but keep the border if that's
specified */
@@ -1310,6 +1314,7 @@ void client_setup_decor_and_functions(ObClient *self)
self->decorations = OB_FRAME_DECOR_BORDER;
else
self->decorations = 0;
+ }
}
}
@@ -2497,7 +2502,7 @@ void client_close(ObClient *self)
ce.xclient.window = self->window;
ce.xclient.format = 32;
ce.xclient.data.l[0] = prop_atoms.wm_delete_window;
- ce.xclient.data.l[1] = event_lasttime;
+ ce.xclient.data.l[1] = event_curtime;
ce.xclient.data.l[2] = 0l;
ce.xclient.data.l[3] = 0l;
ce.xclient.data.l[4] = 0l;
@@ -2818,7 +2823,7 @@ gboolean client_focus(ObClient *self)
#799. So now it is RevertToNone again.
*/
XSetInputFocus(ob_display, self->window, RevertToNone,
- event_lasttime);
+ event_curtime);
}
if (self->focus_notify) {
@@ -2829,7 +2834,7 @@ gboolean client_focus(ObClient *self)
ce.xclient.window = self->window;
ce.xclient.format = 32;
ce.xclient.data.l[0] = prop_atoms.wm_take_focus;
- ce.xclient.data.l[1] = event_lasttime;
+ ce.xclient.data.l[1] = event_curtime;
ce.xclient.data.l[2] = 0l;
ce.xclient.data.l[3] = 0l;
ce.xclient.data.l[4] = 0l;
@@ -2839,7 +2844,7 @@ gboolean client_focus(ObClient *self)
#ifdef DEBUG_FOCUS
ob_debug("%sively focusing %lx at %d\n",
(self->can_focus ? "act" : "pass"),
- self->window, (gint) event_lasttime);
+ self->window, (gint) event_curtime);
#endif
/* Cause the FocusIn to come back to us. Important for desktop switches,
@@ -2861,8 +2866,11 @@ void client_unfocus(ObClient *self)
}
}
-void client_activate(ObClient *self, gboolean here)
+void client_activate(ObClient *self, gboolean here, gboolean user)
{
+ /* XXX do some stuff here if user is false to determine if we really want
+ to activate it or not (a parent or group member is currently active) */
+
if (client_normal(self) && screen_showing_desktop)
screen_show_desktop(FALSE);
if (self->iconic)
@@ -2997,8 +3005,8 @@ ObClient *client_find_directional(ObClient *c, ObDirection dir)
continue;
if(cur->iconic)
continue;
- if(client_focus_target(cur) == cur &&
- !(cur->can_focus || cur->focus_notify))
+ if(!(client_focus_target(cur) == cur &&
+ client_can_focus(cur)))
continue;
/* find the centre coords of this window, from the
diff --git a/openbox/client.h b/openbox/client.h
index 9702bb19..d8382d2a 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -477,8 +477,10 @@ void client_unfocus(ObClient *self);
when the user deliberately selects a window for use.
@param here If true, then the client is brought to the current desktop;
otherwise, the desktop is changed to where the client lives.
+ @param user If true, then a user action is what requested the activation;
+ otherwise, it means an application requested it on its own
*/
-void client_activate(ObClient *self, gboolean here);
+void client_activate(ObClient *self, gboolean here, gboolean user);
/*! Calculates the stacking layer for the client window */
void client_calc_layer(ObClient *self);
diff --git a/openbox/client_list_combined_menu.h b/openbox/client_list_combined_menu.h
index d48ee09b..91ebfc47 100644
--- a/openbox/client_list_combined_menu.h
+++ b/openbox/client_list_combined_menu.h
@@ -20,7 +20,7 @@
#ifndef ob__client_list_combined_menu_h
#define ob__client_list_combined_menu_h
-void client_list_menu_combined_startup(gboolean reconfig);
-void client_list_menu_combined_shutdown(gboolean reconfig);
+void client_list_combined_menu_startup(gboolean reconfig);
+void client_list_combined_menu_shutdown(gboolean reconfig);
#endif
diff --git a/openbox/config.c b/openbox/config.c
index 774eddad..9cf07a37 100644
--- a/openbox/config.c
+++ b/openbox/config.c
@@ -44,7 +44,7 @@ gboolean config_title_number;
gint config_desktops_num;
GSList *config_desktops_names;
-gint config_screen_firstdesk;
+guint config_screen_firstdesk;
gboolean config_resize_redraw;
gboolean config_resize_four_corners;
@@ -455,7 +455,7 @@ static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
if ((n = parse_find_node("firstdesk", node))) {
gint d = parse_int(doc, n);
if (d > 0)
- config_screen_firstdesk = d;
+ config_screen_firstdesk = (unsigned) d;
}
if ((n = parse_find_node("names", node))) {
GSList *it;
@@ -718,7 +718,7 @@ static void bind_default_mouse()
uact = OB_USER_ACTION_MOUSE_DOUBLE_CLICK; break;
case OB_MOUSE_ACTION_MOTION:
uact = OB_USER_ACTION_MOUSE_MOTION; break;
- case OB_NUM_MOUSE_ACTIONS:
+ default:
g_assert_not_reached();
}
mouse_bind(it->button, it->context, it->mact,
diff --git a/openbox/config.h b/openbox/config.h
index 849d5a22..fc300d6c 100644
--- a/openbox/config.h
+++ b/openbox/config.h
@@ -96,7 +96,7 @@ extern gboolean config_title_number;
/*! The number of desktops */
extern gint config_desktops_num;
/*! Desktop to start on, put 5 to start in the center of a 3x3 grid */
-extern gint config_screen_firstdesk;
+extern guint config_screen_firstdesk;
/*! Names for the desktops */
extern GSList *config_desktops_names;
diff --git a/openbox/dock.c b/openbox/dock.c
index 7b92ff58..eceb3b99 100644
--- a/openbox/dock.c
+++ b/openbox/dock.c
@@ -313,6 +313,8 @@ void dock_configure()
dock->y = a->height;
gravity = SouthEastGravity;
break;
+ default:
+ g_assert_not_reached();
}
}
@@ -578,6 +580,8 @@ void dock_app_drag(ObDockApp *app, XMotionEvent *e)
case OB_ORIENTATION_VERT:
after = (y > over->h / 2);
break;
+ default:
+ g_assert_not_reached();
}
/* remove before doing the it->next! */
diff --git a/openbox/event.c b/openbox/event.c
index 21185be9..c74e15ae 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -86,7 +86,12 @@ static gboolean menu_hide_delay_func(gpointer data);
(e)->xfocus.detail == NotifyAncestor || \
(e)->xfocus.detail > NotifyNonlinearVirtual)
-Time event_lasttime = 0;
+/* The most recent time at which an event with a timestamp occured. */
+static Time event_lasttime = 0;
+/* The time for the current event being processed
+ (it's the event_lasttime for events without times, if this is a bug then
+ use CurrentTime instead, but it seems ok) */
+Time event_curtime = CurrentTime;
/*! The value of the mask for the NumLock modifier */
guint NumLockMask;
@@ -251,8 +256,14 @@ static void event_set_lasttime(XEvent *e)
break;
}
- if (t > event_lasttime)
+ if (t > event_lasttime) {
event_lasttime = t;
+ event_curtime = event_lasttime;
+ } else if (t == 0) {
+ event_curtime = event_lasttime;
+ } else {
+ event_curtime = t;
+ }
}
#define STRIP_MODS(s) \
@@ -919,7 +930,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
it can happen now when the window is on
another desktop, but we still don't
want it! */
- client_activate(client, FALSE);
+ client_activate(client, FALSE, TRUE);
break;
case ClientMessage:
/* validate cuz we query stuff off the client here */
@@ -973,8 +984,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
ob_debug("net_close_window for 0x%lx\n", client->window);
client_close(client);
} else if (msgtype == prop_atoms.net_active_window) {
- ob_debug("net_active_window for 0x%lx\n", client->window);
- client_activate(client, FALSE);
+ ob_debug("net_active_window for 0x%lx source=%s\n",
+ client->window,
+ (e->xclient.data.l[0] == 0 ? "unknown" :
+ (e->xclient.data.l[0] == 1 ? "application" :
+ (e->xclient.data.l[0] == 2 ? "user" : "INVALID"))));
+ /* XXX make use of data.l[1] and [2] ! */
+ client_activate(client, FALSE,
+ (e->xclient.data.l[0] == 0 ||
+ e->xclient.data.l[0] == 2));
} else if (msgtype == prop_atoms.net_wm_moveresize) {
ob_debug("net_wm_moveresize for 0x%lx\n", client->window);
if ((Atom)e->xclient.data.l[2] ==
diff --git a/openbox/event.h b/openbox/event.h
index 0da09789..44bf54a0 100644
--- a/openbox/event.h
+++ b/openbox/event.h
@@ -25,7 +25,7 @@
struct _ObClient;
/*! Time at which the last event with a timestamp occured. */
-extern Time event_lasttime;
+extern Time event_curtime;
/*! The value of the mask for the NumLock modifier */
extern guint NumLockMask;
diff --git a/openbox/focus.c b/openbox/focus.c
index d78591ba..9de0c808 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -144,7 +144,7 @@ void focus_shutdown(gboolean reconfig)
g_free(focus_order);
/* reset focus to root */
- XSetInputFocus(ob_display, PointerRoot, RevertToNone, event_lasttime);
+ XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
RrColorFree(color_white);
@@ -186,7 +186,7 @@ void focus_set_client(ObClient *client)
#endif
/* when nothing will be focused, send focus to the backup target */
XSetInputFocus(ob_display, screen_support_win, RevertToNone,
- event_lasttime);
+ event_curtime);
XSync(ob_display, FALSE);
}
@@ -318,6 +318,11 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
if (client_normal(it->data) && client_can_focus(it->data))
return it->data;
+ /* XXX fallback to the "desktop window" if one exists ?
+ could store it while going through all the windows in the loop right
+ above this..
+ */
+
return NULL;
}
@@ -603,7 +608,7 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
done_cycle:
if (done && focus_cycle_target)
- client_activate(focus_cycle_target, FALSE);
+ client_activate(focus_cycle_target, FALSE, TRUE);
t = NULL;
first = NULL;
@@ -665,7 +670,7 @@ void focus_directional_cycle(ObDirection dir, gboolean interactive,
done_cycle:
if (done && focus_cycle_target)
- client_activate(focus_cycle_target, FALSE);
+ client_activate(focus_cycle_target, FALSE, TRUE);
first = NULL;
focus_cycle_target = NULL;
diff --git a/openbox/grab.c b/openbox/grab.c
index b4c192b0..36a0d124 100644
--- a/openbox/grab.c
+++ b/openbox/grab.c
@@ -54,14 +54,14 @@ gboolean grab_keyboard(gboolean grab)
if (kgrabs++ == 0) {
ret = XGrabKeyboard(ob_display, RootWindow(ob_display, ob_screen),
FALSE, GrabModeAsync, GrabModeAsync,
- event_lasttime) == Success;
+ event_curtime) == Success;
if (!ret)
--kgrabs;
} else
ret = TRUE;
} else if (kgrabs > 0) {
if (--kgrabs == 0)
- XUngrabKeyboard(ob_display, event_lasttime);
+ XUngrabKeyboard(ob_display, event_curtime);
ret = TRUE;
}
@@ -77,14 +77,14 @@ gboolean grab_pointer(gboolean grab, ObCursor cur)
ret = XGrabPointer(ob_display, screen_support_win,
False, GRAB_PTR_MASK, GrabModeAsync,
GrabModeAsync, None,
- ob_cursor(cur), event_lasttime) == Success;
+ ob_cursor(cur), event_curtime) == Success;
if (!ret)
--pgrabs;
} else
ret = TRUE;
} else if (pgrabs > 0) {
if (--pgrabs == 0) {
- XUngrabPointer(ob_display, event_lasttime);
+ XUngrabPointer(ob_display, event_curtime);
}
ret = TRUE;
}
@@ -100,14 +100,14 @@ gboolean grab_pointer_window(gboolean grab, ObCursor cur, Window win)
ret = XGrabPointer(ob_display, win, False, GRAB_PTR_MASK,
GrabModeAsync, GrabModeAsync, None,
ob_cursor(cur),
- event_lasttime) == Success;
+ event_curtime) == Success;
if (!ret)
--pgrabs;
} else
ret = TRUE;
} else if (pgrabs > 0) {
if (--pgrabs == 0) {
- XUngrabPointer(ob_display, event_lasttime);
+ XUngrabPointer(ob_display, event_curtime);
}
ret = TRUE;
}
diff --git a/openbox/mainloop.c b/openbox/mainloop.c
index 61c92705..26ba4f9b 100644
--- a/openbox/mainloop.c
+++ b/openbox/mainloop.c
@@ -418,7 +418,8 @@ static void sighandler(gint sig)
/* XXX special case for signals that default to core dump.
but throw some helpful output here... */
- fprintf(stderr, "Fuck yah. Core dump. (Signal=%d)\n", sig);
+ fprintf(stderr, "How are you gentlemen? All your base are"
+ " belong to us. (Signal=%d)\n", sig);
/* die with a core dump */
abort();
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index 3cda7780..fa0af530 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -251,6 +251,8 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
case OB_MENU_ENTRY_TYPE_SEPARATOR:
th = SEPARATOR_HEIGHT + 2*PADDING;
break;
+ default:
+ g_assert_not_reached();
}
RECT_SET_SIZE(self->area, self->frame->inner_w, th);
XResizeWindow(ob_display, self->window,
diff --git a/openbox/mouse.c b/openbox/mouse.c
index 8a390d9f..18f35d3c 100644
--- a/openbox/mouse.c
+++ b/openbox/mouse.c
@@ -200,7 +200,7 @@ void mouse_event(ObClient *client, XEvent *e)
if (CLIENT_CONTEXT(context, client)) {
/* Replay the event, so it goes to the client*/
- XAllowEvents(ob_display, ReplayPointer, event_lasttime);
+ XAllowEvents(ob_display, ReplayPointer, event_curtime);
/* Fall through to the release case! */
} else
break;
diff --git a/openbox/place.c b/openbox/place.c
index b56998b2..f9da5762 100644
--- a/openbox/place.c
+++ b/openbox/place.c
@@ -27,7 +27,8 @@
static Rect *pick_head(ObClient *c)
{
Rect *area = NULL;
- gint i, px, py;
+ guint i;
+ gint px, py;
/* try direct parent first */
if (c->transient_for && c->transient_for != OB_TRAN_GROUP) {
@@ -220,7 +221,6 @@ typedef enum
static gboolean place_smart(ObClient *client, gint *x, gint *y,
ObSmartType type)
{
- guint i;
gboolean ret = FALSE;
GSList *spaces = NULL, *sit;
GList *it;
@@ -320,7 +320,6 @@ static gboolean place_smart(ObClient *client, gint *x, gint *y,
static gboolean place_under_mouse(ObClient *client, gint *x, gint *y)
{
- guint i;
gint l, r, t, b;
gint px, py;
Rect *area;