clean up using meta_prop_get_atom_list (update_mwm_hints): clean up using

2002-01-03  Havoc Pennington  <hp@pobox.com>

	* src/window.c (update_net_wm_state): clean up using
	meta_prop_get_atom_list
	(update_mwm_hints): clean up using meta_prop_get_motif_hints

	* src/Makefile.am (metacity_SOURCES): add xprops.[hc]

	* src/xprops.c: new file with convenience functions for X
	properties
This commit is contained in:
Havoc Pennington 2002-01-04 00:58:39 +00:00 committed by Havoc Pennington
parent ee1361fb6e
commit b9701454b8
5 changed files with 352 additions and 140 deletions

View File

@ -1,3 +1,14 @@
2002-01-03 Havoc Pennington <hp@pobox.com>
* src/window.c (update_net_wm_state): clean up using
meta_prop_get_atom_list
(update_mwm_hints): clean up using meta_prop_get_motif_hints
* src/Makefile.am (metacity_SOURCES): add xprops.[hc]
* src/xprops.c: new file with convenience functions for X
properties
2002-01-03 Havoc Pennington <hp@pobox.com>
* src/workspace.c (meta_workspace_activate): focus top window when

View File

@ -47,7 +47,9 @@ metacity_SOURCES= \
window.c \
window.h \
workspace.c \
workspace.h
workspace.h \
xprops.c \
xprops.h
bin_PROGRAMS=metacity

View File

