diff options
author | Carlos Perelló Marín <carlos@gnome-db.org> | 2001-11-22 08:07:50 +0000 |
---|---|---|
committer | George Lebl <jirka@src.gnome.org> | 2001-11-22 08:07:50 +0000 |
commit | ec4c3bcda4df49078621b3ca84ca0500e76c35f9 (patch) | |
tree | eb3be5b50b4d305ef8945543f51ff23316f03799 /gui/gdmwm.c | |
parent | e623fdceb2c3947e7d62ce77cef700542b18c73f (diff) | |
download | gdm-ec4c3bcda4df49078621b3ca84ca0500e76c35f9.tar.gz |
Merge from stable up to 2.2.5.2 release tag
Thu Nov 22 00:47:23 2001 George Lebl <jirka@5z.com>
* Merge from stable up to 2.2.5.2 release tag
Wed Nov 21 21:12:58 2001 George Lebl <jirka@5z.com>
* daemon/slave.c, daemon/xdmcp.c: Fix minor leaks
Wed Nov 21 20:58:24 2001 George Lebl <jirka@5z.com>
* 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 <xfire@xware.cx>
Wed Nov 21 19:46:50 2001 George Lebl <jirka@5z.com>
* 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 <carlos@gnome-db.org>
* configure.in (ALL_LINGUAS): Added pt.
Diffstat (limited to 'gui/gdmwm.c')
-rw-r--r-- | gui/gdmwm.c | 80 |
1 files changed, 51 insertions, 29 deletions
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); |