2006-10-01 18:30:10 -04:00
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
Comprehensively rename to Mutter
Code:
All references in the code not related to themes, keybindings, or
GConf were changed from 'metacity' to 'mutter'. This includes, among other
things, strings, comments, the atoms used in the message protocol, and
the envvars used for debugging. The GConf schema file was reduced to
the 3 settings new to mutter.
The overall version was brought up to 2.27 to match current gnome.
Structure:
All files named '*metacity*' were renamed '*mutter*' with appropriate
changes in the automake system. Files removed are
doc/creating_themes, src/themes, doc/metacity-theme.dtd,
metacity.doap. These files will eventually end up in an external
gnome-wm-data module.
Installation location:
On the filesystem the mutter-plugindir was change from
$(libdir)/metacity/plugins/clutter to just $(libdir)/mutter/plugins.
The mutter-plugins.pc.in reflects these changes.
Note:
mutter.desktop.in and mutter-wm.desktop both continue to have
X-GNOME-WMSettingsModule=metacity set. This allows
gnome-control-center to continue using libmetacity.so for
configuration. This is fine since most the general keybindings and wm
settings are being read from /apps/metacity/* in gconf.
2009-06-10 06:29:20 -04:00
/* Mutter X property convenience routines */
2002-01-03 19:58:39 -05:00
2014-05-02 09:34:02 -04:00
/*
2002-01-03 19:58:39 -05:00
* Copyright ( C ) 2001 Havoc Pennington
2002-10-26 03:37:11 -04:00
* Copyright ( C ) 2002 Red Hat Inc .
2002-10-28 15:22:22 -05:00
*
* 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 ,
2014-05-02 09:34:02 -04:00
*
2002-01-03 19:58:39 -05:00
* 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 .
2014-05-02 09:34:02 -04:00
*
2002-01-03 19:58:39 -05:00
* You should have received a copy of the GNU General Public License
2014-01-11 20:42:06 -05:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2002-01-03 19:58:39 -05:00
*/
2002-10-28 15:22:22 -05:00
/***********************************************************
Copyright 1988 by Wyse Technology , Inc . , San Jose , Ca ,
Copyright 1987 by Digital Equipment Corporation , Maynard , Massachusetts ,
All Rights Reserved
2014-05-02 09:34:02 -04:00
Permission to use , copy , modify , and distribute this software and its
documentation for any purpose and without fee is hereby granted ,
2002-10-28 15:22:22 -05:00
provided that the above copyright notice appear in all copies and that
2014-05-02 09:34:02 -04:00
both that copyright notice and this permission notice appear in
2002-10-28 15:22:22 -05:00
supporting documentation , and that the name Digital not be
used in advertising or publicity pertaining to distribution of the
2014-05-02 09:34:02 -04:00
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
2002-10-28 15:22:22 -05:00
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 .
*/
2002-01-03 19:58:39 -05:00
# include <config.h>
# include "xprops.h"
2011-03-05 19:29:12 -05:00
# include <meta/errors.h>
2013-09-11 04:18:53 -04:00
# include "util-private.h"
2002-10-26 03:37:11 -04:00
# include "async-getprop.h"
2002-10-26 12:40:50 -04:00
# include "ui.h"
Comprehensively rename to Mutter
Code:
All references in the code not related to themes, keybindings, or
GConf were changed from 'metacity' to 'mutter'. This includes, among other
things, strings, comments, the atoms used in the message protocol, and
the envvars used for debugging. The GConf schema file was reduced to
the 3 settings new to mutter.
The overall version was brought up to 2.27 to match current gnome.
Structure:
All files named '*metacity*' were renamed '*mutter*' with appropriate
changes in the automake system. Files removed are
doc/creating_themes, src/themes, doc/metacity-theme.dtd,
metacity.doap. These files will eventually end up in an external
gnome-wm-data module.
Installation location:
On the filesystem the mutter-plugindir was change from
$(libdir)/metacity/plugins/clutter to just $(libdir)/mutter/plugins.
The mutter-plugins.pc.in reflects these changes.
Note:
mutter.desktop.in and mutter-wm.desktop both continue to have
X-GNOME-WMSettingsModule=metacity set. This allows
gnome-control-center to continue using libmetacity.so for
configuration. This is fine since most the general keybindings and wm
settings are being read from /apps/metacity/* in gconf.
2009-06-10 06:29:20 -04:00
# include "mutter-Xatomtype.h"
2002-01-03 19:58:39 -05:00
# include <X11/Xatom.h>
2002-06-22 00:52:35 -04:00
# include <string.h>
2008-05-18 20:00:09 -04:00
# include "window-private.h"
2002-01-03 19:58:39 -05:00
2002-10-26 03:37:11 -04:00
typedef struct
{
MetaDisplay * display ;
Window xwindow ;
Atom xatom ;
Atom type ;
int format ;
unsigned long n_items ;
unsigned long bytes_after ;
unsigned char * prop ;
} GetPropertyResults ;
2002-01-03 19:58:39 -05:00
static gboolean
2002-10-26 03:37:11 -04:00
validate_or_free_results ( GetPropertyResults * results ,
int expected_format ,
Atom expected_type ,
gboolean must_have_items )
2002-01-03 19:58:39 -05:00
{
char * type_name ;
char * expected_name ;
char * prop_name ;
2002-12-15 16:59:38 -05:00
const char * title ;
const char * res_class ;
const char * res_name ;
MetaWindow * w ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( expected_format = = results - > format & &
expected_type = = results - > type & &
( ! must_have_items | | results - > n_items > 0 ) )
2014-05-02 09:34:02 -04:00
return TRUE ;
2002-10-26 03:37:11 -04:00
meta_error_trap_push ( results - > display ) ;
type_name = XGetAtomName ( results - > display - > xdisplay , results - > type ) ;
expected_name = XGetAtomName ( results - > display - > xdisplay , expected_type ) ;
prop_name = XGetAtomName ( results - > display - > xdisplay , results - > xatom ) ;
2010-10-25 14:44:30 -04:00
meta_error_trap_pop ( results - > display ) ;
2002-01-03 19:58:39 -05:00
2002-12-15 16:59:38 -05:00
w = meta_display_lookup_x_window ( results - > display , results - > xwindow ) ;
if ( w ! = NULL )
{
title = w - > title ;
res_class = w - > res_class ;
res_name = w - > res_name ;
}
else
{
title = NULL ;
res_class = NULL ;
res_name = NULL ;
}
2014-05-02 09:34:02 -04:00
2002-12-15 16:59:38 -05:00
if ( title = = NULL )
title = " unknown " ;
if ( res_class = = NULL )
res_class = " unknown " ;
if ( res_name = = NULL )
res_name = " unknown " ;
2014-05-02 09:34:02 -04:00
2013-09-11 04:37:36 -04:00
meta_warning ( " Window 0x%lx has property %s \n that was expected to have type %s format %d \n and actually has type %s format %d n_items %d. \n This is most likely an application bug, not a window manager bug. \n The window has title= \" %s \" class= \" %s \" name= \" %s \" \n " ,
2002-10-26 03:37:11 -04:00
results - > xwindow ,
2002-01-03 19:58:39 -05:00
prop_name ? prop_name : " (bad atom) " ,
expected_name ? expected_name : " (bad atom) " ,
expected_format ,
type_name ? type_name : " (bad atom) " ,
2002-12-15 13:55:08 -05:00
results - > format , ( int ) results - > n_items ,
2002-12-15 16:59:38 -05:00
title , res_class , res_name ) ;
2002-01-03 19:58:39 -05:00
if ( type_name )
XFree ( type_name ) ;
if ( expected_name )
XFree ( expected_name ) ;
if ( prop_name )
XFree ( prop_name ) ;
2002-10-26 03:37:11 -04:00
if ( results - > prop )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
}
2014-05-02 09:34:02 -04:00
2002-01-03 19:58:39 -05:00
return FALSE ;
}
2002-10-26 03:37:11 -04:00
static gboolean
get_property ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
Atom req_type ,
GetPropertyResults * results )
2002-01-03 19:58:39 -05:00
{
2002-10-26 03:37:11 -04:00
results - > display = display ;
results - > xwindow = xwindow ;
results - > xatom = xatom ;
results - > prop = NULL ;
results - > n_items = 0 ;
results - > type = None ;
results - > bytes_after = 0 ;
results - > format = 0 ;
2014-05-02 09:34:02 -04:00
2014-04-06 15:52:44 -04:00
meta_error_trap_push ( display ) ;
2002-01-03 19:58:39 -05:00
if ( XGetWindowProperty ( display - > xdisplay , xwindow , xatom ,
0 , G_MAXLONG ,
2002-10-26 03:37:11 -04:00
False , req_type , & results - > type , & results - > format ,
& results - > n_items ,
& results - > bytes_after ,
2008-12-01 17:54:57 -05:00
& results - > prop ) ! = Success | |
2002-10-26 03:37:11 -04:00
results - > type = = None )
2002-01-03 19:58:39 -05:00
{
2002-10-26 03:37:11 -04:00
if ( results - > prop )
XFree ( results - > prop ) ;
2010-10-25 14:44:30 -04:00
meta_error_trap_pop_with_return ( display ) ;
2002-01-03 19:58:39 -05:00
return FALSE ;
}
2010-10-25 14:44:30 -04:00
if ( meta_error_trap_pop_with_return ( display ) ! = Success )
2002-01-03 19:58:39 -05:00
{
2002-10-26 03:37:11 -04:00
if ( results - > prop )
XFree ( results - > prop ) ;
2002-01-03 19:58:39 -05:00
return FALSE ;
}
2002-10-26 03:37:11 -04:00
return TRUE ;
}
static gboolean
atom_list_from_results ( GetPropertyResults * results ,
Atom * * atoms_p ,
int * n_atoms_p )
{
if ( ! validate_or_free_results ( results , 32 , XA_ATOM , FALSE ) )
2014-05-02 09:34:02 -04:00
return FALSE ;
2002-01-03 19:58:39 -05:00
2002-10-26 03:37:11 -04:00
* atoms_p = ( Atom * ) results - > prop ;
* n_atoms_p = results - > n_items ;
2014-05-02 09:34:02 -04:00
results - > prop = NULL ;
2002-10-26 03:37:11 -04:00
return TRUE ;
}
gboolean
meta_prop_get_atom_list ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
Atom * * atoms_p ,
int * n_atoms_p )
{
GetPropertyResults results ;
* atoms_p = NULL ;
* n_atoms_p = 0 ;
if ( ! get_property ( display , xwindow , xatom , XA_ATOM ,
& results ) )
return FALSE ;
return atom_list_from_results ( & results , atoms_p , n_atoms_p ) ;
}
static gboolean
cardinal_list_from_results ( GetPropertyResults * results ,
gulong * * cardinals_p ,
int * n_cardinals_p )
{
if ( ! validate_or_free_results ( results , 32 , XA_CARDINAL , FALSE ) )
2014-05-02 09:34:02 -04:00
return FALSE ;
2002-10-26 03:37:11 -04:00
* cardinals_p = ( gulong * ) results - > prop ;
* n_cardinals_p = results - > n_items ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2010-01-21 10:10:44 -05:00
# if GLIB_SIZEOF_LONG == 8
/* Xlib sign-extends format=32 items, but we want them unsigned */
{
int i ;
for ( i = 0 ; i < * n_cardinals_p ; i + + )
( * cardinals_p ) [ i ] = ( * cardinals_p ) [ i ] & 0xffffffff ;
}
# endif
2002-01-03 19:58:39 -05:00
return TRUE ;
}
gboolean
meta_prop_get_cardinal_list ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
gulong * * cardinals_p ,
int * n_cardinals_p )
{
2002-10-26 03:37:11 -04:00
GetPropertyResults results ;
2002-01-03 19:58:39 -05:00
* cardinals_p = NULL ;
* n_cardinals_p = 0 ;
2002-10-26 03:37:11 -04:00
if ( ! get_property ( display , xwindow , xatom , XA_CARDINAL ,
& results ) )
2002-01-03 19:58:39 -05:00
return FALSE ;
2002-10-26 03:37:11 -04:00
return cardinal_list_from_results ( & results , cardinals_p , n_cardinals_p ) ;
2002-01-03 19:58:39 -05:00
}
2002-10-26 03:37:11 -04:00
static gboolean
motif_hints_from_results ( GetPropertyResults * results ,
MotifWmHints * * hints_p )
2002-01-03 19:58:39 -05:00
{
2002-08-10 14:12:36 -04:00
int real_size , max_size ;
# define MAX_ITEMS sizeof (MotifWmHints) / sizeof (gulong)
2014-05-02 09:34:02 -04:00
* hints_p = NULL ;
2002-01-03 19:58:39 -05:00
2002-10-26 03:37:11 -04:00
if ( results - > type = = None | | results - > n_items < = 0 )
2002-01-03 19:58:39 -05:00
{
meta_verbose ( " Motif hints had unexpected type or n_items \n " ) ;
2002-10-26 03:37:11 -04:00
if ( results - > prop )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
}
2002-01-03 19:58:39 -05:00
return FALSE ;
}
2002-08-10 14:12:36 -04:00
/* The issue here is that some old crufty code will set a smaller
* MotifWmHints than the one we expect , apparently . I ' m not sure of
* the history behind it . See bug # 89841 for example .
*/
2002-10-26 03:37:11 -04:00
* hints_p = ag_Xmalloc ( sizeof ( MotifWmHints ) ) ;
if ( * hints_p = = NULL )
{
if ( results - > prop )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
}
return FALSE ;
}
real_size = results - > n_items * sizeof ( gulong ) ;
2002-08-10 14:12:36 -04:00
max_size = MAX_ITEMS * sizeof ( gulong ) ;
2002-10-26 03:37:11 -04:00
memcpy ( * hints_p , results - > prop , MIN ( real_size , max_size ) ) ;
2002-08-10 14:12:36 -04:00
2002-10-26 03:37:11 -04:00
if ( results - > prop )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
}
2014-05-02 09:34:02 -04:00
2002-01-03 19:58:39 -05:00
return TRUE ;
}
2002-01-03 22:25:53 -05:00
gboolean
2002-10-26 03:37:11 -04:00
meta_prop_get_motif_hints ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
MotifWmHints * * hints_p )
2002-01-03 22:25:53 -05:00
{
2002-10-26 03:37:11 -04:00
GetPropertyResults results ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
* hints_p = NULL ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
if ( ! get_property ( display , xwindow , xatom , AnyPropertyType ,
& results ) )
2002-01-03 22:25:53 -05:00
return FALSE ;
2002-10-26 03:37:11 -04:00
return motif_hints_from_results ( & results , hints_p ) ;
}
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
static gboolean
latin1_string_from_results ( GetPropertyResults * results ,
char * * str_p )
{
* str_p = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( ! validate_or_free_results ( results , 8 , XA_STRING , FALSE ) )
return FALSE ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
* str_p = ( char * ) results - > prop ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2002-01-03 22:25:53 -05:00
return TRUE ;
}
gboolean
2002-10-26 03:37:11 -04:00
meta_prop_get_latin1_string ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
char * * str_p )
2002-01-03 22:25:53 -05:00
{
2002-10-26 03:37:11 -04:00
GetPropertyResults results ;
2002-01-03 22:25:53 -05:00
* str_p = NULL ;
2002-10-26 03:37:11 -04:00
if ( ! get_property ( display , xwindow , xatom , XA_STRING ,
& results ) )
2002-01-03 22:25:53 -05:00
return FALSE ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
return latin1_string_from_results ( & results , str_p ) ;
}
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
static gboolean
utf8_string_from_results ( GetPropertyResults * results ,
char * * str_p )
{
* str_p = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( ! validate_or_free_results ( results , 8 ,
2008-05-02 14:49:01 -04:00
results - > display - > atom_UTF8_STRING , FALSE ) )
2002-10-26 03:37:11 -04:00
return FALSE ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
if ( results - > n_items > 0 & &
2006-04-13 09:16:42 -04:00
! g_utf8_validate ( ( gchar * ) results - > prop , results - > n_items , NULL ) )
2002-01-03 22:25:53 -05:00
{
char * name ;
2002-10-26 03:37:11 -04:00
name = XGetAtomName ( results - > display - > xdisplay , results - > xatom ) ;
2013-09-11 04:37:36 -04:00
meta_warning ( " Property %s on window 0x%lx contained invalid UTF-8 \n " ,
2002-10-26 03:37:11 -04:00
name , results - > xwindow ) ;
2002-06-08 19:55:27 -04:00
meta_XFree ( name ) ;
2002-10-26 03:37:11 -04:00
XFree ( results - > prop ) ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2002-01-03 22:25:53 -05:00
return FALSE ;
}
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
* str_p = ( char * ) results - > prop ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2002-01-03 22:25:53 -05:00
return TRUE ;
}
2002-06-22 00:52:35 -04:00
gboolean
2002-10-26 03:37:11 -04:00
meta_prop_get_utf8_string ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
char * * str_p )
{
GetPropertyResults results ;
* str_p = NULL ;
if ( ! get_property ( display , xwindow , xatom ,
2008-05-02 14:49:01 -04:00
display - > atom_UTF8_STRING ,
2002-10-26 03:37:11 -04:00
& results ) )
return FALSE ;
return utf8_string_from_results ( & results , str_p ) ;
}
/* this one freakishly returns g_malloc memory */
static gboolean
utf8_list_from_results ( GetPropertyResults * results ,
char * * * str_p ,
int * n_str_p )
2002-06-22 00:52:35 -04:00
{
int i ;
int n_strings ;
char * * retval ;
const char * p ;
2014-05-02 09:34:02 -04:00
2002-06-22 00:52:35 -04:00
* str_p = NULL ;
* n_str_p = 0 ;
2002-10-26 03:37:11 -04:00
if ( ! validate_or_free_results ( results , 8 ,
2008-05-02 14:49:01 -04:00
results - > display - > atom_UTF8_STRING , FALSE ) )
2002-06-22 00:52:35 -04:00
return FALSE ;
2014-05-02 09:34:02 -04:00
2002-06-22 00:52:35 -04:00
/* I'm not sure this is right, but I'm guessing the
* property is nul - separated
*/
i = 0 ;
2003-07-31 05:35:56 -04:00
n_strings = 0 ;
2002-10-26 03:37:11 -04:00
while ( i < ( int ) results - > n_items )
2002-06-22 00:52:35 -04:00
{
2002-10-26 03:37:11 -04:00
if ( results - > prop [ i ] = = ' \0 ' )
2002-06-22 00:52:35 -04:00
+ + n_strings ;
+ + i ;
}
2003-07-31 05:35:56 -04:00
if ( results - > prop [ results - > n_items - 1 ] ! = ' \0 ' )
+ + n_strings ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
/* we're guaranteed that results->prop has a nul on the end
2002-06-22 00:52:35 -04:00
* by XGetWindowProperty
*/
2014-05-02 09:34:02 -04:00
2002-06-22 00:52:35 -04:00
retval = g_new0 ( char * , n_strings + 1 ) ;
2006-04-13 09:16:42 -04:00
p = ( char * ) results - > prop ;
2002-06-22 00:52:35 -04:00
i = 0 ;
while ( i < n_strings )
{
if ( ! g_utf8_validate ( p , - 1 , NULL ) )
{
char * name ;
2002-10-26 03:37:11 -04:00
meta_error_trap_push ( results - > display ) ;
name = XGetAtomName ( results - > display - > xdisplay , results - > xatom ) ;
2010-10-25 14:44:30 -04:00
meta_error_trap_pop ( results - > display ) ;
2013-09-11 04:37:36 -04:00
meta_warning ( " Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list \n " ,
2002-10-26 03:37:11 -04:00
name , results - > xwindow , i ) ;
2002-06-22 00:52:35 -04:00
meta_XFree ( name ) ;
2002-10-26 03:37:11 -04:00
meta_XFree ( results - > prop ) ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2002-06-22 00:52:35 -04:00
g_strfreev ( retval ) ;
return FALSE ;
}
retval [ i ] = g_strdup ( p ) ;
2014-05-02 09:34:02 -04:00
2002-06-22 00:52:35 -04:00
p = p + strlen ( p ) + 1 ;
+ + i ;
}
2014-05-02 09:34:02 -04:00
2002-06-22 00:52:35 -04:00
* str_p = retval ;
* n_str_p = i ;
2002-10-26 03:37:11 -04:00
meta_XFree ( results - > prop ) ;
results - > prop = NULL ;
2002-06-22 00:52:35 -04:00
return TRUE ;
}
2002-10-26 03:37:11 -04:00
/* returns g_malloc not Xmalloc memory */
2002-01-03 22:25:53 -05:00
gboolean
2002-10-26 03:37:11 -04:00
meta_prop_get_utf8_list ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
char * * * str_p ,
int * n_str_p )
2002-01-03 22:25:53 -05:00
{
2002-10-26 03:37:11 -04:00
GetPropertyResults results ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
* str_p = NULL ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
if ( ! get_property ( display , xwindow , xatom ,
2008-05-02 14:49:01 -04:00
display - > atom_UTF8_STRING ,
2002-10-26 03:37:11 -04:00
& results ) )
2002-01-03 22:25:53 -05:00
return FALSE ;
2002-10-26 03:37:11 -04:00
return utf8_list_from_results ( & results , str_p , n_str_p ) ;
}
2002-01-03 22:25:53 -05:00
2013-09-04 05:11:39 -04:00
/* this one freakishly returns g_malloc memory */
static gboolean
latin1_list_from_results ( GetPropertyResults * results ,
char * * * str_p ,
int * n_str_p )
{
int i ;
int n_strings ;
char * * retval ;
const char * p ;
2014-05-02 09:34:02 -04:00
2013-09-04 05:11:39 -04:00
* str_p = NULL ;
* n_str_p = 0 ;
if ( ! validate_or_free_results ( results , 8 , XA_STRING , FALSE ) )
return FALSE ;
2014-05-02 09:34:02 -04:00
2013-09-04 05:11:39 -04:00
/* I'm not sure this is right, but I'm guessing the
* property is nul - separated
*/
i = 0 ;
n_strings = 0 ;
while ( i < ( int ) results - > n_items )
{
if ( results - > prop [ i ] = = ' \0 ' )
+ + n_strings ;
+ + i ;
}
if ( results - > prop [ results - > n_items - 1 ] ! = ' \0 ' )
+ + n_strings ;
2014-05-02 09:34:02 -04:00
2013-09-04 05:11:39 -04:00
/* we're guaranteed that results->prop has a nul on the end
* by XGetWindowProperty
*/
2014-05-02 09:34:02 -04:00
2013-09-04 05:11:39 -04:00
retval = g_new0 ( char * , n_strings + 1 ) ;
p = ( char * ) results - > prop ;
i = 0 ;
while ( i < n_strings )
{
retval [ i ] = g_strdup ( p ) ;
2014-05-02 09:34:02 -04:00
2013-09-04 05:11:39 -04:00
p = p + strlen ( p ) + 1 ;
+ + i ;
}
2014-05-02 09:34:02 -04:00
2013-09-04 05:11:39 -04:00
* str_p = retval ;
* n_str_p = i ;
meta_XFree ( results - > prop ) ;
results - > prop = NULL ;
return TRUE ;
}
gboolean
meta_prop_get_latin1_list ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
char * * * str_p ,
int * n_str_p )
{
GetPropertyResults results ;
* str_p = NULL ;
if ( ! get_property ( display , xwindow , xatom ,
XA_STRING , & results ) )
return FALSE ;
return latin1_list_from_results ( & results , str_p , n_str_p ) ;
}
2005-10-03 14:13:45 -04:00
void
meta_prop_set_utf8_string_hint ( MetaDisplay * display ,
Window xwindow ,
Atom atom ,
const char * val )
{
meta_error_trap_push ( display ) ;
2014-05-02 09:34:02 -04:00
XChangeProperty ( display - > xdisplay ,
2005-10-03 14:13:45 -04:00
xwindow , atom ,
2014-05-02 09:34:02 -04:00
display - > atom_UTF8_STRING ,
2005-10-03 14:13:45 -04:00
8 , PropModeReplace , ( guchar * ) val , strlen ( val ) ) ;
2010-10-25 14:44:30 -04:00
meta_error_trap_pop ( display ) ;
2005-10-03 14:13:45 -04:00
}
2002-10-26 03:37:11 -04:00
static gboolean
window_from_results ( GetPropertyResults * results ,
Window * window_p )
{
if ( ! validate_or_free_results ( results , 32 , XA_WINDOW , TRUE ) )
2014-05-02 09:34:02 -04:00
return FALSE ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
* window_p = * ( Window * ) results - > prop ;
XFree ( results - > prop ) ;
2014-05-02 09:34:02 -04:00
results - > prop = NULL ;
2002-01-03 22:25:53 -05:00
return TRUE ;
}
2002-12-09 22:23:04 -05:00
static gboolean
counter_from_results ( GetPropertyResults * results ,
XSyncCounter * counter_p )
{
if ( ! validate_or_free_results ( results , 32 ,
Fix bug 143333, support for update counter spec, and 109362, schedule
Sat Jun 19 02:21:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
Fix bug 143333, support for update counter spec, and 109362,
schedule compensation events when events are ignored.
* src/display.c (meta_display_open): Add _NET_WM_SYNC_REQUEST and
_NET_WM_SYNC_REQUEST_COUNTER atoms. Remove the old
METACITY_SYNC_COUNTER stuff.
(meta_display_begin_op): Setup the sync counter
* src/xprops.c, src/xprops.h, src/window-props.c, src/display.h:
Add new atoms.
* src/window.c (send_sync_request): new function.
(meta_window_move_resize_internal): send a sync request before
resizing.
(check_move_resize_frequence): Rework logic to also check the SYNC
case. If an event is ignored return the remaining time.
(update_resize_timeout): Timeout that gets called when a
compensation event is scheduled.
(uddate_resize): schedule compensation events when an event is
ignored.
(meta_window_handle_mouse_grap_op_event): When an alarm is
received and sync was turned off, turn it back on.
* src/window.h (struct MetaWindow) Add some variables
2004-06-18 20:45:24 -04:00
XA_CARDINAL ,
2002-12-09 22:23:04 -05:00
TRUE ) )
2014-05-02 09:34:02 -04:00
return FALSE ;
2002-12-09 22:23:04 -05:00
* counter_p = * ( XSyncCounter * ) results - > prop ;
XFree ( results - > prop ) ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2002-12-09 22:23:04 -05:00
return TRUE ;
}
2011-06-08 10:01:30 -04:00
static gboolean
counter_list_from_results ( GetPropertyResults * results ,
XSyncCounter * * counters_p ,
int * n_counters_p )
{
if ( ! validate_or_free_results ( results , 32 ,
XA_CARDINAL ,
FALSE ) )
return FALSE ;
* counters_p = ( XSyncCounter * ) results - > prop ;
* n_counters_p = results - > n_items ;
results - > prop = NULL ;
return TRUE ;
}
2002-12-09 22:23:04 -05:00
2002-10-26 03:37:11 -04:00
gboolean
meta_prop_get_window ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
Window * window_p )
{
GetPropertyResults results ;
* window_p = None ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( ! get_property ( display , xwindow , xatom , XA_WINDOW ,
& results ) )
return FALSE ;
return window_from_results ( & results , window_p ) ;
}
2002-01-03 22:25:53 -05:00
gboolean
meta_prop_get_cardinal ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
gulong * cardinal_p )
{
return meta_prop_get_cardinal_with_atom_type ( display , xwindow , xatom ,
XA_CARDINAL , cardinal_p ) ;
}
2002-10-26 03:37:11 -04:00
static gboolean
cardinal_with_atom_type_from_results ( GetPropertyResults * results ,
Atom prop_type ,
gulong * cardinal_p )
{
if ( ! validate_or_free_results ( results , 32 , prop_type , TRUE ) )
2014-05-02 09:34:02 -04:00
return FALSE ;
2002-10-26 03:37:11 -04:00
* cardinal_p = * ( gulong * ) results - > prop ;
2010-01-21 10:10:44 -05:00
# if GLIB_SIZEOF_LONG == 8
/* Xlib sign-extends format=32 items, but we want them unsigned */
* cardinal_p & = 0xffffffff ;
# endif
2002-10-26 03:37:11 -04:00
XFree ( results - > prop ) ;
2014-05-02 09:34:02 -04:00
results - > prop = NULL ;
2002-10-26 03:37:11 -04:00
return TRUE ;
}
2002-01-03 22:25:53 -05:00
gboolean
meta_prop_get_cardinal_with_atom_type ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
Atom prop_type ,
gulong * cardinal_p )
{
2002-10-26 03:37:11 -04:00
GetPropertyResults results ;
2002-01-03 22:25:53 -05:00
* cardinal_p = 0 ;
2002-10-26 03:37:11 -04:00
if ( ! get_property ( display , xwindow , xatom , prop_type ,
& results ) )
2002-01-03 22:25:53 -05:00
return FALSE ;
2002-10-26 03:37:11 -04:00
return cardinal_with_atom_type_from_results ( & results , prop_type , cardinal_p ) ;
}
2014-04-06 17:03:53 -04:00
static char *
text_property_to_utf8 ( Display * xdisplay ,
const XTextProperty * prop )
{
char * ret = NULL ;
char * * local_list = NULL ;
int count = 0 ;
int res ;
res = XmbTextPropertyToTextList ( xdisplay , prop , & local_list , & count ) ;
if ( res = = XNoMemory | | res = = XLocaleNotSupported | | res = = XConverterNotFound )
goto out ;
if ( count = = 0 )
goto out ;
ret = g_strdup ( local_list [ 0 ] ) ;
out :
meta_XFree ( local_list ) ;
return ret ;
}
2002-10-26 12:40:50 -04:00
static gboolean
text_property_from_results ( GetPropertyResults * results ,
char * * utf8_str_p )
{
XTextProperty tp ;
* utf8_str_p = NULL ;
2014-04-06 17:03:53 -04:00
2002-10-26 12:40:50 -04:00
tp . value = results - > prop ;
results - > prop = NULL ;
tp . encoding = results - > type ;
tp . format = results - > format ;
2014-05-02 09:34:02 -04:00
tp . nitems = results - > n_items ;
2014-04-06 17:03:53 -04:00
* utf8_str_p = text_property_to_utf8 ( results - > display - > xdisplay , & tp ) ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( tp . value ! = NULL )
XFree ( tp . value ) ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
return * utf8_str_p ! = NULL ;
}
gboolean
meta_prop_get_text_property ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
char * * utf8_str_p )
{
GetPropertyResults results ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( ! get_property ( display , xwindow , xatom , AnyPropertyType ,
& results ) )
return FALSE ;
return text_property_from_results ( & results , utf8_str_p ) ;
}
/* From Xmd.h */
# ifndef cvtINT32toInt
2003-09-29 14:16:45 -04:00
# if SIZEOF_VOID_P == 8
2008-11-25 18:18:08 -05:00
# define cvtINT8toInt(val) ((((unsigned int)val) & 0x00000080) ? (((unsigned int)val) | 0xffffffffffffff00) : ((unsigned int)val))
# define cvtINT16toInt(val) ((((unsigned int)val) & 0x00008000) ? (((unsigned int)val) | 0xffffffffffff0000) : ((unsigned int)val))
# define cvtINT32toInt(val) ((((unsigned int)val) & 0x80000000) ? (((unsigned int)val) | 0xffffffff00000000) : ((unsigned int)val))
2002-10-26 12:40:50 -04:00
# define cvtINT8toShort(val) cvtINT8toInt(val)
# define cvtINT16toShort(val) cvtINT16toInt(val)
# define cvtINT32toShort(val) cvtINT32toInt(val)
# define cvtINT8toLong(val) cvtINT8toInt(val)
# define cvtINT16toLong(val) cvtINT16toInt(val)
# define cvtINT32toLong(val) cvtINT32toInt(val)
# else
# define cvtINT8toInt(val) (val)
# define cvtINT16toInt(val) (val)
# define cvtINT32toInt(val) (val)
# define cvtINT8toShort(val) (val)
# define cvtINT16toShort(val) (val)
# define cvtINT32toShort(val) (val)
# define cvtINT8toLong(val) (val)
# define cvtINT16toLong(val) (val)
# define cvtINT32toLong(val) (val)
2003-09-29 14:16:45 -04:00
# endif /* SIZEOF_VOID_P == 8 */
2002-10-26 12:40:50 -04:00
# endif /* cvtINT32toInt() */
static gboolean
wm_hints_from_results ( GetPropertyResults * results ,
XWMHints * * hints_p )
{
XWMHints * hints ;
xPropWMHints * raw ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
* hints_p = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( ! validate_or_free_results ( results , 32 , XA_WM_HINTS , TRUE ) )
2014-05-02 09:34:02 -04:00
return FALSE ;
2002-10-26 12:40:50 -04:00
2014-05-02 09:34:02 -04:00
/* pre-R3 bogusly truncated window_group, don't fail on them */
2002-10-26 12:40:50 -04:00
if ( results - > n_items < ( NumPropWMHintsElements - 1 ) )
{
meta_verbose ( " WM_HINTS property too short: %d should be %d \n " ,
( int ) results - > n_items , NumPropWMHintsElements - 1 ) ;
if ( results - > prop )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
}
return FALSE ;
}
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
hints = ag_Xmalloc0 ( sizeof ( XWMHints ) ) ;
raw = ( xPropWMHints * ) results - > prop ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
hints - > flags = raw - > flags ;
hints - > input = ( raw - > input ? True : False ) ;
hints - > initial_state = cvtINT32toInt ( raw - > initialState ) ;
hints - > icon_pixmap = raw - > iconPixmap ;
hints - > icon_window = raw - > iconWindow ;
hints - > icon_x = cvtINT32toInt ( raw - > iconX ) ;
hints - > icon_y = cvtINT32toInt ( raw - > iconY ) ;
hints - > icon_mask = raw - > iconMask ;
if ( results - > n_items > = NumPropWMHintsElements )
hints - > window_group = raw - > windowGroup ;
else
hints - > window_group = 0 ;
if ( results - > prop )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
}
* hints_p = hints ;
return TRUE ;
}
gboolean
meta_prop_get_wm_hints ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
XWMHints * * hints_p )
{
GetPropertyResults results ;
* hints_p = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( ! get_property ( display , xwindow , xatom , XA_WM_HINTS ,
& results ) )
return FALSE ;
return wm_hints_from_results ( & results , hints_p ) ;
}
static gboolean
class_hint_from_results ( GetPropertyResults * results ,
XClassHint * class_hint )
{
int len_name , len_class ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
class_hint - > res_class = NULL ;
class_hint - > res_name = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( ! validate_or_free_results ( results , 8 , XA_STRING , FALSE ) )
return FALSE ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
len_name = strlen ( ( char * ) results - > prop ) ;
if ( ! ( class_hint - > res_name = ag_Xmalloc ( len_name + 1 ) ) )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
return FALSE ;
}
2014-05-02 09:34:02 -04:00
2006-04-13 09:16:42 -04:00
strcpy ( class_hint - > res_name , ( char * ) results - > prop ) ;
2002-10-26 12:40:50 -04:00
if ( len_name = = ( int ) results - > n_items )
len_name - - ;
2014-05-02 09:34:02 -04:00
2006-04-13 09:16:42 -04:00
len_class = strlen ( ( char * ) results - > prop + len_name + 1 ) ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( ! ( class_hint - > res_class = ag_Xmalloc ( len_class + 1 ) ) )
{
XFree ( class_hint - > res_name ) ;
class_hint - > res_name = NULL ;
XFree ( results - > prop ) ;
results - > prop = NULL ;
return FALSE ;
}
2014-05-02 09:34:02 -04:00
2006-04-13 09:16:42 -04:00
strcpy ( class_hint - > res_class , ( char * ) results - > prop + len_name + 1 ) ;
2002-10-26 12:40:50 -04:00
XFree ( results - > prop ) ;
results - > prop = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
return TRUE ;
}
gboolean
meta_prop_get_class_hint ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
XClassHint * class_hint )
{
GetPropertyResults results ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
class_hint - > res_class = NULL ;
class_hint - > res_name = NULL ;
2014-05-02 09:34:02 -04:00
2002-10-26 12:40:50 -04:00
if ( ! get_property ( display , xwindow , xatom , XA_STRING ,
& results ) )
return FALSE ;
return class_hint_from_results ( & results , class_hint ) ;
}
2002-10-28 15:22:22 -05:00
static gboolean
size_hints_from_results ( GetPropertyResults * results ,
XSizeHints * * hints_p ,
gulong * flags_p )
{
xPropSizeHints * raw ;
XSizeHints * hints ;
2014-05-02 09:34:02 -04:00
2002-10-28 15:22:22 -05:00
* hints_p = NULL ;
* flags_p = 0 ;
2014-05-02 09:34:02 -04:00
2002-10-28 15:22:22 -05:00
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 ) ) ;
2014-05-02 09:34:02 -04:00
2002-10-28 15:22:22 -05:00
/* 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 */
2014-05-02 09:34:02 -04:00
2002-10-28 15:22:22 -05:00
XFree ( results - > prop ) ;
results - > prop = NULL ;
* hints_p = hints ;
2014-05-02 09:34:02 -04:00
2002-10-28 15:22:22 -05:00
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 ;
2014-05-02 09:34:02 -04:00
2002-10-28 15:22:22 -05:00
if ( ! get_property ( display , xwindow , xatom , XA_WM_SIZE_HINTS ,
& results ) )
return FALSE ;
return size_hints_from_results ( & results , hints_p , flags_p ) ;
}
2002-10-26 03:37:11 -04:00
static AgGetPropertyTask *
get_task ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
Atom req_type )
{
return ag_task_create ( display - > xdisplay ,
xwindow ,
xatom , 0 , G_MAXLONG ,
False , req_type ) ;
}
2002-01-03 22:25:53 -05:00
2002-12-16 17:01:15 -05:00
static char *
latin1_to_utf8 ( const char * text )
{
GString * str ;
const char * p ;
2014-05-02 09:34:02 -04:00
2002-12-16 17:01:15 -05:00
str = g_string_new ( " " ) ;
p = text ;
while ( * p )
{
g_string_append_unichar ( str , * p ) ;
+ + p ;
}
return g_string_free ( str , FALSE ) ;
}
2002-10-26 03:37:11 -04:00
void
meta_prop_get_values ( MetaDisplay * display ,
Window xwindow ,
MetaPropValue * values ,
int n_values )
{
int i ;
AgGetPropertyTask * * tasks ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
meta_verbose ( " Requesting %d properties of 0x%lx at once \n " ,
n_values , xwindow ) ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( n_values = = 0 )
return ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
tasks = g_new0 ( AgGetPropertyTask * , n_values ) ;
2002-11-30 22:58:04 -05:00
/* Start up tasks. The "values" array can have values
* with atom = = None , which means to ignore that element .
*/
2002-10-26 03:37:11 -04:00
i = 0 ;
while ( i < n_values )
{
if ( values [ i ] . required_type = = None )
{
switch ( values [ i ] . type )
{
case META_PROP_VALUE_INVALID :
2002-11-30 22:58:04 -05:00
/* This means we don't really want a value, e.g. got
* property notify on an atom we don ' t care about .
*/
if ( values [ i ] . atom ! = None )
2008-01-28 09:52:34 -05:00
meta_bug ( " META_PROP_VALUE_INVALID requested in %s \n " , G_STRFUNC ) ;
2002-10-26 03:37:11 -04:00
break ;
case META_PROP_VALUE_UTF8_LIST :
case META_PROP_VALUE_UTF8 :
2008-05-02 14:49:01 -04:00
values [ i ] . required_type = display - > atom_UTF8_STRING ;
2002-10-26 03:37:11 -04:00
break ;
case META_PROP_VALUE_STRING :
2002-12-16 17:01:15 -05:00
case META_PROP_VALUE_STRING_AS_UTF8 :
2002-10-26 03:37:11 -04:00
values [ i ] . required_type = XA_STRING ;
break ;
case META_PROP_VALUE_MOTIF_HINTS :
values [ i ] . required_type = AnyPropertyType ;
break ;
case META_PROP_VALUE_CARDINAL_LIST :
case META_PROP_VALUE_CARDINAL :
values [ i ] . required_type = XA_CARDINAL ;
break ;
case META_PROP_VALUE_WINDOW :
values [ i ] . required_type = XA_WINDOW ;
break ;
case META_PROP_VALUE_ATOM_LIST :
values [ i ] . required_type = XA_ATOM ;
break ;
2002-10-26 12:40:50 -04:00
case META_PROP_VALUE_TEXT_PROPERTY :
values [ i ] . required_type = AnyPropertyType ;
break ;
case META_PROP_VALUE_WM_HINTS :
values [ i ] . required_type = XA_WM_HINTS ;
break ;
case META_PROP_VALUE_CLASS_HINT :
values [ i ] . required_type = XA_STRING ;
break ;
2002-10-28 15:22:22 -05:00
case META_PROP_VALUE_SIZE_HINTS :
values [ i ] . required_type = XA_WM_SIZE_HINTS ;
break ;
2002-12-09 22:23:04 -05:00
case META_PROP_VALUE_SYNC_COUNTER :
2011-06-08 10:01:30 -04:00
case META_PROP_VALUE_SYNC_COUNTER_LIST :
Fix bug 143333, support for update counter spec, and 109362, schedule
Sat Jun 19 02:21:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
Fix bug 143333, support for update counter spec, and 109362,
schedule compensation events when events are ignored.
* src/display.c (meta_display_open): Add _NET_WM_SYNC_REQUEST and
_NET_WM_SYNC_REQUEST_COUNTER atoms. Remove the old
METACITY_SYNC_COUNTER stuff.
(meta_display_begin_op): Setup the sync counter
* src/xprops.c, src/xprops.h, src/window-props.c, src/display.h:
Add new atoms.
* src/window.c (send_sync_request): new function.
(meta_window_move_resize_internal): send a sync request before
resizing.
(check_move_resize_frequence): Rework logic to also check the SYNC
case. If an event is ignored return the remaining time.
(update_resize_timeout): Timeout that gets called when a
compensation event is scheduled.
(uddate_resize): schedule compensation events when an event is
ignored.
(meta_window_handle_mouse_grap_op_event): When an alarm is
received and sync was turned off, turn it back on.
* src/window.h (struct MetaWindow) Add some variables
2004-06-18 20:45:24 -04:00
values [ i ] . required_type = XA_CARDINAL ;
2002-12-09 22:23:04 -05:00
break ;
2002-10-26 03:37:11 -04:00
}
}
2002-11-30 22:58:04 -05:00
if ( values [ i ] . atom ! = None )
tasks [ i ] = get_task ( display , xwindow ,
values [ i ] . atom , values [ i ] . required_type ) ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
+ + i ;
2014-05-02 09:34:02 -04:00
}
2002-10-26 03:37:11 -04:00
/* Get replies for all our tasks */
2002-11-03 19:56:12 -05:00
meta_topic ( META_DEBUG_SYNC , " Syncing to get %d GetProperty replies in %s \n " ,
2008-01-28 09:52:34 -05:00
n_values , G_STRFUNC ) ;
2002-10-26 03:37:11 -04:00
XSync ( display - > xdisplay , False ) ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
/* Collect results, should arrive in order requested */
i = 0 ;
while ( i < n_values )
{
AgGetPropertyTask * task ;
GetPropertyResults results ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( tasks [ i ] = = NULL )
{
2002-11-30 22:58:04 -05:00
/* Probably values[i].type was None, or ag_task_create()
* returned NULL .
2002-10-26 03:37:11 -04:00
*/
values [ i ] . type = META_PROP_VALUE_INVALID ;
goto next ;
}
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
task = ag_get_next_completed_task ( display - > xdisplay ) ;
g_assert ( task ! = NULL ) ;
g_assert ( ag_task_have_reply ( task ) ) ;
results . display = display ;
results . xwindow = xwindow ;
results . xatom = values [ i ] . atom ;
results . prop = NULL ;
results . n_items = 0 ;
results . type = None ;
results . bytes_after = 0 ;
results . format = 0 ;
2014-05-02 09:34:02 -04:00
2002-10-26 03:37:11 -04:00
if ( ag_task_get_reply_and_free ( task ,
& results . type , & results . format ,
& results . n_items ,
& results . bytes_after ,
2008-12-01 17:54:57 -05:00
& results . prop ) ! = Success | |
2002-10-26 03:37:11 -04:00
results . type = = None )
{
values [ i ] . type = META_PROP_VALUE_INVALID ;
if ( results . prop )
{
XFree ( results . prop ) ;
results . prop = NULL ;
}
goto next ;
}
switch ( values [ i ] . type )
{
case META_PROP_VALUE_INVALID :
g_assert_not_reached ( ) ;
break ;
case META_PROP_VALUE_UTF8_LIST :
if ( ! utf8_list_from_results ( & results ,
& values [ i ] . v . string_list . strings ,
& values [ i ] . v . string_list . n_strings ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_UTF8 :
if ( ! utf8_string_from_results ( & results ,
& values [ i ] . v . str ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_STRING :
if ( ! latin1_string_from_results ( & results ,
& values [ i ] . v . str ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
2002-12-16 17:01:15 -05:00
case META_PROP_VALUE_STRING_AS_UTF8 :
if ( ! latin1_string_from_results ( & results ,
& values [ i ] . v . str ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
else
{
char * new_str ;
char * xmalloc_new_str ;
new_str = latin1_to_utf8 ( values [ i ] . v . str ) ;
xmalloc_new_str = ag_Xmalloc ( strlen ( new_str ) + 1 ) ;
if ( xmalloc_new_str ! = NULL )
{
strcpy ( xmalloc_new_str , new_str ) ;
meta_XFree ( values [ i ] . v . str ) ;
values [ i ] . v . str = xmalloc_new_str ;
}
g_free ( new_str ) ;
}
break ;
2002-10-26 03:37:11 -04:00
case META_PROP_VALUE_MOTIF_HINTS :
if ( ! motif_hints_from_results ( & results ,
& values [ i ] . v . motif_hints ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_CARDINAL_LIST :
if ( ! cardinal_list_from_results ( & results ,
& values [ i ] . v . cardinal_list . cardinals ,
& values [ i ] . v . cardinal_list . n_cardinals ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_CARDINAL :
if ( ! cardinal_with_atom_type_from_results ( & results ,
values [ i ] . required_type ,
& values [ i ] . v . cardinal ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_WINDOW :
if ( ! window_from_results ( & results ,
& values [ i ] . v . xwindow ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_ATOM_LIST :
if ( ! atom_list_from_results ( & results ,
& values [ i ] . v . atom_list . atoms ,
& values [ i ] . v . atom_list . n_atoms ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
2002-10-26 12:40:50 -04:00
case META_PROP_VALUE_TEXT_PROPERTY :
if ( ! text_property_from_results ( & results , & values [ i ] . v . str ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_WM_HINTS :
if ( ! wm_hints_from_results ( & results , & values [ i ] . v . wm_hints ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
case META_PROP_VALUE_CLASS_HINT :
if ( ! class_hint_from_results ( & results , & values [ i ] . v . class_hint ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
2002-10-28 15:22:22 -05:00
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 ;
2011-06-08 10:01:30 -04:00
case META_PROP_VALUE_SYNC_COUNTER :
2002-12-09 22:23:04 -05:00
if ( ! counter_from_results ( & results ,
& values [ i ] . v . xcounter ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
2011-06-08 10:01:30 -04:00
break ;
case META_PROP_VALUE_SYNC_COUNTER_LIST :
if ( ! counter_list_from_results ( & results ,
& values [ i ] . v . xcounter_list . counters ,
& values [ i ] . v . xcounter_list . n_counters ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
break ;
2002-10-26 03:37:11 -04:00
}
2005-06-10 22:28:04 -04:00
2002-10-26 03:37:11 -04:00
next :
+ + i ;
}
g_free ( tasks ) ;
2002-01-03 22:25:53 -05:00
}
2002-11-03 18:42:21 -05:00
static void
free_value ( MetaPropValue * value )
{
switch ( value - > type )
{
2014-05-02 09:34:02 -04:00
case META_PROP_VALUE_INVALID :
2002-11-03 18:42:21 -05:00
break ;
case META_PROP_VALUE_UTF8 :
case META_PROP_VALUE_STRING :
2002-12-16 17:01:15 -05:00
case META_PROP_VALUE_STRING_AS_UTF8 :
2002-11-03 18:42:21 -05:00
meta_XFree ( value - > v . str ) ;
break ;
case META_PROP_VALUE_MOTIF_HINTS :
meta_XFree ( value - > v . motif_hints ) ;
2014-05-02 09:34:02 -04:00
break ;
2002-11-03 18:42:21 -05:00
case META_PROP_VALUE_CARDINAL :
break ;
2014-05-02 09:34:02 -04:00
case META_PROP_VALUE_WINDOW :
2002-11-03 18:42:21 -05:00
break ;
case META_PROP_VALUE_ATOM_LIST :
meta_XFree ( value - > v . atom_list . atoms ) ;
break ;
case META_PROP_VALUE_TEXT_PROPERTY :
meta_XFree ( value - > v . str ) ;
break ;
case META_PROP_VALUE_WM_HINTS :
meta_XFree ( value - > v . wm_hints ) ;
break ;
case META_PROP_VALUE_CLASS_HINT :
meta_XFree ( value - > v . class_hint . res_class ) ;
meta_XFree ( value - > v . class_hint . res_name ) ;
break ;
case META_PROP_VALUE_SIZE_HINTS :
meta_XFree ( value - > v . size_hints . hints ) ;
break ;
case META_PROP_VALUE_UTF8_LIST :
g_strfreev ( value - > v . string_list . strings ) ;
break ;
case META_PROP_VALUE_CARDINAL_LIST :
meta_XFree ( value - > v . cardinal_list . cardinals ) ;
break ;
2002-12-09 22:23:04 -05:00
case META_PROP_VALUE_SYNC_COUNTER :
break ;
2011-06-08 10:01:30 -04:00
case META_PROP_VALUE_SYNC_COUNTER_LIST :
meta_XFree ( value - > v . xcounter_list . counters ) ;
break ;
2002-11-03 18:42:21 -05:00
}
}
void
meta_prop_free_values ( MetaPropValue * values ,
int n_values )
{
int i ;
i = 0 ;
while ( i < n_values )
{
free_value ( & values [ i ] ) ;
+ + i ;
}
/* Zero the whole thing to quickly detect breakage */
memset ( values , ' \0 ' , sizeof ( MetaPropValue ) * n_values ) ;
}