[g-a-devel]Re: gnome-mag fixage (patch)



On Mon, 2002-12-09 at 16:57, Michael Meeks wrote:
> Hi Bill,
> 
> 	This (appears) to stop the screen magnifier regularly dying for me on
> startup; of course there are still some acutely odd things happening
> with it but ... ;-)
> 
> 	May I commit ?

Thanks for the patch.  It looks good overall.  However there are a
couple of issues, I'll mention them below [BH].  If you don't mind
making the changes I mention below, than feel free to commit.  The
issues are mostly:

	* copyright; LGPL please
	* please let's use bonobo_object_from_servant throughout
	* some typos (I mention them in comments [BH]).

-Bill

> 	HTH,
> Index: COPYING

...
Don't change the license; you GPL'd it accidentally.  If we need to
update the license in some way, let's do that after a separate
discussion.

> --- ChangeLog	12 Nov 2002 18:57:01 -0000	1.30
> +++ ChangeLog	9 Dec 2002 16:58:43 -0000
> @@ -1,3 +1,46 @@
> +2002-12-09  Michael Meeks  <michael ximian com>
> +
> +	* magnifier/zoom-region.c (zoom_region_paint_cursor),
> +	(zoom_region_calculate_scroll_rects),
> +	(zoom_region_scroll_smooth): quit if we don't have a cursor.

No, we should scroll without a cursor... I think you might 
mean zoom_region_paint_cursor, where you do apply a reasonable exit from
the func if there's no cursor.

> +	* magnifier/magnifier.c (magnifier_get_type): kill.
> +	(magnifier_new): upd.
> +	(impl_magnifier_dispose): upd.
> +	(impl_magnifier_create_zoom_region): plug leak.
> +	(magnifier_properties_init): don't leak default args
> +	on properties that are non-writeable.
> +
> +	* magnifier/magnifier-main.c
> +	(magnifier_main_test_image): make test_i_foo a
> +	local static at least.
> +
> +	* magnifier/zoom-region.c
> +	(impl_zoom_region_set_mag_factor): dup/ref pb.
> +	(zoom_region_update_pointer_timeout): remove evil
> +	check for ->priv == 0xaaaaaaa ie. what might be
> +	in freed memory if you're lucky.

[BH]
Lots of usage of bonobo_object(s) in place of
bonobo_object_from_servant(s).  We should stick to one of the other, and
I prefer the latter since it's clearer from te function name what's
going on.

> +	(zoom_region_class_init): use GObject dispose,
> +	not the epv version.
> +	(zoom_region_dispose): fix several evilnesses.
> +	(zoom_region_get_type): kill.
> +	(zoom_region_finalize): chain to parent.
> +	(zoom_region_get_source_subwindow): bin ugly static we
> +	re-allocate each time anyway.
> +	(impl_zoom_region_dispose): for compat, just do
> +	an unref.

[BH]
Ah, no, since a single unref is not guaranteed to dispose the region.
This method is probably bogus, but still...

