From ec4c3bcda4df49078621b3ca84ca0500e76c35f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Perell=F3=20Mar=EDn?= Date: Thu, 22 Nov 2001 08:07:50 +0000 Subject: Merge from stable up to 2.2.5.2 release tag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thu Nov 22 00:47:23 2001 George Lebl * Merge from stable up to 2.2.5.2 release tag Wed Nov 21 21:12:58 2001 George Lebl * daemon/slave.c, daemon/xdmcp.c: Fix minor leaks Wed Nov 21 20:58:24 2001 George Lebl * gui/gdmwm.c: Support the InputHint to support No Input windows, so that we can support things like xscribble and keyboards and other accessibility and such doodaahs. Based on a patch from Crossfire Wed Nov 21 19:46:50 2001 George Lebl * daemon/server.c: keep 4 old x server logs in a logrotate like manner to make debugging X server problems easier 2001-11-17 Carlos Perelló Marín * configure.in (ALL_LINGUAS): Added pt. --- gui/gdmwm.c | 80 +++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 29 deletions(-) (limited to 'gui/gdmwm.c') diff --git a/gui/gdmwm.c b/gui/gdmwm.c index f9834471..0c927816 100644 --- a/gui/gdmwm.c +++ b/gui/gdmwm.c @@ -42,6 +42,7 @@ struct _GdmWindow { gboolean ignore_size_hints; /* for gdm windows */ gboolean center; /* do centering */ gboolean recenter; /* do re-centering */ + gboolean takefocus; /* permit take focus */ }; static GList *windows = NULL; @@ -357,15 +358,50 @@ wm_protocol_check_support (Window xwin, return is_supported; } +static GList * +find_window_list (Window w, gboolean deco_ok) +{ + GList *li; + + for (li = windows; li != NULL; li = li->next) { + GdmWindow *gw = li->data; + + if (gw->win == w) + return li; + if (deco_ok && + (gw->deco == w || + gw->shadow == w)) + return li; + } + + return NULL; +} + +static GdmWindow * +find_window (Window w, gboolean deco_ok) +{ + GList *li = find_window_list (w, deco_ok); + if (li == NULL) + return NULL; + else + return li->data; +} + void gdm_wm_focus_window (Window window) { XWindowAttributes attribs = {0}; + GdmWindow *win; if (no_focus_login > 0 && window == wm_login_window) return; + win = find_window (window, TRUE); + if (win != NULL && + ! win->takefocus) + return; + trap_push (); XGetWindowAttributes (wm_disp, window, &attribs); @@ -395,35 +431,6 @@ gdm_wm_focus_window (Window window) trap_pop (); } -static GList * -find_window_list (Window w, gboolean deco_ok) -{ - GList *li; - - for (li = windows; li != NULL; li = li->next) { - GdmWindow *gw = li->data; - - if (gw->win == w) - return li; - if (deco_ok && - (gw->deco == w || - gw->shadow == w)) - return li; - } - - return NULL; -} - -static GdmWindow * -find_window (Window w, gboolean deco_ok) -{ - GList *li = find_window_list (w, deco_ok); - if (li == NULL) - return NULL; - else - return li->data; -} - static void center_x_window (GdmWindow *gw, Window w, Window hintwin) { @@ -635,6 +642,7 @@ add_window (Window w, gboolean center) gw = find_window (w, FALSE); if (gw == NULL) { XClassHint hint = { NULL, NULL }; + XWMHints *wmhints; int x, y; Window root; unsigned int width, height, border, depth; @@ -649,6 +657,17 @@ add_window (Window w, gboolean center) gw->ignore_size_hints = FALSE; gw->center = center; gw->recenter = FALSE; + gw->takefocus = TRUE; + + wmhints = XGetWMHints (wm_disp, w); + if (wmhints != NULL) { + /* NoInput windows */ + if ((wmhints->flags & InputHint) && + ! wmhints->input) { + gw->takefocus = FALSE; + } + XFree (wmhints); + } /* hack, set USpos/size on login window */ if (w == wm_login_window) { @@ -670,6 +689,9 @@ add_window (Window w, gboolean center) * such stuff */ gw->center = FALSE; gw->recenter = FALSE; + } else if (is_wm_class (&hint, "xscribble", 0)) { + /* hack, xscribble mustn't take focus */ + gw->takefocus = FALSE; } if (hint.res_name != NULL) XFree (hint.res_name); -- cgit v1.2.1