@ -32,6 +32,7 @@
#include "session.h"
#include "effects.h"
#include "prefs.h"
#include "xprops.h"
#include <X11/Xatom.h>
@ -59,8 +60,8 @@ static int update_size_hints (MetaWindow *window);
static int update_title (MetaWindow *window);
static int update_protocols (MetaWindow *window);
static int update_wm_hints (MetaWindow *window);
static int update_net_wm_state (MetaWindow *window);
static int update_mwm_hints (MetaWindow *window);
static void update_net_wm_state (MetaWindow *window);
static void update_mwm_hints (MetaWindow *window);
static int update_wm_class (MetaWindow *window);
static int update_transient_for (MetaWindow *window);
static void update_sm_hints (MetaWindow *window);
@ -3248,116 +3249,52 @@ update_wm_hints (MetaWindow *window)
return meta_error_trap_pop (window->display);
}
static int
static void
update_net_wm_state (MetaWindow *window)
{
/* We know this is only on initial window creation,
* clients don't change the property.
*/
Atom type;
int format;
gulong n_atoms;
gulong bytes_after;
int n_atoms;
Atom *atoms;
int result;
int i;
window->shaded = FALSE;
window->maximized = FALSE;
window->wm_state_modal = FALSE;
meta_error_trap_push (window->display);
XGetWindowProperty (window->display->xdisplay, window->xwindow,
window->display->atom_net_wm_state,
0, G_MAXLONG,
False, XA_ATOM, &type, &format, &n_atoms,
&bytes_after, (guchar **)&atoms);
result = meta_error_trap_pop (window->display);
if (result != Success)
if (meta_prop_get_atom_list (window->display, window->xwindow,
window->display->atom_net_wm_state,
&atoms, &n_atoms))
{
recalc_window_type (window);
return result;
}
if (type != XA_ATOM)
{
recalc_window_type (window);
return -1; /* whatever */
}
i = 0;
while (i < n_atoms)
{
if (atoms[i] == window->display->atom_net_wm_state_shaded)
window->shaded = TRUE;
else if (atoms[i] == window->display->atom_net_wm_state_maximized_horz)
window->maximized = TRUE;
else if (atoms[i] == window->display->atom_net_wm_state_maximized_vert)
window->maximized = TRUE;
else if (atoms[i] == window->display->atom_net_wm_state_modal)
window->wm_state_modal = TRUE;
int i;
++i;
i = 0;
while (i < n_atoms)
{
if (atoms[i] == window->display->atom_net_wm_state_shaded)
window->shaded = TRUE;
else if (atoms[i] == window->display->atom_net_wm_state_maximized_horz)
window->maximized = TRUE;
else if (atoms[i] == window->display->atom_net_wm_state_maximized_vert)
window->maximized = TRUE;
else if (atoms[i] == window->display->atom_net_wm_state_modal)
window->wm_state_modal = TRUE;
++i;
}
XFree (atoms);
}
XFree (atoms);
recalc_window_type (window);
return Success;
}
/* I don't know of any docs anywhere on what the
* hell most of this means. Copied from Lesstif by
* way of GTK
*/
typedef struct {
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long input_mode;
unsigned long status;
} MotifWmHints, MwmHints;
#define MWM_HINTS_FUNCTIONS (1L << 0)
#define MWM_HINTS_DECORATIONS (1L << 1)
#define MWM_HINTS_INPUT_MODE (1L << 2)
#define MWM_HINTS_STATUS (1L << 3)
#define MWM_FUNC_ALL (1L << 0)
#define MWM_FUNC_RESIZE (1L << 1)
#define MWM_FUNC_MOVE (1L << 2)
#define MWM_FUNC_MINIMIZE (1L << 3)
#define MWM_FUNC_MAXIMIZE (1L << 4)
#define MWM_FUNC_CLOSE (1L << 5)
#define MWM_DECOR_ALL (1L << 0)
#define MWM_DECOR_BORDER (1L << 1)
#define MWM_DECOR_RESIZEH (1L << 2)
#define MWM_DECOR_TITLE (1L << 3)
#define MWM_DECOR_MENU (1L << 4)
#define MWM_DECOR_MINIMIZE (1L << 5)
#define MWM_DECOR_MAXIMIZE (1L << 6)
#define MWM_INPUT_MODELESS 0
#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
#define MWM_INPUT_SYSTEM_MODAL 2
#define MWM_INPUT_FULL_APPLICATION_MODAL 3
#define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL
#define MWM_TEAROFF_WINDOW (1L<<0)
static int
static void
update_mwm_hints (MetaWindow *window)
{
MotifWmHints *hints;
Atom type;
int format;
gulong nitems;
gulong bytes_after;
int result;
window->mwm_decorated = TRUE;
window->mwm_has_close_func = TRUE;
@ -3365,25 +3302,16 @@ update_mwm_hints (MetaWindow *window)
window->mwm_has_maximize_func = TRUE;
window->mwm_has_move_func = TRUE;
window->mwm_has_resize_func = TRUE;
meta_error_trap_push (window->display);
XGetWindowProperty (window->display->xdisplay, window->xwindow,
window->display->atom_motif_wm_hints,
0, sizeof (MotifWmHints)/sizeof (long),
False, AnyPropertyType, &type, &format, &nitems,
&bytes_after, (guchar **)&hints);
result = meta_error_trap_pop (window->display);
if (result != Success ||
type == None)
if (!meta_prop_get_motif_hints (window->display, window->xwindow,
window->display->atom_motif_wm_hints,
&hints))
{
meta_verbose ("Window %s has no MWM hints\n", window->desc);
/* may be Success, unused anyhow */
return result;
return;
}
/* We support MWM hints deemed non-stupid */
/* We support those MWM hints deemed non-stupid */
meta_verbose ("Window %s has MWM hints\n",
window->desc);
@ -3467,52 +3395,42 @@ update_mwm_hints (MetaWindow *window)
XFree (hints);
recalc_window_features (window);
return Success;
}
static gboolean
meta_window_get_icon_geometry (MetaWindow *window,
MetaRectangle *rect)
{
Atom type;
int format;
gulong nitems;
gulong bytes_after;
gulong *geometry;
int result;
meta_error_trap_push (window->display);
type = None;
XGetWindowProperty (window->display->xdisplay,
window->xwindow,
window->display->atom_net_wm_icon_geometry,
0, G_MAXLONG,
False, XA_CARDINAL, &type, &format, &nitems,
&bytes_after, ((guchar **)&geometry));
result = meta_error_trap_pop (window->display);
if (result != Success || type != XA_CARDINAL)
return FALSE;
gulong *geometry = NULL;
int nitems;
if (nitems != 4)
if (meta_prop_get_cardinal_list (window->display,
window->xwindow,
window->display->atom_net_wm_icon_geometry,
&geometry, &nitems))
{
if (nitems != 4)
{
meta_verbose ("_NET_WM_ICON_GEOMETRY on %s has %d values instead of 4\n",
window->desc, nitems);
XFree (geometry);
return FALSE;
}
if (rect)
{
rect->x = geometry[0];
rect->y = geometry[1];
rect->width = geometry[2];
rect->height = geometry[3];
}
XFree (geometry);
return FALSE;
}
if (rect)
{
rect->x = geometry[0];
rect->y = geometry[1];
rect->width = geometry[2];
rect->height = geometry[3];
return TRUE;
}
XFree (geometry);
return TRUE;
return FALSE;
}
static int