> +	calm compile warnings, kill PropData, PropIdx
> +
> +	* magnifier/magnifier.c (impl_magnifier_create_zoom_region),
> +	(impl_magnifier_get_properties): dup/ref/rel/unref the pb.
> +
> +	* magnifier/magnifier-main.c (main): re-write to
> +	use bonobo_pbclient stuff.
> +	(magnifier_main_refresh_all): release/unref the pb.
> +
> +	* magnifier/zoom-region.c (impl_zoom_region_dispose):
> +	don't g_idle_remove_by_data 3 times.
> +
>  2002-11-12  Bill Haneman <bill haneman sun com>
>  
>  	Fixes for bugzilla 95942 and 98236.
> Index: magnifier/magnifier-main.c
> ===================================================================
> RCS file: /cvs/gnome/gnome-mag/magnifier/magnifier-main.c,v
> retrieving revision 1.12
> diff -u -p -u -r1.12 magnifier-main.c
> --- magnifier/magnifier-main.c	12 Nov 2002 18:57:05 -0000	1.12
> +++ magnifier/magnifier-main.c	9 Dec 2002 16:58:43 -0000
> @@ -120,44 +120,39 @@ init_rect_bounds (GNOME_Magnifier_RectBo
>  	bounds->y2 = y2;
>  }
>  
> -static int test_i_foo = 0;
> -
>  static int
>  magnifier_main_test_image (gpointer data)
>  {
> -  Magnifier *magnifier = (Magnifier *) data;
> -  GNOME_Magnifier_ZoomRegionList *zoom_regions;
> -  GNOME_Magnifier_ZoomRegion zoom_region;
> -  CORBA_Environment ev;
> -  GNOME_Magnifier_RectBounds roi;
> +	static int test_i_foo = 0;
> +	Magnifier *magnifier = (Magnifier *) data;
> +	GNOME_Magnifier_ZoomRegionList *zoom_regions;
> +	CORBA_Environment ev;
> +	GNOME_Magnifier_RectBounds roi;
> +	CORBA_exception_init (&ev);
>  
> -  CORBA_exception_init (&ev);
> +	roi.x1 = 10 * test_i_foo;
> +	roi.y1 = 10 * test_i_foo;
> +	roi.x2 = 200 + 10 * test_i_foo;
> +	roi.y2 = 200 + 10 * test_i_foo;
> +	++test_i_foo;
> +
> +	if (!IS_MAGNIFIER (magnifier))
> +		return FALSE;
> +	magnifier->priv->cursor_x = (roi.x2 + roi.x1) / 2;
> +	magnifier->priv->cursor_y = (roi.y2 + roi.y1) / 2;
> +	zoom_regions =
> +		GNOME_Magnifier_Magnifier_getZoomRegions (
> +			BONOBO_OBJREF (magnifier),
> +			&ev);
>  
> -  roi.x1 = 10 * test_i_foo;
> -  roi.y1 = 10 * test_i_foo;
> -  roi.x2 = 200 + 10 * test_i_foo;
> -  roi.y2 = 200 + 10 * test_i_foo;
> -  ++test_i_foo;
> -
> -  if (!IS_MAGNIFIER (magnifier)) return FALSE;
> -  magnifier->priv->cursor_x = (roi.x2 + roi.x1) / 2;
> -  magnifier->priv->cursor_y = (roi.y2 + roi.y1) / 2;
> -  zoom_regions =
> -	  GNOME_Magnifier_Magnifier_getZoomRegions (
> -		  BONOBO_OBJREF (magnifier),
> -		  &ev);
> -  if (zoom_regions && (zoom_regions->_length > 0)) {
> -	  zoom_region = CORBA_Object_duplicate (
> -		  ( (CORBA_Object *) (zoom_regions->_buffer))[0], &ev);
> -	  if (zoom_region != CORBA_OBJECT_NIL) {
> -		  GNOME_Magnifier_ZoomRegion_setROI (zoom_region,
> -						     &roi,
> -						     &ev);
> -	  } else fprintf (stderr, "nil region!\n");
> -  }
> +	if (zoom_regions && (zoom_regions->_length > 0))
> +		GNOME_Magnifier_ZoomRegion_setROI (
> +			zoom_regions->_buffer[0], &roi, &ev);
>    
> -  if (test_i_foo < 50) return TRUE;
> -  return FALSE;
> +	if (test_i_foo < 50)
> +		return TRUE;
> +
> +	return FALSE;
>  }
>  
>  static int last_x = 0, last_y = 0;
> @@ -175,7 +170,7 @@ magnifier_main_pan_image (gpointer data)
>    GdkModifierType mask_return;
>  
>    CORBA_exception_init (&ev);
> -  
> +
>    if (global_options.mouse_follow && IS_MAGNIFIER (magnifier))
>    {
>  	  gdk_window_get_pointer (
> @@ -226,39 +221,46 @@ magnifier_main_pan_image (gpointer data)
>  static int
>  magnifier_main_refresh_all (gpointer data)
>  {
> +	int i;
>  	Magnifier *magnifier = data;
> -	CORBA_Environment ev;
>  	CORBA_any *dirty_bounds_any;
> -	GNOME_Magnifier_ZoomRegionList *regions;
> -	GNOME_Magnifier_RectBounds *dirty_bounds;
> -	GNOME_Magnifier_ZoomRegion region;
> +	CORBA_Environment ev;
>  	Bonobo_PropertyBag properties;
> -	int i;
> +	GNOME_Magnifier_RectBounds *dirty_bounds;
> +	GNOME_Magnifier_ZoomRegionList *regions;

[BH] This looks like pointless churn, except for the removal of
'dirty-bounds-any'.  Honestly, we need a better diff ;-)
	
>  	CORBA_exception_init (&ev);
>  
> -	if (!IS_MAGNIFIER (magnifier)) return FALSE;
> +	if (!IS_MAGNIFIER (magnifier))
> +		return FALSE;
>  	
>  	regions = GNOME_Magnifier_Magnifier_getZoomRegions (
>  		BONOBO_OBJREF (magnifier),
>  		&ev);
> +#ifdef DEBUG
>  	fprintf (stderr, "refreshing %d regions\n", regions->_length);
> +#endif
>  
>  	properties = GNOME_Magnifier_Magnifier_getProperties (BONOBO_OBJREF
> (magnifier), &ev);
> +
>  	dirty_bounds_any = Bonobo_PropertyBag_getValue (properties,
> "source-display-size", &ev);
> +	if (BONOBO_EX (&ev)) {
> +		g_warning ("Error getting source-display-size");
> +		bonobo_main_quit ();
> +		return FALSE;
> +	}
> +
>  	dirty_bounds = (GNOME_Magnifier_RectBounds *)
> dirty_bounds_any->_value;
>  	/*
>  	  fprintf (stderr, "region to update: %d %d %d %d\n",
>  		 dirty_bounds->x1, dirty_bounds->y1, dirty_bounds->x2,
> dirty_bounds->y2);
>  	*/
> -	for (i = 0; i < regions->_length; ++i) {
> -		region = CORBA_Object_duplicate (regions->_buffer[i], &ev);
> +	for (i = 0; i < regions->_length; ++i)
>  		GNOME_Magnifier_ZoomRegion_markDirty (
> -			region,
> -			ORBit_copy_value (dirty_bounds,
> -					  TC_GNOME_Magnifier_RectBounds),
> -			&ev);
> -	}
> +			regions->_buffer [i], dirty_bounds, &ev);
> +
> +	bonobo_object_release_unref (properties, NULL);
> +
>  	return TRUE;
>  }
>  
> @@ -302,56 +304,24 @@ main (int argc, char** argv)
>    if (ev._major != CORBA_NO_EXCEPTION) fprintf (stderr, "EXCEPTION\n");
>  
>    if (global_options.source_display)
> -  {
> -	  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> -	  /* TODO: do we need to free the bonobo arg after this call? */
> -	  BONOBO_ARG_SET_STRING (arg, global_options.source_display);
> -	  Bonobo_PropertyBag_setValue (properties, "source-display-screen",
> -				       arg,
> -				       &ev);
> -  }
> -  if (global_options.target_display)
> -  {
> -	  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> -	  /* TODO: do we need to free the bonobo arg after this call? */
> -	  BONOBO_ARG_SET_STRING (arg, global_options.target_display);
> -	  Bonobo_PropertyBag_setValue (properties, "target-display-screen",
> -				       arg,
> -				       &ev);
> -  }
> +	  bonobo_pbclient_set_string (properties, "source-display-screen",
> +				      global_options.source_display, NULL);
> +
>    if (global_options.target_display)
> -  {
> -	  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> -	  /* TODO: do we need to free the bonobo arg after this call? */
> -	  BONOBO_ARG_SET_STRING (arg, global_options.cursor_set);
> -	  Bonobo_PropertyBag_setValue (properties, "cursor-set",
> -				       arg,
> -				       &ev);
> -  }
> +	  bonobo_pbclient_set_string (properties, "target-display-screen",
> +				      global_options.target_display, NULL);
> +
>    if (global_options.cursor_size)
> -  {
> -	  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_INT);
> -	  BONOBO_ARG_SET_INT (arg, global_options.cursor_size);
> -	  Bonobo_PropertyBag_setValue (properties, "cursor-size",
> -				       arg,
> -				       &ev);
> -  }
> -  else if (global_options.cursor_scale_factor != 1.0F)
> -  {
> -	  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_FLOAT);
> -	  BONOBO_ARG_SET_FLOAT (arg, global_options.cursor_scale_factor);
> -	  Bonobo_PropertyBag_setValue (properties, "cursor-scale-factor",
> -				       arg,
> -				       &ev);
> -  }
> +	  bonobo_pbclient_set_long (properties, "cursor-size",
> +				    global_options.cursor_size, NULL);
> +
> +  if (global_options.cursor_scale_factor != 1.0F)

[BH]
Should be else if, not 'if'.


> +	  bonobo_pbclient_set_float (properties, "cursor-scale-factor",
> +				     global_options.cursor_scale_factor, NULL);
> +
>    if (global_options.cursor_color)
> -  {
> -	  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_LONG);
> -	  BONOBO_ARG_SET_LONG (arg, global_options.cursor_color);
> -	  Bonobo_PropertyBag_setValue (properties, "cursor-color",
> -				       arg,
> -				       &ev);
> -  }
> +	  bonobo_pbclient_set_long (properties, "cursor-clor",
> +				    global_options.cursor_color, NULL);

[BH] Typo, regression.

