openbox/popup.h \
openbox/prop.c \
openbox/prop.h \
- openbox/propwin.c \
- openbox/propwin.h \
openbox/resist.c \
openbox/resist.h \
openbox/screen.c \
#include "event.h"
#include "grab.h"
#include "focus.h"
-#include "propwin.h"
#include "stacking.h"
#include "openbox.h"
#include "group.h"
ObAppSettings *settings;
gboolean transient = FALSE;
Rect place, *monitor;
+ Time map_time;
grab_server(TRUE);
self->wmstate = WithdrawnState; /* make sure it gets updated first time */
self->gravity = NorthWestGravity;
self->desktop = screen_num_desktops; /* always an invalid value */
- self->user_time = focus_client ? focus_client->user_time : CurrentTime;
/* get all the stuff off the window */
client_get_all(self, TRUE);
/* now we have all of the window's information so we can set this up */
client_setup_decor_and_functions(self, FALSE);
- {
- Time t = sn_app_started(self->startup_id, self->class);
- if (t) self->user_time = t;
- }
+ /* tell startup notification that this app started */
+ map_time = sn_app_started(self->startup_id, self->class);
/* do this after we have a frame.. it uses the frame to help determine the
WM_STATE to apply. */
if (activate) {
gboolean raise = FALSE;
- guint32 last_time = focus_client ?
- focus_client->user_time : CurrentTime;
-
- /* This is focus stealing prevention */
- ob_debug_type(OB_DEBUG_FOCUS,
- "Want to focus new window 0x%x with time %u "
- "(last time %u)\n",
- self->window, self->user_time, last_time);
if (menu_frame_visible || moveresize_in_progress) {
activate = FALSE;
else if (!(self->desktop == screen_desktop ||
self->desktop == DESKTOP_ALL) &&
/* the timestamp is from before you changed desktops */
- self->user_time && screen_desktop_user_time &&
- !event_time_after(self->user_time, screen_desktop_user_time))
+ map_time && screen_desktop_user_time &&
+ !event_time_after(map_time, screen_desktop_user_time))
{
activate = FALSE;
raise = TRUE;
else if (focus_client && client_search_focus_tree_full(self) == NULL &&
client_search_focus_group_full(self) == NULL)
{
- /* If time stamp is old, don't steal focus */
- if (self->user_time && last_time &&
- !event_time_after(self->user_time, last_time))
- {
- activate = FALSE;
- ob_debug_type(OB_DEBUG_FOCUS,
- "Not focusing the window because the time is "
- "too old\n");
- }
/* If its a transient (and parents aren't focused) and the time
is ambiguous (either the current focus target doesn't have
a timestamp, or they are the same (we probably inherited it
from them) */
- else if (client_has_parent(self) &&
- (!last_time || self->user_time == last_time))
- {
+ if (client_has_parent(self)) {
activate = FALSE;
ob_debug_type(OB_DEBUG_FOCUS,
"Not focusing the window because it is a "
- "transient, and the time is very ambiguous\n");
+ "transient, and its relatives aren't focused\n");
}
/* Don't steal focus from globally active clients.
I stole this idea from KWin. It seems nice.
}
if (!activate) {
- ob_debug_type(OB_DEBUG_FOCUS,
- "Focus stealing prevention activated for %s with "
- "time %u (last time %u)\n",
- self->title, self->user_time, last_time);
/* if the client isn't focused, then hilite it so the user
knows it is there */
client_hilite(self, TRUE);
/* remove the window from our save set */
XChangeSaveSet(ob_display, self->window, SetModeDelete);
- /* kill the property windows */
- propwin_remove(self->user_time_window, OB_PROPWIN_USER_TIME, self);
-
/* update the focus lists */
focus_order_remove(self);
if (client_focused(self)) {
client_get_colormap(self);
client_update_strut(self);
client_update_icons(self);
- client_update_user_time_window(self);
- if (!self->user_time_window) /* check if this would have been called */
- client_update_user_time(self);
client_update_icon_geometry(self);
}
frame_adjust_icon(self->frame);
}
-void client_update_user_time(ObClient *self)
-{
- guint32 time;
- gboolean got = FALSE;
-
- if (self->user_time_window)
- got = PROP_GET32(self->user_time_window,
- net_wm_user_time, cardinal, &time);
- if (!got)
- got = PROP_GET32(self->window, net_wm_user_time, cardinal, &time);
-
- if (got) {
- /* we set this every time, not just when it grows, because in practice
- sometimes time goes backwards! (ntpdate.. yay....) so.. if it goes
- backward we don't want all windows to stop focusing. we'll just
- assume noone is setting times older than the last one, cuz that
- would be pretty stupid anyways
- */
- self->user_time = time;
-
- /*ob_debug("window %s user time %u\n", self->title, time);*/
- }
-}
-
-void client_update_user_time_window(ObClient *self)
-{
- guint32 w;
-
- if (!PROP_GET32(self->window, net_wm_user_time_window, window, &w))
- w = None;
-
- if (w != self->user_time_window) {
- /* remove the old window */
- propwin_remove(self->user_time_window, OB_PROPWIN_USER_TIME, self);
- self->user_time_window = None;
-
- if (self->group && self->group->leader == w) {
- ob_debug_type(OB_DEBUG_APP_BUGS, "Window is setting its "
- "_NET_WM_USER_TYPE_WINDOW to its group leader\n");
- /* do it anyways..? */
- }
- else if (w == self->window) {
- ob_debug_type(OB_DEBUG_APP_BUGS, "Window is setting its "
- "_NET_WM_USER_TIME_WINDOW to itself\n");
- w = None; /* don't do it */
- }
-
- /* add the new window */
- propwin_add(w, OB_PROPWIN_USER_TIME, self);
- self->user_time_window = w;
-
- /* and update from it */
- client_update_user_time(self);
- }
-}
-
void client_update_icon_geometry(ObClient *self)
{
guint num;
void client_activate(ObClient *self, gboolean here, gboolean raise,
gboolean unshade, gboolean user)
{
- guint32 last_time = focus_client ? focus_client->user_time : CurrentTime;
- gboolean allow = FALSE;
-
- /* if the currently focused app doesn't set a user_time, then it can't
- benefit from any focus stealing prevention.
-
- if the timestamp is missing in the request then let it go through
- even if it is source=app, because EVERY APPLICATION DOES THIS because
- GTK IS VERY BUGGY AND HARDCODES source=application... WHY!?
- */
- if (!last_time || !event_curtime)
- allow = TRUE;
- /* otherwise, if they didn't give a time stamp or if it is too old, they
- don't get focus */
- else
- allow = event_time_after(event_curtime, last_time);
-
- ob_debug_type(OB_DEBUG_FOCUS,
- "Want to activate window 0x%x with time %u (last time %u), "
- "source=%s allowing? %d\n",
- self->window, event_curtime, last_time,
- (user ? "user" : "application"), allow);
-
- if (allow)
- client_present(self, here, raise, unshade);
- else
- /* don't focus it but tell the user it wants attention */
- client_hilite(self, TRUE);
+ client_present(self, here, raise, unshade);
}
static void client_bring_windows_recursive(ObClient *self,
/*! Where the window should iconify to/from */
Rect icon_geometry;
-
- /*! The time when the client last received user interaction */
- guint32 user_time;
- /*! A separate window for the client to update it's user_time on */
- Window user_time_window;
};
extern GList *client_list;
-extern GHashTable *client_user_time_window_map;
void client_startup(gboolean reconfig);
void client_shutdown(gboolean reconfig);
void client_update_strut(ObClient *self);
/*! Updates the window's icons */
void client_update_icons(ObClient *self);
-/*! Updates the window's user time */
-void client_update_user_time(ObClient *self);
-/*! Updates the window's user time window */
-void client_update_user_time_window(ObClient *self);
/*! Updates the window's icon geometry (where to iconify to/from) */
void client_update_icon_geometry(ObClient *self);
#include "menuframe.h"
#include "keyboard.h"
#include "modkeys.h"
-#include "propwin.h"
#include "mouse.h"
#include "mainloop.h"
#include "focus.h"
static void event_handle_dock(ObDock *s, XEvent *e);
static void event_handle_dockapp(ObDockApp *app, XEvent *e);
static void event_handle_client(ObClient *c, XEvent *e);
-static void event_handle_user_time_window_clients(GSList *l, XEvent *e);
static void event_handle_user_input(ObClient *client, XEvent *e);
static gboolean is_enter_focus_event_ignored(XEvent *e);
ObDock *dock = NULL;
ObDockApp *dockapp = NULL;
ObWindow *obwin = NULL;
- GSList *timewinclients = NULL;
XEvent ee, *e;
ObEventData *ed = data;
e = ⅇ
window = event_get_window(e);
- if (e->type != PropertyNotify ||
- !(timewinclients = propwin_get_clients(window,
- OB_PROPWIN_USER_TIME)))
- if ((obwin = g_hash_table_lookup(window_map, &window))) {
- switch (obwin->type) {
- case Window_Dock:
- dock = WINDOW_AS_DOCK(obwin);
- break;
- case Window_DockApp:
- dockapp = WINDOW_AS_DOCKAPP(obwin);
- break;
- case Window_Client:
- client = WINDOW_AS_CLIENT(obwin);
- break;
- case Window_Menu:
- case Window_Internal:
- /* not to be used for events */
- g_assert_not_reached();
- break;
- }
+ if ((obwin = g_hash_table_lookup(window_map, &window))) {
+ switch (obwin->type) {
+ case Window_Dock:
+ dock = WINDOW_AS_DOCK(obwin);
+ break;
+ case Window_DockApp:
+ dockapp = WINDOW_AS_DOCKAPP(obwin);
+ break;
+ case Window_Client:
+ client = WINDOW_AS_CLIENT(obwin);
+ break;
+ case Window_Menu:
+ case Window_Internal:
+ /* not to be used for events */
+ g_assert_not_reached();
+ break;
}
+ }
event_set_curtime(e);
event_hack_mods(e);
section or by focus_fallback */
client_calc_layer(client);
}
- } else if (timewinclients)
- event_handle_user_time_window_clients(timewinclients, e);
+ }
else if (client)
event_handle_client(client, e);
else if (dockapp)
}
}
-static void event_handle_user_time_window_clients(GSList *l, XEvent *e)
-{
- g_assert(e->type == PropertyNotify);
- if (e->xproperty.atom == prop_atoms.net_wm_user_time) {
- for (; l; l = g_slist_next(l))
- client_update_user_time(l->data);
- }
-}
-
static void event_handle_client(ObClient *client, XEvent *e)
{
XEvent ce;
(e->xclient.data.l[0] == 2 ? "user" : "INVALID"))));
/* XXX make use of data.l[2] !? */
if (e->xclient.data.l[0] == 1 || e->xclient.data.l[0] == 2) {
- event_curtime = e->xclient.data.l[1];
- if (event_curtime == 0)
+ /* don't use the user's timestamp for client_focus, cuz if it's
+ an old broken timestamp (happens all the time) then focus
+ won't move even though we're trying to move it
+ event_curtime = e->xclient.data.l[1];*/
+ if (e->xclient.data.l[1] == 0)
ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_ACTIVE_WINDOW message for window %s is"
" missing a timestamp\n", client->title);
else if (msgtype == prop_atoms.net_wm_icon_geometry) {
client_update_icon_geometry(client);
}
- else if (msgtype == prop_atoms.net_wm_user_time) {
- client_update_user_time(client);
- }
- else if (msgtype == prop_atoms.net_wm_user_time_window) {
- client_update_user_time_window(client);
- }
#ifdef SYNC
else if (msgtype == prop_atoms.net_wm_sync_request_counter) {
client_update_sync_request_counter(client);
#include "menuframe.h"
#include "grab.h"
#include "group.h"
-#include "propwin.h"
#include "config.h"
#include "mainloop.h"
#include "gettext.h"
sn_startup(reconfigure);
screen_startup(reconfigure);
grab_startup(reconfigure);
- propwin_startup(reconfigure);
group_startup(reconfigure);
client_startup(reconfigure);
dock_startup(reconfigure);
dock_shutdown(reconfigure);
client_shutdown(reconfigure);
group_shutdown(reconfigure);
- propwin_shutdown(reconfigure);
grab_shutdown(reconfigure);
screen_shutdown(reconfigure);
focus_cycle_popup_shutdown(reconfigure);
CREATE(net_wm_icon_geometry, "_NET_WM_ICON_GEOMETRY");
/* CREATE(net_wm_pid, "_NET_WM_PID"); */
CREATE(net_wm_allowed_actions, "_NET_WM_ALLOWED_ACTIONS");
- CREATE(net_wm_user_time, "_NET_WM_USER_TIME");
- CREATE(net_wm_user_time_window, "_NET_WM_USER_TIME_WINDOW");
+/* CREATE(net_wm_user_time, "_NET_WM_USER_TIME"); */
+/* CREATE(net_wm_user_time_window, "_NET_WM_USER_TIME_WINDOW"); */
CREATE(kde_net_wm_frame_strut, "_KDE_NET_WM_FRAME_STRUT");
CREATE(net_frame_extents, "_NET_FRAME_EXTENTS");
Atom net_wm_icon_geometry;
/* Atom net_wm_pid; */
Atom net_wm_allowed_actions;
- Atom net_wm_user_time;
- Atom net_wm_user_time_window;
+/* Atom net_wm_user_time; */
+/* Atom net_wm_user_time_window; */
Atom net_frame_extents;
/* application protocols */
+++ /dev/null
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- propwin.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "propwin.h"
-#include "openbox.h"
-#include "client.h"
-#include "debug.h"
-
-typedef struct _ObPropWin ObPropWin;
-typedef struct _ObPropWinData ObPropWinData;
-
-struct _ObPropWinData
-{
- GSList *clients;
-};
-
-struct _ObPropWin
-{
- Window win;
- ObPropWinData data[OB_NUM_PROPWIN_TYPES];
-};
-
-/*! A hash table that maps a window to an ObPropWin */
-static GHashTable *propwin_map;
-
-static guint window_hash(Window *w) { return *w; }
-static gboolean window_comp(Window *w1, Window *w2) { return *w1 == *w2; }
-
-void propwin_startup(gboolean reconfig)
-{
- if (!reconfig)
- propwin_map = g_hash_table_new_full((GHashFunc)window_hash,
- (GEqualFunc)window_comp,
- NULL,
- g_free);
-}
-
-void propwin_shutdown(gboolean reconfig)
-{
- if (!reconfig)
- g_hash_table_destroy(propwin_map);
- else
- g_assert(g_hash_table_size(propwin_map) == 0);
-}
-
-void propwin_add(Window win, ObPropWinType type, ObClient *client)
-{
- ObPropWin *p;
-
- if (!win) return;
-
- g_assert(client);
- g_assert(type < OB_NUM_PROPWIN_TYPES);
-
- p = g_hash_table_lookup(propwin_map, &win);
- if (!p) {
- p = g_new0(ObPropWin, 1);
- p->win = win;
- g_hash_table_insert(propwin_map, &p->win, p);
- /* get property changes on this window */
- XSelectInput(ob_display, win, PropertyChangeMask);
- } else
- g_assert(g_slist_find(p->data[type].clients, client) == NULL);
-
- if (p->data[type].clients != NULL)
- ob_debug("Client %s is using a property window 0x%x that is already "
- "in use\n", client->title, win);
-
- /* add it to the clients list */
- p->data[type].clients = g_slist_prepend(p->data[type].clients, client);
-}
-
-void propwin_remove(Window win, ObPropWinType type, ObClient *client)
-{
- ObPropWin *p;
-
- if (!win) return;
-
- p = g_hash_table_lookup(propwin_map, &win);
- g_assert(p);
-
- /* remove it to the clients list */
- g_assert(g_slist_find(p->data[type].clients, client) != NULL);
- p->data[type].clients = g_slist_remove(p->data[type].clients, client);
-
- /* no more clients left for this type */
- if (p->data[type].clients == NULL) {
- guint i;
- gboolean none = TRUE;
-
- for (i = 0; i < OB_NUM_PROPWIN_TYPES; ++i)
- if (p->data[i].clients != NULL)
- none = FALSE; /* another type still has a client for this
- window */
-
- if (none) {
- /* don't get events for this window any more */
- XSelectInput(ob_display, win, NoEventMask);
- g_hash_table_remove(propwin_map, &win);
- }
- }
-}
-
-GSList* propwin_get_clients(Window win, ObPropWinType type)
-{
- ObPropWin *p = g_hash_table_lookup(propwin_map, &win);
- if (p)
- return p->data[type].clients;
- else
- return NULL;
-}
+++ /dev/null
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- propwin.h for the Openbox window manager
- Copyright (c) 2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __propwin_h
-#define __propwin_h
-
-#include <glib.h>
-#include <X11/Xlib.h>
-
-struct _ObClient;
-
-typedef enum {
- OB_PROPWIN_USER_TIME,
- OB_NUM_PROPWIN_TYPES
-} ObPropWinType;
-
-void propwin_startup(gboolean reconfig);
-void propwin_shutdown(gboolean reconfig);
-
-void propwin_add(Window win, ObPropWinType type, struct _ObClient *client);
-void propwin_remove(Window win, ObPropWinType type, struct _ObClient *client);
-
-GSList* propwin_get_clients(Window win, ObPropWinType type);
-
-#endif
supported[i++] = prop_atoms.net_wm_state_demands_attention;
supported[i++] = prop_atoms.net_moveresize_window;
supported[i++] = prop_atoms.net_wm_moveresize;
+/*
supported[i++] = prop_atoms.net_wm_user_time;
supported[i++] = prop_atoms.net_wm_user_time_window;
+*/
supported[i++] = prop_atoms.net_frame_extents;
supported[i++] = prop_atoms.net_request_frame_extents;
supported[i++] = prop_atoms.net_restack_window;