#include "group.h"
#include "focus_cycle.h"
#include "screen.h"
-#include "prop.h"
#include "keyboard.h"
#include "focus.h"
#include "stacking.h"
+#include "obt/prop.h"
#include <X11/Xlib.h>
#include <glib.h>
if (reconfig) return;
/* reset focus to root */
- XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
+ XSetInputFocus(obt_display, PointerRoot, RevertToNone, CurrentTime);
}
static void push_to_top(ObClient *client)
{
+ ObClient *p;
+
+ /* if it is modal for a single window, then put that window at the top
+ of the focus order first, so it will be right after ours. the same is
+ done with stacking */
+ if (client->modal && (p = client_direct_parent(client)))
+ push_to_top(p);
+
focus_order = g_list_remove(focus_order, client);
focus_order = g_list_prepend(focus_order, client);
}
Window active;
ob_debug_type(OB_DEBUG_FOCUS,
- "focus_set_client 0x%lx\n", client ? client->window : 0);
+ "focus_set_client 0x%lx", client ? client->window : 0);
if (focus_client == client)
return;
screen_install_colormap(focus_client, FALSE);
screen_install_colormap(client, TRUE);
- /* in the middle of cycling..? kill it. */
- focus_cycle_stop(focus_client);
- focus_cycle_stop(client);
-
focus_client = client;
if (client != NULL) {
/* set the NET_ACTIVE_WINDOW hint, but preserve it on shutdown */
if (ob_state() != OB_STATE_EXITING) {
active = client ? client->window : None;
- PROP_SET32(RootWindow(ob_display, ob_screen),
- net_active_window, window, active);
+ OBT_PROP_SET32(obt_root(ob_screen), NET_ACTIVE_WINDOW, WINDOW, active);
}
}
GList *it;
ObClient *c;
- ob_debug_type(OB_DEBUG_FOCUS, "trying pointer stuff\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "trying pointer stuff");
if (allow_pointer && config_focus_follow)
if ((c = client_under_pointer()) &&
(allow_refocus || client_focus_target(c) != old) &&
(client_normal(c) &&
client_focus(c)))
{
- ob_debug_type(OB_DEBUG_FOCUS, "found in pointer stuff\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found in pointer stuff");
return c;
}
- ob_debug_type(OB_DEBUG_FOCUS, "trying the focus order\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "trying the focus order");
for (it = focus_order; it; it = g_list_next(it)) {
c = it->data;
/* fallback focus to a window if:
3. it is not shaded
*/
if ((allow_omnipresent || c->desktop == screen_desktop) &&
- focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, FALSE) &&
+ focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE) &&
!c->shaded &&
(allow_refocus || client_focus_target(c) != old) &&
client_focus(c))
{
- ob_debug_type(OB_DEBUG_FOCUS, "found in focus order\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found in focus order");
return c;
}
}
- ob_debug_type(OB_DEBUG_FOCUS, "trying a desktop window\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "trying a desktop window");
for (it = focus_order; it; it = g_list_next(it)) {
c = it->data;
/* fallback focus to a window if:
a splashscreen or a desktop window (save the desktop as a
backup fallback though)
*/
- if (focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, TRUE) &&
+ if (focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) &&
(allow_refocus || client_focus_target(c) != old) &&
client_focus(c))
{
- ob_debug_type(OB_DEBUG_FOCUS, "found a desktop window\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found a desktop window");
return c;
}
}
void focus_nothing(void)
{
- /* Install our own colormap */
- if (focus_client != NULL) {
- screen_install_colormap(focus_client, FALSE);
- screen_install_colormap(NULL, TRUE);
- }
-
/* nothing is focused, update the colormap and _the root property_ */
focus_set_client(NULL);
- /* if there is a grab going on, then we need to cancel it. if we move
- focus during the grab, applications will get NotifyWhileGrabbed events
- and ignore them !
-
- actions should not rely on being able to move focus during an
- interactive grab.
- */
- event_cancel_all_key_grabs();
-
/* when nothing will be focused, send focus to the backup target */
- XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot,
+ XSetInputFocus(obt_display, screen_support_win, RevertToPointerRoot,
event_curtime);
}
/* check that it's not a helper window to avoid infinite recursion */
if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL &&
focus_valid_target(c, TRUE, iconic_windows, all_desktops,
- FALSE, FALSE))
+ FALSE, FALSE, FALSE))
{
return TRUE;
}
gboolean iconic_windows,
gboolean all_desktops,
gboolean dock_windows,
- gboolean desktop_windows)
+ gboolean desktop_windows,
+ gboolean user_request)
{
gboolean ok = FALSE;
!focus_target_has_siblings(ft, iconic_windows, all_desktops))));
/* it's not set to skip the taskbar (but this only applies to normal typed
- windows, and is overridden if the window is modal) */
+ windows, and is overridden if the window is modal or if the user asked
+ for this window to be focused, or if the window is iconified) */
ok = ok && (ft->type != OB_CLIENT_TYPE_NORMAL ||
ft->modal ||
+ ft->iconic ||
+ user_request ||
!ft->skip_taskbar);
/* it's not going to just send focus off somewhere else (modal window),
iconic_windows,
all_desktops,
dock_windows,
- desktop_windows));
+ desktop_windows,
+ FALSE));
}
return ok;
}
-