summaryrefslogtreecommitdiff
path: root/gui/gdmwm.c
diff options
context:
space:
mode:
authorCarlos Perelló Marín <carlos@gnome-db.org>2001-11-22 08:07:50 +0000
committerGeorge Lebl <jirka@src.gnome.org>2001-11-22 08:07:50 +0000
commitec4c3bcda4df49078621b3ca84ca0500e76c35f9 (patch)
treeeb3be5b50b4d305ef8945543f51ff23316f03799 /gui/gdmwm.c
parente623fdceb2c3947e7d62ce77cef700542b18c73f (diff)
downloadgdm-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.c80
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);