192
src/xprops.c Normal file
View File

@ -0,0 +1,192 @@
/* Metacity X property convenience routines */
/*
* Copyright (C) 2001 Havoc Pennington
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "xprops.h"
#include "errors.h"
#include "util.h"
#include <X11/Xatom.h>
static gboolean
check_type_and_format (MetaDisplay *display,
Window xwindow,
Atom xatom,
int expected_format,
Atom expected_type,
int format,
Atom type)
{
char *type_name;
char *expected_name;
char *prop_name;
if (expected_format == format &&
expected_type == type)
return TRUE;
meta_error_trap_push (display);
type_name = XGetAtomName (display->xdisplay, type);
expected_name = XGetAtomName (display->xdisplay, expected_type);
prop_name = XGetAtomName (display->xdisplay, xatom);
meta_error_trap_pop (display);
meta_warning (_("Window 0x%lx has property %s that was expected to have type %s format %d and actually has type %s format %d\n"),
xwindow,
prop_name ? prop_name : "(bad atom)",
expected_name ? expected_name : "(bad atom)",
expected_format,
type_name ? type_name : "(bad atom)",
format);
if (type_name)
XFree (type_name);
if (expected_name)
XFree (expected_name);
if (prop_name)
XFree (prop_name);
return FALSE;
}
gboolean
meta_prop_get_atom_list (MetaDisplay *display,
Window xwindow,
Atom xatom,
Atom **atoms_p,
int *n_atoms_p)
{
Atom type;
int format;
gulong n_atoms;
gulong bytes_after;
Atom *atoms;
*atoms_p = NULL;
*n_atoms_p = 0;
meta_error_trap_push (display);
if (XGetWindowProperty (display->xdisplay, xwindow, xatom,
0, G_MAXLONG,
False, XA_ATOM, &type, &format, &n_atoms,
&bytes_after, (guchar **)&atoms) != Success)
{
meta_error_trap_pop (display);
return FALSE;
}
if (meta_error_trap_pop (display) != Success)
return FALSE;
if (!check_type_and_format (display, xwindow, xatom, 32, XA_ATOM,
format, type))
{
XFree (atoms);
return FALSE;
}
*atoms_p = atoms;
*n_atoms_p = n_atoms;
return TRUE;
}
gboolean
meta_prop_get_cardinal_list (MetaDisplay *display,
Window xwindow,
Atom xatom,
gulong **cardinals_p,
int *n_cardinals_p)
{
Atom type;
int format;
gulong n_cardinals;
gulong bytes_after;
gulong *cardinals;
*cardinals_p = NULL;
*n_cardinals_p = 0;
meta_error_trap_push (display);
if (XGetWindowProperty (display->xdisplay, xwindow, xatom,
0, G_MAXLONG,
False, XA_CARDINAL, &type, &format, &n_cardinals,
&bytes_after, (guchar **)&cardinals) != Success)
{
meta_error_trap_pop (display);
return FALSE;
}
if (meta_error_trap_pop (display) != Success)
return FALSE;
if (!check_type_and_format (display, xwindow, xatom, 32, XA_CARDINAL,
format, type))
{
XFree (cardinals);
return FALSE;
}
*cardinals_p = cardinals;
*n_cardinals_p = n_cardinals;
return TRUE;
}
gboolean
meta_prop_get_motif_hints (MetaDisplay *display,
Window xwindow,
Atom xatom,
MotifWmHints **hints_p)
{
Atom type;
int format;
gulong bytes_after;
MotifWmHints *hints;
gulong n_items;
#define EXPECTED_ITEMS sizeof (MotifWmHints)/sizeof (gulong)
*hints_p = NULL;
meta_error_trap_push (display);
if (XGetWindowProperty (display->xdisplay, xwindow, xatom,
0, EXPECTED_ITEMS,
False, AnyPropertyType, &type, &format, &n_items,
&bytes_after, (guchar **)&hints) != Success)
{
meta_error_trap_pop (display);
return FALSE;
}
if (meta_error_trap_pop (display) != Success)
return FALSE;
if (type == None || n_items != EXPECTED_ITEMS)
{
meta_verbose ("Motif hints had unexpected type or n_items\n");
XFree (hints);
return FALSE;
}
*hints_p = hints;
return TRUE;
}

89
src/xprops.h Normal file
View File

@ -0,0 +1,89 @@
/* Metacity X property convenience routines */
/*
* Copyright (C) 2001 Havoc Pennington
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_XPROPS_H
#define META_XPROPS_H
#include "display.h"
#include <X11/Xutil.h>
/* Copied from Lesstif by way of GTK. Rudimentary docs can be
* found in some Motif reference guides online.
*/
typedef struct {
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long input_mode;
unsigned long status;
} MotifWmHints, MwmHints;
#define MWM_HINTS_FUNCTIONS (1L << 0)
#define MWM_HINTS_DECORATIONS (1L << 1)
#define MWM_HINTS_INPUT_MODE (1L << 2)
#define MWM_HINTS_STATUS (1L << 3)
#define MWM_FUNC_ALL (1L << 0)
#define MWM_FUNC_RESIZE (1L << 1)
#define MWM_FUNC_MOVE (1L << 2)
#define MWM_FUNC_MINIMIZE (1L << 3)
#define MWM_FUNC_MAXIMIZE (1L << 4)
#define MWM_FUNC_CLOSE (1L << 5)
#define MWM_DECOR_ALL (1L << 0)
#define MWM_DECOR_BORDER (1L << 1)
#define MWM_DECOR_RESIZEH (1L << 2)
#define MWM_DECOR_TITLE (1L << 3)
#define MWM_DECOR_MENU (1L << 4)
#define MWM_DECOR_MINIMIZE (1L << 5)
#define MWM_DECOR_MAXIMIZE (1L << 6)
#define MWM_INPUT_MODELESS 0
#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
#define MWM_INPUT_SYSTEM_MODAL 2
#define MWM_INPUT_FULL_APPLICATION_MODAL 3
#define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL
#define MWM_TEAROFF_WINDOW (1L<<0)
/* These all return the memory from Xlib, so require an XFree()
* when they return TRUE. They return TRUE on success.
*/
gboolean meta_prop_get_atom_list (MetaDisplay *display,
Window xwindow,
Atom xatom,
Atom **atoms_p,
int *n_atoms_p);
gboolean meta_prop_get_motif_hints (MetaDisplay *display,
Window xwindow,
Atom xatom,
MotifWmHints **hints_p);
gboolean meta_prop_get_cardinal_list (MetaDisplay *display,
Window xwindow,
Atom xatom,
gulong **cardinals_p,
int *n_cardinals_p);
#endif