>    w = gdk_screen_get_width (
>  	  gdk_display_get_screen (magnifier->target_display,
>  				  magnifier->target_screen_num));
> @@ -380,12 +350,15 @@ main (int argc, char** argv)
>  			       viewport_any,
>  			       &ev);
>  
> +  bonobo_object_release_unref (properties, NULL);
> +  properties = NULL;
> +
>    if (global_options.vertical_split ||
>        global_options.horizontal_split ||
>        global_options.fullscreen)
>    {
> -	  GNOME_Magnifier_ZoomRegion zoom_region;
>  	  int scroll_policy;
> +	  GNOME_Magnifier_ZoomRegion zoom_region;

[BH]  churn again... :-(

>  	  
>  	  fprintf (stderr, "creating an initial zoom region.\n");
>  	  init_rect_bounds (roi, 0, 0, 100, 100);
> @@ -404,55 +377,52 @@ main (int argc, char** argv)
>  	  scroll_policy = global_options.smooth_scroll ?
>  		  GNOME_Magnifier_ZoomRegion_SCROLL_SMOOTHEST :
>  		  GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST;
> -	  if (ev._major != CORBA_NO_EXCEPTION) fprintf (stderr,
> "EXCEPTION\n");
> -	  Bonobo_PropertyBag_setValue (properties, "smooth-scroll-policy",
> -				       bonobo_arg_new_from (
> -					       BONOBO_ARG_INT, &scroll_policy),
> -				       &ev);
> -	  Bonobo_PropertyBag_setValue (properties, "border-size",
> -				       bonobo_arg_new_from (
> -					       BONOBO_ARG_INT, &global_options.border_width),
> -				       &ev);
> -	  Bonobo_PropertyBag_setValue (properties, "border-color",
> -				       bonobo_arg_new_from (
> -					       BONOBO_ARG_LONG, &global_options.border_color),
> -				       &ev);
> -	  Bonobo_PropertyBag_setValue (properties, "use-test-pattern",
> -				       bonobo_arg_new_from (
> -					       BONOBO_ARG_BOOLEAN, &global_options.test_pattern),
> -				       &ev);
> +	  if (BONOBO_EX (&ev))
> +		  fprintf (stderr, "EXCEPTION\n");
> +
> +	  bonobo_pbclient_set_boolean (properties, "smooth-scroll-policy",
> +				       scroll_policy, &ev);
> +	  bonobo_pbclient_set_long    (properties, "border_size",
> +				       global_options.border_width, &ev);

[BH]  This was BONOBO_ARG_INT, not BONOBO_ARG_LONG.

> +	  bonobo_pbclient_set_long    (properties, "border-color",
> +				       global_options.border_color, &ev);
> +	  bonobo_pbclient_set_boolean (properties, "use-test-pattern",
> +				       global_options.test_pattern, &ev);
> +
>  	  if (strcmp (global_options.smoothing_type, "none"))
> -	  {
> -		  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> -		  /* TODO: do we need to free the bonobo arg after this call? */
> -		  BONOBO_ARG_SET_STRING (arg, global_options.smoothing_type);
> -		  Bonobo_PropertyBag_setValue (properties, "smoothing-type",
> -					       arg,
> -				       &ev);
> -	  }
> +		  bonobo_pbclient_set_string (properties, "smoothing-type",
> +					      global_options.smoothing_type, &ev);
> +
>  	  if (global_options.invert_image)
> -		  Bonobo_PropertyBag_setValue (properties, "inverse-video",
> -					       bonobo_arg_new_from (
> -						       BONOBO_ARG_BOOLEAN,
> -						       &global_options.invert_image),
> -					       &ev);
> +		  bonobo_pbclient_set_boolean (properties, "inverse-video",
> +					       global_options.invert_image, NULL);
> +
>  	  GNOME_Magnifier_Magnifier_addZoomRegion (
>  		  BONOBO_OBJREF (magnifier),
>  		  zoom_region,
>  		  &ev);
> -  }
>  
> -  if (!global_options.timing_test)
> -  {
> -	  refresh_handle = gtk_timeout_add(global_options.refresh_time,
> magnifier_main_refresh_all, magnifier);
> -	  pan_handle = gtk_timeout_add(global_options.mouse_poll_time,
> magnifier_main_pan_image, magnifier);
> +	  bonobo_object_release_unref (properties, &ev);
> +	  properties = NULL;
>    }
> -  else
> -	  refresh_handle = gtk_timeout_add(global_options.refresh_time,
> magnifier_main_test_image, magnifier);
> +
> +  if (!global_options.timing_test) {
> +	  refresh_handle = gtk_timeout_add (
> +		  global_options.refresh_time,
> +		  magnifier_main_refresh_all, magnifier);
> +
> +	  pan_handle = gtk_timeout_add (
> +		  global_options.mouse_poll_time,
> +		  magnifier_main_pan_image, magnifier);
> +  } else
> +	  refresh_handle = gtk_timeout_add (
> +		  global_options.refresh_time,
> +		  magnifier_main_test_image, magnifier);
>  
>    bonobo_main ();
>    
>    gtk_timeout_remove (refresh_handle);
> +
>    if (pan_handle)
>  	  gtk_timeout_remove (pan_handle);
>    
> Index: magnifier/magnifier.c
> ===================================================================
> RCS file: /cvs/gnome/gnome-mag/magnifier/magnifier.c,v
> retrieving revision 1.22
> diff -u -p -u -r1.22 magnifier.c
> --- magnifier/magnifier.c	12 Nov 2002 18:57:05 -0000	1.22
> +++ magnifier/magnifier.c	9 Dec 2002 16:58:44 -0000
> @@ -34,10 +34,7 @@
>  #include "zoom-region-private.h"
>  #include "GNOME_Magnifier.h"
>  
> -/*
> - * Our parent GObject type
> - */
> -#define PARENT_TYPE BONOBO_OBJECT_TYPE
> +static GObjectClass *parent_class = NULL;
>  
>  enum {
>  	MAGNIFIER_SOURCE_DISPLAY_PROP,
> @@ -55,8 +52,6 @@ enum {
>  	MAGNIFIER_CROSSWIRE_COLOR_PROP
>  } PropIdx;
>  
> -static BonoboObjectClass *parent_class;
> -
>  static void
>  magnifier_realize (GtkWidget *widget)
>  {
> @@ -66,8 +61,7 @@ magnifier_realize (GtkWidget *widget)
>  	
>  	static gboolean initialized = FALSE;
>  	
> -	if (!initialized)
> -	{
> +	if (!initialized) {

[BH] Odd, I thought we were using lone-brackets (i.e. bracket on its own
line).

>  		wm_window_protocols[0] = gdk_x11_get_xatom_by_name
> ("WM_DELETE_WINDOW");
>  		wm_window_protocols[1] = gdk_x11_get_xatom_by_name ("_NET_WM_PING");
>  		/* use DOCK until Metacity RFE for new window type goes in */
> @@ -94,9 +88,9 @@ magnifier_realize (GtkWidget *widget)
>  }
>  
>  static void
> -magnifier_exit()
> +magnifier_exit ()
>  {
> -  gtk_exit(0);
> +	gtk_exit (0);
>  }
>  
>  static gint
> @@ -476,8 +470,9 @@ magnifier_gobject_dispose (GObject *obje
>  	if (magnifier->zoom_regions)
>  		g_list_free (magnifier->zoom_regions);
>  	magnifier->zoom_regions = NULL;
> -	G_OBJECT_CLASS (parent_class)->dispose (object);
>  	bonobo_main_quit ();
> +
> +	BONOBO_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
>  }
>  
>  static void
> @@ -485,18 +480,17 @@ impl_magnifier_set_source_display (Porta
>  				   const CORBA_char *display,
>  				   CORBA_Environment *ev)
>  {
> -  Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant
> (servant));
> -  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> -  BONOBO_ARG_SET_STRING (arg, display);
> -
> -  magnifier_set_property (magnifier->property_bag,
> -			  arg,
> -			  MAGNIFIER_SOURCE_DISPLAY_PROP,
> -			  ev,
> -			  magnifier);
> +	Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant
> (servant));
> +	BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> +	BONOBO_ARG_SET_STRING (arg, display);
> +
> +	magnifier_set_property (magnifier->property_bag,
> +				arg,
> +				MAGNIFIER_SOURCE_DISPLAY_PROP,
> +				ev,
> +				magnifier);
>  
> -  bonobo_arg_release (arg);
> -  
> +	bonobo_arg_release (arg);
>  }
>  
>  static void
> @@ -504,18 +498,17 @@ impl_magnifier_set_target_display (Porta
>  				   const CORBA_char *display,
>  				   CORBA_Environment *ev)
>  {
> -  Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant
> (servant));
> -  BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> -  BONOBO_ARG_SET_STRING (arg, display);
> -
> -  magnifier_set_property (magnifier->property_bag,
> -			  arg,
> -			  MAGNIFIER_TARGET_DISPLAY_PROP,
> -			  ev,
> -			  magnifier);
> +	Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant
> (servant));
> +	BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);
> +	BONOBO_ARG_SET_STRING (arg, display);
> +
> +	magnifier_set_property (magnifier->property_bag,
> +				arg,
> +				MAGNIFIER_TARGET_DISPLAY_PROP,
> +				ev,
> +				magnifier);
>  
> -  bonobo_arg_release (arg);
> -  
> +	bonobo_arg_release (arg);
>  }
>  
>  static GNOME_Magnifier_ZoomRegion
> @@ -526,13 +519,11 @@ impl_magnifier_create_zoom_region (Porta
>  				   const GNOME_Magnifier_RectBounds *viewport,
>  				   CORBA_Environment *ev)
>  {
> -	Magnifier *magnifier =
> -		MAGNIFIER (bonobo_object_from_servant (servant));
> -	GNOME_Magnifier_ZoomRegion retval;
> -	CORBA_any *viewport_any =
> -		CORBA_any__alloc ();
> -	Bonobo_PropertyBag properties;
> +	Magnifier *magnifier = MAGNIFIER (bonobo_object (servant));

[BH] Why are we not using the standard bonobo_object_from_servant()
here?

> +	CORBA_any viewport_any;
>  	ZoomRegion *zoom_region = zoom_region_new ();
> +	Bonobo_PropertyBag properties;
> +	GNOME_Magnifier_ZoomRegion retval;
>  
>  	/* FIXME:
>  	 * shouldn't do this here, since it causes the region to get
> @@ -544,20 +535,24 @@ impl_magnifier_create_zoom_region (Porta
>  	/* XXX: should check ev after each call, below */
>  	CORBA_exception_init (ev);
>  	GNOME_Magnifier_ZoomRegion_setMagFactor (retval, zx, zy, ev);
> -	if (ev->_major != CORBA_NO_EXCEPTION) fprintf (stderr, "EXCEPTION
> setMagFactor\n");
> +
> +	if (ev->_major != CORBA_NO_EXCEPTION)
> +		fprintf (stderr, "EXCEPTION setMagFactor\n");
> +
>  	CORBA_exception_init (ev);
>  	properties = GNOME_Magnifier_ZoomRegion_getProperties (retval, ev);
> -	if (ev->_major != CORBA_NO_EXCEPTION) fprintf (stderr, "EXCEPTION
> getProperties\n");
> -	viewport_any->_type = TC_GNOME_Magnifier_RectBounds;
> -	viewport_any->_value = ORBit_copy_value (viewport,
> -						TC_GNOME_Magnifier_RectBounds);
> +	if (ev->_major != CORBA_NO_EXCEPTION)
> +		fprintf (stderr, "EXCEPTION getProperties\n");
> +
> +	viewport_any._type = TC_GNOME_Magnifier_RectBounds;
> +	viewport_any._value = (gpointer) viewport;
>  	Bonobo_PropertyBag_setValue (
> -		properties,
> -		"viewport",
> -		viewport_any,
> -		ev);	
> +		properties, "viewport", &viewport_any, ev);
> +
>  	GNOME_Magnifier_ZoomRegion_setROI (retval, roi, ev);
> -	if (ev->_major != CORBA_NO_EXCEPTION) fprintf (stderr, "EXCEPTION
> setROI\n");
> +	if (ev->_major != CORBA_NO_EXCEPTION)
> +		fprintf (stderr, "EXCEPTION setROI\n");
> +
>  	CORBA_exception_init (ev);
>  
>  	gtk_widget_set_size_request (magnifier->priv->canvas,
> @@ -565,6 +560,8 @@ impl_magnifier_create_zoom_region (Porta
>  			   viewport->y2 - viewport->y1);
>  	gtk_widget_show (magnifier->priv->canvas);
>  	gtk_widget_show (magnifier->priv->w);
> +
> +	bonobo_object_release_unref (properties, ev);
>  	
>  	return CORBA_Object_duplicate (retval, ev);
>  }
> @@ -575,9 +572,10 @@ impl_magnifier_add_zoom_region (Portable
>  				const GNOME_Magnifier_ZoomRegion region,
>  				CORBA_Environment * ev)
>  {
> -	Magnifier *magnifier =
> -		MAGNIFIER (bonobo_object_from_servant (servant));
> +	Magnifier *magnifier = MAGNIFIER (bonobo_object (servant));

[BH] object_from_servant.

> +
>  	magnifier->zoom_regions = g_list_append (magnifier->zoom_regions,
> region);
> +
>  	return CORBA_TRUE;
>  }
>  
> @@ -585,10 +583,9 @@ static Bonobo_PropertyBag
>  impl_magnifier_get_properties (PortableServer_Servant servant,
>  			       CORBA_Environment *ev)
>  {
> -	Magnifier *magnifier =
> -		MAGNIFIER (bonobo_object_from_servant (servant));
> +	Magnifier *magnifier = MAGNIFIER (bonobo_object (servant));

[BH] bonobo_object_from_servant() ?

>  
> -	return CORBA_Object_duplicate (
> +	return bonobo_object_dup_ref (
>  		BONOBO_OBJREF (magnifier->property_bag), ev);
>  }
>  
> @@ -622,21 +619,20 @@ static void
>  impl_magnifier_clear_all_zoom_regions (PortableServer_Servant servant,
>  				       CORBA_Environment * ev)
>  {
> -  Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant
> (servant));
> -  fprintf (stderr, "Destroying all zoom regions!\n");
> -  g_list_foreach (magnifier->zoom_regions, magnifier_unref_zoom_region,
> magnifier);
> -  g_list_free (magnifier->zoom_regions);
> -  magnifier->zoom_regions = NULL;
> +	Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant
> (servant));
> +
> +	fprintf (stderr, "Destroying all zoom regions!\n");
> +	g_list_foreach (magnifier->zoom_regions,
> +			magnifier_unref_zoom_region, magnifier);
> +	g_list_free (magnifier->zoom_regions);
> +	magnifier->zoom_regions = NULL;
>  }
>  
>  static void
>  impl_magnifier_dispose (PortableServer_Servant servant,
>  			CORBA_Environment *ev)
>  {
> -	Magnifier *magnifier =
> -		MAGNIFIER (bonobo_object_from_servant (servant));
> -	while (IS_MAGNIFIER(magnifier) && G_OBJECT (magnifier)->ref_count)
> -		bonobo_object_unref (BONOBO_OBJECT (magnifier));
> +	bonobo_object_unref (bonobo_object (servant));

[BH]  object_from_servant again.  Also, I think we should retain the old
behavior of un-reffing to zero, even though I agree that it's quite a
nasty thing to do to a client.  I think this method is marked deprecated
in the docs, if not, we'll do that straightaway.

>  }
>  
>  static void
> @@ -647,8 +643,6 @@ magnifier_class_init (MagnifierClass *kl
>  
>  	object_class->dispose  = magnifier_gobject_dispose;
>  
> -	parent_class = g_type_class_ref (BONOBO_OBJECT_TYPE);	
> -
>          epv->_set_SourceDisplay = impl_magnifier_set_source_display;
>  	epv->_set_TargetDisplay = impl_magnifier_set_target_display;
>  	epv->getProperties = impl_magnifier_get_properties;
> @@ -677,25 +671,19 @@ magnifier_properties_init (Magnifier *ma
>  	bonobo_object_add_interface (BONOBO_OBJECT (magnifier),
>  				     BONOBO_OBJECT (magnifier->property_bag));
>  
> -	def = bonobo_arg_new (BONOBO_ARG_STRING);
> -	BONOBO_ARG_SET_STRING (def, getenv ("DISPLAY"));
> -	
>  	bonobo_property_bag_add (magnifier->property_bag,
>  				 "source-display-screen",
>  				 MAGNIFIER_SOURCE_DISPLAY_PROP,
>  				 BONOBO_ARG_STRING,
> -				 def,
> +				 NULL,
>  				 "source display screen",
>  				 Bonobo_PROPERTY_WRITEABLE);
>  
> -	def = bonobo_arg_new (BONOBO_ARG_STRING);
> -	BONOBO_ARG_SET_STRING (def, getenv ("DISPLAY"));
> -
>  	bonobo_property_bag_add (magnifier->property_bag,
>  				 "target-display-screen",
>  				 MAGNIFIER_TARGET_DISPLAY_PROP,
>  				 BONOBO_ARG_STRING,
> -				 def,
> +				 NULL,
>  				 "target display screen",
>  				 Bonobo_PROPERTY_WRITEABLE);
>  
> @@ -800,7 +788,6 @@ magnifier_properties_init (Magnifier *ma
>  				 Bonobo_PROPERTY_WRITEABLE);
>  }
>  
> -
>  static void
>  magnifier_init (Magnifier *magnifier)
>  {
> @@ -855,53 +842,18 @@ GdkDrawable *
>  magnifier_get_cursor (Magnifier *magnifier)
>  {
>  	if (!magnifier->priv->cursor)
> -	{
>  		magnifier_init_cursor (magnifier);
> -	}
> -	return magnifier->priv->cursor;
> -}
>  
> -GType
> -magnifier_get_type (void)
> -{
> -        static GType type = 0;
> -
> -        if (!type) {
> -                static const GTypeInfo tinfo = {
> -                        sizeof (MagnifierClass),
> -                        (GBaseInitFunc) NULL,
> -                        (GBaseFinalizeFunc) NULL,
> -                        (GClassInitFunc) magnifier_class_init,
> -                        (GClassFinalizeFunc) NULL,
> -                        NULL, /* class data */
> -                        sizeof (Magnifier),
> -                        0, /* n preallocs */
> -                        (GInstanceInitFunc) magnifier_init,
> -                        NULL /* value table */
> -                };
> -                /*
> -                 *   Here we use bonobo_type_unique instead of
> -                 * gtk_type_unique, this auto-generates a load of
> -                 * CORBA structures for us. All derived types must
> -                 * use bonobo_type_unique.
> -                 */
> -                type = bonobo_type_unique (
> -                        PARENT_TYPE,
> -                        POA_GNOME_Magnifier_Magnifier__init,
> -                        NULL,
> -                        G_STRUCT_OFFSET (MagnifierClass, epv),
> -                        &tinfo,
> -                        "Magnifier");
> -        }
> -
> -        return type;
> +	return magnifier->priv->cursor;
>  }
>  
>  Magnifier *
>  magnifier_new (int argc, char **argv)
>  {
> -  Magnifier *magnifier =
> -	  MAGNIFIER (g_object_new (magnifier_get_type(), NULL));
> -
> -  return magnifier;
> +	return g_object_new (magnifier_get_type(), NULL);
>  }
> +
> +BONOBO_TYPE_FUNC_FULL (Magnifier, 
> +		       GNOME_Magnifier_Magnifier,
> +		       BONOBO_TYPE_OBJECT,
> +		       magnifier);
> Index: magnifier/zoom-region.c
> ===================================================================
> RCS file: /cvs/gnome/gnome-mag/magnifier/zoom-region.c,v
> retrieving revision 1.12
> diff -u -p -u -r1.12 zoom-region.c
> --- magnifier/zoom-region.c	12 Nov 2002 18:57:05 -0000	1.12
> +++ magnifier/zoom-region.c	9 Dec 2002 16:58:45 -0000
> @@ -36,10 +36,7 @@
>  #include "magnifier.h" /* needed to access parent data */
>  #include "magnifier-private.h" /* needed to access parent data */
>  
> -/*
> - * Our parent GObject type
> - */
> -#define PARENT_TYPE BONOBO_OBJECT_TYPE
> +static GObjectClass *parent_class = NULL;
>  
>  enum {
>  	ZOOM_REGION_MANAGED_PROP,
> @@ -57,20 +54,12 @@ enum {
>  	ZOOM_REGION_TESTPATTERN_PROP
>  } PropIdx;
>  
> -typedef union {
> -	gint      i;
> -	glong     l;
> -	gboolean  b;
> -	gfloat    f;
> -	gdouble   d;
> -	char     *s;
> -	GNOME_Magnifier_RectBounds r;
> -} PropData;
> -
> +#ifdef TEST_XTST_CURSOR
>  static Cursor *x_cursors;
>  static Window cursor_window = None;
> +#endif
>  
> -static gboolean can_coalesce = True; /* change this when event
> coalescing is working */
> +static gboolean can_coalesce = TRUE ; /* change this when event
> coalescing is working */
>  
>  static void zoom_region_sync (ZoomRegion *region);
>  static void zoom_region_finalize (GObject *object);
> @@ -99,6 +88,7 @@ _debug_announce_rect (char *msg, GdkRect
>  		 msg, rect.x, rect.y, rect.x + rect.width, rect.y + rect.height);
>  }
>  
> +#ifdef TEST_XTST_CURSOR
>  /** util stuff **/
>  static Cursor *
>  _get_x_cursors (Display *display)
> @@ -120,6 +110,7 @@ _get_x_cursors (Display *display)
>  	}
>  	return x_cursors;
>  }
> +#endif
>  
>  static gboolean
>  _diff_pixbufs (const GdkPixbuf *a, const GdkPixbuf *b)
> @@ -136,8 +127,10 @@ _diff_pixbufs (const GdkPixbuf *a, const
>  		gdk_pixbuf_get_n_channels (a)/ bits_per_byte;
>  	long n_rows = gdk_pixbuf_get_height (a);
>  
> -	if (gdk_pixbuf_get_height (b) != n_rows) return True;
> -	if (gdk_pixbuf_get_width (b) != gdk_pixbuf_get_width (a)) return True;
> +	if (gdk_pixbuf_get_height (b) != n_rows)
> +		return TRUE;
> +	if (gdk_pixbuf_get_width (b) != gdk_pixbuf_get_width (a))
> +		return TRUE;
>  	for (j = 0; j < n_rows; ++j)
>  	{
>  		cpa = pa + j * rsa;
> @@ -146,13 +139,13 @@ _diff_pixbufs (const GdkPixbuf *a, const
>  		{
>  			if (*cpa != *cpb)
>  			{
> -				return True;
> +				return TRUE;
>  			}
>  			cpa++;
>  			cpb++;
>  		}		
>  	}
> -	return False;
> +	return FALSE;
>  }
>  
>  /** EVENT COALESCING **/
> @@ -165,19 +158,19 @@ _diff_pixbufs (const GdkPixbuf *a, const
>   * a: the first GdkRectangle, which will be changed to the new bounds
> if
>   *    coalesce operation can be performed, otherwise unchanged.
>   * b: the second GdkRectangle.
> - * returns: True if the two are coalesced, False otherwise.
> + * returns: True if the two are coalesced, FALSE otherwise.
>   **/
>  static gboolean
>  _combine_rects (GdkRectangle *a, GdkRectangle *b)
>  {
> -	gboolean can_combine = False;
> +	gboolean can_combine = FALSE;
>  	if ((a->x == b->x) && (a->x + a->width == b->x + b->width))
>  	{
> -		can_combine = True;
> +		can_combine = TRUE;
>  	}
>  	else if ((a->y == b->y) && (a->y + a->height == b->y + b->height))
>  	{
> -		can_combine = True;
> +		can_combine = TRUE;
>  	}
>  	if (can_combine)
>  	{
> @@ -187,11 +180,11 @@ _combine_rects (GdkRectangle *a, GdkRect
>  		{
>  			gdk_rectangle_union (a, b, &c);
>  			*a = c;
> -			can_combine = True;
> +			can_combine = TRUE;
>  		}
>  		else
>  		{
> -			can_combine = False;
> +			can_combine = FALSE;
>  		}
>  	}
>  	return can_combine;
> @@ -207,13 +200,13 @@ _combine_rects (GdkRectangle *a, GdkRect
>   * oooooo  into   oooxxx
>   * oooooo         oooxxx
>   *
> - * returns: True if the refactor was performed, False if it could not
> be
> + * returns: TRUE if the refactor was performed, FALSE if it could not
> be
>   *          completed (i.e. if the rectangles did not form a suitable
> union).
>   **/
>  static gboolean
>  _refactor_rects (GdkRectangle *p, GdkRectangle *n)
>  {
> -	gboolean refactored = False;
> +	gboolean refactored = FALSE;
>  	GdkRectangle *a, *b;
>  	if (p->x == n->x)
>  	{
> @@ -233,14 +226,14 @@ _refactor_rects (GdkRectangle *p, GdkRec
>  			a->height += b->height;
>  			b->x += a->width;
>  			b->width -= a->width;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		else if (a->y + a->height == b->y)
>  		{
>  			a->height += b->height;
>  			b->x += a->width;
>  			b->width -= a->width;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		if (refactored) fprintf (stderr, "REFACTOR 1\n");
>  	}		
> @@ -262,14 +255,14 @@ _refactor_rects (GdkRectangle *p, GdkRec
>  			a->width += b->width;
>  			b->y += a->height;
>  			b->height -= a->height;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		else if (a->x + a->width == b->x)
>  		{
>  			a->width += b->width;
>  			b->y += a->height;
>  			b->height -= a->height;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		if (refactored) fprintf (stderr, "REFACTOR 2\n");
>  	}
> @@ -290,13 +283,13 @@ _refactor_rects (GdkRectangle *p, GdkRec
>  			a->y -= b->height;
>  			a->height += b->height;
>  			b->width -= a->width;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		else if (a->y + a->height == b->y)
>  		{
>  			a->height += b->height;
>  			b->width -= a->width;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		if (refactored) fprintf (stderr, "REFACTOR 3\n");
>  	}
> @@ -317,13 +310,13 @@ _refactor_rects (GdkRectangle *p, GdkRec
>  			a->x -= b->width;
>  			a->width += b->width;
>  			b->height -= a->height;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		else if (a->x + a->width == b->x)
>  		{
>  			a->width += b->width;
>  			b->height -= a->height;
> -			refactored = True;
> +			refactored = TRUE;
>  		}
>  		if (refactored) fprintf (stderr, "REFACTOR 4\n");
>  	}
> @@ -601,7 +594,7 @@ zoom_region_cursor_rect (ZoomRegion *zoo
>  		rect = zoom_region_view_rect_from_source_rect (zoom_region, rect);
>  		rect.x -= magnifier->cursor_hotspot.x;
>  		rect.y -= magnifier->cursor_hotspot.y;
> -		gdk_drawable_get_size (magnifier->priv->cursor, &rect.width,
> &rect.height);
> +		gdk_drawable_get_size (cursor, &rect.width, &rect.height);
>  	}
>  	return rect;
>  }
> @@ -642,6 +635,7 @@ zoom_region_paint_crosswire_cursor (Zoom
>  	int x_left_clip, x_right_clip = 0, y_top_clip, y_bottom_clip = 0;
>  	int csize;
>  	GdkRectangle rect;
> +	GdkDrawable *cursor;
>  	
>  	if (!(magnifier && zoom_region->priv->w &&
>  	      zoom_region->priv->w->window &&
> @@ -670,10 +664,10 @@ zoom_region_paint_crosswire_cursor (Zoom
>  	rect = zoom_region_view_rect_from_source_rect (zoom_region, rect);
>  	if (clip_rect) gdk_gc_set_clip_rectangle (gc, clip_rect);
>  
> -	if (magnifier->crosswire_clip)
> +	if (magnifier->crosswire_clip &&
> +	    (cursor = magnifier_get_cursor (magnifier)))
>  	{
> -		gdk_drawable_get_size (magnifier_get_cursor (magnifier),
> -				       &csize, &csize);
> +		gdk_drawable_get_size (cursor, &csize, &csize);
>  		y_top_clip = rect.y - magnifier->cursor_hotspot.y -
>  			magnifier->crosswire_size;
>  		y_bottom_clip = rect.y +
> @@ -703,17 +697,17 @@ zoom_region_paint_crosswire_cursor (Zoom
>  	{
>  		if (magnifier->crosswire_clip )
>  		{
> -			gdk_draw_rectangle (zoom_region->priv->w->window, gc, True,
> +			gdk_draw_rectangle (zoom_region->priv->w->window, gc, TRUE,
>  					    rect.x - magnifier->crosswire_size / 2,
>  					    0, magnifier->crosswire_size, y_top_clip);
> -			gdk_draw_rectangle (zoom_region->priv->w->window, gc, True, 0,
> +			gdk_draw_rectangle (zoom_region->priv->w->window, gc, TRUE, 0,
>  					    rect.y - magnifier->crosswire_size / 2,
>  					    x_left_clip, magnifier->crosswire_size);
>  		}
> -		gdk_draw_rectangle (zoom_region->priv->w->window, gc, True,
> +		gdk_draw_rectangle (zoom_region->priv->w->window, gc, TRUE,
>  				    rect.x - magnifier->crosswire_size / 2,
>  				    x_right_clip, magnifier->crosswire_size, 4096);
> -		gdk_draw_rectangle (zoom_region->priv->w->window, gc, True,
> y_bottom_clip,
> +		gdk_draw_rectangle (zoom_region->priv->w->window, gc, TRUE,
> y_bottom_clip,
>  				    rect.y - magnifier->crosswire_size / 2,
>  				    4096, magnifier->crosswire_size);
>  	}
> @@ -744,6 +738,8 @@ zoom_region_paint_cursor (ZoomRegion *zo
>  		int width, height;
>  		GdkGC *gc = gdk_gc_new (zoom_region->priv->w->window);
>  		GdkDrawable *cursor = magnifier_get_cursor (magnifier);
> +		if (!cursor)
> +			return;
>  		zoom_region->priv->cursor_backing_rect = rect;
>  		gdk_drawable_get_size (zoom_region->priv->cursor_backing_pixels,
>  				       &width, &height);
> @@ -831,14 +827,16 @@ zoom_region_paint_border (ZoomRegion *zo
>  			color.red = (zoom_region->border_color & 0xFF0000) >> 16;
>  			color.green = (zoom_region->border_color & 0xFF00) >> 8;
>  			color.blue = zoom_region->border_color & 0xFF;
> +#ifdef DEBUG
>  			fprintf (stderr, "border color triple RGB=%d|%d|%d",
>  				 color.red, color.green, color.blue);
> +#endif
>  			gdk_gc_set_foreground (zoom_region->priv->border_gc, &color);
>  		}
>  	/*
>  		gdk_draw_rectangle (zoom_region->priv->w->window,
>  				    zoom_region->priv->border_gc,
> -				    True,
> +				    TRUE,
>  				    area->x,
>  				    area->y,
>  				    area->width,
> @@ -943,7 +941,10 @@ zoom_region_calculate_scroll_rects (Zoom
>  	    zoom_region->priv->w->window)
>  		window = zoom_region->priv->w->window;
>  	else
> -		return False;
> +		return FALSE;
> +	if (!window)
> +		return FALSE;
> +
>  	gdk_drawable_get_size (GDK_DRAWABLE (window),
>  			       &rect.width,
>  			       &rect.height);
> @@ -1000,6 +1001,9 @@ zoom_region_scroll_smooth (ZoomRegion *z
>  {
>  	GdkWindow *window = zoom_region->priv->w->window;
>  	GdkRectangle window_rect;
> +
> +	if (!window)
> +		return;
>  	window_rect.x = 0;
>  	window_rect.y = 0;
>  	gdk_drawable_get_size (GDK_DRAWABLE (window),
> @@ -1080,6 +1084,7 @@ zoom_region_set_cursor_pos (ZoomRegion *
>  	}
>  }
>  
> +#ifdef TEST_XTST_CURSOR
>  static GdkWindow *
>  zoom_region_source_root (ZoomRegion *zoom_region)
>  {
> @@ -1091,6 +1096,7 @@ zoom_region_source_root (ZoomRegion *zoo
>  		return gdk_screen_get_root_window (source_screen);
>  	else return NULL;
>  }
> +#endif
>  
>  static gboolean
>  zoom_region_update_pointer (ZoomRegion *zoom_region, gboolean
> draw_cursor)
> @@ -1160,7 +1166,7 @@ zoom_region_update_pointer (ZoomRegion *
>  					       magnifier->target_display));
>  				XSync (GDK_DISPLAY_XDISPLAY (
>  					       magnifier->target_display),
> -				       False);
> +				       FALSE);
>  			}
>  			XSynchronize (display, FALSE);
>  			if (cursor_id >= max_cursors) cursor_id = -1;
> @@ -1211,16 +1217,15 @@ static int
>  zoom_region_update_pointer_timeout (gpointer data)
>  {
>  	ZoomRegion *zoom_region = data;
> -	/* FIXME: test below is a hack */
> -	if (!zoom_region->priv == 0xaaaaaaaa) return FALSE;
> +
>  	if (zoom_region_update_pointer (zoom_region, TRUE)) {
>  	        g_idle_add_full (G_PRIORITY_HIGH_IDLE,
>  				 zoom_region_update_pointer_idle,
>  				 data,
>  				 NULL);
>  		return FALSE;
> -	}
> -	else return TRUE;
> +	} else
> +		return TRUE;
>  }
>  
>  static void
> @@ -1285,9 +1290,6 @@ zoom_region_post_process_pixbuf (ZoomReg
>  	 **/
>  }
>  
> -
> -static GdkImage *__image = NULL; /* TESTING ONLY */
> -
>  static GdkPixbuf *
>  zoom_region_get_source_subwindow (ZoomRegion *zoom_region,
>  				  const GdkRectangle bounds)
> @@ -1309,19 +1311,21 @@ zoom_region_get_source_subwindow (ZoomRe
>  	if (!zoom_region->priv->source_drawable)
>  	{
>  		if (zoom_region->priv->test) {
> -			__image = gdk_image_new (GDK_IMAGE_FASTEST,
> -						 gdk_visual_get_system (),
> -						 width,
> -						 height);
> +			GdkImage *test_image = NULL;
> +
> +			test_image = gdk_image_new (GDK_IMAGE_FASTEST,
> +						    gdk_visual_get_system (),
> +						    width,
> +						    height);
>  			
>  			for (i = 0; i < width; ++i)
>  				for (j = 0; j < height; ++j)
> -					gdk_image_put_pixel (__image, i, j, i*j);
> +					gdk_image_put_pixel (test_image, i, j, i*j);
>  
>  			zoom_region->priv->source_drawable = gdk_pixmap_new (NULL, width,
> height, 24);
>  			gdk_draw_image (zoom_region->priv->source_drawable,
>  					gdk_gc_new (zoom_region->priv->source_drawable),
> -					__image,
> +					test_image,
>  					0, 0,
>  					0, 0,
>  					width, height);
> @@ -1338,7 +1342,7 @@ zoom_region_get_source_subwindow (ZoomRe
>  		{
>  			zoom_region->priv->source_pixbuf_cache =
>  				gdk_pixbuf_new (GDK_COLORSPACE_RGB,
> -						False,
> +						FALSE,
>  						8, /* FIXME: not always 8? */
>  						width, height);
>  		}
> @@ -1555,9 +1559,11 @@ zoom_region_set_viewport (ZoomRegion *zo
>  			  const GNOME_Magnifier_RectBounds *viewport)
>  {
>  	zoom_region->viewport = *viewport;
> +#ifdef DEBUG
>  	fprintf (stderr, "setting viewport %d,%d - %d,%d\n",
>  		 (int) viewport->x1, (int) viewport->y1,
>  		 (int) viewport->x2, (int) viewport->y2);
> +#endif
>  	zoom_region_recompute_exposed_viewport (zoom_region);
>  	zoom_region_align (zoom_region);
>  	if (!zoom_region->priv->w) {
> @@ -1740,7 +1746,6 @@ impl_zoom_region_set_mag_factor (Portabl
>  {
>  	ZoomRegion *zoom_region =
>  		ZOOM_REGION (bonobo_object_from_servant (servant));
> -	GNOME_Magnifier_RectBounds *source_bounds;
>  	CORBA_any *any;
>  	/* TODO: assert that parent is magnifier object */
>  	Bonobo_PropertyBag properties =
> @@ -1749,27 +1754,30 @@ impl_zoom_region_set_mag_factor (Portabl
>  				(Magnifier *) zoom_region->priv->parent), ev);
>  	any = Bonobo_PropertyBag_getValue (
>  		properties, "source-display-size", ev);
> -	source_bounds = (GNOME_Magnifier_RectBounds *) any->_value;
> +	if (!BONOBO_EX (ev))
> +		zoom_region->priv->source_area =
> +			*((GNOME_Magnifier_RectBounds *) any->_value);
>  	zoom_region->xscale = mag_factor_x;
>  	zoom_region->yscale = mag_factor_y;
>  
> -	zoom_region->priv->source_area = *source_bounds;
> -
>  	if (zoom_region->priv->scaled_pixbuf)
>  		g_object_unref (zoom_region->priv->scaled_pixbuf);
> +
>  	zoom_region->priv->scaled_pixbuf = gdk_pixbuf_new (
>  		GDK_COLORSPACE_RGB, FALSE, 8,
>  		zoom_region->priv->source_area.x2 -
>  		zoom_region->priv->source_area.x1 * zoom_region->xscale + 1,
>  		zoom_region->priv->source_area.y2 -
>  		zoom_region->priv->source_area.y1 * zoom_region->yscale + 1);
> -	if (zoom_region->priv->pixmap)
> -	{
> +
> +	if (zoom_region->priv->pixmap) {
>  		g_object_unref (zoom_region->priv->pixmap);
>  		zoom_region->priv->pixmap = NULL;
>  	}
>  	zoom_region_update_current (zoom_region);
>  	zoom_region_sync (zoom_region);
> +
> +	bonobo_object_release_unref (properties, NULL);
>  }
>  
>  static void
> @@ -1790,8 +1798,7 @@ impl_zoom_region_get_properties (Portabl
>  {
>  	ZoomRegion *zoom_region =
>  		ZOOM_REGION (bonobo_object_from_servant (servant));
> -	fprintf (stderr, "getting zoom region property-bag\n");
> -	return CORBA_Object_duplicate (
> +	return bonobo_object_dup_ref (
>  		BONOBO_OBJREF (zoom_region->properties), ev);
>  }
>  
> @@ -1832,16 +1839,22 @@ static void
>  impl_zoom_region_dispose (PortableServer_Servant servant,
>  			  CORBA_Environment * ev)
>  {
> -	ZoomRegion *zoom_region =
> -		ZOOM_REGION (bonobo_object_from_servant (servant));
> -	fprintf (stderr, "zoom region destroyed!\n");
> -	gtk_signal_disconnect (GTK_OBJECT (zoom_region->priv->w),
> -			       zoom_region->priv->expose_handler_id);
> -	g_idle_remove_by_data (zoom_region); /* 3 times? well, we have
> several...*/
> -	g_idle_remove_by_data (zoom_region);
> -	g_idle_remove_by_data (zoom_region);
> +	bonobo_object_unref (bonobo_object (servant));
> +}
> +
> +static void
> +zoom_region_dispose (GObject *object)
> +{
> +	ZoomRegion *zoom_region = ZOOM_REGION (object);
> +
> +	fprintf (stderr, "zoom region dispose!\n");
> +
> +	g_signal_handler_disconnect (
> +		zoom_region->priv->w,
> +		zoom_region->priv->expose_handler_id);
>  	g_idle_remove_by_data (zoom_region);
> -	bonobo_object_unref (BONOBO_OBJECT (zoom_region));
> +
> +	BONOBO_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
>  }
>  
>  static void
> @@ -1849,8 +1862,9 @@ zoom_region_class_init (ZoomRegionClass 
>  {
>          GObjectClass * object_class = (GObjectClass *) klass;
>          POA_GNOME_Magnifier_ZoomRegion__epv *epv = &klass->epv;
> -	
> -        object_class->finalize = zoom_region_finalize; /* TODO */
> +
> +	object_class->dispose = zoom_region_dispose;
> +        object_class->finalize = zoom_region_finalize;
>  	
>          epv->setMagFactor = impl_zoom_region_set_mag_factor;
>          epv->getMagFactor = impl_zoom_region_get_mag_factor;
> @@ -2047,7 +2061,7 @@ zoom_region_private_init (ZoomRegionPriv
>  	priv->border_gc = NULL;
>  	priv->gdk_interp_type = GDK_INTERP_NEAREST;
>  	priv->expose_handler_id = 0;
> -	priv->test = False;
> +	priv->test = FALSE;
>  }
>  
>  static void
> @@ -2056,8 +2070,8 @@ zoom_region_init (ZoomRegion *zoom_regio
>  	zoom_region_properties_init (zoom_region);
>  	zoom_region->smooth_scroll_policy =
>  		GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST;
> -	zoom_region->invert = False;
> -	zoom_region->cache_source = False;
> +	zoom_region->invert = FALSE;
> +	zoom_region->cache_source = FALSE;
>  	zoom_region->border_size = 0;
>  	zoom_region->border_color = 0;
>  	zoom_region->roi.x1 = 0;
> @@ -2078,65 +2092,35 @@ zoom_region_init (ZoomRegion *zoom_regio
>  			    NULL);
>  }
>  
> -GType
> -zoom_region_get_type (void)
> -{
> -        static GType type = 0;
> -
> -        if (!type) {
> -                static const GTypeInfo tinfo = {
> -                        sizeof (ZoomRegionClass),
> -                        (GBaseInitFunc) NULL,
> -                        (GBaseFinalizeFunc) NULL,
> -                        (GClassInitFunc) zoom_region_class_init,
> -                        (GClassFinalizeFunc) NULL,
> -                        NULL, /* class data */
> -                        sizeof (ZoomRegion),
> -                        0, /* n preallocs */
> -                        (GInstanceInitFunc) zoom_region_init,
> -                        NULL /* value table */
> -                };
> -                /*
> -                 *   Here we use bonobo_type_unique instead of
> -                 * gtk_type_unique, this auto-generates a load of
> -                 * CORBA structures for us. All derived types must
> -                 * use bonobo_type_unique.
> -                 */
> -                type = bonobo_type_unique (
> -                        PARENT_TYPE,
> -                        POA_GNOME_Magnifier_ZoomRegion__init,
> -                        NULL,
> -                        G_STRUCT_OFFSET (ZoomRegionClass, epv),
> -                        &tinfo,
> -                        "ZoomRegion");
> -        }
> -
> -        return type;
> -}
> -
>  ZoomRegion *
> -zoom_region_new ()
> +zoom_region_new (void)
>  {
> -  ZoomRegion *zoom_region =
> -	  ZOOM_REGION (g_object_new (zoom_region_get_type(), NULL));
> -  return zoom_region;
> +	return g_object_new (zoom_region_get_type(), NULL);
>  }
>  
>  static void
>  zoom_region_finalize (GObject *region)
>  {
> -  ZoomRegion *zoom_region = (ZoomRegion *) region;
> -  g_list_free (zoom_region->priv->q);
> -  gtk_container_remove (GTK_CONTAINER (zoom_region->priv->border),
> -			GTK_WIDGET (zoom_region->priv->w));
> -  gtk_container_remove (GTK_CONTAINER (((Magnifier *) 
> -					zoom_region->priv->parent)->priv->canvas),
> -			GTK_WIDGET (zoom_region->priv->border));
> -  g_object_unref (G_OBJECT (zoom_region->priv->source_pixbuf_cache));
> -  g_object_unref (G_OBJECT (zoom_region->priv->scaled_pixbuf));
> -  g_object_unref (G_OBJECT (zoom_region->priv->pixmap));
> -  g_object_unref (G_OBJECT (zoom_region->priv->cursor_backing_pixels));
> -  g_object_unref (G_OBJECT (zoom_region->priv->border_gc));
> -  g_free (zoom_region->priv);
> -  zoom_region->priv = NULL;
> -}
> +	ZoomRegion *zoom_region = (ZoomRegion *) region;
> +
> +	g_list_free (zoom_region->priv->q);
> +	gtk_container_remove (GTK_CONTAINER (zoom_region->priv->border),
> +			      GTK_WIDGET (zoom_region->priv->w));
> +	gtk_container_remove (GTK_CONTAINER (((Magnifier *) 
> +					      zoom_region->priv->parent)->priv->canvas),
> +			      GTK_WIDGET (zoom_region->priv->border));
> +	g_object_unref (zoom_region->priv->source_pixbuf_cache);
> +	g_object_unref (zoom_region->priv->scaled_pixbuf);
> +	g_object_unref (zoom_region->priv->pixmap);
> +	g_object_unref (zoom_region->priv->cursor_backing_pixels);
> +	g_object_unref (zoom_region->priv->border_gc);
> +	g_free (zoom_region->priv);
> +	zoom_region->priv = NULL;
> +
> +	BONOBO_CALL_PARENT (G_OBJECT_CLASS, finalize, (region));
> +}
> +
> +BONOBO_TYPE_FUNC_FULL (ZoomRegion, 
> +		       GNOME_Magnifier_ZoomRegion,
> +		       BONOBO_TYPE_OBJECT,
> +		       zoom_region);
> 
> 
> 
> -- 
>  mmeeks gnu org  <><, Pseudo Engineer, itinerant idiot
> 





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]