summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2002-10-28 20:22:22 +0000
committerHavoc Pennington <hp@src.gnome.org>2002-10-28 20:22:22 +0000
commitb3a1122b2ac59376b716a66a18a8516a061625bc (patch)
treeae561b1a91b578f2848fc3737ddfebc361ef7775
parentc7d9042e5dfaddee6a9bcebe642ff4fc09446b9e (diff)
downloadmetacity-b3a1122b2ac59376b716a66a18a8516a061625bc.tar.gz
use meta_prop_get_size_hints
2002-10-28 Havoc Pennington <hp@redhat.com> * src/window.c (update_size_hints): use meta_prop_get_size_hints * src/xprops.c: add support for getting XSizeHints
-rw-r--r--ChangeLog6
-rw-r--r--src/window.c32
-rw-r--r--src/xprops.c143
-rw-r--r--src/xprops.h15
4 files changed, 183 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 21aa3301..23be2346 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2002-10-28 Havoc Pennington <hp@redhat.com>
+
+ * src/window.c (update_size_hints): use meta_prop_get_size_hints
+
+ * src/xprops.c: add support for getting XSizeHints
+
2002-10-28 Havoc Pennington <hp@pobox.com>
* src/window.c, src/display.c: store the window menu on the
diff --git a/src/window.c b/src/window.c
index cddfbdd6..480ea855 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4022,6 +4022,7 @@ update_size_hints (MetaWindow *window)
int x, y, w, h;
gulong supplied;
XSizeHints old_hints;
+ XSizeHints *new_hints;
meta_topic (META_DEBUG_GEOMETRY, "Updating WM_NORMAL_HINTS for %s\n", window->desc);
@@ -4038,21 +4039,28 @@ update_size_hints (MetaWindow *window)
window->size_hints.flags = 0;
supplied = 0;
+ new_hints = NULL;
- meta_error_trap_push (window->display);
- XGetWMNormalHints (window->display->xdisplay,
- window->xwindow,
- &window->size_hints,
- &supplied);
- meta_error_trap_pop (window->display, TRUE);
-
- /* as far as I can tell, "supplied" is just
- * to check whether we had old-style normal hints
- * without gravity, base size as returned by
- * XGetNormalHints()
+ meta_prop_get_size_hints (window->display,
+ window->xwindow,
+ XA_WM_NORMAL_HINTS,
+ &new_hints,
+ &supplied);
+
+ /* as far as I can tell, "supplied" is just to check whether we had
+ * old-style normal hints without gravity, base size as returned by
+ * XGetNormalHints(), so we don't really use it as we fixup
+ * window->size_hints to have those fields if they're missing.
*/
- /* Put it back. */
+ if (new_hints != NULL)
+ {
+ window->size_hints = *new_hints;
+ XFree (new_hints);
+ new_hints = NULL;
+ }
+
+ /* Put back saved ConfigureRequest. */
window->size_hints.x = x;
window->size_hints.y = y;
window->size_hints.width = w;
diff --git a/src/xprops.c b/src/xprops.c
index bc66db2c..30de3286 100644
--- a/src/xprops.c
+++ b/src/xprops.c
@@ -3,6 +3,11 @@
/*
* Copyright (C) 2001 Havoc Pennington
* Copyright (C) 2002 Red Hat Inc.
+ *
+ * Some trivial property-unpacking code from Xlib:
+ * Copyright 1987, 1988, 1998 The Open Group
+ * Copyright 1988 by Wyse Technology, Inc., San Jose, Ca,
+ * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -20,6 +25,59 @@
* 02111-1307, USA.
*/
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca,
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL AND WYSE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL DIGITAL OR WYSE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/*
+
+Copyright 1987, 1988, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+
#include <config.h>
#include "xprops.h"
#include "errors.h"
@@ -703,6 +761,82 @@ meta_prop_get_class_hint (MetaDisplay *display,
return class_hint_from_results (&results, class_hint);
}
+static gboolean
+size_hints_from_results (GetPropertyResults *results,
+ XSizeHints **hints_p,
+ gulong *flags_p)
+{
+ xPropSizeHints *raw;
+ XSizeHints *hints;
+
+ *hints_p = NULL;
+ *flags_p = 0;
+
+ if (!validate_or_free_results (results, 32, XA_WM_SIZE_HINTS, FALSE))
+ return FALSE;
+
+ if (results->n_items < OldNumPropSizeElements)
+ return FALSE;
+
+ raw = (xPropSizeHints*) results->prop;
+
+ hints = ag_Xmalloc (sizeof (XSizeHints));
+
+ /* XSizeHints misdeclares these as int instead of long */
+ hints->flags = raw->flags;
+ hints->x = cvtINT32toInt (raw->x);
+ hints->y = cvtINT32toInt (raw->y);
+ hints->width = cvtINT32toInt (raw->width);
+ hints->height = cvtINT32toInt (raw->height);
+ hints->min_width = cvtINT32toInt (raw->minWidth);
+ hints->min_height = cvtINT32toInt (raw->minHeight);
+ hints->max_width = cvtINT32toInt (raw->maxWidth);
+ hints->max_height = cvtINT32toInt (raw->maxHeight);
+ hints->width_inc = cvtINT32toInt (raw->widthInc);
+ hints->height_inc = cvtINT32toInt (raw->heightInc);
+ hints->min_aspect.x = cvtINT32toInt (raw->minAspectX);
+ hints->min_aspect.y = cvtINT32toInt (raw->minAspectY);
+ hints->max_aspect.x = cvtINT32toInt (raw->maxAspectX);
+ hints->max_aspect.y = cvtINT32toInt (raw->maxAspectY);
+
+ *flags_p = (USPosition | USSize | PAllHints);
+ if (results->n_items >= NumPropSizeElements)
+ {
+ hints->base_width= cvtINT32toInt (raw->baseWidth);
+ hints->base_height= cvtINT32toInt (raw->baseHeight);
+ hints->win_gravity= cvtINT32toInt (raw->winGravity);
+ *flags_p |= (PBaseSize | PWinGravity);
+ }
+
+ hints->flags &= (*flags_p); /* get rid of unwanted bits */
+
+ XFree (results->prop);
+ results->prop = NULL;
+
+ *hints_p = hints;
+
+ return TRUE;
+}
+
+gboolean
+meta_prop_get_size_hints (MetaDisplay *display,
+ Window xwindow,
+ Atom xatom,
+ XSizeHints **hints_p,
+ gulong *flags_p)
+{
+ GetPropertyResults results;
+
+ *hints_p = NULL;
+ *flags_p = 0;
+
+ if (!get_property (display, xwindow, xatom, XA_WM_SIZE_HINTS,
+ &results))
+ return FALSE;
+
+ return size_hints_from_results (&results, hints_p, flags_p);
+}
+
static AgGetPropertyTask*
get_task (MetaDisplay *display,
Window xwindow,
@@ -772,6 +906,9 @@ meta_prop_get_values (MetaDisplay *display,
case META_PROP_VALUE_CLASS_HINT:
values[i].required_type = XA_STRING;
break;
+ case META_PROP_VALUE_SIZE_HINTS:
+ values[i].required_type = XA_WM_SIZE_HINTS;
+ break;
}
}
@@ -890,6 +1027,12 @@ meta_prop_get_values (MetaDisplay *display,
if (!class_hint_from_results (&results, &values[i].v.class_hint))
values[i].type = META_PROP_VALUE_INVALID;
break;
+ case META_PROP_VALUE_SIZE_HINTS:
+ if (!size_hints_from_results (&results,
+ &values[i].v.size_hints.hints,
+ &values[i].v.size_hints.flags))
+ values[i].type = META_PROP_VALUE_INVALID;
+ break;
}
next:
diff --git a/src/xprops.h b/src/xprops.h
index d1da7d99..0bdf4796 100644
--- a/src/xprops.h
+++ b/src/xprops.h
@@ -122,6 +122,12 @@ gboolean meta_prop_get_class_hint (MetaDisplay *display,
Atom xatom,
XClassHint *class_hint);
+gboolean meta_prop_get_size_hints (MetaDisplay *display,
+ Window xwindow,
+ Atom xatom,
+ XSizeHints **hints_p,
+ gulong *flags_p);
+
typedef enum
{
META_PROP_VALUE_INVALID,
@@ -135,7 +141,8 @@ typedef enum
META_PROP_VALUE_ATOM_LIST,
META_PROP_VALUE_TEXT_PROPERTY, /* comes back as UTF-8 string */
META_PROP_VALUE_WM_HINTS,
- META_PROP_VALUE_CLASS_HINT
+ META_PROP_VALUE_CLASS_HINT,
+ META_PROP_VALUE_SIZE_HINTS
} MetaPropValueType;
/* used to request/return/store property values */
@@ -156,6 +163,12 @@ typedef struct
struct
{
+ XSizeHints *hints;
+ unsigned long flags;
+ } size_hints;
+
+ struct
+ {
gulong *cardinals;
int n_cardinals;
} cardinal_list;