2006-10-01 18:30:10 -04:00
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2002-01-03 19:58:39 -05:00
/* Metacity X property convenience routines */
/*
* 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 ,
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 .
*
* 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 .
*/
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
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 .
*/
2002-01-03 19:58:39 -05:00
# include <config.h>
# include "xprops.h"
# include "errors.h"
# include "util.h"
2002-10-26 03:37:11 -04:00
# include "async-getprop.h"
2002-10-26 12:40:50 -04:00
# include "ui.h"
# include "metacity-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 ;
2002-10-26 03:37:11 -04:00
if ( expected_format = = results - > format & &
expected_type = = results - > type & &
( ! must_have_items | | results - > n_items > 0 ) )
2002-01-03 22:25:53 -05:00
return TRUE ;
2002-01-03 19:58:39 -05:00
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 ) ;
meta_error_trap_pop ( results - > display , TRUE ) ;
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 ;
}
if ( title = = NULL )
title = " unknown " ;
if ( res_class = = NULL )
res_class = " unknown " ;
if ( res_name = = NULL )
res_name = " unknown " ;
2002-12-17 13:26:08 -05: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 ;
}
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 ;
2002-01-03 19:58:39 -05:00
2002-10-21 17:44:35 -04:00
meta_error_trap_push_with_return ( 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 ,
( guchar * * ) & results - > prop ) ! = Success | |
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 ) ;
2002-10-21 17:44:35 -04:00
meta_error_trap_pop_with_return ( display , TRUE ) ;
2002-01-03 19:58:39 -05:00
return FALSE ;
}
2002-10-21 17:44:35 -04:00
if ( meta_error_trap_pop_with_return ( display , TRUE ) ! = 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 ) )
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 ;
results - > prop = NULL ;
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 ) )
return FALSE ;
* cardinals_p = ( gulong * ) results - > prop ;
* n_cardinals_p = results - > n_items ;
results - > prop = NULL ;
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)
2002-01-03 19:58:39 -05:00
2002-10-26 03:37:11 -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 ;
}
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 ;
2002-01-03 22:25:53 -05: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 ;
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 ;
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 ;
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 ;
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 ) ;
2002-01-03 22:25:53 -05: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 ;
2002-01-03 22:25:53 -05:00
return FALSE ;
}
2002-10-26 03:37:11 -04:00
* str_p = ( char * ) results - > prop ;
results - > prop = NULL ;
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 ;
* 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 ;
2002-10-26 03:37:11 -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 ;
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
*/
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 ) ;
meta_error_trap_pop ( results - > display , TRUE ) ;
2002-06-22 00:52:35 -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 ;
2002-06-22 00:52:35 -04:00
g_strfreev ( retval ) ;
return FALSE ;
}
retval [ i ] = g_strdup ( p ) ;
p = p + strlen ( p ) + 1 ;
+ + i ;
}
* 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
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 ) ;
XChangeProperty ( display - > xdisplay ,
xwindow , atom ,
2008-05-02 14:49:01 -04:00
display - > atom_UTF8_STRING ,
2005-10-03 14:13:45 -04:00
8 , PropModeReplace , ( guchar * ) val , strlen ( val ) ) ;
meta_error_trap_pop ( display , FALSE ) ;
}
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 ) )
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 ) ;
results - > prop = NULL ;
2002-01-03 22:25:53 -05:00
return TRUE ;
}
2002-12-09 22:23:04 -05:00
# ifdef HAVE_XSYNC
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 ) )
return FALSE ;
* counter_p = * ( XSyncCounter * ) results - > prop ;
XFree ( results - > prop ) ;
results - > prop = NULL ;
return TRUE ;
}
# endif
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 ;
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 ) )
return FALSE ;
* cardinal_p = * ( gulong * ) results - > prop ;
XFree ( results - > prop ) ;
results - > prop = NULL ;
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 ) ;
}
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 ;
tp . value = results - > prop ;
results - > prop = NULL ;
tp . encoding = results - > type ;
tp . format = results - > format ;
tp . nitems = results - > n_items ;
* utf8_str_p = meta_text_property_to_utf8 ( results - > display - > xdisplay ,
& tp ) ;
if ( tp . value ! = NULL )
XFree ( tp . value ) ;
return * utf8_str_p ! = NULL ;
}
gboolean
meta_prop_get_text_property ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
char * * utf8_str_p )
{
GetPropertyResults results ;
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
2002-10-26 12:40:50 -04:00
# define cvtINT8toInt(val) (((val) & 0x00000080) ? ((val) | 0xffffffffffffff00) : (val))
# define cvtINT16toInt(val) (((val) & 0x00008000) ? ((val) | 0xffffffffffff0000) : (val))
# define cvtINT32toInt(val) (((val) & 0x80000000) ? ((val) | 0xffffffff00000000) : (val))
# 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 ;
* hints_p = NULL ;
if ( ! validate_or_free_results ( results , 32 , XA_WM_HINTS , TRUE ) )
return FALSE ;
/* pre-R3 bogusly truncated window_group, don't fail on them */
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 ;
}
hints = ag_Xmalloc0 ( sizeof ( XWMHints ) ) ;
raw = ( xPropWMHints * ) results - > prop ;
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 ;
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 ;
class_hint - > res_class = NULL ;
class_hint - > res_name = NULL ;
if ( ! validate_or_free_results ( results , 8 , XA_STRING , FALSE ) )
return FALSE ;
len_name = strlen ( ( char * ) results - > prop ) ;
if ( ! ( class_hint - > res_name = ag_Xmalloc ( len_name + 1 ) ) )
{
XFree ( results - > prop ) ;
results - > prop = NULL ;
return FALSE ;
}
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 - - ;
2006-04-13 09:16:42 -04:00
len_class = strlen ( ( char * ) results - > prop + len_name + 1 ) ;
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 ;
}
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 ;
return TRUE ;
}
gboolean
meta_prop_get_class_hint ( MetaDisplay * display ,
Window xwindow ,
Atom xatom ,
XClassHint * class_hint )
{
GetPropertyResults results ;
class_hint - > res_class = NULL ;
class_hint - > res_name = NULL ;
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 ;
* 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 ) ;
}
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 ;
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 ) ;
2002-01-03 22:25:53 -05:00
2002-10-26 03:37:11 -04:00
if ( n_values = = 0 )
return ;
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 :
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 ) ;
2002-10-26 03:37:11 -04:00
+ + i ;
}
/* 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 ) ;
/* Collect results, should arrive in order requested */
i = 0 ;
while ( i < n_values )
{
AgGetPropertyTask * task ;
GetPropertyResults results ;
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 ;
}
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 ;
if ( ag_task_get_reply_and_free ( task ,
& results . type , & results . format ,
& results . n_items ,
& results . bytes_after ,
2008-06-28 23:23:08 -04:00
( unsigned char * * ) ( & 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 ;
2002-12-09 22:23:04 -05:00
case META_PROP_VALUE_SYNC_COUNTER :
# ifdef HAVE_XSYNC
if ( ! counter_from_results ( & results ,
& values [ i ] . v . xcounter ) )
values [ i ] . type = META_PROP_VALUE_INVALID ;
# else
values [ i ] . type = META_PROP_VALUE_INVALID ;
2005-06-10 22:28:04 -04:00
if ( results . prop )
{
XFree ( results . prop ) ;
results . prop = NULL ;
}
2002-12-09 22:23:04 -05:00
# endif
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 )
{
case META_PROP_VALUE_INVALID :
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 ) ;
break ;
case META_PROP_VALUE_CARDINAL :
break ;
case META_PROP_VALUE_WINDOW :
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 ;
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 ) ;
}