diff options
author | Carlos Garcia Campos <carlosgc@gnome.org> | 2010-06-25 13:42:24 +0200 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@gnome.org> | 2010-06-25 15:07:17 +0200 |
commit | d8861651357a872d208470c2a81ace129b876e3c (patch) | |
tree | c2a38b1f35130ff5c9e1de76c2eb6471cf1854db | |
parent | 3deb24d073c5ff812905c349596c16df0865a4c8 (diff) |
wip: initial dbus portbonobo-less
-rw-r--r-- | INSTALL | 97 | ||||
-rw-r--r-- | configure.in | 49 | ||||
-rw-r--r-- | magnifier/GNOME_Magnifier.server.in.in | 15 | ||||
-rw-r--r-- | magnifier/Makefile.am | 87 | ||||
-rw-r--r-- | magnifier/magnifier-main.c | 285 | ||||
-rw-r--r-- | magnifier/magnifier-private.h | 2 | ||||
-rw-r--r-- | magnifier/magnifier.c | 2198 | ||||
-rw-r--r-- | magnifier/magnifier.h | 99 | ||||
-rw-r--r-- | magnifier/x11/gmag-graphical-server.c | 51 | ||||
-rw-r--r-- | magnifier/x11/gmag-graphical-server.h | 3 | ||||
-rw-r--r-- | magnifier/zoom-region-private.h | 13 | ||||
-rw-r--r-- | magnifier/zoom-region.c | 3137 | ||||
-rw-r--r-- | magnifier/zoom-region.h | 138 | ||||
-rw-r--r-- | test/Makefile.am | 10 | ||||
-rw-r--r-- | test/mag-test.c | 272 |
15 files changed, 2420 insertions, 4036 deletions
@@ -4,8 +4,10 @@ Installation Instructions Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. Basic Installation ================== @@ -13,7 +15,11 @@ Basic Installation Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for -instructions specific to this package. +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -42,7 +48,7 @@ may remove or edit it. you want to change it or regenerate `configure' using a newer version of `autoconf'. -The simplest way to compile this package is: + The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. @@ -53,12 +59,22 @@ The simplest way to compile this package is: 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with - the package. + the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is @@ -67,8 +83,15 @@ The simplest way to compile this package is: all sorts of other programs in order to regenerate files that came with the distribution. - 6. Often, you can also type `make uninstall' to remove the installed - files again. + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. Compilers and Options ===================== @@ -93,7 +116,8 @@ same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have @@ -120,7 +144,8 @@ Installation Names By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you @@ -131,15 +156,46 @@ Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. -Optional Features -================= - Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE @@ -152,6 +208,13 @@ find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + Particular systems ================== @@ -288,7 +351,7 @@ operates. `configure' can determine that directory automatically. `--prefix=DIR' - Use DIR as the installation prefix. *Note Installation Names:: + Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. diff --git a/configure.in b/configure.in index c694474..e6ad6bd 100644 --- a/configure.in +++ b/configure.in @@ -1,11 +1,8 @@ dnl Process this file with autoconf to produce a configure script. dnl required versions of other tools. -m4_define([req_ver_glib], [1.3.11]) -m4_define([req_ver_gtk], [2.14.0]) -m4_define([req_ver_libbonobo], [1.107.0]) -m4_define([req_ver_libspi], [0.12.1]) -m4_define([req_ver_orbit], [2.3.100]) +m4_define([req_ver_glib], [2.25.9]) +m4_define([req_ver_gtk], [2.21.2]) AC_INIT(magnifier/magnifier.c) AC_CONFIG_MACRO_DIR([m4]) @@ -236,42 +233,30 @@ AC_PATH_PROG(GCONFTOOL, gconftool-2) AM_GCONF_SOURCE_2 PKG_CHECK_MODULES(LIBDEPS, [ - ORBit-2.0 >= 2.3.100 - glib-2.0 >= 2.11.1 - gmodule-2.0 >= 1.3.11 - gobject-2.0 >= 1.3.11 - gthread-2.0 >= 1.3.11 + glib-2.0 >= 2.25.9 + gmodule-2.0 >= 2.25.9 + gobject-2.0 >= 2.25.9 + gthread-2.0 >= 2.25.9 ]) AC_SUBST(LIBDEPS_LIBS) AC_SUBST(LIBDEPS_CFLAGS) PKG_CHECK_MODULES(DEPS, [ - libloginhelper-1.0 >= 1.5.2 - libbonobo-2.0 >= 1.107.0 - ORBit-2.0 >= 2.3.100 - glib-2.0 >= 2.11.1 - gtk+-2.0 >= 2.14.0 - gdk-pixbuf-2.0 >= 2.1.0 - dbus-glib-1 + glib-2.0 >= 2.25.9 + gtk+-2.0 >= 2.21.2 + gdk-pixbuf-2.0 >= 2.21.2 ]) AC_SUBST(DEPS_LIBS) AC_SUBST(DEPS_CFLAGS) PKG_CHECK_MODULES(TEST, [ - libspi-1.0 >= 1.5.0 - libbonobo-2.0 >= 1.107.0 - ORBit-2.0 >= 2.3.100 - glib-2.0 >= 1.3.11 - gtk+-2.0 >= 2.14.0 - gdk-pixbuf-2.0 >= 2.1.0 + glib-2.0 >= 2.25.9 + gtk+-2.0 >= 2.21.2 + gdk-pixbuf-2.0 >= 2.21.2 ]) AC_SUBST(TEST_LIBS) AC_SUBST(TEST_CFLAGS) -PKG_CHECK_MODULES(ORBIT, ORBit-2.0 >= 2.3.100) -AC_SUBST(ORBIT_CFLAGS) -AC_SUBST(ORBIT_LIBS) - old_LIBS="$LIBS" dnl Checks for inet libraries: AC_SEARCH_LIBS(gethostent, nsl) @@ -284,16 +269,6 @@ AC_SUBST(INET_LIBS) LIBS="$old_LIBS" -dnl orbit-idl. -ORBIT_IDL="`$PKG_CONFIG --variable=orbit_idl ORBit-2.0`" -AC_SUBST(ORBIT_IDL) - -dnl Bonobo and Bonobo-Activation idl files -BONOBO_ACTIVATION_IDL_DIR="`$PKG_CONFIG --variable=idldir bonobo-activation-2.0`" -LIBBONOBO_IDL_DIR="`$PKG_CONFIG --variable=idldir libbonobo-2.0`" -AC_SUBST(BONOBO_ACTIVATION_IDL_DIR) -AC_SUBST(LIBBONOBO_IDL_DIR) - AC_ARG_VAR([DEFAULT_GMAG_INTROSPECTION_PATH], [Set the default path for the install of DBus introspection XML relative to the pkgdatadir.]) diff --git a/magnifier/GNOME_Magnifier.server.in.in b/magnifier/GNOME_Magnifier.server.in.in deleted file mode 100644 index 577e153..0000000 --- a/magnifier/GNOME_Magnifier.server.in.in +++ /dev/null @@ -1,15 +0,0 @@ -<oaf_info> - <oaf_server iid="OAFIID:GNOME_Magnifier_Magnifier:0.9" - type="exe" location="@BINDIR@/magnifier"> - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:Bonobo/Unknown:1.0"/> - <item value="IDL:GNOME/Magnifier/Magnifier:0.9"/> - <item value="IDL:Accessibility/LoginHelper:1.0"/> - </oaf_attribute> - <oaf_attribute name="bonobo:environment" type="stringv"> - <item value="DISPLAY"/> - </oaf_attribute> - <oaf_attribute name="name" type="string" _value="Magnifier"/> - <oaf_attribute name="description" type="string" _value="Simple Screen Magnification Service"/> - </oaf_server> -</oaf_info> diff --git a/magnifier/Makefile.am b/magnifier/Makefile.am index 770ade2..4d75820 100644 --- a/magnifier/Makefile.am +++ b/magnifier/Makefile.am @@ -1,24 +1,7 @@ Cursorsdir = $(datadir)/gnome-mag -lib_LTLIBRARIES = libgnome-mag.la - bin_PROGRAMS = magnifier -libgnome_mag_la_SOURCES = \ - GNOME_Magnifier-common.c \ - GNOME_Magnifier-stubs.c - -libgnome_mag_la_DEPENDENCIES = \ - GNOME_Magnifier.h - -libgnome_mag_la_LDFLAGS = \ - $(LT_VERSION_INFO) -no-undefined - -libgnome_mag_la_LIBADD = $(LIBDEPS_LIBS) - -libgnomemagincludedir=$(includedir)/gnome-mag-1.0/magnifier -libgnomemaginclude_HEADERS=GNOME_Magnifier.h - AM_CFLAGS = $(CFLAGS) $(DEPS_CFLAGS) $(X_FLAGS) magnifier_SOURCES = magnifier-main.c \ @@ -29,10 +12,6 @@ magnifier_SOURCES = magnifier-main.c \ zoom-region-private.h \ magnifier.h \ magnifier-private.h \ - GNOME_Magnifier.h \ - GNOME_Magnifier-skels.c \ - GNOME_Magnifier-common.c \ - magnifier-server.h \ $(targetdir)/gmag-graphical-server.c \ $(targetdir)/gmag-graphical-server.h \ $(targetdir)/gmag-compositor.c \ @@ -52,39 +31,8 @@ INCLUDES = \ $(GNOME_MAG_DEBUG_CFLAGS) \ -DCURSORSDIR=\""$(Cursorsdir)"\" -IDL_OUT = GNOME_Magnifier.h GNOME_Magnifier-skels.c GNOME_Magnifier-stubs.c GNOME_Magnifier-common.c GNOME_Magnifier-imodule.c - -IDL = $(top_srcdir)/idl/GNOME_Magnifier.idl - -BUILT_SOURCES = $(IDL_OUT) -CLEANFILES = $(IDL_OUT) -DISTCLEANFILES = $(IDL_OUT) - -magnifier.h : GNOME_Magnifier.h - -IDLFLAGS = -I$(BONOBO_ACTIVATION_IDL_DIR) \ - -I$(LIBBONOBO_IDL_DIR) \ - -I$(top_srcdir)/idl \ - --add-imodule - -orbittypelibdir = $(libdir)/orbit-2.0 -orbittypelib_LTLIBRARIES = GNOME_Magnifier_module.la -GNOME_Magnifier_module_la_LDFLAGS = \ - -export-dynamic -module -avoid-version -no-undefined - -GNOME_Magnifier_module_la_LIBADD = $(ORBIT_LIBS) - -GNOME_Magnifier_module_la_SOURCES = \ - GNOME_Magnifier-imodule.c - # The X_LIBS must NOT be searched first or it breaks the build -LDADD = libgnome-mag.la $(DEPS_LIBS) $(X_LIBS) $(COLORBLIND_LIBS) - -serverinfodir= $(libdir)/bonobo/servers -$(server_in_files): $(server_in_files).in - sed -e "s|\@BINDIR\@|$(bindir)|" $< > $@ -server_in_files = GNOME_Magnifier.server.in -serverinfo_DATA = $(server_in_files:.server.in=.server) +LDADD = $(DEPS_LIBS) $(X_LIBS) $(COLORBLIND_LIBS) servicedir = $(datadir)/dbus-1/services service_in_files= org.freedesktop.gnome.Magnifier.service.in @@ -92,37 +40,10 @@ service_DATA = $(service_in_files:.service.in=.service) $(service_DATA): $(service_in_files) Makefile @sed -e "s|\@BINDIR\@|$(bindir)|" $< > $@ - -DISTCLEANFILES += org.freedesktop.gnome.Magnifier.service - -@INTLTOOL_SERVER_RULE@ - -EXTRA_DIST = $(server_in_files).in $(service_in_files) - -$(IDL_OUT) : $(IDL) $(ORBIT_IDL) - $(ORBIT_IDL) $(IDLFLAGS) $(IDL) - -DONT_DIST_SOURCE = $(IDL_OUT) - -CLEANFILES += $(server_in_files) $(serverinfo_DATA) $(service_DATA) - -BUILT_SOURCES += magnifier-server.h magnifier-client.h zoom-region-server.h zoom-region-client.h - -noinst_HEADERS = $(BUILT_SOURCES) - -magnifier-server.h: $(top_srcdir)/xml/org.freedesktop.gnome.Magnifier.xml - dbus-binding-tool --prefix=impl_dbus_magnifier --mode=glib-server $< > $@ -magnifier-client.h: $(top_srcdir)/xml/org.freedesktop.gnome.Magnifier.xml - dbus-binding-tool --prefix=impl_dbus_magnifier --mode=glib-client $< > $@ +DISTCLEANFILES = org.freedesktop.gnome.Magnifier.service -zoom-region-server.h: $(top_srcdir)/xml/org.freedesktop.gnome.ZoomRegion.xml - dbus-binding-tool --prefix=impl_dbus_zoom_region --mode=glib-server $< > $@ +EXTRA_DIST = $(service_in_files) -zoom-region-client.h: $(top_srcdir)/xml/org.freedesktop.gnome.ZoomRegion.xml - dbus-binding-tool --prefix=impl_dbus_zoom_region --mode=glib-client $< > $@ +CLEANFILES = $(service_DATA) -dist-hook: - for file in $(DONT_DIST_SOURCE) ; do \ - rm -f $(distdir)/$$file ; \ - done diff --git a/magnifier/magnifier-main.c b/magnifier/magnifier-main.c index 5c41f6b..f09e3c7 100644 --- a/magnifier/magnifier-main.c +++ b/magnifier/magnifier-main.c @@ -25,7 +25,6 @@ #include "magnifier-private.h" #include "zoom-region.h" #include "gmag-graphical-server.h" -#include "GNOME_Magnifier.h" #include <unistd.h> @@ -36,12 +35,11 @@ #include <gdk/gdk.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> - -#include <libbonobo.h> +#include <glib/gi18n.h> #define ENV_STRING_MAX_SIZE 128 -GNOME_Magnifier_ZoomRegion zoom_region; +ZoomRegion *zoom_region; typedef struct { gchar *target_display; @@ -156,7 +154,7 @@ static GOptionEntry magnifier_options [] = { }; static void -init_rect_bounds (GNOME_Magnifier_RectBounds *bounds, +init_rect_bounds (RectBounds *bounds, long x1, long y1, long x2, long y2) { bounds->x1 = x1; @@ -176,27 +174,17 @@ magnifier_main_test_image (gpointer data) static int x_direction = 1; static int y_direction = 1; Magnifier *magnifier = (Magnifier *) data; - GNOME_Magnifier_ZoomRegionList *zoom_regions; - Bonobo_PropertyBag properties; - CORBA_Environment ev; - GNOME_Magnifier_RectBounds roi; + GList *zoom_regions; + RectBounds roi; int x_roi, y_roi; /* Only iterate the number of times specified */ if (global_options.timing_iterations > 0) { if (timing_counter > global_options.timing_iterations) { - CORBA_exception_init (&ev); - properties = GNOME_Magnifier_ZoomRegion_getProperties (zoom_region, &ev); - if (BONOBO_EX (&ev)) - fprintf (stderr, "EXCEPTION\n"); - - bonobo_pbclient_set_boolean (properties, "exit-magnifier", - TRUE, &ev); + g_object_set (magnifier, "exit-magnifier", TRUE, NULL); } } - CORBA_exception_init (&ev); - x_roi = global_options.timing_delta_x * timing_x_pos; roi.x1 = x_roi; roi.x2 = (target_width / global_options.zoom_factor) + roi.x1; @@ -240,15 +228,9 @@ magnifier_main_test_image (gpointer data) 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)) { - - GNOME_Magnifier_ZoomRegion_setROI ( - zoom_regions->_buffer[0], &roi, &ev); + zoom_regions = magnifier->zoom_regions; + if (zoom_regions) { + zoom_region_set_roi (ZOOM_REGION (zoom_regions->data), &roi); } return TRUE; @@ -260,15 +242,12 @@ static int magnifier_main_pan_image (gpointer data) { Magnifier *magnifier = (Magnifier *) data; - GNOME_Magnifier_ZoomRegionList *zoom_regions; - GNOME_Magnifier_ZoomRegion zoom_region; - CORBA_Environment ev; - GNOME_Magnifier_RectBounds roi; + GList *zoom_regions; + RectBounds roi; int mouse_x_return, mouse_y_return; int w, h; GdkModifierType mask_return; - - CORBA_exception_init (&ev); + GList *l; if (global_options.mouse_follow && IS_MAGNIFIER (magnifier)) { @@ -289,26 +268,13 @@ magnifier_main_pan_image (gpointer data) roi.x2 = roi.x1 + 1; roi.y2 = roi.y1 + 1; - zoom_regions = - GNOME_Magnifier_Magnifier_getZoomRegions ( - BONOBO_OBJREF (magnifier), - &ev); - if (zoom_regions && (zoom_regions->_length > 0)) + zoom_regions = magnifier->zoom_regions; + for (l = zoom_regions; l; l = g_list_next (l)) { - int i; - for (i = 0; i < zoom_regions->_length; ++i) - { - /* fprintf (stderr, "panning region %d\n", i);*/ - zoom_region = - CORBA_Object_duplicate ( - ( (CORBA_Object *) - (zoom_regions->_buffer))[i], &ev); - if (zoom_region != CORBA_OBJECT_NIL) { - GNOME_Magnifier_ZoomRegion_setROI (zoom_region, - &roi, - &ev); - } else fprintf (stderr, "nil region!\n"); - } + zoom_region = (ZoomRegion *)l->data; + if (zoom_region) { + zoom_region_set_roi (zoom_region, &roi); + } else fprintf (stderr, "nil region!\n"); } } return TRUE; @@ -320,46 +286,30 @@ magnifier_main_pan_image (gpointer data) static int magnifier_main_refresh_all (gpointer data) { - int i; Magnifier *magnifier = data; - CORBA_any *dirty_bounds_any; - CORBA_Environment ev; - Bonobo_PropertyBag properties; - GNOME_Magnifier_RectBounds *dirty_bounds; - GNOME_Magnifier_ZoomRegionList *regions; - - CORBA_exception_init (&ev); + RectBounds *dirty_bounds; + GList *regions, *l; if (!IS_MAGNIFIER (magnifier)) return FALSE; - regions = GNOME_Magnifier_Magnifier_getZoomRegions ( - BONOBO_OBJREF (magnifier), - &ev); + regions = magnifier->zoom_regions; #ifdef DEBUG_REFRESH fprintf (stderr, "refreshing %d regions\n", regions->_length); #endif - properties = GNOME_Magnifier_Magnifier_getProperties (BONOBO_OBJREF (magnifier), &ev); + g_object_get (magnifier, "source-display-bounds", &dirty_bounds, NULL); - dirty_bounds_any = Bonobo_PropertyBag_getValue (properties, "source-display-bounds", &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Error getting source-display-bounds"); - bonobo_main_quit (); - return FALSE; - } - - dirty_bounds = (GNOME_Magnifier_RectBounds *) dirty_bounds_any->_value; - - fprintf (stderr, "region to update: %d %d %d %d\n", + 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) - GNOME_Magnifier_ZoomRegion_markDirty ( - regions->_buffer [i], dirty_bounds, &ev); + for (l = regions; l; l = g_list_next (l)) { + zoom_region = (ZoomRegion *)l->data; + zoom_region_mark_dirty (zoom_region, dirty_bounds); + } - bonobo_object_release_unref (properties, NULL); + g_free (dirty_bounds); return TRUE; } @@ -368,21 +318,12 @@ int main (int argc, char** argv) { GOptionContext *context; - GNOME_Magnifier_RectBounds *roi = GNOME_Magnifier_RectBounds__alloc(); - GNOME_Magnifier_RectBounds *viewport = GNOME_Magnifier_RectBounds__alloc(); - CORBA_any *viewport_any; + RectBounds roi; + RectBounds viewport; int x = 0, y = 0, src_width, src_height; guint pan_handle = 0, refresh_handle = 0; - CORBA_Environment ev; - Bonobo_PropertyBag properties; - Magnifier *magnifier; - if (!bonobo_init (&argc, argv)) { - g_error ("Could not initialize Bonobo"); - } - CORBA_exception_init (&ev); - context = g_option_context_new ("- a screen magnifier for Gnome"); g_option_context_set_description (context, "Report bugs to http://bugzilla.gnome.org\n"); g_option_context_add_main_entries (context, magnifier_options, "main options"); @@ -433,42 +374,20 @@ main (int argc, char** argv) g_setenv ("MAGNIFIER_IGNORE_COMPOSITE", "1", TRUE); #endif /* HAVE_COMPOSITE */ - magnifier = magnifier_new (global_options.is_override_redirect); - - properties = GNOME_Magnifier_Magnifier_getProperties ( - BONOBO_OBJREF (magnifier), &ev); - if (ev._major != CORBA_NO_EXCEPTION) fprintf (stderr, "EXCEPTION\n"); - - if (global_options.target_display) - bonobo_pbclient_set_string (properties, "target-display-screen", - global_options.target_display, NULL); - - if (global_options.source_display) - bonobo_pbclient_set_string (properties, "source-display-screen", - global_options.source_display, NULL); - - if (global_options.cursor_set) - bonobo_pbclient_set_string (properties, "cursor-set", - global_options.cursor_set, NULL); - - if (global_options.cursor_size) - bonobo_pbclient_set_long (properties, "cursor-size", - global_options.cursor_size, NULL); - - else if (global_options.cursor_scale_factor != 0.0F) - bonobo_pbclient_set_float (properties, "cursor-scale-factor", - global_options.cursor_scale_factor, NULL); - else - bonobo_pbclient_set_float (properties, "cursor-scale-factor", - global_options.zoom_factor, NULL); - - if (global_options.cursor_color) - bonobo_pbclient_set_ulong (properties, "cursor-color", - global_options.cursor_color, - NULL); + magnifier = magnifier_new (global_options.is_override_redirect, + global_options.source_display, + global_options.target_display); + + g_object_set (magnifier, + "cursor-set", global_options.cursor_set, + "cursor-size", global_options.cursor_size, + "cursor-scale-factor", global_options.cursor_scale_factor != 0.0F ? + global_options.cursor_scale_factor : global_options.zoom_factor, + "cursor-color", global_options.cursor_color, + NULL); if (!global_options.show_crosswires) - bonobo_pbclient_set_long (properties, "crosswire-size", 0, NULL); + g_object_set (magnifier, "crosswire-size", 0, NULL); src_width = gdk_screen_get_width (gdk_display_get_screen ( magnifier->source_display, @@ -499,123 +418,77 @@ main (int argc, char** argv) if (global_options.vertical_split || global_options.horizontal_split || global_options.fullscreen) { - init_rect_bounds (viewport, x, y, x + target_width, + init_rect_bounds (&viewport, x, y, x + target_width, y + target_height); - viewport_any = bonobo_arg_new_from (TC_GNOME_Magnifier_RectBounds, - viewport); - - bonobo_pbclient_set_value (properties, "target-display-bounds", - viewport_any, &ev); - bonobo_arg_release (viewport_any); + g_object_set (magnifier, "source-display-bounds", &viewport, NULL); } if (global_options.vertical_split || global_options.horizontal_split) { #ifdef HAVE_COMPOSITE if (!g_getenv ("MAGNIFIER_IGNORE_COMPOSITE")) - init_rect_bounds (viewport, 0, 0, + init_rect_bounds (&viewport, 0, 0, src_width, src_height); else #endif /* HAVE_COMPOSITE */ - init_rect_bounds (viewport, 0, 0, + init_rect_bounds (&viewport, 0, 0, src_width-x, src_height-y); - viewport_any = bonobo_arg_new_from (TC_GNOME_Magnifier_RectBounds, - viewport); - bonobo_pbclient_set_value (properties, "source-display-bounds", - viewport_any, - &ev); - - bonobo_arg_release (viewport_any); + g_object_set (magnifier, "source-display-bounds", &viewport, NULL); } else if (global_options.fullscreen) { - init_rect_bounds (viewport, 0, 0, src_width, src_height); - viewport_any = bonobo_arg_new_from (TC_GNOME_Magnifier_RectBounds, - viewport); - bonobo_pbclient_set_value (properties, "source-display-bounds", - viewport_any, - &ev); - bonobo_arg_release (viewport_any); + init_rect_bounds (&viewport, 0, 0, src_width, src_height); + g_object_set (magnifier, "source-display-bounds", &viewport, NULL); } - bonobo_object_release_unref (properties, NULL); - properties = NULL; - if (global_options.vertical_split || global_options.horizontal_split || global_options.fullscreen) { int scroll_policy; - init_rect_bounds (roi, 0, 0, + init_rect_bounds (&roi, 0, 0, target_width / global_options.zoom_factor, target_height / global_options.zoom_factor); - init_rect_bounds (viewport, 0, 0, target_width, target_height); - zoom_region = - GNOME_Magnifier_Magnifier_createZoomRegion ( - BONOBO_OBJREF (magnifier), - global_options.zoom_factor, - global_options.zoom_factor, - roi, - viewport, - &ev); - - properties = GNOME_Magnifier_ZoomRegion_getProperties (zoom_region, &ev); - if (BONOBO_EX (&ev)) - fprintf (stderr, "EXCEPTION\n"); - - scroll_policy = global_options.smooth_scroll ? - GNOME_Magnifier_ZoomRegion_SCROLL_SMOOTHEST : - GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST; - - bonobo_pbclient_set_long (properties, "timing-iterations", - global_options.timing_iterations, &ev); - bonobo_pbclient_set_boolean (properties, "timing-output", - global_options.timing_output, &ev); - bonobo_pbclient_set_long (properties, "timing-pan-rate", - global_options.timing_pan_rate, &ev); - bonobo_pbclient_set_long (properties, "border-size", - global_options.border_width, &ev); - bonobo_pbclient_set_long (properties, "border-color", - global_options.border_color, &ev); - bonobo_pbclient_set_short (properties, "smooth-scroll-policy", - (short) scroll_policy, &ev); - bonobo_pbclient_set_boolean (properties, "use-test-pattern", - global_options.test_pattern, &ev); - bonobo_pbclient_set_boolean (properties, "draw-cursor", - !global_options.hide_pointer, &ev); + init_rect_bounds (&viewport, 0, 0, target_width, target_height); + zoom_region = magnifier_create_zoom_region (magnifier, + global_options.zoom_factor, + global_options.zoom_factor, + &roi, &viewport); + + scroll_policy = global_options.smooth_scroll ? SCROLL_SMOOTHEST : SCROLL_FASTEST; + + g_object_set (zoom_region, + "timing-iterations", global_options.timing_iterations, + "timing-output", global_options.timing_output, + "timing-pan-rate", global_options.timing_pan_rate, + "border-size", global_options.border_width, + "border-color", global_options.border_color, + "smooth-scroll-policy", scroll_policy, + "use-test-pattern", global_options.test_pattern, + "draw-cursor", !global_options.hide_pointer, + "inverse-video", global_options.invert_image, + NULL); if (strcmp (global_options.smoothing_type, "none")) - bonobo_pbclient_set_string (properties, "smoothing-type", - global_options.smoothing_type, &ev); + g_object_set (zoom_region, + "smoothing-type", global_options.smoothing_type, + NULL); - if (global_options.invert_image) - bonobo_pbclient_set_boolean (properties, "inverse-video", - global_options.invert_image, NULL); - - GNOME_Magnifier_Magnifier_addZoomRegion ( - BONOBO_OBJREF (magnifier), - zoom_region, - &ev); - - bonobo_object_release_unref (properties, &ev); - properties = NULL; + magnifier_add_zoom_region (magnifier, zoom_region); } if (global_options.timing_pan_rate) { - GNOME_Magnifier_ZoomRegionList *zoom_regions; - GNOME_Magnifier_RectBounds roi; + GList *zoom_regions; + RectBounds roi; roi.x1 = 100; roi.x2 = 100 + (target_width / global_options.zoom_factor); roi.y1 = 0; roi.y2 = target_height / global_options.zoom_factor; - zoom_regions = GNOME_Magnifier_Magnifier_getZoomRegions ( - BONOBO_OBJREF (magnifier), &ev); - - if (zoom_regions && (zoom_regions->_length > 0)) + zoom_regions = magnifier->zoom_regions; + if (zoom_regions) { - GNOME_Magnifier_ZoomRegion_setROI ( - zoom_regions->_buffer[0], &roi, &ev); + zoom_region_set_roi (ZOOM_REGION (zoom_regions->data), &roi); } } else if (global_options.timing_iterations) @@ -639,7 +512,7 @@ main (int argc, char** argv) magnifier_main_pan_image, magnifier); } - bonobo_main (); + gtk_main (); if (refresh_handle) g_source_remove (refresh_handle); diff --git a/magnifier/magnifier-private.h b/magnifier/magnifier-private.h index a518975..621beef 100644 --- a/magnifier/magnifier-private.h +++ b/magnifier/magnifier-private.h @@ -28,7 +28,6 @@ G_BEGIN_DECLS #include <gtk/gtk.h> struct _MagnifierPrivate { - GtkWidget *w; GtkWidget *canvas; GdkWindow *root; GdkWindow *overlay; @@ -44,6 +43,7 @@ struct _MagnifierPrivate { int cursor_hotspot_y; gboolean use_source_cursor; GHashTable *cursorlist; + guint dbus_object_id; }; G_END_DECLS diff --git a/magnifier/magnifier.c b/magnifier/magnifier.c index ff6faed..d5716cc 100644 --- a/magnifier/magnifier.c +++ b/magnifier/magnifier.c @@ -23,26 +23,16 @@ #include "config.h" #include "magnifier.h" #include "magnifier-private.h" -#include "zoom-region.h" #include "zoom-region-private.h" #include "gmag-cursor.h" #include "gmag-graphical-server.h" -#include "GNOME_Magnifier.h" -#include "magnifier-server.h" #include <stdlib.h> #include <string.h> #include <strings.h> -#include <libbonobo.h> -#include <login-helper/login-helper.h> - -#include <dbus/dbus-glib-bindings.h> - #include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk/gdkx.h> -#include <gdk/gdk.h> -#include <gtk/gtk.h> /* if you #define this, don't forget to set MAG_CLIENT_DEBUG env variable */ #define DEBUG_CLIENT_CALLS @@ -54,20 +44,8 @@ static gboolean client_debug = FALSE; #define DBG(a) #endif -typedef struct -{ - LoginHelper parent; - Magnifier *mag; -} MagLoginHelper; - -typedef struct -{ - LoginHelperClass parent_class; -} MagLoginHelperClass; - -static GObjectClass *parent_class = NULL; - enum { + PORP_0, MAGNIFIER_SOURCE_DISPLAY_PROP, MAGNIFIER_TARGET_DISPLAY_PROP, MAGNIFIER_SOURCE_SIZE_PROP, @@ -82,14 +60,12 @@ enum { MAGNIFIER_CROSSWIRE_LENGTH_PROP, MAGNIFIER_CROSSWIRE_CLIP_PROP, MAGNIFIER_CROSSWIRE_COLOR_PROP -} PropIdx; +}; typedef struct { - GNOME_Magnifier_RectBounds rectbounds; - RectBounds dbus_rectbounds; - GNOME_Magnifier_RectBounds viewport; - RectBounds dbus_viewport; + RectBounds rectbounds; + RectBounds *viewport; gboolean is_managed; gint scroll_policy; gfloat contrast; @@ -103,97 +79,25 @@ typedef struct gboolean inverse; } MagnifierZoomRegionSaveProps; -#ifdef DEBUG_CLIENT_CALLS -gchar* mag_prop_names[MAGNIFIER_CROSSWIRE_COLOR_PROP + 1] = { - "SOURCE_DISPLAY", - "TARGET_DISPLAY", - "SOURCE_SIZE", - "TARGET_SIZE", - "CURSOR_SET", - "CURSOR_SIZE", - "CURSOR_ZOOM", - "CURSOR_COLOR", - "CURSOR_HOTSPOT", - "CURSOR_DEFAULT_SIZE", - "CROSSWIRE_SIZE", - "CROSSWIRE_LENGTH", - "CROSSWIRE_CLIP", - "CROSSWIRE_COLOR" -}; -#endif - -static Magnifier *_this_magnifier = NULL; extern gint fixes_event_base; static void magnifier_init_cursor_set (Magnifier *magnifier, gchar *cursor_set); -static void magnifier_init_window (Magnifier *magnifier, GdkScreen *screen); static gboolean magnifier_reset_struts_at_idle (gpointer data); -static void magnifier_init_window (Magnifier *magnifier, GdkScreen *screen); static void magnifier_adjust_source_size (Magnifier *magnifier); -static gboolean _is_override_redirect = FALSE; +static void magnifier_init (Magnifier *magnifier); +static void magnifier_class_init (MagnifierClass *klass); +static void magnifier_do_dispose (Magnifier *magnifier); +static GDBusConnection *dbus_connection = NULL; static GHashTable *zoom_hash = NULL; -static Window* -mag_login_helper_get_raise_windows (LoginHelper *helper) -{ - Window *mainwin = NULL; - MagLoginHelper *mag_helper = (MagLoginHelper *) helper; - Magnifier *magnifier = MAGNIFIER (mag_helper->mag); - - if (magnifier && magnifier->priv && magnifier->priv->w) - { - mainwin = g_new0 (Window, 2); - mainwin[0] = GDK_WINDOW_XWINDOW (gtk_widget_get_window (magnifier->priv->w)); - mainwin[1] = None; - } - return mainwin; -} - -static LoginHelperDeviceReqFlags -mag_login_helper_get_device_reqs (LoginHelper *helper) -{ - /* means "don't grab the xserver or core pointer", - and "we need to raise windows" */ - return LOGIN_HELPER_GUI_EVENTS | - LOGIN_HELPER_POST_WINDOWS | - LOGIN_HELPER_CORE_POINTER; -} - -static gboolean -mag_login_helper_set_safe (LoginHelper *helper, gboolean ignored) -{ - return TRUE; -} - -static void -mag_login_helper_class_init (MagLoginHelperClass *klass) -{ - LoginHelperClass *login_helper_class = LOGIN_HELPER_CLASS(klass); - login_helper_class->get_raise_windows = mag_login_helper_get_raise_windows; - login_helper_class->get_device_reqs = mag_login_helper_get_device_reqs; - login_helper_class->set_safe = mag_login_helper_set_safe; -} - -static void -mag_login_helper_init (MagLoginHelper *helper) -{ - helper->mag = NULL; /* we set this with mag_login_helper_set_magnifier */ -} - -static void -mag_login_helper_set_magnifier (MagLoginHelper *helper, Magnifier *mag) -{ - if (helper) - helper->mag = mag; -} +#define MAGNIFIER_GET_PRIVATE(object) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((object), MAGNIFIER_TYPE, MagnifierPrivate)) -BONOBO_TYPE_FUNC (MagLoginHelper, - LOGIN_HELPER_TYPE, - mag_login_helper) +G_DEFINE_TYPE (Magnifier, magnifier, GTK_TYPE_WINDOW) static gboolean -can_open_display (gchar *display_name) +can_open_display (const gchar *display_name) { Display *d; if ((d = XOpenDisplay (display_name))) @@ -241,19 +145,16 @@ magnifier_zoom_regions_update_pointer (Magnifier *magnifier) list = magnifier->zoom_regions; while (list) { /* propagate the expose events to the zoom regions */ - GNOME_Magnifier_ZoomRegion zoom_region; - CORBA_Environment ev; - zoom_region = list->data; - CORBA_exception_init (&ev); - if (zoom_region) - GNOME_Magnifier_ZoomRegion_updatePointer ( - CORBA_Object_duplicate (zoom_region, &ev), &ev); + ZoomRegion *zoom_region; + + zoom_region = (ZoomRegion *)list->data; + zoom_region_update_cursor (zoom_region, 0, 0, NULL); list = g_list_next (list); } } static void -magnifier_zoom_regions_mark_dirty (Magnifier *magnifier, GNOME_Magnifier_RectBounds rect_bounds) +magnifier_zoom_regions_mark_dirty (Magnifier *magnifier, RectBounds rect_bounds) { GList *list; @@ -263,14 +164,10 @@ magnifier_zoom_regions_mark_dirty (Magnifier *magnifier, GNOME_Magnifier_RectBou while (list) { /* propagate the expose events to the zoom regions */ - GNOME_Magnifier_ZoomRegion zoom_region; - CORBA_Environment ev; - zoom_region = list->data; - CORBA_exception_init (&ev); - if (zoom_region) - GNOME_Magnifier_ZoomRegion_markDirty (CORBA_Object_duplicate (zoom_region, &ev), - &rect_bounds, - &ev); + ZoomRegion *zoom_region; + + zoom_region = (ZoomRegion *)list->data; + zoom_region_mark_dirty (zoom_region, &rect_bounds); list = g_list_next (list); } } @@ -282,7 +179,7 @@ magnifier_set_cursor_from_pixbuf (Magnifier *magnifier, GdkPixmap *pixmap, *mask; gint width, height; GdkGC *gc; - GdkDrawable *drawable = gtk_widget_get_window (magnifier->priv->w); + GdkDrawable *drawable = gtk_widget_get_window (GTK_WIDGET (magnifier)); if (magnifier->priv->cursor) { g_object_unref (magnifier->priv->cursor); @@ -365,7 +262,7 @@ magnifier_set_cursor_pixmap_by_name (Magnifier *magnifier, void magnifier_notify_damage (Magnifier *magnifier, GdkRectangle *rect) { - GNOME_Magnifier_RectBounds rect_bounds; + RectBounds rect_bounds; rect_bounds.x1 = rect->x; rect_bounds.y1 = rect->y; rect_bounds.x2 = rect->x + rect->width; @@ -386,18 +283,6 @@ magnifier_set_extension_listeners (Magnifier *magnifier, GdkWindow *root) magnifier->source_initialized = TRUE; } -static void -magnifier_size_allocate (GtkWidget *widget) -{ - gmag_gs_check_set_struts (_this_magnifier); -} - -static void -magnifier_realize (GtkWidget *widget) -{ - gmag_gs_magnifier_realize (widget); -} - GdkWindow* magnifier_get_root (Magnifier *magnifier) { @@ -410,7 +295,7 @@ magnifier_get_root (Magnifier *magnifier) } static gint -magnifier_parse_display_name (Magnifier *magnifier, gchar *full_display_string, +magnifier_parse_display_name (Magnifier *magnifier, const gchar *full_display_string, gchar **display_name) { gchar *screen_ptr; @@ -431,7 +316,7 @@ magnifier_parse_display_name (Magnifier *magnifier, gchar *full_display_string, } static void -magnifier_get_display_rect_bounds (Magnifier *magnifier, GNOME_Magnifier_RectBounds *rect_bounds, gboolean is_target) +magnifier_get_display_rect_bounds (Magnifier *magnifier, RectBounds *rect_bounds, gboolean is_target) { if (is_target) { @@ -464,7 +349,7 @@ magnifier_full_screen_capable (Magnifier *magnifier) { if ((strcmp (magnifier->source_display_name, magnifier->target_display_name) != 0) || - gmag_gs_use_compositor (magnifier)) + gmag_gs_use_compositor (magnifier->source_display_name, magnifier->target_display_name)) return TRUE; return FALSE; @@ -473,7 +358,7 @@ magnifier_full_screen_capable (Magnifier *magnifier) static void magnifier_adjust_source_size (Magnifier *magnifier) { - GNOME_Magnifier_RectBounds rect_bounds; + RectBounds rect_bounds; gdouble vfract_top, vfract_bottom, hfract_left, hfract_right; magnifier_get_display_rect_bounds (magnifier, &rect_bounds, FALSE); @@ -524,30 +409,45 @@ magnifier_adjust_source_size (Magnifier *magnifier) magnifier->source_bounds.x2, magnifier->source_bounds.y2); } -static void -magnifier_unref_zoom_region (gpointer data, gpointer user_data) +ZoomRegion * +magnifier_create_zoom_region (Magnifier *magnifier, + gdouble zx, + gdouble zy, + RectBounds *roi, + RectBounds *viewport) { -/* Magnifier *magnifier = user_data; NOT USED */ - CORBA_Environment ev; - GNOME_Magnifier_ZoomRegion zoom_region = data; - CORBA_exception_init (&ev); - - DBG(g_message ("unreffing zoom region")); + ZoomRegion *zoom_region = zoom_region_new(dbus_connection, GTK_WIDGET (magnifier)); + + DBG (fprintf (stderr, "Create zoom region: \tzoom %f,%f, viewport %d,%d to %d,%d\n", (float) zx, (float) zy, viewport->x1, viewport->y1, viewport->x2, viewport->y2)); + + /* FIXME: + * shouldn't do this here, since it causes the region to get + * mapped onto the parent, if if it's not explicitly added! + */ + DBG(g_message ("creating zoom region with parent %p", magnifier)); + + zoom_region_set_mag_factor (zoom_region, zx, zy); + g_object_set (zoom_region, "viewport", viewport, NULL); + zoom_region_set_roi (zoom_region, roi); + + gtk_widget_set_size_request (magnifier->priv->canvas, + viewport->x2 - viewport->x1, + viewport->y2 - viewport->y1); + gtk_widget_show (magnifier->priv->canvas); + gtk_widget_show (GTK_WIDGET (magnifier)); - GNOME_Magnifier_ZoomRegion_dispose (zoom_region, &ev); - if (!BONOBO_EX (&ev)) - Bonobo_Unknown_unref (zoom_region, &ev); + g_hash_table_insert (zoom_hash, g_strdup (zoom_region->object_path), zoom_region); + + return zoom_region; } -static void -magnifier_dbus_unref_zoom_region (gpointer data, gpointer user_data) +void +magnifier_add_zoom_region (Magnifier *magnifier, + ZoomRegion *zoom_region) { -/* Magnifier *magnifier = user_data; NOT USED */ - ZoomRegion *zoom_region = data; - - DBG(g_message ("unreffing zoom region")); - - impl_dbus_zoom_region_dispose (zoom_region); + magnifier->zoom_regions = g_list_append (magnifier->zoom_regions, g_object_ref (zoom_region)); + g_hash_table_remove (zoom_hash, zoom_region->object_path); + gmag_gs_check_set_struts (magnifier); } static GSList* @@ -555,6 +455,7 @@ magnifier_zoom_regions_save (Magnifier *magnifier) { GList *list; GSList *save_props = NULL; + ZoomRegion *zoom_region; g_assert (magnifier); list = magnifier->zoom_regions; @@ -563,44 +464,36 @@ magnifier_zoom_regions_save (Magnifier *magnifier) while (list) { - GNOME_Magnifier_ZoomRegion zoom_region; - CORBA_Environment ev; zoom_region = list->data; - CORBA_exception_init (&ev); if (zoom_region) { - Bonobo_PropertyBag properties; - CORBA_any *value; - MagnifierZoomRegionSaveProps *zoomer_props = g_new0 (MagnifierZoomRegionSaveProps, 1); - - zoomer_props->rectbounds = GNOME_Magnifier_ZoomRegion_getROI (zoom_region, &ev); - properties = GNOME_Magnifier_ZoomRegion_getProperties (zoom_region, &ev); - value = bonobo_pbclient_get_value (properties, "viewport", TC_GNOME_Magnifier_RectBounds, &ev); - memcpy (&zoomer_props->viewport, value->_value, sizeof (GNOME_Magnifier_RectBounds)); - CORBA_free (value); - zoomer_props->is_managed = bonobo_pbclient_get_boolean (properties, "is-managed", NULL); - zoomer_props->scroll_policy = bonobo_pbclient_get_short (properties, "smooth-scroll-policy", NULL); - zoomer_props->contrast = bonobo_pbclient_get_float (properties, "contrast", NULL); - zoomer_props->zx = bonobo_pbclient_get_float (properties, "mag-factor-x", NULL); - zoomer_props->zy = bonobo_pbclient_get_float (properties, "mag-factor-y", NULL); - zoomer_props->xalign = bonobo_pbclient_get_long (properties, "x-alignment", NULL); - zoomer_props->yalign = bonobo_pbclient_get_long (properties, "y-alignment", NULL); - zoomer_props->border_color = bonobo_pbclient_get_long (properties, "border-color", NULL); - zoomer_props->border_size = bonobo_pbclient_get_long (properties, "border-size", NULL); - zoomer_props->smoothing_type = bonobo_pbclient_get_string (properties, "smoothing-type", NULL); - zoomer_props->inverse = bonobo_pbclient_get_boolean (properties, "inverse-video", NULL); - - bonobo_object_release_unref (properties, &ev); - magnifier_unref_zoom_region ((gpointer) zoom_region, NULL); - save_props = g_slist_append (save_props, zoomer_props); + MagnifierZoomRegionSaveProps *zoomer_props = g_slice_new0 (MagnifierZoomRegionSaveProps); + + zoomer_props->rectbounds = zoom_region->roi; + g_object_get (zoom_region, + "viewport", &zoomer_props->viewport, + "is-managed", &zoomer_props->is_managed, + "smooth-scroll-policy", &zoomer_props->scroll_policy, + "contrast", &zoomer_props->contrast, + "mag-factor-x", &zoomer_props->zx, + "mag-factor-y", &zoomer_props->zy, + "x-alignment", &zoomer_props->xalign, + "y-alignment", &zoomer_props->yalign, + "border-color", &zoomer_props->border_color, + "border-size", &zoomer_props->border_size, + "smoothing-type", &zoomer_props->smoothing_type, + "inverse-video", &zoomer_props->inverse, + NULL); + + g_object_unref (zoom_region); + save_props = g_slist_prepend (save_props, zoomer_props); } list = g_list_next (list); } magnifier->zoom_regions = NULL; - magnifier->zoom_regions_dbus = NULL; - return save_props; + return g_slist_reverse (save_props); } static void @@ -610,45 +503,39 @@ magnifier_zoom_regions_restore (Magnifier *magnifier, GSList *region_params) while (list) { - CORBA_Environment ev; MagnifierZoomRegionSaveProps *zoomer_props = list->data; - GNOME_Magnifier_ZoomRegion new_region; - Bonobo_PropertyBag new_properties; - - CORBA_exception_init (&ev); - new_region = GNOME_Magnifier_Magnifier_createZoomRegion (BONOBO_OBJREF (magnifier), zoomer_props->zx, zoomer_props->zy, &zoomer_props->rectbounds, &zoomer_props->viewport, &ev); - new_properties = GNOME_Magnifier_ZoomRegion_getProperties (new_region, &ev); - bonobo_pbclient_set_boolean (new_properties, "is-managed", - zoomer_props->is_managed, NULL); - bonobo_pbclient_set_short (new_properties, "smooth-scroll-policy", - zoomer_props->scroll_policy, NULL); - bonobo_pbclient_set_float (new_properties, "contrast", - zoomer_props->contrast, NULL); + ZoomRegion *new_region; + + new_region = magnifier_create_zoom_region (magnifier, + zoomer_props->zx, + zoomer_props->zy, + &zoomer_props->rectbounds, + zoomer_props->viewport); + g_object_set (new_region, + "is-managed", zoomer_props->is_managed, + "smooth-scroll-policy", zoomer_props->scroll_policy, + "contrast", zoomer_props->contrast, /* NOT YET USED - bonobo_pbclient_set_long (new_properties, "x-alignment", - zoomer_props->xalign, NULL); - bonobo_pbclient_set_long (new_properties, "y-alignment", - zoomer_props->yalign, NULL); + "x-alignment", zoomer_props->xalign, + "y-alignment", zoomer_props->yalign, */ - bonobo_pbclient_set_long (new_properties, "border-color", - zoomer_props->border_color, NULL); - bonobo_pbclient_set_long (new_properties, "border-size", - zoomer_props->border_size, NULL); - bonobo_pbclient_set_string (new_properties, "smoothing-type", - zoomer_props->smoothing_type, NULL); - bonobo_pbclient_set_boolean (new_properties, "inverse-video", - zoomer_props->inverse, NULL); - GNOME_Magnifier_Magnifier_addZoomRegion (BONOBO_OBJREF (magnifier), new_region, &ev); + "border-color", zoomer_props->border_color, + "border-size", zoomer_props->border_size, + "smoothing-type", zoomer_props->smoothing_type, + "inverse-video", zoomer_props->inverse, + NULL); + magnifier_add_zoom_region (magnifier, new_region); + g_object_unref (new_region); + g_free (zoomer_props->viewport); g_free (zoomer_props->smoothing_type); - g_free (zoomer_props); - bonobo_object_release_unref (new_properties, &ev); + g_slice_free (MagnifierZoomRegionSaveProps, zoomer_props); list = g_slist_next (list); } g_slist_free (region_params); } static void -magnifier_init_display (Magnifier *magnifier, gchar *display_name, gboolean is_target) +magnifier_init_display (Magnifier *magnifier, const gchar *display_name, gboolean is_target) { if (!can_open_display (display_name)) return; @@ -790,7 +677,7 @@ magnifier_transform_cursor (Magnifier *magnifier) g_object_unref (cursor_pixmap); g_object_unref (mask_pixmap); magnifier->priv->cursor = gdk_pixmap_new ( - gtk_widget_get_window (magnifier->priv->w), + gtk_widget_get_window (GTK_WIDGET (magnifier)), size_x, size_y, -1); if (!GDK_IS_DRAWABLE (magnifier->priv->cursor)) @@ -799,7 +686,7 @@ magnifier_transform_cursor (Magnifier *magnifier) return; } magnifier->priv->cursor_mask = gdk_pixmap_new ( - gtk_widget_get_window (magnifier->priv->w), + gtk_widget_get_window (GTK_WIDGET (magnifier)), size_x, size_y, 1); if (GDK_IS_DRAWABLE (magnifier->priv->cursor)) { @@ -895,13 +782,13 @@ magnifier_reset_struts_at_idle (gpointer data) Magnifier *magnifier = MAGNIFIER (data); #if GTK_CHECK_VERSION (2,19,5) if (magnifier->priv && - gtk_widget_get_realized (magnifier->priv->w) && + gtk_widget_get_realized (GTK_WIDGET (magnifier)) && gmag_gs_check_set_struts (magnifier)) { return FALSE; } #else if (magnifier->priv && - GTK_WIDGET_REALIZED (magnifier->priv->w) && + GTK_WIDGET_REALIZED (magnifier) && gmag_gs_check_set_struts (magnifier)) { return FALSE; } @@ -911,479 +798,470 @@ magnifier_reset_struts_at_idle (gpointer data) } static void -magnifier_get_property (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - Magnifier *magnifier = user_data; - int csize = 0; - - DBG (fprintf (stderr, "Get property: \t%s\n", mag_prop_names[arg_id])); - - switch (arg_id) { - case MAGNIFIER_SOURCE_SIZE_PROP: - BONOBO_ARG_SET_GENERAL (arg, magnifier->source_bounds, - TC_GNOME_Magnifier_RectBounds, - GNOME_Magnifier_RectBounds, NULL); - break; - case MAGNIFIER_TARGET_SIZE_PROP: - BONOBO_ARG_SET_GENERAL (arg, magnifier->target_bounds, - TC_GNOME_Magnifier_RectBounds, - GNOME_Magnifier_RectBounds, NULL); +method_call_cb (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + Magnifier *magnifier = MAGNIFIER (user_data); + + if (g_strcmp0 (method_name, "fullScreenCapable") == 0) { + gboolean retval = FALSE; + + if ((strcmp (magnifier->source_display_name, + magnifier->target_display_name) != 0) || + gmag_gs_use_compositor (magnifier->source_display_name, magnifier->target_display_name)) { + retval = TRUE; + } - break; - case MAGNIFIER_CURSOR_SET_PROP: - BONOBO_ARG_SET_STRING (arg, magnifier->cursor_set); - break; - case MAGNIFIER_CURSOR_SIZE_PROP: - BONOBO_ARG_SET_INT (arg, magnifier->cursor_size_x); - BONOBO_ARG_SET_INT (arg, magnifier->cursor_size_y); - break; - case MAGNIFIER_CURSOR_ZOOM_PROP: - BONOBO_ARG_SET_FLOAT (arg, magnifier->cursor_scale_factor); - break; - case MAGNIFIER_CURSOR_COLOR_PROP: - BONOBO_ARG_SET_GENERAL (arg, magnifier->cursor_color, - TC_CORBA_unsigned_long, - CORBA_unsigned_long, NULL); - break; - case MAGNIFIER_CURSOR_HOTSPOT_PROP: - BONOBO_ARG_SET_GENERAL (arg, magnifier->cursor_hotspot, - TC_GNOME_Magnifier_Point, - GNOME_Magnifier_Point, NULL); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(b)", retval)); + } else if (g_strcmp0 (method_name, "hideCursor") == 0) { + gmag_gs_hide_cursor (magnifier); - break; - case MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP: - if (magnifier->priv->cursor) - gdk_drawable_get_size (magnifier->priv->cursor, - &csize, &csize); - BONOBO_ARG_SET_INT (arg, csize); - break; - case MAGNIFIER_CROSSWIRE_SIZE_PROP: - BONOBO_ARG_SET_INT (arg, magnifier->crosswire_size); - break; - case MAGNIFIER_CROSSWIRE_LENGTH_PROP: - BONOBO_ARG_SET_INT (arg, magnifier->crosswire_length); - break; - case MAGNIFIER_CROSSWIRE_CLIP_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, magnifier->crosswire_clip); - break; - case MAGNIFIER_CROSSWIRE_COLOR_PROP: - BONOBO_ARG_SET_LONG (arg, magnifier->crosswire_color); - break; - case MAGNIFIER_SOURCE_DISPLAY_PROP: - BONOBO_ARG_SET_STRING (arg, magnifier->source_display_name); - break; - case MAGNIFIER_TARGET_DISPLAY_PROP: - BONOBO_ARG_SET_STRING (arg, magnifier->target_display_name); - break; - default: - bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound); - }; -} + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "showCursor") == 0) { + gmag_gs_show_cursor (magnifier); -gboolean -impl_dbus_magnifier_set_source_display (Magnifier *magnifier, gchar *source_display) -{ - gchar *full_display_string = source_display; - if (can_open_display (full_display_string)) - { - GSList *zoom_region_params = NULL; - magnifier->source_screen_num = - magnifier_parse_display_name (magnifier, - full_display_string, - NULL); - magnifier->source_display = - gdk_display_open (full_display_string); - magnifier->source_display_name = g_strdup (full_display_string); - zoom_region_params = magnifier_zoom_regions_save (magnifier); - magnifier->priv->root = - gdk_screen_get_root_window ( - gdk_display_get_screen ( - magnifier->source_display, - magnifier->source_screen_num)); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "supportColorblindFilters") == 0) { +#ifdef HAVE_COLORBLIND + gboolean retval = TRUE; +#else + gboolean retval = FALSE; +#endif + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(b)", retval)); + } else if (g_strcmp0 (method_name, "createZoomRegion") == 0) { + ZoomRegion *zoom_region; + double zx, zy; + GVariant *roi_v, *viewport_v; + const int *items; + gsize n_items; + RectBounds roi; + RectBounds viewport; + + g_variant_get (parameters, "(dd@ai@ai)", &zx, &zy, &roi_v, &viewport_v); + items = g_variant_get_fixed_array (roi_v, &n_items, sizeof (gint32)); + if (n_items == 4) { + roi.x1 = items[0]; + roi.y1 = items[1]; + roi.x2 = items[2]; + roi.y2 = items[3]; + } + g_variant_unref (roi_v); + + items = g_variant_get_fixed_array (viewport_v, &n_items, sizeof (gint32)); + if (n_items == 4) { + viewport.x1 = items[0]; + viewport.y1 = items[1]; + viewport.x2 = items[2]; + viewport.y2 = items[3]; + } + g_variant_unref (viewport_v); + + zoom_region = magnifier_create_zoom_region (magnifier, zx, zy, &roi, &viewport); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(o)", zoom_region->object_path)); + } else if (g_strcmp0 (method_name, "getZoomRegions") == 0) { + ZoomRegion *zoom_region; + gchar **list; + int i, len; + + len = g_list_length (magnifier->zoom_regions); + list = g_malloc0 (sizeof (gchar *) * len); + for (i = 0; i < len; ++i) { + zoom_region = g_list_nth_data (magnifier->zoom_regions, i); + list[i] = zoom_region->object_path; + } - /* remove the source_drawable, since in the new display the - * composite can be unavailable and the source_drawable is - * where the desktop screen is composed. If this is not - * freed it will be used even if the display doesn't use - * composite what will lead to wrong behavior and crashes. - * If composite is used in the new display this variable is - * re-created */ - if (magnifier->priv->source_drawable) { - g_object_unref (magnifier->priv->source_drawable); - magnifier->priv->source_drawable = NULL; - } + DBG (fprintf (stderr, "Get zoom regions: \t%d\n", len)); - /* attach listeners for DAMAGE, "dirty region", XFIXES - * cursor changes */ - magnifier_set_extension_listeners (magnifier, magnifier_get_root (magnifier)); - magnifier_get_display_rect_bounds (magnifier, &magnifier->source_bounds, FALSE); - magnifier_adjust_source_size (magnifier); - magnifier_zoom_regions_restore (magnifier, zoom_region_params); - magnifier_warp_cursor_to_screen (magnifier); - gmag_gs_check_set_struts (magnifier); - gmag_gs_reset_overlay_at_idle (magnifier); - } - DBG(fprintf (stderr, "Set source display: \t%s\n", full_display_string)); - - return TRUE; -} + g_dbus_method_invocation_return_value (invocation, + g_variant_new_strv ((const gchar * const*)list, len)); + g_free (list); + } else if (g_strcmp0 (method_name, "addZoomRegion") == 0) { + ZoomRegion *zoom_region; + const gchar *zoom_region_path; -gchar* -impl_dbus_magnifier_get_source_display (Magnifier *magnifier) -{ - return g_strdup (magnifier->source_display_name); -} + g_variant_get (parameters, "(&o)", &zoom_region_path); -gboolean -impl_dbus_magnifier_set_target_display (Magnifier *magnifier, gchar *target_display) -{ - gchar *full_display_string = target_display; - if (can_open_display (full_display_string)) - { - magnifier->target_screen_num = - magnifier_parse_display_name (magnifier, - full_display_string, - NULL); - magnifier->target_display = - gdk_display_open (full_display_string); - magnifier->target_display_name = g_strdup (full_display_string); - if (GTK_IS_WINDOW (magnifier->priv->w)) - { -#ifdef REPARENT_GTK_WINDOW_WORKS - gtk_window_set_screen (GTK_WINDOW (magnifier->priv->w), - gdk_display_get_screen ( - magnifier->target_display, - magnifier->target_screen_num)); -#else - GSList *zoom_region_params = NULL; - /* disconnect from the old window's destroy signal */ - g_object_disconnect (magnifier->priv->w, - "any_signal::realize", magnifier_realize, NULL, - "any_signal::size_allocate", magnifier_size_allocate, NULL, - "any_signal::destroy", magnifier_exit, NULL, - NULL); - /* save the old zoom region state */ - zoom_region_params = magnifier_zoom_regions_save (magnifier); - /* destroy the old window */ - gtk_widget_destroy (magnifier->priv->w); - /* and re-initialize... */ - magnifier_init_window (magnifier, gdk_display_get_screen ( - magnifier->target_display, - magnifier->target_screen_num)); - /* restore the zoom regions in their new host magnifier window */ - magnifier_zoom_regions_restore (magnifier, zoom_region_params); -#endif - } - magnifier_get_display_rect_bounds (magnifier, &magnifier->source_bounds, FALSE); - magnifier_init_cursor_set (magnifier, magnifier->cursor_set); /* needed to reset pixmaps */ - if (magnifier->priv->overlay) - gdk_window_move (magnifier->priv->overlay, - magnifier->target_bounds.x1, - magnifier->target_bounds.y1); - else - gtk_window_move (GTK_WINDOW (magnifier->priv->w), - magnifier->target_bounds.x1, - magnifier->target_bounds.y1); - - if ((magnifier->target_bounds.x2 - magnifier->target_bounds.x1 > 0) && - (magnifier->target_bounds.y2 - magnifier->target_bounds.y1) > 0) - { - if (magnifier->priv->overlay) - gdk_window_resize ( - magnifier->priv->overlay, - magnifier->target_bounds.x2 - - magnifier->target_bounds.x1, - magnifier->target_bounds.y2 - - magnifier->target_bounds.y1); - gtk_window_resize (GTK_WINDOW (magnifier->priv->w), - magnifier->target_bounds.x2 - magnifier->target_bounds.x1, - magnifier->target_bounds.y2 - magnifier->target_bounds.y1); - DBG(fprintf (stderr, "Set target size: \t%d,%d to %d,%d\n", - magnifier->target_bounds.x1, magnifier->target_bounds.y1, magnifier->target_bounds.x2, magnifier->target_bounds.y2)); - } - /* N. B. we don't reset the target bounds to the limits of the new display, because */ - /* doing so would override the client-specified magnifier size */ - /* magnifier_get_display_rect_bounds (magnifier, &magnifier->target_bounds, TRUE); */ - gmag_gs_check_set_struts (magnifier); - } - DBG(fprintf (stderr, "Set target display: \t%s (screen %d)\n", - full_display_string, magnifier->target_screen_num)); - - return TRUE; -} + if (!magnifier->source_initialized) + { + magnifier_set_extension_listeners (magnifier, magnifier_get_root (magnifier)); + } -gchar* -impl_dbus_magnifier_get_target_display (Magnifier *magnifier) -{ - return g_strdup (magnifier->target_display_name); -} + /* FIXME: this needs proper lifecycle management */ + zoom_region = g_hash_table_lookup (zoom_hash, zoom_region_path); + magnifier_add_zoom_region (magnifier, zoom_region); -gboolean -impl_dbus_magnifier_set_source_size (Magnifier *magnifier, gint32 **bounds) -{ - magnifier->source_bounds.x1 = (*bounds)[0]; - magnifier->source_bounds.y1 = (*bounds)[1]; - magnifier->source_bounds.x2 = (*bounds)[2]; - magnifier->source_bounds.y2 = (*bounds)[3]; - DBG (fprintf (stderr, "Set source size: \t%d,%d to %d,%d\n", - magnifier->source_bounds.x1, magnifier->source_bounds.y1, magnifier->source_bounds.x2, magnifier->source_bounds.y2)); - - return TRUE; -} + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(b)", TRUE)); + } else if (g_strcmp0 (method_name, "clearAllZoomRegions") == 0) { + g_list_foreach (magnifier->zoom_regions, + (GFunc)g_object_unref, + NULL); + g_list_free (magnifier->zoom_regions); + magnifier->zoom_regions = NULL; -GArray* -impl_dbus_magnifier_get_source_size (Magnifier *magnifier) -{ - GArray *ret = g_array_new (FALSE, FALSE, sizeof (gint32)); - - g_array_append_val (ret, magnifier->source_bounds.x1); - g_array_append_val (ret, magnifier->source_bounds.y1); - g_array_append_val (ret, magnifier->source_bounds.x2); - g_array_append_val (ret, magnifier->source_bounds.y2); - - return ret; -} + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "dispose") == 0) { + magnifier_do_dispose (magnifier); -gboolean -impl_dbus_magnifier_set_target_size (Magnifier *magnifier, gint32 **bounds) -{ - magnifier->target_bounds.x1 = (*bounds)[0]; - magnifier->target_bounds.y1 = (*bounds)[1]; - magnifier->target_bounds.x2 = (*bounds)[2]; - magnifier->target_bounds.y2 = (*bounds)[3]; - - if (magnifier->priv->overlay) - gdk_window_move_resize (magnifier->priv->overlay, - magnifier->target_bounds.x1, - magnifier->target_bounds.y1, - magnifier->target_bounds.x2 - - magnifier->target_bounds.x1, - magnifier->target_bounds.y2 - - magnifier->target_bounds.y1); - else - gtk_window_move (GTK_WINDOW (magnifier->priv->w), - magnifier->target_bounds.x1, - magnifier->target_bounds.y1); - - gtk_window_resize (GTK_WINDOW (magnifier->priv->w), - magnifier->target_bounds.x2 - magnifier->target_bounds.x1, - magnifier->target_bounds.y2 - magnifier->target_bounds.y1); - gmag_gs_check_set_struts (magnifier); - DBG(fprintf (stderr, "Set target size: \t%d,%d to %d,%d\n", - magnifier->target_bounds.x1, magnifier->target_bounds.y1, magnifier->target_bounds.x2, magnifier->target_bounds.y2)); - if (!strcmp (magnifier->target_display_name, magnifier->source_display_name) && - (magnifier->target_screen_num == magnifier->source_screen_num)) - magnifier_adjust_source_size (magnifier); - - return TRUE; -} + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "setSourceDisplay") == 0) { + const gchar *display_string; -GArray* -impl_dbus_magnifier_get_target_size (Magnifier *magnifier) -{ - GArray *ret = g_array_new (FALSE, FALSE, sizeof (gint32)); - - g_array_append_val (ret, magnifier->target_bounds.x1); - g_array_append_val (ret, magnifier->target_bounds.y1); - g_array_append_val (ret, magnifier->target_bounds.x2); - g_array_append_val (ret, magnifier->target_bounds.y2); - - return ret; -} + g_variant_get (parameters, "(&s)", &display_string); + g_object_set (magnifier, "source-display-screen", display_string, NULL); -gboolean -impl_dbus_magnifier_set_cursor_set (Magnifier *magnifier, gchar *cursor_set) -{ - magnifier_init_cursor_set (magnifier, g_strdup (cursor_set)); - DBG (fprintf (stderr, "Setting cursor set: \t%s\n", cursor_set)); - - return TRUE; -} + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "getSourceDisplay") == 0) { + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", magnifier->source_display_name)); + } else if (g_strcmp0 (method_name, "setTargetDisplay") == 0) { + const gchar *display_string; -gchar* -impl_dbus_magnifier_get_cursor_set (Magnifier *magnifier) -{ - return g_strdup (magnifier->cursor_set); -} + g_variant_get (parameters, "(&s)", &display_string); + g_object_set (magnifier, "target-display-screen", display_string, NULL); -gboolean -impl_dbus_magnifier_set_cursor_size (Magnifier *magnifier, gint x, gint y) -{ - magnifier->cursor_size_x = x; - magnifier->cursor_size_y = y; - magnifier_transform_cursor (magnifier); - DBG (fprintf (stderr, "Setting cursor size: \t%d\n", magnifier->cursor_size_x)); - - return TRUE; + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "getTargetDisplay") == 0) { + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", magnifier->target_display_name)); + } } -GArray* -impl_dbus_magnifier_get_cursor_size (Magnifier *magnifier) -{ - GArray *ret = g_array_new (FALSE, FALSE, sizeof (gint)); - - g_array_append_val (ret, magnifier->cursor_size_x); - g_array_append_val (ret, magnifier->cursor_size_y); - - return ret; -} +static GVariant * +get_property_cb (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + Magnifier *magnifier = MAGNIFIER (user_data); + GVariant *retval = NULL; + + if (g_strcmp0 (property_name, "SourceSize") == 0) { + GVariant *children[4]; + + children[0] = g_variant_new_int32 (magnifier->source_bounds.x1); + children[1] = g_variant_new_int32 (magnifier->source_bounds.y1); + children[2] = g_variant_new_int32 (magnifier->source_bounds.x2); + children[3] = g_variant_new_int32 (magnifier->source_bounds.y2); + retval = g_variant_new_array (G_VARIANT_TYPE_INT32, children, 4); + } else if (g_strcmp0 (property_name, "TargetSize") == 0) { + GVariant *children[4]; + + children[0] = g_variant_new_int32 (magnifier->target_bounds.x1); + children[1] = g_variant_new_int32 (magnifier->target_bounds.y1); + children[2] = g_variant_new_int32 (magnifier->target_bounds.x2); + children[3] = g_variant_new_int32 (magnifier->target_bounds.y2); + retval = g_variant_new_array (G_VARIANT_TYPE_INT32, children, 4); + } else if (g_strcmp0 (property_name, "CursorSet") == 0) { + retval = g_variant_new_string (magnifier->cursor_set ? magnifier->cursor_set : ""); + } else if (g_strcmp0 (property_name, "CursorSize") == 0) { + GVariant *children[2]; + + children[0] = g_variant_new_int32 (magnifier->cursor_size_x); + children[1] = g_variant_new_int32 (magnifier->cursor_size_y); + retval = g_variant_new_array (G_VARIANT_TYPE_INT32, children, 2); + } else if (g_strcmp0 (property_name, "CursorZoom") == 0) { + retval = g_variant_new_double (magnifier->cursor_scale_factor); + } else if (g_strcmp0 (property_name, "CursorColor") == 0) { + retval = g_variant_new_uint32 (magnifier->cursor_color); + } else if (g_strcmp0 (property_name, "CursorHotspot") == 0) { + GVariant *children[2]; + + children[0] = g_variant_new_int32 (magnifier->cursor_hotspot.x); + children[1] = g_variant_new_int32 (magnifier->cursor_hotspot.y); + retval = g_variant_new_array (G_VARIANT_TYPE_INT32, children, 2); + } else if (g_strcmp0 (property_name, "CursorDefaultSize") == 0) { + gint32 csize = 0; + + if (magnifier->priv->cursor) { + gdk_drawable_get_size (magnifier->priv->cursor, &csize, &csize); + } + retval = g_variant_new_int32 (csize); + } else if (g_strcmp0 (property_name, "CrosswireSize") == 0) { + retval = g_variant_new_int32 (magnifier->crosswire_size); + } else if (g_strcmp0 (property_name, "CrosswireLength") == 0) { + retval = g_variant_new_int32 (magnifier->crosswire_length); + } else if (g_strcmp0 (property_name, "CrosswireClip") == 0) { + retval = g_variant_new_boolean (magnifier->crosswire_clip); + } else if (g_strcmp0 (property_name, "CrosswireColor") == 0) { + retval = g_variant_new_uint32 (magnifier->crosswire_color); + } -gboolean -impl_dbus_magnifier_set_cursor_zoom (Magnifier *magnifier, double factor) -{ - magnifier->cursor_scale_factor = factor; - DBG (fprintf (stderr, "Setting cursor scale factor: \t%f\n", magnifier->cursor_scale_factor)); - magnifier_transform_cursor (magnifier); - - return TRUE; + return retval; } -double -impl_dbus_magnifier_get_cursor_zoom (Magnifier *magnifier) -{ - return magnifier->cursor_scale_factor; -} +static gboolean +set_property_cb (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + Magnifier *magnifier = MAGNIFIER (user_data); + + if (g_strcmp0 (property_name, "SourceSize") == 0) { + const int *items; + gsize n_items; + RectBounds rect; + + items = g_variant_get_fixed_array (value, &n_items, sizeof (gint32)); + if (n_items == 4) { + rect.x1 = items[0]; + rect.y1 = items[1]; + rect.x2 = items[2]; + rect.y2 = items[3]; + } + g_object_set (magnifier, "source-display-bounds", &rect, NULL); + } else if (g_strcmp0 (property_name, "TargetSize") == 0) { + const int *items; + gsize n_items; + RectBounds rect; + + items = g_variant_get_fixed_array (value, &n_items, sizeof (gint32)); + if (n_items == 4) { + rect.x1 = items[0]; + rect.y1 = items[1]; + rect.x2 = items[2]; + rect.y2 = items[3]; + } + g_object_set (magnifier, "target-display-bounds", &rect, NULL); + } else if (g_strcmp0 (property_name, "CursorSet") == 0) { + g_object_set (magnifier, + "cursor-set", g_variant_get_string (value, NULL), + NULL); + } else if (g_strcmp0 (property_name, "CursorSize") == 0) { + g_object_set (magnifier, + "cursor-size", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "CursorZoom") == 0) { + g_object_set (magnifier, + "cursor-scale-factor", g_variant_get_double (value), + NULL); + } else if (g_strcmp0 (property_name, "CursorColor") == 0) { + g_object_set (magnifier, + "cursor-color", g_variant_get_uint32 (value), + NULL); + } else if (g_strcmp0 (property_name, "CursorHotspot") == 0) { + const int *items; + gsize n_items; + Point point; + + items = g_variant_get_fixed_array (value, &n_items, sizeof (gint32)); + if (n_items == 2) { + point.x = items[0]; + point.y = items[1]; + } + g_object_set (magnifier, "cursor-hotspot", &point, NULL); + } else if (g_strcmp0 (property_name, "CrosswireSize") == 0) { + g_object_set (magnifier, + "crosswire-size", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "CrosswireLength") == 0) { + g_object_set (magnifier, + "crosswire-length", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "CrosswireClip") == 0) { + g_object_set (magnifier, + "crosswire-clip", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "CrosswireColor") == 0) { + g_object_set (magnifier, + "crosswire-clip", g_variant_get_uint32 (value), + NULL); + } -gboolean -impl_dbus_magnifier_set_cursor_color (Magnifier *magnifier, guint32 color) -{ - magnifier->cursor_color = color; - magnifier_transform_cursor (magnifier); - DBG (fprintf (stderr, "Setting cursor color: \t%u\n", (unsigned) magnifier->cursor_color)); - return TRUE; } -guint32 -impl_dbus_magnifier_get_cursor_color (Magnifier *magnifier) -{ - return magnifier->cursor_color; -} +static const gchar introspection_xml[] = +"<node>" + "<interface name='org.freedesktop.gnome.Magnifier'>" + "<method name='fullScreenCapable'>" + "<arg type='b' name='b-ret' direction='out'/>" + "</method>" + "<method name='hideCursor'/>" + "<method name='showCursor'/>" + "<method name='supportColorblindFilters'>" + "<arg type='b' name='b-ret' direction='out'/>" + "</method>" + "<method name='createZoomRegion'>" + "<arg type='d' name='zx' direction='in'/>" + "<arg type='d' name='zy' direction='in'/>" + "<arg type='ai' name='ROI' direction='in'/>" + "<arg type='ai' name='viewPort' direction='in'/>" + "<arg type='o' name='zoomRegion-ret' direction='out'/>" + "</method>" + "<method name='getZoomRegions'>" + "<arg type='as' name='zoomRegionList-ret' direction='out'/>" + "</method>" + "<method name='addZoomRegion'>" + "<arg type='o' name='region' direction='in'/>" + "<arg type='b' name='b-ret' direction='out'/>" + "</method>" + "<method name='clearAllZoomRegions'/>" + "<method name='dispose'/>" + "<property name='SourceSize' type='ai' access='readwrite'/>" + "<property name='TargetSize' type='ai' access='readwrite'/>" + "<property name='CursorSet' type='s' access='readwrite'/>" + "<property name='CursorSize' type='i' access='readwrite'/>" + "<property name='CursorZoom' type='d' access='readwrite'/>" + "<property name='CursorColor' type='u' access='readwrite'/>" + "<property name='CursorHotspot' type='ai' access='readwrite'/>" + "<property name='CrosswireSize' type='i' access='readwrite'/>" + "<property name='CrosswireLength' type='i' access='readwrite'/>" + "<property name='CrosswireClip' type='b' access='readwrite'/>" + "<property name='CrosswireColor' type='i' access='readwrite'/>" + "<property name='CursorDefaultSize' type='i' access='read'/>" + "</interface>" +"</node>"; + +static const GDBusInterfaceVTable interface_vtable = { + method_call_cb, + get_property_cb, + set_property_cb +}; -gboolean -impl_dbus_magnifier_set_cursor_hotspot (Magnifier *magnifier, gint32 x, gint32 y) -{ - magnifier->cursor_hotspot.x = x; - magnifier->cursor_hotspot.y = y; - magnifier_transform_cursor (magnifier); - - return TRUE; -} +static GDBusNodeInfo *introspection_data = NULL; -GArray* -impl_dbus_magnifier_get_cursor_hotspot (Magnifier *magnifier) +static void +magnifier_do_dispose (Magnifier *magnifier) { - GArray *ret = g_array_new (FALSE, FALSE, sizeof (gint32)); - - g_array_append_val (ret, magnifier->cursor_hotspot.x); - g_array_append_val (ret, magnifier->cursor_hotspot.y); - - return ret; -} + g_dbus_connection_unregister_object (dbus_connection, magnifier->priv->dbus_object_id); -gint32 -impl_dbus_magnifier_get_cursor_default_size (Magnifier *magnifier) -{ - gint32 csize; - - if (magnifier->priv->cursor) { - gdk_drawable_get_size (magnifier->priv->cursor, &csize, &csize); + if (magnifier->zoom_regions) { + g_list_foreach (magnifier->zoom_regions, (GFunc)g_object_unref, NULL); + g_list_free (magnifier->zoom_regions); } - - return csize; -} + magnifier->zoom_regions = NULL; -gboolean -impl_dbus_magnifier_set_crosswire_size (Magnifier *magnifier, gint size) -{ - magnifier->crosswire_size = size; - DBG (fprintf (stderr, "Setting crosswire size: \t%d\n", magnifier->crosswire_size)); - magnifier_zoom_regions_update_pointer (magnifier); - - return TRUE; -} + g_object_unref (dbus_connection); -gint -impl_dbus_magnifier_get_crosswire_size (Magnifier *magnifier) -{ - return magnifier->crosswire_size; + gtk_main_quit (); } -gboolean -impl_dbus_magnifier_set_crosswire_length (Magnifier *magnifier, gint length) +static void +magnifier_gobject_dispose (GObject *object) { - GNOME_Magnifier_RectBounds rect_bounds; - rect_bounds.x1 = 0; - rect_bounds.y1 = 0; - rect_bounds.x2 = 4096; - rect_bounds.y2 = 4096; - - magnifier->crosswire_length = length; - DBG (fprintf (stderr, "Setting crosswire length: \t%d\n", magnifier->crosswire_length)); - magnifier_zoom_regions_mark_dirty (magnifier, rect_bounds); - - return TRUE; -} + magnifier_do_dispose (MAGNIFIER (object)); -gboolean -impl_dbus_magnifier_set_crosswire_clip (Magnifier *magnifier, gboolean clip) -{ - magnifier->crosswire_clip = clip; - DBG (fprintf (stderr, "Setting crosswire clip: \t%s\n", magnifier->crosswire_clip ? "true" : "false")); - magnifier_zoom_regions_update_pointer (magnifier); - - return TRUE; + G_OBJECT_CLASS (magnifier_parent_class)->dispose (object); } -gboolean -impl_dbus_magnifier_get_crosswire_clip (Magnifier *magnifier) +static void +magnifier_gobject_constructed (GObject *object) { - return magnifier->crosswire_clip; -} + Magnifier *magnifier = MAGNIFIER (object); + const gchar *display_env; -gint -impl_dbus_magnifier_get_crosswire_length (Magnifier *magnifier) { - return magnifier->crosswire_length; -} + display_env = g_getenv ("DISPLAY"); -gboolean -impl_dbus_magnifier_set_crosswire_color (Magnifier *magnifier, guint32 color) -{ - magnifier->crosswire_color = color; - DBG (fprintf (stderr, "Setting crosswire color: \t%ld\n", (long) magnifier->crosswire_color)); - - return TRUE; + magnifier_init_display (magnifier, display_env, TRUE); + magnifier_init_display (magnifier, display_env, FALSE); } -guint32 -impl_dbus_magnifier_get_crosswire_color (Magnifier *magnifier) +static void +magnifier_gobject_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) { - return magnifier->crosswire_color; + Magnifier *magnifier = MAGNIFIER (object); + + switch (prop_id) { + case MAGNIFIER_SOURCE_SIZE_PROP: { + RectBounds *rect = g_new (RectBounds, 1); + + *rect = magnifier->source_bounds; + g_value_set_pointer (value, rect); + } + break; + case MAGNIFIER_TARGET_SIZE_PROP: { + RectBounds *rect = g_new (RectBounds, 1); + + *rect = magnifier->target_bounds; + g_value_set_pointer (value, rect); + } + break; + case MAGNIFIER_CURSOR_SET_PROP: + g_value_set_string (value, magnifier->cursor_set); + break; + case MAGNIFIER_CURSOR_SIZE_PROP: + g_value_set_int (value, magnifier->cursor_size_x); + break; + case MAGNIFIER_CURSOR_ZOOM_PROP: + g_value_set_float (value, magnifier->cursor_scale_factor); + break; + case MAGNIFIER_CURSOR_COLOR_PROP: + g_value_set_ulong (value, magnifier->cursor_color); + break; + case MAGNIFIER_CURSOR_HOTSPOT_PROP: { + Point *point = g_new (Point, 1); + + *point = magnifier->cursor_hotspot; + g_value_set_pointer (value, point); + } + break; + case MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP: { + int csize = 0; + + if (magnifier->priv->cursor) + gdk_drawable_get_size (magnifier->priv->cursor, + &csize, &csize); + g_value_set_uint (value, csize); + } + break; + case MAGNIFIER_CROSSWIRE_SIZE_PROP: + g_value_set_int (value, magnifier->crosswire_size); + break; + case MAGNIFIER_CROSSWIRE_LENGTH_PROP: + g_value_set_int (value, magnifier->crosswire_length); + break; + case MAGNIFIER_CROSSWIRE_CLIP_PROP: + g_value_set_boolean (value, magnifier->crosswire_clip); + break; + case MAGNIFIER_CROSSWIRE_COLOR_PROP: + g_value_set_long (value, magnifier->crosswire_color); + break; + case MAGNIFIER_SOURCE_DISPLAY_PROP: + g_value_set_string (value, magnifier->source_display_name); + break; + case MAGNIFIER_TARGET_DISPLAY_PROP: + g_value_set_string (value, magnifier->target_display_name); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } static void -magnifier_set_property (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) +magnifier_gobject_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) { - Magnifier *magnifier = user_data; - gchar *full_display_string; + Magnifier *magnifier = MAGNIFIER (object); + RectBounds rect_bounds = { 0, 0, 4096, 4096 }; - GNOME_Magnifier_RectBounds rect_bounds; - rect_bounds.x1 = 0; - rect_bounds.y1 = 0; - rect_bounds.x2 = 4096; - rect_bounds.y2 = 4096; + switch (prop_id) { + case MAGNIFIER_SOURCE_DISPLAY_PROP: { + const gchar *full_display_string; - switch (arg_id) { - case MAGNIFIER_SOURCE_DISPLAY_PROP: - full_display_string = BONOBO_ARG_GET_STRING (arg); + full_display_string = g_value_get_string (value); if (can_open_display (full_display_string)) { GSList *zoom_region_params = NULL; @@ -1424,9 +1302,12 @@ magnifier_set_property (BonoboPropertyBag *bag, gmag_gs_reset_overlay_at_idle (magnifier); } DBG(fprintf (stderr, "Set source display: \t%s\n", full_display_string)); + } break; - case MAGNIFIER_TARGET_DISPLAY_PROP: - full_display_string = BONOBO_ARG_GET_STRING (arg); + case MAGNIFIER_TARGET_DISPLAY_PROP: { + const gchar *full_display_string; + + full_display_string = g_value_get_string (value); if (can_open_display (full_display_string)) { magnifier->target_screen_num = @@ -1436,10 +1317,11 @@ magnifier_set_property (BonoboPropertyBag *bag, magnifier->target_display = gdk_display_open (full_display_string); magnifier->target_display_name = g_strdup (full_display_string); - if (GTK_IS_WINDOW (magnifier->priv->w)) + if (GTK_IS_WINDOW (magnifier)) { +#if 0 /* FIXME */ #ifdef REPARENT_GTK_WINDOW_WORKS - gtk_window_set_screen (GTK_WINDOW (magnifier->priv->w), + gtk_window_set_screen (GTK_WINDOW (magnifier), gdk_display_get_screen ( magnifier->target_display, magnifier->target_screen_num)); @@ -1462,6 +1344,7 @@ magnifier_set_property (BonoboPropertyBag *bag, /* restore the zoom regions in their new host magnifier window */ magnifier_zoom_regions_restore (magnifier, zoom_region_params); #endif +#endif } magnifier_get_display_rect_bounds (magnifier, &magnifier->source_bounds, FALSE); magnifier_init_cursor_set (magnifier, magnifier->cursor_set); /* needed to reset pixmaps */ @@ -1470,7 +1353,7 @@ magnifier_set_property (BonoboPropertyBag *bag, magnifier->target_bounds.x1, magnifier->target_bounds.y1); else - gtk_window_move (GTK_WINDOW (magnifier->priv->w), + gtk_window_move (GTK_WINDOW (magnifier), magnifier->target_bounds.x1, magnifier->target_bounds.y1); @@ -1484,7 +1367,7 @@ magnifier_set_property (BonoboPropertyBag *bag, magnifier->target_bounds.x1, magnifier->target_bounds.y2 - magnifier->target_bounds.y1); - gtk_window_resize (GTK_WINDOW (magnifier->priv->w), + gtk_window_resize (GTK_WINDOW (magnifier), magnifier->target_bounds.x2 - magnifier->target_bounds.x1, magnifier->target_bounds.y2 - magnifier->target_bounds.y1); DBG(fprintf (stderr, "Set target size: \t%d,%d to %d,%d\n", @@ -1497,21 +1380,20 @@ magnifier_set_property (BonoboPropertyBag *bag, } DBG(fprintf (stderr, "Set target display: \t%s (screen %d)\n", full_display_string, magnifier->target_screen_num)); + } break; - case MAGNIFIER_SOURCE_SIZE_PROP: - magnifier->source_bounds = BONOBO_ARG_GET_GENERAL (arg, - TC_GNOME_Magnifier_RectBounds, - GNOME_Magnifier_RectBounds, - NULL); + case MAGNIFIER_SOURCE_SIZE_PROP: { + RectBounds *rect = g_value_get_pointer (value); + + magnifier->source_bounds = *rect; DBG (fprintf (stderr, "Set source size: \t%d,%d to %d,%d\n", magnifier->source_bounds.x1, magnifier->source_bounds.y1, magnifier->source_bounds.x2, magnifier->source_bounds.y2)); + } break; - case MAGNIFIER_TARGET_SIZE_PROP: - magnifier->target_bounds = BONOBO_ARG_GET_GENERAL (arg, - TC_GNOME_Magnifier_RectBounds, - GNOME_Magnifier_RectBounds, - - NULL); + case MAGNIFIER_TARGET_SIZE_PROP: { + RectBounds *rect = g_value_get_pointer (value); + + magnifier->target_bounds = *rect; if (magnifier->priv->overlay) gdk_window_move_resize (magnifier->priv->overlay, magnifier->target_bounds.x1, @@ -1521,11 +1403,11 @@ magnifier_set_property (BonoboPropertyBag *bag, magnifier->target_bounds.y2 - magnifier->target_bounds.y1); else - gtk_window_move (GTK_WINDOW (magnifier->priv->w), + gtk_window_move (GTK_WINDOW (magnifier), magnifier->target_bounds.x1, magnifier->target_bounds.y1); - gtk_window_resize (GTK_WINDOW (magnifier->priv->w), + gtk_window_resize (GTK_WINDOW (magnifier), magnifier->target_bounds.x2 - magnifier->target_bounds.x1, magnifier->target_bounds.y2 - magnifier->target_bounds.y1); gmag_gs_check_set_struts (magnifier); @@ -1534,49 +1416,44 @@ magnifier_set_property (BonoboPropertyBag *bag, if (!strcmp (magnifier->target_display_name, magnifier->source_display_name) && (magnifier->target_screen_num == magnifier->source_screen_num)) magnifier_adjust_source_size (magnifier); + } break; case MAGNIFIER_CURSOR_SET_PROP: - magnifier_init_cursor_set (magnifier, g_strdup (BONOBO_ARG_GET_STRING (arg))); - DBG (fprintf (stderr, "Setting cursor set: \t%s\n", BONOBO_ARG_GET_STRING (arg))); + magnifier_init_cursor_set (magnifier, g_strdup (g_value_get_string (value))); + DBG (fprintf (stderr, "Setting cursor set: \t%s\n", g_value_get_string (value))); break; case MAGNIFIER_CURSOR_SIZE_PROP: - magnifier->cursor_size_x = BONOBO_ARG_GET_INT (arg); - magnifier->cursor_size_y = BONOBO_ARG_GET_INT (arg); + magnifier->cursor_size_x = g_value_get_int (value); + magnifier->cursor_size_y = magnifier->cursor_size_x; magnifier_transform_cursor (magnifier); DBG (fprintf (stderr, "Setting cursor size: \t%d\n", magnifier->cursor_size_x)); break; case MAGNIFIER_CURSOR_ZOOM_PROP: - magnifier->cursor_scale_factor = BONOBO_ARG_GET_FLOAT (arg); + magnifier->cursor_scale_factor = g_value_get_float (value); DBG (fprintf (stderr, "Setting cursor scale factor: \t%f\n", (float) magnifier->cursor_scale_factor)); magnifier_transform_cursor (magnifier); break; case MAGNIFIER_CURSOR_COLOR_PROP: - magnifier->cursor_color = BONOBO_ARG_GET_GENERAL (arg, - TC_CORBA_unsigned_long, - CORBA_unsigned_long, - NULL); + magnifier->cursor_color = g_value_get_ulong (value); magnifier_transform_cursor (magnifier); DBG (fprintf (stderr, "Setting cursor color: \t%u\n", (unsigned) magnifier->cursor_color)); break; - case MAGNIFIER_CURSOR_HOTSPOT_PROP: - magnifier->cursor_hotspot = BONOBO_ARG_GET_GENERAL (arg, - TC_GNOME_Magnifier_Point, - GNOME_Magnifier_Point, - NULL); + case MAGNIFIER_CURSOR_HOTSPOT_PROP: { + Point *point = g_value_get_pointer (value); + + magnifier->cursor_hotspot = *point; /* TODO: notify zoomers */ /* FIXME: don't call init_cursor, it overwrites this property! */ - magnifier_transform_cursor (magnifier); - break; - case MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP: - bonobo_exception_set (ev, ex_Bonobo_PropertyBag_ReadOnly); + magnifier_transform_cursor (magnifier); + } break; case MAGNIFIER_CROSSWIRE_SIZE_PROP: - magnifier->crosswire_size = BONOBO_ARG_GET_INT (arg); + magnifier->crosswire_size = g_value_get_int (value); DBG (fprintf (stderr, "Setting crosswire size: \t%d\n", magnifier->crosswire_size)); magnifier_zoom_regions_update_pointer (magnifier); break; case MAGNIFIER_CROSSWIRE_LENGTH_PROP: - magnifier->crosswire_length = BONOBO_ARG_GET_INT (arg); + magnifier->crosswire_length = g_value_get_int (value); DBG (fprintf (stderr, "Setting crosswire length: \t%d\n", magnifier->crosswire_length)); /* FIXME: The call below forces the repaint of all the screen, * but I can't figure a better solution right now to the case @@ -1584,713 +1461,277 @@ magnifier_set_property (BonoboPropertyBag *bag, magnifier_zoom_regions_mark_dirty (magnifier, rect_bounds); break; case MAGNIFIER_CROSSWIRE_CLIP_PROP: - magnifier->crosswire_clip = BONOBO_ARG_GET_BOOLEAN (arg); + magnifier->crosswire_clip = g_value_get_boolean (value); DBG (fprintf (stderr, "Setting crosswire clip: \t%s\n", magnifier->crosswire_clip ? "true" : "false")); magnifier_zoom_regions_update_pointer (magnifier); break; case MAGNIFIER_CROSSWIRE_COLOR_PROP: - magnifier->crosswire_color = BONOBO_ARG_GET_LONG (arg); + magnifier->crosswire_color = g_value_get_long (value); DBG (fprintf (stderr, "Setting crosswire size: \t%ld\n", (long) magnifier->crosswire_color)); break; default: - bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound); - break; - }; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } static void -magnifier_do_dispose (Magnifier *magnifier) +magnifier_init (Magnifier *magnifier) { - /* FIXME: this is dead ropey code structuring */ - bonobo_activation_active_server_unregister ( - MAGNIFIER_OAFIID, BONOBO_OBJREF (magnifier)); + magnifier->priv = MAGNIFIER_GET_PRIVATE (magnifier); - if (magnifier->zoom_regions_dbus) - g_list_free (magnifier->zoom_regions_dbus); - if (magnifier->zoom_regions) - g_list_free (magnifier->zoom_regions); - magnifier->zoom_regions = NULL; - magnifier->zoom_regions_dbus = NULL; - - bonobo_main_quit (); -} + magnifier->cursor_scale_factor = 1.0F; + magnifier->cursor_color = 0xFF000000; + magnifier->crosswire_size = 1; + magnifier->priv->use_source_cursor = TRUE; + magnifier_init_cursor_set (magnifier, "default"); -static void -magnifier_gobject_dispose (GObject *object) -{ - magnifier_do_dispose (MAGNIFIER (object)); + magnifier->priv->canvas = gtk_fixed_new (); + gtk_container_add (GTK_CONTAINER (magnifier), magnifier->priv->canvas); - BONOBO_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); -} + mag_timing.process = g_timer_new (); + mag_timing.frame = g_timer_new (); + mag_timing.scale = g_timer_new (); + mag_timing.idle = g_timer_new (); -static inline -CORBA_boolean -impl_magnifier_support_colorblind_filters (PortableServer_Servant _servant G_GNUC_UNUSED, - CORBA_Environment *ev G_GNUC_UNUSED) -{ -#ifdef HAVE_COLORBLIND - return CORBA_TRUE; -#else - return CORBA_FALSE; +#ifdef DEBUG_CLIENT_CALLS + client_debug = (g_getenv ("MAG_CLIENT_DEBUG") != NULL); #endif + zoom_hash = g_hash_table_new (g_str_hash, g_str_equal); } static void -impl_magnifier_hide_cursor (PortableServer_Servant servant, - CORBA_Environment *ev) +magnifier_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) { - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); + GTK_WIDGET_CLASS (magnifier_parent_class)->size_allocate (widget, allocation); - gmag_gs_hide_cursor (magnifier); + gmag_gs_check_set_struts (MAGNIFIER (widget)); } static void -impl_magnifier_show_cursor (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - - gmag_gs_show_cursor (magnifier); -} - -static -CORBA_boolean -impl_magnifier_full_screen_capable (PortableServer_Servant servant, - CORBA_Environment * ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - - if ((strcmp (magnifier->source_display_name, - magnifier->target_display_name) != 0) || - gmag_gs_use_compositor (magnifier)) - return CORBA_TRUE; - - return CORBA_FALSE; -} - -gboolean -impl_dbus_magnifier_full_screen_capable (Magnifier *magnifier) -{ - if ((strcmp (magnifier->source_display_name, - magnifier->target_display_name) != 0) || - gmag_gs_use_compositor (magnifier)) { - return TRUE; - } - - return FALSE; -} - -gboolean -impl_dbus_magnifier_hide_cursor (Magnifier *magnifier) -{ - gmag_gs_hide_cursor (magnifier); - - return TRUE; -} - -gboolean -impl_dbus_magnifier_show_cursor (Magnifier *magnifier) -{ - gmag_gs_show_cursor (magnifier); - - return TRUE; -} - -gboolean -impl_dbus_magnifier_support_colorblind_filters (Magnifier *magnifier) -{ -#ifdef HAVE_COLORBLIND - return TRUE; -#else - return FALSE; -#endif -} - -gchar* -impl_dbus_magnifier_create_zoom_region (Magnifier *magnifier, - const double zx, - const double zy, - const gint32 **roi, - const gint32 **viewport) -{ - ZoomRegion *zoom_region = zoom_region_new(); - - DBG (fprintf (stderr, "Create zoom region: \tzoom %f,%f, viewport %d,%d to %d,%d\n", (float) zx, (float) zy, (*viewport)[0]/*x1*/, (*viewport)[1]/*y1*/, (*viewport)[2]/*x2*/, (*viewport)[3]/*y3*/)); - - /* FIXME: - * shouldn't do this here, since it causes the region to get - * mapped onto the parent, if if it's not explicitly added! - */ - DBG(g_message ("creating zoom region with parent %p", magnifier)); - zoom_region->priv->parent = magnifier; - - impl_dbus_zoom_region_set_mag_factor (zoom_region, zx, zy); - - impl_dbus_zoom_region_move_resize (zoom_region, viewport); - - impl_dbus_zoom_region_set_roi (zoom_region, roi); - - gtk_widget_set_size_request (magnifier->priv->canvas, - (*viewport)[2] - (*viewport)[0], - (*viewport)[3] - (*viewport)[1]); - gtk_widget_show (magnifier->priv->canvas); - gtk_widget_show (magnifier->priv->w); - - g_hash_table_insert (zoom_hash, g_strdup(zoom_region->object_path), zoom_region); - - return g_strdup (zoom_region->object_path); -} - -gchar** -impl_dbus_magnifier_get_zoom_regions (Magnifier *magnifier) -{ - ZoomRegion *zoom_region; - gchar **list; - int i, len; - - len = g_list_length (magnifier->zoom_regions); - list = g_malloc0 (sizeof (gchar *) * len); - for (i = 0; i < len; ++i) { - zoom_region = g_list_nth_data (magnifier->zoom_regions_dbus, i); - list[i] = g_strdup (zoom_region->object_path); - } - - DBG (fprintf (stderr, "Get zoom regions: \t%d\n", len)); - - return list; -} - -gboolean -impl_dbus_magnifier_add_zoom_region (Magnifier *magnifier, gchar *zoom_region_path) -{ - if (!magnifier->source_initialized) - { - magnifier_set_extension_listeners (magnifier, magnifier_get_root (magnifier)); - } - - /* FIXME: this needs proper lifecycle management */ - ZoomRegion *zoom_region = g_hash_table_lookup (zoom_hash, zoom_region_path); - magnifier->zoom_regions = g_list_append (magnifier->zoom_regions, BONOBO_OBJREF (zoom_region)); - magnifier->zoom_regions_dbus = g_list_append (magnifier->zoom_regions_dbus, zoom_region); - g_hash_table_remove (zoom_hash, zoom_region_path); - gmag_gs_check_set_struts (magnifier); - - return TRUE; -} - -gboolean -impl_dbus_magnifier_clear_all_zoom_regions (Magnifier *magnifier) +magnifier_realize (GtkWidget *widget) { - g_list_foreach (magnifier->zoom_regions_dbus, - magnifier_dbus_unref_zoom_region, magnifier); - g_list_foreach (magnifier->zoom_regions, - magnifier_unref_zoom_region, magnifier); - g_list_free (magnifier->zoom_regions); - g_list_free (magnifier->zoom_regions_dbus); - magnifier->zoom_regions = NULL; - magnifier->zoom_regions_dbus = NULL; - - return TRUE; -} + GTK_WIDGET_CLASS (magnifier_parent_class)->realize (widget); -gboolean -impl_dbus_magnifier_dispose (Magnifier *magnifier) -{ - magnifier_do_dispose (magnifier); - - return TRUE; + gmag_gs_magnifier_realize (widget); } static void -impl_magnifier_set_source_display (PortableServer_Servant servant, - const CORBA_char *display, - CORBA_Environment *ev) +magnifier_destroy (GtkObject *object) { - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING); - gchar *full_display_string; - - full_display_string = g_strdup (display); - if (strcmp (full_display_string, "") == 0) - full_display_string = (gchar *) g_getenv ("DISPLAY"); - - BONOBO_ARG_SET_STRING (arg, full_display_string); - - DBG (fprintf (stderr, "Set source display: \t%s\n", - full_display_string)); - - if (strcmp (full_display_string, magnifier->source_display_name)) { - magnifier_set_property (magnifier->property_bag, - arg, - MAGNIFIER_SOURCE_DISPLAY_PROP, - ev, - magnifier); - } - else - { - DBG (fprintf (stderr, "Attempt to set source to same value as previous: %s\n", - full_display_string)); - } - bonobo_arg_release (arg); + gtk_main_quit (); } static void -impl_magnifier_set_target_display (PortableServer_Servant servant, - const CORBA_char *display, - CORBA_Environment *ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING); - gchar *full_display_string; - - full_display_string = g_strdup (display); - if (strcmp (full_display_string, "") == 0) - full_display_string = (gchar *) g_getenv ("DISPLAY"); - - BONOBO_ARG_SET_STRING (arg, full_display_string); - - DBG (fprintf (stderr, "Set target display: \t%s\n", - full_display_string)); - - if (strcmp (full_display_string, magnifier->target_display_name)) - { - magnifier_set_property (magnifier->property_bag, - arg, - MAGNIFIER_TARGET_DISPLAY_PROP, - ev, - magnifier); - } - else - { - DBG (fprintf (stderr, "Attempt to set target to same value as previous: %s\n", - full_display_string)); - } - bonobo_arg_release (arg); -} - -static -CORBA_string -impl_magnifier_get_source_display (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - DBG (fprintf (stderr, "Get source display: \t%s\n", magnifier->source_display_name)); - - return CORBA_string_dup (magnifier->source_display_name ? magnifier->source_display_name : ""); -} - -static -CORBA_string -impl_magnifier_get_target_display (PortableServer_Servant servant, - CORBA_Environment *ev) +magnifier_class_init (MagnifierClass *klass) { - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - DBG (fprintf (stderr, "Get target display: \t%s\n", - magnifier->target_display_name)); + GObjectClass * object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + GtkObjectClass *gtk_object_class = (GtkObjectClass *) klass; - return CORBA_string_dup (magnifier->target_display_name ? magnifier->target_display_name : ""); + object_class->constructed = magnifier_gobject_constructed; + object_class->dispose = magnifier_gobject_dispose; + object_class->get_property = magnifier_gobject_get_property; + object_class->set_property = magnifier_gobject_set_property; + + widget_class->realize = magnifier_realize; + widget_class->size_allocate = magnifier_size_allocate; + gtk_object_class->destroy = magnifier_destroy; + + g_object_class_install_property (object_class, + MAGNIFIER_SOURCE_DISPLAY_PROP, + g_param_spec_string ("source-display-screen", + "SourceDisplayScreen", + "source display screen", + NULL, + G_PARAM_WRITABLE)); + g_object_class_install_property (object_class, + MAGNIFIER_TARGET_DISPLAY_PROP, + g_param_spec_string ("target-display-screen", + "TargetDisplayScreen", + "target display screen", + NULL, + G_PARAM_WRITABLE)); + g_object_class_install_property (object_class, + MAGNIFIER_SOURCE_SIZE_PROP, + g_param_spec_pointer ("source-display-bounds", + "SourceDisplayBounds", + "source display bounds/size", + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_TARGET_SIZE_PROP, + g_param_spec_pointer ("target-display-bounds", + "TargetDisplayBounds", + "target display bounds/size", + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CURSOR_SET_PROP, + g_param_spec_string ("cursor-set", + "CursorSet", + "name of cursor set", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CURSOR_SIZE_PROP, + g_param_spec_int ("cursor-size", + "CursorSize", + "cursor size, in pixels", + 0, G_MAXINT, 64, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CURSOR_ZOOM_PROP, + g_param_spec_float ("cursor-scale-factor", + "CursorScaleFactor", + "scale factor for cursors (overrides size)", + 0, G_MAXFLOAT, 1.0F, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CURSOR_COLOR_PROP, + g_param_spec_ulong ("cursor-color", + "CursorColor", + "foreground color for 1-bit cursors, as ARGB", + 0, G_MAXULONG, 0xFF000000, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CURSOR_HOTSPOT_PROP, + g_param_spec_pointer ("cursor-hotspot", + "CursorHotspot", + "hotspot relative to cursor's upper-left-corner, at default resolition", + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP, + g_param_spec_int ("cursor-default-size", + "CursorDefaultSize", + "default size of current cursor set", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CROSSWIRE_SIZE_PROP, + g_param_spec_int ("crosswire-size", + "CrosswireSize", + "thickness of crosswire cursor, in target pixels", + G_MININT, G_MAXINT, 1, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CROSSWIRE_LENGTH_PROP, + g_param_spec_int ("crosswire-length", + "CrosswireLength", + "length of crosswire cursor, in target pixels", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CROSSWIRE_COLOR_PROP, + g_param_spec_long ("crosswire-color", + "CrosswireColor", + "color of crosswire, as A-RGB; note that alpha is required. (use 0 for XOR wire)", + G_MINLONG, G_MAXLONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + MAGNIFIER_CROSSWIRE_CLIP_PROP, + g_param_spec_boolean ("crosswire-clip", + "CrosswireClip", + "whether to inset the cursor over the crosswire or not", + FALSE, + G_PARAM_READWRITE)); + + g_type_class_add_private (klass, sizeof (MagnifierPrivate)); } -static GNOME_Magnifier_ZoomRegion -impl_magnifier_create_zoom_region (PortableServer_Servant servant, - const CORBA_float zx, - const CORBA_float zy, - const GNOME_Magnifier_RectBounds *roi, - const GNOME_Magnifier_RectBounds *viewport, - CORBA_Environment *ev) +Magnifier * +magnifier_new (gboolean override_redirect, + const gchar *source_display_name, + const gchar *target_display_name) { - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - CORBA_any viewport_any; - ZoomRegion *zoom_region = zoom_region_new (); - Bonobo_PropertyBag properties; - GNOME_Magnifier_ZoomRegion retval; - - DBG (fprintf (stderr, "Create zoom region: \tzoom %f,%f, viewport %d,%d to %d,%d\n", (float) zx, (float) zy, viewport->x1, viewport->y1, viewport->x2, viewport->y2)); - - /* FIXME: - * shouldn't do this here, since it causes the region to get - * mapped onto the parent, if if it's not explicitly added! - */ - DBG(g_message ("creating zoom region with parent %p", magnifier)); - zoom_region->priv->parent = magnifier; - - retval = BONOBO_OBJREF (zoom_region); - - /* 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"); - - 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 = (gpointer) viewport; - Bonobo_PropertyBag_setValue ( - properties, "viewport", &viewport_any, ev); - - GNOME_Magnifier_ZoomRegion_setROI (retval, roi, ev); - if (ev->_major != CORBA_NO_EXCEPTION) - fprintf (stderr, "EXCEPTION setROI\n"); - - CORBA_exception_init (ev); - - gtk_widget_set_size_request (magnifier->priv->canvas, - viewport->x2 - viewport->x1, - viewport->y2 - viewport->y1); - gtk_widget_show (magnifier->priv->canvas); - gtk_widget_show (magnifier->priv->w); + Magnifier *mag; + GtkWindowType mag_win_type = GTK_WINDOW_TOPLEVEL; + guint32 request_name_reply; + GVariant *result; + GError *error = NULL; - bonobo_object_release_unref (properties, ev); - - return CORBA_Object_duplicate (retval, ev); -} + if (override_redirect || gmag_gs_use_compositor (source_display_name, target_display_name)) + mag_win_type = GTK_WINDOW_POPUP; -static -CORBA_boolean -impl_magnifier_add_zoom_region (PortableServer_Servant servant, - const GNOME_Magnifier_ZoomRegion region, - CORBA_Environment * ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); + mag = g_object_new (magnifier_get_type(), + "source-display-screen", source_display_name, + "target-display-screen", target_display_name, + "type", mag_win_type, + "can_focus", FALSE, + "title", "magnifier", + "allow_grow", TRUE, + "allow_shrink", TRUE, + "border_width", 0, + NULL); + + if (!dbus_connection) + dbus_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (!dbus_connection) { + g_error ("Unable to connect to dbus: %s", error->message); + g_error_free (error); + g_object_unref (mag); - if (!magnifier->source_initialized) - { - magnifier_set_extension_listeners (magnifier, magnifier_get_root (magnifier)); + return NULL; } - /* FIXME: this needs proper lifecycle management */ - magnifier->zoom_regions = g_list_append (magnifier->zoom_regions, region); - gmag_gs_check_set_struts (magnifier); - - return CORBA_TRUE; -} - -static Bonobo_PropertyBag -impl_magnifier_get_properties (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - return bonobo_object_dup_ref ( - BONOBO_OBJREF (magnifier->property_bag), ev); -} + result = g_dbus_connection_call_sync (dbus_connection, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "RequestName", + g_variant_new ("(su)", + "org.freedesktop.gnome.Magnifier", + G_BUS_NAME_OWNER_FLAGS_NONE), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &error); + if (!result) { + g_warning ("Cannot register the magnifier: %s", + error->message); + g_error_free (error); + g_object_unref (mag); -GNOME_Magnifier_ZoomRegionList * -impl_magnifier_get_zoom_regions (PortableServer_Servant servant, - CORBA_Environment * ev) -{ - Magnifier *magnifier = - MAGNIFIER (bonobo_object_from_servant (servant)); - - GNOME_Magnifier_ZoomRegionList *list; - CORBA_Object objref; - int i, len; - - len = g_list_length (magnifier->zoom_regions); - list = GNOME_Magnifier_ZoomRegionList__alloc (); - list->_length = len; - list->_buffer = - GNOME_Magnifier_ZoomRegionList_allocbuf (list->_length); - for (i = 0; i < len; ++i) { - objref = g_list_nth_data (magnifier->zoom_regions, i); - list->_buffer [i] = - CORBA_Object_duplicate (objref, ev); + return NULL; } - CORBA_sequence_set_release (list, CORBA_TRUE); - - DBG (fprintf (stderr, "Get zoom regions: \t%d\n", len)); - - return list; -} - -static void -impl_magnifier_clear_all_zoom_regions (PortableServer_Servant servant, - CORBA_Environment * ev) -{ - Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant)); - fprintf (stderr, "Clear 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->zoom_regions_dbus = NULL; -} - -static void -impl_magnifier_dispose (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - magnifier_do_dispose ( - MAGNIFIER (bonobo_object_from_servant (servant))); -} -static void -magnifier_class_init (MagnifierClass *klass) -{ - GObjectClass * object_class = (GObjectClass *) klass; - POA_GNOME_Magnifier_Magnifier__epv *epv = &klass->epv; - parent_class = g_type_class_peek (BONOBO_TYPE_OBJECT); /* needed by BONOBO_CALL_PARENT! */ - - object_class->dispose = magnifier_gobject_dispose; - - epv->fullScreenCapable = impl_magnifier_full_screen_capable; - epv->hideCursor = impl_magnifier_hide_cursor; - epv->showCursor = impl_magnifier_show_cursor; - epv->supportColorblindFilters = impl_magnifier_support_colorblind_filters; - epv->_set_SourceDisplay = impl_magnifier_set_source_display; - epv->_set_TargetDisplay = impl_magnifier_set_target_display; - epv->_get_SourceDisplay = impl_magnifier_get_source_display; - epv->_get_TargetDisplay = impl_magnifier_get_target_display; - epv->getProperties = impl_magnifier_get_properties; - epv->getZoomRegions = impl_magnifier_get_zoom_regions; - epv->createZoomRegion = impl_magnifier_create_zoom_region; - epv->addZoomRegion = impl_magnifier_add_zoom_region; - epv->clearAllZoomRegions = impl_magnifier_clear_all_zoom_regions; - epv->dispose = impl_magnifier_dispose; -} - -static void -magnifier_properties_init (Magnifier *magnifier) -{ - BonoboArg *def; - GNOME_Magnifier_RectBounds rect_bounds; - gchar *display_env; - - magnifier->property_bag = - bonobo_property_bag_new_closure ( - g_cclosure_new_object ( - G_CALLBACK (magnifier_get_property), - G_OBJECT (magnifier)), - g_cclosure_new_object ( - G_CALLBACK (magnifier_set_property), - G_OBJECT (magnifier))); - /* Aggregate so magnifier implements Bonobo_PropertyBag */ - bonobo_object_add_interface (BONOBO_OBJECT (magnifier), - BONOBO_OBJECT (magnifier->property_bag)); - - def = bonobo_arg_new (BONOBO_ARG_STRING); - display_env = getenv ("DISPLAY"); - BONOBO_ARG_SET_STRING (def, display_env); - - bonobo_property_bag_add (magnifier->property_bag, - "source-display-screen", - MAGNIFIER_SOURCE_DISPLAY_PROP, - BONOBO_ARG_STRING, - def, - "source display screen", - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "target-display-screen", - MAGNIFIER_TARGET_DISPLAY_PROP, - BONOBO_ARG_STRING, - def, - "target display screen", - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); + g_variant_get (result, "(u)", &request_name_reply); + g_variant_unref (result); - magnifier_init_display (magnifier, display_env, TRUE); - magnifier_init_display (magnifier, display_env, FALSE); - - magnifier_get_display_rect_bounds (magnifier, &rect_bounds, FALSE); - def = bonobo_arg_new_from (TC_GNOME_Magnifier_RectBounds, &rect_bounds); - - bonobo_property_bag_add (magnifier->property_bag, - "source-display-bounds", - MAGNIFIER_SOURCE_SIZE_PROP, - TC_GNOME_Magnifier_RectBounds, - def, - "source display bounds/size", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - magnifier_get_display_rect_bounds (magnifier, &rect_bounds, TRUE); - def = bonobo_arg_new_from (TC_GNOME_Magnifier_RectBounds, &rect_bounds); - - bonobo_property_bag_add (magnifier->property_bag, - "target-display-bounds", - MAGNIFIER_TARGET_SIZE_PROP, - TC_GNOME_Magnifier_RectBounds, - def, - "target display bounds/size", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - bonobo_property_bag_add (magnifier->property_bag, - "cursor-set", - MAGNIFIER_CURSOR_SET_PROP, - BONOBO_ARG_STRING, - NULL, - "name of cursor set", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - def = bonobo_arg_new (BONOBO_ARG_INT); - BONOBO_ARG_SET_INT (def, 64); - - bonobo_property_bag_add (magnifier->property_bag, - "cursor-size", - MAGNIFIER_CURSOR_SIZE_PROP, - BONOBO_ARG_INT, - def, - "cursor size, in pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - bonobo_property_bag_add (magnifier->property_bag, - "cursor-scale-factor", - MAGNIFIER_CURSOR_ZOOM_PROP, - BONOBO_ARG_FLOAT, - NULL, - "scale factor for cursors (overrides size)", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "cursor-color", - MAGNIFIER_CURSOR_COLOR_PROP, - TC_CORBA_unsigned_long, - NULL, - "foreground color for 1-bit cursors, as ARGB", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "cursor-hotspot", - MAGNIFIER_CURSOR_HOTSPOT_PROP, - TC_GNOME_Magnifier_Point, - NULL, - "hotspot relative to cursor's upper-left-corner, at default resolition", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "cursor-default-size", - MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP, - BONOBO_ARG_INT, - NULL, - "default size of current cursor set", - Bonobo_PROPERTY_READABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "crosswire-size", - MAGNIFIER_CROSSWIRE_SIZE_PROP, - BONOBO_ARG_INT, - NULL, - "thickness of crosswire cursor, in target pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "crosswire-length", - MAGNIFIER_CROSSWIRE_LENGTH_PROP, - BONOBO_ARG_INT, - NULL, - "length of crosswire cursor, in target pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "crosswire-color", - MAGNIFIER_CROSSWIRE_COLOR_PROP, - BONOBO_ARG_LONG, - NULL, - "color of crosswire, as A-RGB; note that alpha is required. (use 0 for XOR wire)", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (magnifier->property_bag, - "crosswire-clip", - MAGNIFIER_CROSSWIRE_CLIP_PROP, - BONOBO_ARG_BOOLEAN, - NULL, - "whether to inset the cursor over the crosswire or not", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); -} - -static void -magnifier_init_window (Magnifier *magnifier, GdkScreen *screen) -{ - GtkWindowType mag_win_type = GTK_WINDOW_TOPLEVEL; - if (_is_override_redirect || gmag_gs_use_compositor (magnifier)) - mag_win_type = GTK_WINDOW_POPUP; - - magnifier->priv->w = - g_object_connect (gtk_widget_new (gtk_window_get_type (), - "user_data", NULL, - "can_focus", FALSE, - "type", mag_win_type, - "title", "magnifier", - "allow_grow", TRUE, - "allow_shrink", TRUE, - "border_width", 0, - NULL), - "signal::realize", magnifier_realize, NULL, - "signal::size_allocate", magnifier_size_allocate, NULL, - "signal::destroy", magnifier_exit, NULL, - NULL); - gtk_window_set_screen (GTK_WINDOW (magnifier->priv->w), screen); - magnifier->priv->canvas = gtk_fixed_new (); - gtk_container_add (GTK_CONTAINER (magnifier->priv->w), - magnifier->priv->canvas); - magnifier->priv->root = NULL; -} - -static void -magnifier_init (Magnifier *magnifier) -{ - magnifier->priv = g_new0 (MagnifierPrivate, 1); - magnifier_properties_init (magnifier); - magnifier->zoom_regions = NULL; - magnifier->zoom_regions_dbus = NULL; - magnifier->source_screen_num = 0; - magnifier->target_screen_num = 0; - magnifier->source_display_name = g_strdup (":0.0"); - magnifier->target_display_name = g_strdup (":0.0"); - magnifier->cursor_size_x = 0; - magnifier->cursor_size_y = 0; - magnifier->cursor_scale_factor = 1.0F; - magnifier->cursor_color = 0xFF000000; - magnifier->crosswire_size = 1; - magnifier->crosswire_length = 0; - magnifier->crosswire_color = 0; - magnifier->crosswire_clip = FALSE; - magnifier->cursor_hotspot.x = 0; - magnifier->cursor_hotspot.y = 0; - magnifier->target_bounds.x1 = 0; - magnifier->target_bounds.y1 = 0; - magnifier->target_bounds.x2 = 0; - magnifier->target_bounds.y2 = 0; - magnifier->priv->cursor = NULL; - magnifier->priv->w = NULL; - magnifier->priv->use_source_cursor = TRUE; - magnifier->priv->cursorlist = NULL; - magnifier->priv->source_drawable = NULL; - magnifier->priv->overlay = NULL; - magnifier_init_window (magnifier, - gdk_display_get_screen (magnifier->target_display, - magnifier->target_screen_num)); - magnifier_init_cursor_set (magnifier, "default"); + switch (request_name_reply) { + case 1: /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */ + case 4: /* DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER */ + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, &error); + if (!introspection_data) { + g_warning ("%s", error->message); + } else { + mag->priv->dbus_object_id = + g_dbus_connection_register_object (dbus_connection, + "/org/freedesktop/gnome/Magnifier", + introspection_data->interfaces[0], + &interface_vtable, + mag, NULL, + &error); + if (error) { + g_printerr ("Failed to register magnifier object: %s\n", error->message); + g_error_free (error); + g_object_unref (mag); + + return NULL; + } + } + break; + case 2: /* DBUS_REQUEST_NAME_REPLY_IN_QUEUE */ + case 3: /* DBUS_REQUEST_NAME_REPLY_EXISTS */ + printf("An instance of magnifier is already active. Exiting Program.\n"); + exit (0); + break; + default: + g_warning ("Cannot register the magnifier: unhandled " + "reply %u from RequestName", request_name_reply); + } - mag_timing.process = g_timer_new (); - mag_timing.frame = g_timer_new (); - mag_timing.scale = g_timer_new (); - mag_timing.idle = g_timer_new (); -#ifdef DEBUG_CLIENT_CALLS - client_debug = (g_getenv ("MAG_CLIENT_DEBUG") != NULL); -#endif + g_timeout_add (500, magnifier_reset_struts_at_idle, mag); + g_timeout_add (500, gmag_gs_reset_overlay_at_idle, mag); - zoom_hash = g_hash_table_new (g_str_hash, g_str_equal); + return mag; } GdkDrawable * @@ -2321,72 +1762,3 @@ magnifier_get_cursor (Magnifier *magnifier) } return magnifier->priv->cursor; } - -Magnifier * -magnifier_new (gboolean override_redirect) -{ - Magnifier *mag; - MagLoginHelper *helper; - GError *error = NULL; - MagnifierClass *klass = NULL; - DBusGProxy *driver_proxy; - guint request_req; - int ret; - - _is_override_redirect = override_redirect; - - mag = g_object_new (magnifier_get_type(), NULL); - - _this_magnifier = mag; /* FIXME what about multiple instances? */ - - helper = g_object_new (mag_login_helper_get_type (), NULL); - mag_login_helper_set_magnifier (helper, mag); - - bonobo_object_add_interface (bonobo_object (mag), - BONOBO_OBJECT (helper)); - - ret = bonobo_activation_active_server_register ( - MAGNIFIER_OAFIID, BONOBO_OBJREF (mag)); - if (ret != Bonobo_ACTIVATION_REG_SUCCESS) { - if ( ret == Bonobo_ACTIVATION_REG_ALREADY_ACTIVE) - { - printf("An instance of magnifier is already active. Exiting Program.\n"); - exit(0); - } else - g_error ("Error registering magnifier server.\n"); - } - - klass = MAGNIFIER_GET_CLASS (mag); - - klass->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - if (klass->connection == NULL) { - g_warning ("Unable to connect to dbus: %s", error->message); - g_error_free (error); - return NULL; - } - - dbus_g_object_type_install_info (MAGNIFIER_TYPE, &dbus_glib_impl_dbus_magnifier_object_info); - - dbus_g_connection_register_g_object (klass->connection, "/org/freedesktop/gnome/Magnifier", - G_OBJECT (_this_magnifier)); - - driver_proxy = dbus_g_proxy_new_for_name (klass->connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - - if (!org_freedesktop_DBus_request_name (driver_proxy, "org.freedesktop.gnome.Magnifier", 0, &request_req, - &error)) { - g_warning ("Unable to register service: %s", error->message); - g_error_free (error); - } - - g_timeout_add (500, magnifier_reset_struts_at_idle, mag); - g_timeout_add (500, gmag_gs_reset_overlay_at_idle, mag); - - return mag; -} - -BONOBO_TYPE_FUNC_FULL (Magnifier, - GNOME_Magnifier_Magnifier, - BONOBO_TYPE_OBJECT, - magnifier) - diff --git a/magnifier/magnifier.h b/magnifier/magnifier.h index 8aab945..905ffc7 100644 --- a/magnifier/magnifier.h +++ b/magnifier/magnifier.h @@ -23,22 +23,15 @@ #ifndef MAGNIFIER_H_ #define MAGNIFIER_H_ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "GNOME_Magnifier.h" - #include <glib.h> +#include <glib-object.h> +#include <gtk/gtk.h> #include <gdk/gdk.h> -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-property-bag.h> - -#include <login-helper/login-helper.h> +#include "zoom-region.h" -#include <dbus/dbus-glib.h> +G_BEGIN_DECLS #define MAGNIFIER_TYPE (magnifier_get_type ()) #define MAGNIFIER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MAGNIFIER_TYPE, Magnifier)) @@ -47,25 +40,10 @@ extern "C" { #define IS_MAGNIFIER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), MAGNIFIER_TYPE)) #define MAGNIFIER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), MAGNIFIER_TYPE, MagnifierClass)) -#define MAGNIFIER_OAFIID "OAFIID:GNOME_Magnifier_Magnifier:0.9" - typedef struct _MagnifierPrivate MagnifierPrivate; typedef struct { - gint32 x1; - gint32 y1; - gint32 x2; - gint32 y2; -} RectBounds; - -typedef struct { - gint32 x; - gint32 y; -} Point; - -typedef struct { - BonoboObject parent; - BonoboPropertyBag *property_bag; + GtkWindow parent; GdkDisplay *source_display; GdkDisplay *target_display; gchar *source_display_name; @@ -73,7 +51,6 @@ typedef struct { int source_screen_num; int target_screen_num; GList *zoom_regions; - GList *zoom_regions_dbus; gboolean source_initialized; gint crosswire_size; gint crosswire_length; @@ -84,16 +61,14 @@ typedef struct { gint cursor_size_y; guint32 cursor_color; float cursor_scale_factor; - GNOME_Magnifier_RectBounds source_bounds; - GNOME_Magnifier_RectBounds target_bounds; - GNOME_Magnifier_Point cursor_hotspot; + RectBounds source_bounds; + RectBounds target_bounds; + Point cursor_hotspot; MagnifierPrivate *priv; } Magnifier; typedef struct { - BonoboObjectClass parent_class; - POA_GNOME_Magnifier_Magnifier__epv epv; - DBusGConnection *connection; + GtkWindowClass parent_class; } MagnifierClass; /* @@ -172,9 +147,18 @@ typedef struct timing { TimingStruct mag_timing; GdkDrawable *magnifier_get_cursor (Magnifier *magnifier); -GType magnifier_get_type (void); +GType magnifier_get_type (void) G_GNUC_CONST; GdkWindow *magnifier_get_root (Magnifier *magnifier); -Magnifier *magnifier_new (gboolean override_redirect); +Magnifier *magnifier_new (gboolean override_redirect, + const gchar *source_display_name, + const gchar *target_display_name); +ZoomRegion *magnifier_create_zoom_region (Magnifier *magnifier, + gdouble zx, + gdouble zy, + RectBounds *roi, + RectBounds *viewport); +void magnifier_add_zoom_region (Magnifier *magnifier, + ZoomRegion *zoom_region); void magnifier_notify_damage (Magnifier *magnifier, GdkRectangle *rect); void magnifier_set_cursor_from_pixbuf (Magnifier *magnifier, @@ -186,47 +170,6 @@ void magnifier_transform_cursor (Magnifier *magnifier); void magnifier_zoom_regions_update_pointer (Magnifier *magnifier); gboolean magnifier_full_screen_capable (Magnifier *magnifier); -/* D-BUS methods */ -gboolean impl_dbus_magnifier_full_screen_capable (Magnifier *magnifier); -gboolean impl_dbus_magnifier_hide_cursor (Magnifier *magnifier); -gboolean impl_dbus_magnifier_show_cursor (Magnifier *magnifier); -gboolean impl_dbus_magnifier_support_colorblind_filters (Magnifier *magnifier); -gchar* impl_dbus_magnifier_create_zoom_region (Magnifier *magnifier, const double zx, const double zy, - const gint32 **roi, const gint32 **viewport); -gchar** impl_dbus_magnifier_get_zoom_regions (Magnifier *magnifier); -gboolean impl_dbus_magnifier_add_zoom_region (Magnifier *magnifier, gchar *zoom_region_path); -gboolean impl_dbus_magnifier_clear_all_zoom_regions (Magnifier *magnifier); -gboolean impl_dbus_magnifier_dispose (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_source_display (Magnifier *magnifier, gchar *source_display); -gchar* impl_dbus_magnifier_get_source_display (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_target_display (Magnifier *magnifier, gchar *target_display); -gchar* impl_dbus_magnifier_get_target_display (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_source_size (Magnifier *magnifier, gint32 **bounds); -GArray* impl_dbus_magnifier_get_source_size (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_target_size (Magnifier *magnifier, gint32 **bounds); -GArray* impl_dbus_magnifier_get_target_size (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_cursor_set (Magnifier *magnifier, gchar *cursor_set); -gchar* impl_dbus_magnifier_get_cursor_set (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_cursor_size (Magnifier *magnifier, gint x, gint y); -GArray* impl_dbus_magnifier_get_cursor_size (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_cursor_zoom (Magnifier *magnifier, double factor); -double impl_dbus_magnifier_get_cursor_zoom (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_cursor_color (Magnifier *magnifier, guint32 color); -guint32 impl_dbus_magnifier_get_cursor_color (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_cursor_hotspot (Magnifier *magnifier, gint32 x, gint32 y); -GArray* impl_dbus_magnifier_get_cursor_hotspot (Magnifier *magnifier); -gint32 impl_dbus_magnifier_get_cursor_default_size (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_crosswire_size (Magnifier *magnifier, gint size); -gint impl_dbus_magnifier_get_crosswire_size (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_crosswire_length (Magnifier *magnifier, gint length); -gint impl_dbus_magnifier_get_crosswire_length (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_crosswire_clip (Magnifier *magnifier, gboolean clip); -gboolean impl_dbus_magnifier_get_crosswire_clip (Magnifier *magnifier); -gboolean impl_dbus_magnifier_set_crosswire_color (Magnifier *magnifier, guint32 color); -guint32 impl_dbus_magnifier_get_crosswire_color (Magnifier *magnifier); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS #endif /* MAGNIFIER_H_ */ diff --git a/magnifier/x11/gmag-graphical-server.c b/magnifier/x11/gmag-graphical-server.c index a5c6c5f..c322557 100644 --- a/magnifier/x11/gmag-graphical-server.c +++ b/magnifier/x11/gmag-graphical-server.c @@ -153,24 +153,24 @@ gboolean gmag_gs_check_set_struts (Magnifier *magnifier) { #ifdef HAVE_COMPOSITE - if (gmag_gs_use_compositor (magnifier)) + if (gmag_gs_use_compositor (magnifier->source_display_name, magnifier->target_display_name)) return TRUE; #endif #if GTK_CHECK_VERSION (2,19,5) if (magnifier && - magnifier->priv && magnifier->priv->w && gtk_widget_get_realized (magnifier->priv->w) && - gtk_widget_get_window (magnifier->priv->w)) + gtk_widget_get_realized (GTK_WIDGET (magnifier)) && + gtk_widget_get_window (GTK_WIDGET (magnifier))) #else if (magnifier && - magnifier->priv && magnifier->priv->w && GTK_WIDGET_REALIZED (magnifier->priv->w) && - gtk_widget_get_window (magnifier->priv->w)) + GTK_WIDGET_REALIZED (magnifier) && + gtk_widget_get_window (GTK_WIDGET (magnifier))) #endif { Atom atom_strut = gdk_x11_get_xatom_by_name ("_NET_WM_STRUT"); Atom atom_strut_partial = gdk_x11_get_xatom_by_name ("_NET_WM_STRUT_PARTIAL"); guint32 struts[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - GtkWidget *widget = magnifier->priv->w; + GtkWidget *widget = GTK_WIDGET (magnifier); gint width = gdk_screen_get_width ( gdk_display_get_screen (magnifier->target_display, magnifier->target_screen_num)); @@ -181,8 +181,8 @@ gmag_gs_check_set_struts (Magnifier *magnifier) gint right_margin, left_margin, top_margin, bottom_margin; gint wx, wy, ww, wh; - gtk_window_get_position (GTK_WINDOW (magnifier->priv->w), &wx, &wy); - gtk_window_get_size (GTK_WINDOW (magnifier->priv->w), &ww, &wh); + gtk_window_get_position (GTK_WINDOW (magnifier), &wx, &wy); + gtk_window_get_size (GTK_WINDOW (magnifier), &ww, &wh); left_margin = wx; right_margin = (width - ww) - wx; @@ -254,36 +254,34 @@ gmag_gs_reset_overlay_at_idle (gpointer data) if (data) { Magnifier *magnifier = MAGNIFIER (data); #if GTK_CHECK_VERSION (2,19,5) - if (magnifier->priv && magnifier->priv->w && - gtk_widget_get_realized (magnifier->priv->w)) + if (gtk_widget_get_realized (GTK_WIDGET (magnifier))) #else - if (magnifier->priv && magnifier->priv->w && - GTK_WIDGET_REALIZED (magnifier->priv->w)) + if (GTK_WIDGET_REALIZED (magnifier)) #endif - if (gtk_widget_get_window (magnifier->priv->w)) { + if (gtk_widget_get_window (GTK_WIDGET (magnifier))) { #ifdef HAVE_OVERLAY gint x, y, over_w, over_h; if (!magnifier->priv->overlay) { - magnifier->priv->overlay = gdk_window_foreign_new (XCompositeGetOverlayWindow (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (magnifier->priv->w)), GDK_WINDOW_XID (magnifier->priv->root))); + magnifier->priv->overlay = gdk_window_foreign_new (XCompositeGetOverlayWindow (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (magnifier))), GDK_WINDOW_XID (magnifier->priv->root))); gdk_window_get_position ( - gtk_widget_get_window (magnifier->priv->w), &x, + gtk_widget_get_window (GTK_WIDGET (magnifier)), &x, &y); gdk_drawable_get_size ( - gtk_widget_get_window (magnifier->priv->w), + gtk_widget_get_window (GTK_WIDGET (magnifier)), &over_w, &over_h); gdk_window_move_resize ( magnifier->priv->overlay, x, y, over_w, over_h); gdk_window_reparent ( - gtk_widget_get_window (magnifier->priv->w), + gtk_widget_get_window (GTK_WIDGET (magnifier)), magnifier->priv->overlay, 0, 0); } #ifdef HAVE_SHAPEINPUT - XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (magnifier->priv->w)), GDK_WINDOW_XID (magnifier->priv->overlay), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded); + XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (magnifier))), GDK_WINDOW_XID (magnifier->priv->overlay), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded); #endif /* HAVE_SHAPEINPUT */ #else #ifdef HAVE_SHAPEINPUT - XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (magnifier->priv->w)), GDK_WINDOW_XID (gtk_widget_get_window (magnifier->priv->w)), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded); + XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (magnifier))), GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (magnifier))), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded); #endif /* HAVE_SHAPEINPUT */ #endif /* HAVE_OVERLAY */ return FALSE; @@ -384,8 +382,8 @@ gmag_gs_events_handler (GIOChannel *source, GIOCondition condition, if (magnifier->priv->overlay) mag_window = GDK_WINDOW_XID (magnifier->priv->overlay); #else - if (magnifier->priv->w && gtk_widget_get_window (magnifier->priv->w)) - mag_window = GDK_WINDOW_XID (gtk_widget_get_window (magnifier->priv->w)); + if (gtk_widget_get_window (GTK_WIDGET (magnifier))) + mag_window = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (magnifier))); #endif /* HAVE_OVERLAY */ do @@ -468,10 +466,11 @@ gmag_gs_use_damage () * others. */ gboolean -gmag_gs_use_compositor (Magnifier *magnifier) +gmag_gs_use_compositor (const gchar *source_display_name, + const gchar *target_display_name) { if (dpy == NULL) { - dpy = XOpenDisplay (magnifier->source_display_name); + dpy = XOpenDisplay (source_display_name); } if (!gmag_gs_use_damage ()) { @@ -483,8 +482,8 @@ gmag_gs_use_compositor (Magnifier *magnifier) /* if the source and target display are different we don't need the * composite extension. This is the case when using the dummy driver or * a dual head configuration */ - if (strcmp (magnifier->source_display_name, - magnifier->target_display_name) != 0) + if (strcmp (source_display_name, + target_display_name) != 0) return FALSE; if (XQueryExtension (dpy, "Composite", &major, &event, &error) && @@ -546,7 +545,7 @@ gmag_gs_client_init (Magnifier *magnifier) g_io_channel_unref (ioc); use_damage = gmag_gs_use_damage (); - use_compositor = gmag_gs_use_compositor (magnifier); + use_compositor = gmag_gs_use_compositor (magnifier->source_display_name, magnifier->target_display_name); fixes_event_base = gmag_cursor_init (magnifier, dpy); diff --git a/magnifier/x11/gmag-graphical-server.h b/magnifier/x11/gmag-graphical-server.h index 2352574..d51bd70 100644 --- a/magnifier/x11/gmag-graphical-server.h +++ b/magnifier/x11/gmag-graphical-server.h @@ -43,7 +43,8 @@ void gmag_gs_magnifier_realize (GtkWidget *widget); gboolean gmag_gs_error_check (void); gboolean gmag_gs_reset_overlay_at_idle (gpointer data); gboolean gmag_gs_check_set_struts (Magnifier *magnifier); -gboolean gmag_gs_use_compositor (Magnifier *magnifier); +gboolean gmag_gs_use_compositor (const gchar *source_display_name, + const gchar *target_display_name); void gmag_gs_hide_cursor (Magnifier *magnifier); void gmag_gs_show_cursor (Magnifier *magnifier); diff --git a/magnifier/zoom-region-private.h b/magnifier/zoom-region-private.h index 3a6d68a..d5ad435 100644 --- a/magnifier/zoom-region-private.h +++ b/magnifier/zoom-region-private.h @@ -24,16 +24,14 @@ #define ZOOM_REGION_PRIVATE_H_ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +G_BEGIN_DECLS struct _ZoomRegionPrivate { GList *q; /* bounds of currently exposed region, in target pixmap coords */ - GNOME_Magnifier_RectBounds exposed_bounds; + RectBounds exposed_bounds; /* bounds of valid ('gettable') source area, in source coords */ - GNOME_Magnifier_RectBounds source_area; + RectBounds source_area; gpointer parent; GtkWidget *w; GtkWidget *border; @@ -53,10 +51,9 @@ struct _ZoomRegionPrivate { guint update_pointer_id; guint update_handler_id; gboolean test; + guint dbus_object_id; }; -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS #endif /* ZOOM_REGION_PRIVATE_H_ */ diff --git a/magnifier/zoom-region.c b/magnifier/zoom-region.c index 66df717..3bb5e7d 100644 --- a/magnifier/zoom-region.c +++ b/magnifier/zoom-region.c @@ -25,7 +25,6 @@ #include <stdlib.h> #include <string.h> -#include <popt.h> #ifdef HAVE_COLORBLIND #include <colorblind.h> @@ -39,7 +38,6 @@ #endif #include <gdk/gdkx.h> -#include <libbonobo.h> #include <math.h> #undef ZOOM_REGION_DEBUG @@ -48,7 +46,6 @@ #include "zoom-region-private.h" #include "magnifier.h" /* needed to access parent data */ #include "magnifier-private.h" /* needed to access parent data */ -#include "zoom-region-server.h" #define DEBUG_CLIENT_CALLS @@ -59,9 +56,8 @@ static gboolean client_debug = FALSE; #define DBG(a) #endif -static GObjectClass *parent_class = NULL; - enum { + PROP_0, ZOOM_REGION_MANAGED_PROP, ZOOM_REGION_POLL_MOUSE_PROP, ZOOM_REGION_DRAW_CURSOR_PROP, @@ -91,42 +87,7 @@ enum { ZOOM_REGION_TIMING_OUTPUT_PROP, ZOOM_REGION_TIMING_PAN_RATE_PROP, ZOOM_REGION_EXIT_MAGNIFIER -} PropIdx; - -#ifdef DEBUG_CLIENT_CALLS -gchar* prop_names[ZOOM_REGION_EXIT_MAGNIFIER + 1] = -{ - "MANAGED", - "POLLMOUSE", - "DRAWCURSOR", - "SMOOTHSCROLL", - "COLORBLIND", - "INVERT", - "SMOOTHING", - "CONTRASTR", - "CONTRASTG", - "CONTRASTB", - "BRIGHTR", - "BRIGHTG", - "BRIGHTB", - "XSCALE", - "YSCALE", - "BORDERSIZE", - "BORDERSIZETOP", - "BORDERSIZELEFT", - "BORDERSIZERIGHT", - "BORDERSIZEBOTTOM", - "BORDERCOLOR", - "XALIGN", - "YALIGN", - "VIEWPORT", - "TESTPATTERN", - "TIMING_TEST", - "TIMING_OUTPUT", - "TIMING_PAN_RATE", - "EXIT_MAGNIFIER" }; -#endif typedef enum { ZOOM_REGION_ERROR_NONE, @@ -151,6 +112,8 @@ static gboolean can_coalesce = TRUE ; /* change this when event coalescing is wo static int zoom_region_number = 0; +static GDBusConnection *dbus_connection = NULL; + #define CLAMP_B_C(v) (t = (v), CLAMP (t, -1, 1)); static void zoom_region_sync (ZoomRegion *region); @@ -163,14 +126,23 @@ static void zoom_region_queue_update (ZoomRegion *zoom_region, static int zoom_region_process_updates (gpointer data); static void zoom_region_paint (ZoomRegion *zoom_region, GdkRectangle *rect); static void zoom_region_paint_pixmap (ZoomRegion *zoom_region, GdkRectangle *rect); +static gboolean zoom_region_update_pointer (ZoomRegion *zoom_region, gboolean draw_cursor); static int zoom_region_update_pointer_timeout (gpointer data); static GdkRectangle zoom_region_rect_from_bounds (ZoomRegion *zoom_region, - const GNOME_Magnifier_RectBounds *bounds); + const RectBounds *bounds); static ZoomRegionPixmapCreationError zoom_region_create_pixmap (ZoomRegion *zoom_region); static GdkRectangle zoom_region_update_pixmap (ZoomRegion *zoom_region, const GdkRectangle update_rect, GdkRectangle *paint_rect); static void zoom_region_get_move_x_y (ZoomRegion *zoom_region, long *x, long *y); static void zoom_region_recompute_exposed_bounds (ZoomRegion *zoom_region); static void zoom_region_update_current (ZoomRegion *zoom_region); +static int zoom_region_pan_test (gpointer data); +static int zoom_region_process_pending (gpointer data); +static void zoom_region_do_dispose (ZoomRegion *zoom_region); + +#define ZOOM_REGION_GET_PRIVATE(object) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((object), ZOOM_REGION_TYPE, ZoomRegionPrivate)) + +G_DEFINE_TYPE (ZoomRegion, zoom_region, GTK_TYPE_DRAWING_AREA) void reset_timing_stats() @@ -548,7 +520,7 @@ _rectangle_clip_to_rectangle (GdkRectangle area, static GdkRectangle _rectangle_clip_to_bounds (GdkRectangle area, - GNOME_Magnifier_RectBounds *clip_bounds) + RectBounds *clip_bounds) { area.x = MAX (area.x, clip_bounds->x1); area.x = MIN (area.x, clip_bounds->x2); @@ -563,7 +535,7 @@ static GdkRectangle zoom_region_clip_to_source (ZoomRegion *zoom_region, GdkRectangle area) { - GNOME_Magnifier_RectBounds *source_rect_ptr; + RectBounds *source_rect_ptr; if (zoom_region && zoom_region->priv && zoom_region->priv->parent) { source_rect_ptr = &((Magnifier *)zoom_region->priv->parent)->source_bounds; @@ -577,7 +549,7 @@ static GdkRectangle zoom_region_clip_to_exposed_target (ZoomRegion *zoom_region, GdkRectangle area) { - GNOME_Magnifier_RectBounds onscreen_target, *source_area; + RectBounds onscreen_target, *source_area; source_area = &zoom_region->priv->source_area; onscreen_target.x1 = MAX (floor (zoom_region->priv->exposed_bounds.x1 @@ -620,8 +592,8 @@ zoom_region_clip_to_window (ZoomRegion *zoom_region, return area; - if (gtk_widget_get_window (zoom_region->priv->w)) - gdk_drawable_get_size (GDK_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w)), + if (gtk_widget_get_window (GTK_WIDGET (zoom_region))) + gdk_drawable_get_size (GDK_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region))), &window_rect.x, &window_rect.y); else @@ -634,7 +606,7 @@ zoom_region_clip_to_window (ZoomRegion *zoom_region, static GdkRectangle zoom_region_source_rect_from_view_bounds (ZoomRegion *zoom_region, - const GNOME_Magnifier_RectBounds *view_bounds) + const RectBounds *view_bounds) { GdkRectangle source_rect; source_rect.x = floor ((view_bounds->x1 + zoom_region->priv->exposed_bounds.x1) @@ -676,7 +648,7 @@ zoom_region_source_rect_from_view_rect (ZoomRegion *zoom_region, static GdkRectangle zoom_region_rect_from_bounds (ZoomRegion *zoom_region, - const GNOME_Magnifier_RectBounds *bounds) + const RectBounds *bounds) { GdkRectangle rect; rect.x = bounds->x1; @@ -686,9 +658,7 @@ zoom_region_rect_from_bounds (ZoomRegion *zoom_region, return rect; } -/** ************** **/ - -static CORBA_boolean +static gboolean zoom_region_update_scale (ZoomRegion *zoom_region, gdouble x, gdouble y) { gdouble x_old = zoom_region->xscale; @@ -838,13 +808,13 @@ zoom_region_paint_crosswire_cursor (ZoomRegion *zoom_region, GdkRectangle *clip_ g_assert (zoom_region->alive); #endif if (!(magnifier && - gtk_widget_get_window (zoom_region->priv->w) && - GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w)) && + gtk_widget_get_window (GTK_WIDGET (zoom_region)) && + GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region))) && magnifier->crosswire_size > 0)) return; if (zoom_region->priv->crosswire_gc == NULL) { - zoom_region->priv->crosswire_gc = gdk_gc_new (gtk_widget_get_window (zoom_region->priv->w)); + zoom_region->priv->crosswire_gc = gdk_gc_new (gtk_widget_get_window (GTK_WIDGET (zoom_region))); cmap = gdk_gc_get_colormap(zoom_region->priv->crosswire_gc); last_color_init = FALSE; } @@ -934,32 +904,32 @@ zoom_region_paint_crosswire_cursor (ZoomRegion *zoom_region, GdkRectangle *clip_ } if (magnifier->crosswire_size == 1) { if (magnifier->crosswire_clip) { - gdk_draw_line (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, rect.x, y_top_clip, rect.x, y_bottom_clip); - gdk_draw_line (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, x_left_clip, rect.y, x_right_clip, rect.y); } - gdk_draw_line (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, rect.x, y_start, rect.x, y_end); - gdk_draw_line (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, x_start, rect.y, x_end, rect.y); } else { if (magnifier->crosswire_clip ) { gdk_draw_rectangle ( - gtk_widget_get_window (zoom_region->priv->w), + gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, TRUE, rect.x - magnifier->crosswire_size / 2, y_top_clip, magnifier->crosswire_size, y_bottom_clip - y_top_clip); gdk_draw_rectangle ( - gtk_widget_get_window (zoom_region->priv->w), + gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, TRUE, x_left_clip, rect.y - magnifier->crosswire_size / 2, @@ -967,12 +937,12 @@ zoom_region_paint_crosswire_cursor (ZoomRegion *zoom_region, GdkRectangle *clip_ magnifier->crosswire_size); } gdk_draw_rectangle ( - gtk_widget_get_window (zoom_region->priv->w), + gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, TRUE, rect.x - magnifier->crosswire_size / 2, y_start, magnifier->crosswire_size, y_end - y_start); gdk_draw_rectangle ( - gtk_widget_get_window (zoom_region->priv->w), + gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->crosswire_gc, TRUE, x_start, rect.y - magnifier->crosswire_size / 2, x_end - x_start, magnifier->crosswire_size); @@ -1034,18 +1004,18 @@ zoom_region_paint_cursor (ZoomRegion *zoom_region, g_object_unref (zoom_region->priv->cursor_backing_pixels); } zoom_region->priv->cursor_backing_pixels = - gdk_pixmap_new (gtk_widget_get_window (zoom_region->priv->w), + gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (zoom_region)), rect.width, rect.height, -1); } - if (gtk_widget_get_window (zoom_region->priv->w) != NULL) + if (gtk_widget_get_window (GTK_WIDGET (zoom_region)) != NULL) { if (zoom_region->priv->default_gc == NULL) - zoom_region->priv->default_gc = gdk_gc_new(gtk_widget_get_window (zoom_region->priv->w)); + zoom_region->priv->default_gc = gdk_gc_new(gtk_widget_get_window (GTK_WIDGET (zoom_region))); gdk_draw_drawable (zoom_region->priv->cursor_backing_pixels, zoom_region->priv->default_gc, - gtk_widget_get_window (zoom_region->priv->w), + gtk_widget_get_window (GTK_WIDGET (zoom_region)), rect.x, rect.y, 0, 0, @@ -1053,10 +1023,10 @@ zoom_region_paint_cursor (ZoomRegion *zoom_region, rect.height); } DEBUG_RECT ("painting", rect); - if (cursor && zoom_region->priv->w && GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) + if (cursor && GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) { if (zoom_region->priv->paint_cursor_gc == NULL) - zoom_region->priv->paint_cursor_gc = gdk_gc_new (gtk_widget_get_window (zoom_region->priv->w)); + zoom_region->priv->paint_cursor_gc = gdk_gc_new (gtk_widget_get_window (GTK_WIDGET (zoom_region))); gdk_gc_set_clip_rectangle (zoom_region->priv->paint_cursor_gc, clip_rect); values.clip_x_origin = rect.x; @@ -1065,12 +1035,12 @@ zoom_region_paint_cursor (ZoomRegion *zoom_region, gdk_gc_set_values(zoom_region->priv->paint_cursor_gc, &values, GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN | GDK_GC_CLIP_MASK); - gdk_draw_rectangle (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_rectangle (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->paint_cursor_gc, TRUE, rect.x, rect.y, rect.width, rect.height); - gdk_draw_drawable (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_drawable (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->paint_cursor_gc, cursor, 0, 0, @@ -1163,15 +1133,14 @@ zoom_region_paint_pixmap (ZoomRegion *zoom_region, g_assert (zoom_region->alive); #endif g_assert (zoom_region->priv); - g_assert (zoom_region->priv->w); - if (!GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) return; + if (!GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) return; if (zoom_region->priv->default_gc == NULL) - zoom_region->priv->default_gc = gdk_gc_new (gtk_widget_get_window (zoom_region->priv->w)); + zoom_region->priv->default_gc = gdk_gc_new (gtk_widget_get_window (GTK_WIDGET (zoom_region))); - if (zoom_region->priv->pixmap && GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) + if (zoom_region->priv->pixmap && GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) { - gdk_draw_drawable (gtk_widget_get_window (zoom_region->priv->w), + gdk_draw_drawable (gtk_widget_get_window (GTK_WIDGET (zoom_region)), zoom_region->priv->default_gc, zoom_region->priv->pixmap, area->x + zoom_region->priv->exposed_bounds.x1 - zoom_region->priv->source_area.x1 * zoom_region->xscale, @@ -1208,7 +1177,7 @@ zoom_region_create_pixmap (ZoomRegion *zoom_region) #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - if (zoom_region->priv->w && GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) + if (GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) { long width = (zoom_region->priv->source_area.x2 - zoom_region->priv->source_area.x1) * zoom_region->xscale; @@ -1216,11 +1185,11 @@ zoom_region_create_pixmap (ZoomRegion *zoom_region) zoom_region->priv->source_area.y1) * zoom_region->yscale; zoom_region->priv->pixmap = gdk_pixmap_new ( - gtk_widget_get_window (zoom_region->priv->w), + gtk_widget_get_window (GTK_WIDGET (zoom_region)), width, height, gdk_drawable_get_depth ( - gtk_widget_get_window (zoom_region->priv->w))); + gtk_widget_get_window (GTK_WIDGET (zoom_region)))); if (gmag_gs_error_check ()) { zoom_region->priv->pixmap = NULL; @@ -1238,38 +1207,7 @@ zoom_region_create_pixmap (ZoomRegion *zoom_region) return ZOOM_REGION_ERROR_NO_TARGET_DRAWABLE; } -static void -zoom_region_expose_handler (GtkWindow * w, - GdkEventExpose *event, - gpointer data) -{ - ZoomRegion *zoom_region = data; - DEBUG_RECT ("expose", event->area); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - if (zoom_region->priv->pixmap == NULL) - { - ZoomRegionPixmapCreationError ret; - /* TODO: scale down if this fails here */ - while ((ret = zoom_region_create_pixmap (zoom_region)) == - ZOOM_REGION_ERROR_TOO_BIG) { - zoom_region->xscale -= 1.0; - zoom_region->yscale -= 1.0; - zoom_region->priv->pixmap = NULL; - g_warning ("Scale factor too big to fit in memory; shrinking."); - } - if (ret == ZOOM_REGION_ERROR_NO_TARGET_DRAWABLE) - g_warning ("create-pixmap: no target drawable"); - else - zoom_region_update_pixmap (zoom_region, event->area, - NULL); - } - zoom_region_paint (zoom_region, &event->area); -} - -static void +void zoom_region_update_cursor (ZoomRegion *zoom_region, int dx, int dy, GdkRectangle *clip_rect) { @@ -1284,10 +1222,23 @@ zoom_region_update_cursor (ZoomRegion *zoom_region, int dx, int dy, zoom_region->priv->last_drawn_crosswire_pos.y += dy; zoom_region_paint_cursor (zoom_region, clip_rect); zoom_region_paint_crosswire_cursor (zoom_region, clip_rect); - if (GTK_IS_WIDGET (zoom_region->priv->w) && - GDK_IS_WINDOW (gtk_widget_get_window (zoom_region->priv->w))) + if (GTK_IS_WIDGET (zoom_region) && + GDK_IS_WINDOW (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) gdk_display_sync (gdk_drawable_get_display ( - gtk_widget_get_window (zoom_region->priv->w))); + gtk_widget_get_window (GTK_WIDGET (zoom_region)))); +} + +void +zoom_region_mark_dirty (ZoomRegion *zoom_region, RectBounds *roi_dirty) +{ + DEBUG_RECT ("mark dirty", zoom_region_rect_from_bounds ( + zoom_region, roi_dirty) ); + + zoom_region_update_pointer (zoom_region, TRUE); + /* XXX ? should we clip here, or wait till process_updates? */ + zoom_region_queue_update (zoom_region, + zoom_region_clip_to_source (zoom_region, + zoom_region_rect_from_bounds (zoom_region, roi_dirty))); } static gboolean @@ -1306,9 +1257,9 @@ zoom_region_calculate_scroll_rects (ZoomRegion *zoom_region, #endif rect.x = 0; rect.y = 0; - if (zoom_region && zoom_region->priv->w && - gtk_widget_get_window (zoom_region->priv->w)) - window = gtk_widget_get_window (zoom_region->priv->w); + if (zoom_region && + gtk_widget_get_window (GTK_WIDGET (zoom_region))) + window = gtk_widget_get_window (GTK_WIDGET (zoom_region)); else retval = FALSE; if (!window) @@ -1355,8 +1306,8 @@ zoom_region_scroll_fast (ZoomRegion *zoom_region, int dx, int dy, #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - if (zoom_region->priv->w && gtk_widget_get_window (zoom_region->priv->w)) - window = gtk_widget_get_window (zoom_region->priv->w); + if (gtk_widget_get_window (GTK_WIDGET (zoom_region))) + window = gtk_widget_get_window (GTK_WIDGET (zoom_region)); else { processing_updates = FALSE; return; @@ -1369,7 +1320,7 @@ zoom_region_scroll_fast (ZoomRegion *zoom_region, int dx, int dy, gdk_window_process_updates (window, FALSE); /* sync reduces cursor flicker, but slows things down */ if (zoom_region->smooth_scroll_policy > - GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST) + SCROLL_FASTEST) gdk_display_sync (gdk_drawable_get_display (window)); } @@ -1385,8 +1336,8 @@ zoom_region_scroll_smooth (ZoomRegion *zoom_region, int dx, int dy, #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - if (zoom_region->priv->w && GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) - window = gtk_widget_get_window (zoom_region->priv->w); + if (GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) + window = gtk_widget_get_window (GTK_WIDGET (zoom_region)); else return; window_rect.x = 0; @@ -1437,7 +1388,7 @@ zoom_region_scroll (ZoomRegion *zoom_region, int dx, int dy) zoom_region_update_pixmap (zoom_region, zoom_region_source_rect_from_view_rect (zoom_region, expose_rect_h), NULL); zoom_region_update_pixmap (zoom_region, zoom_region_source_rect_from_view_rect (zoom_region, expose_rect_v), NULL); - if (zoom_region->smooth_scroll_policy > GNOME_Magnifier_ZoomRegion_SCROLL_FAST) { + if (zoom_region->smooth_scroll_policy > SCROLL_FAST) { zoom_region_scroll_smooth (zoom_region, dx, dy, &scroll_rect, &expose_rect_h, @@ -1607,44 +1558,44 @@ zoom_region_process_pixbuf (ZoomRegion *zoom_region, GdkPixbuf *pixbuf) #ifdef HAVE_COLORBLIND if (zoom_region->color_blind_filter != - GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_NO_FILTER) { + COLORBLIND_FILTER_T_NO_FILTER) { color_blind_filter = TRUE; cbr = colorblind_create (); color = malloc (sizeof (COLORBLIND_XCOLOR)); switch (zoom_region->color_blind_filter) { - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_NO_FILTER: + case COLORBLIND_FILTER_T_NO_FILTER: break; /* This entry is only to avoid a warning */ - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_SATURATE_RED: + case COLORBLIND_FILTER_T_SELECTIVE_SATURATE_RED: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_saturate_red); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_SATURATE_GREEN: + case COLORBLIND_FILTER_T_SELECTIVE_SATURATE_GREEN: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_saturate_green); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_SATURATE_BLUE: + case COLORBLIND_FILTER_T_SELECTIVE_SATURATE_BLUE: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_saturate_blue); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_RED: + case COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_RED: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_dessaturate_red); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_GREEN: + case COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_GREEN: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_dessaturate_green); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_BLUE: + case COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_BLUE: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_dessaturate_blue); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_HUE_SHIFT_POSITIVE: + case COLORBLIND_FILTER_T_HUE_SHIFT_POSITIVE: colorblind_set_filter_type (cbr, colorblind_filter_t_hue_shift_positive); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_HUE_SHIFT_NEGATIVE: + case COLORBLIND_FILTER_T_HUE_SHIFT_NEGATIVE: colorblind_set_filter_type (cbr, colorblind_filter_t_hue_shift_negative); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_SATURATE: + case COLORBLIND_FILTER_T_SELECTIVE_SATURATE: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_saturate); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE: + case COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE: colorblind_set_filter_type (cbr, colorblind_filter_t_selective_dessaturate); break; - case GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_MONOCHRONE_OTHERS: + case COLORBLIND_FILTER_T_MONOCHRONE_OTHERS: colorblind_set_filter_type (cbr, colorblind_filter_t_monochrome_others); break; } @@ -1773,10 +1724,10 @@ zoom_region_get_source_subwindow (ZoomRegion *zoom_region, for (j = 0; j < height; ++j) gdk_image_put_pixel (test_image, i, j, i*j); - zoom_region->priv->source_drawable = gdk_pixmap_new (gtk_widget_get_window (zoom_region->priv->w), width, height, -1); + zoom_region->priv->source_drawable = gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (zoom_region)), width, height, -1); if (zoom_region->priv->default_gc == NULL) - zoom_region->priv->default_gc = gdk_gc_new(gtk_widget_get_window (zoom_region->priv->w)); + zoom_region->priv->default_gc = gdk_gc_new(gtk_widget_get_window (GTK_WIDGET (zoom_region))); gdk_draw_image (zoom_region->priv->source_drawable, zoom_region->priv->default_gc, @@ -1891,7 +1842,7 @@ zoom_region_update_pixmap (ZoomRegion *zoom_region, zoom_region_post_process_pixbuf (zoom_region, subimage, zoom_region->priv->scaled_pixbuf); if (zoom_region->priv->default_gc == NULL) - zoom_region->priv->default_gc = gdk_gc_new(gtk_widget_get_window (zoom_region->priv->w)); + zoom_region->priv->default_gc = gdk_gc_new(gtk_widget_get_window (GTK_WIDGET (zoom_region))); #ifndef USE_GDK_PIXBUF_RENDER_TO_DRAWABLE if (GDK_IS_DRAWABLE (zoom_region->priv->pixmap)) @@ -1943,14 +1894,14 @@ zoom_region_update (ZoomRegion *zoom_region, const GdkRectangle update_rect) { GdkRectangle paint_rect = {0, 0, 0, 0}; - if (zoom_region->priv->w && gtk_widget_get_window (zoom_region->priv->w)) { + if (gtk_widget_get_window (GTK_WIDGET (zoom_region))) { GdkRectangle source_rect = zoom_region_update_pixmap (zoom_region, update_rect, &paint_rect); if (paint_rect.x != 0 || paint_rect.y != 0 || paint_rect.width != 0 || paint_rect.height != 0) { gdk_window_begin_paint_rect ( - gtk_widget_get_window (zoom_region->priv->w), &paint_rect); + gtk_widget_get_window (GTK_WIDGET (zoom_region)), &paint_rect); zoom_region_paint (zoom_region, &paint_rect); - gdk_window_end_paint (gtk_widget_get_window (zoom_region->priv->w)); + gdk_window_end_paint (gtk_widget_get_window (GTK_WIDGET (zoom_region))); } if (timing_test) { mag_timing.num_scale_samples++; @@ -1993,14 +1944,12 @@ static void zoom_region_init_window (ZoomRegion *zoom_region) { GtkFixed *parent; - GtkWidget *zoomer, *border; + GtkWidget *border; DBG(fprintf (stderr, "window not yet created...\n")); parent = GTK_FIXED ( ((Magnifier *)zoom_region->priv->parent)->priv->canvas); - zoomer = gtk_drawing_area_new (); border = gtk_drawing_area_new (); zoom_region->priv->border = border; - zoom_region->priv->w = zoomer; #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); @@ -2010,7 +1959,7 @@ zoom_region_init_window (ZoomRegion *zoom_region) zoom_region->viewport.x1, zoom_region->viewport.y2 - zoom_region->viewport.y1); - gtk_widget_set_size_request (GTK_WIDGET (zoomer), + gtk_widget_set_size_request (GTK_WIDGET (zoom_region), zoom_region->viewport.x2 - zoom_region->viewport.x1 - (zoom_region->border_size_right + @@ -2022,19 +1971,15 @@ zoom_region_init_window (ZoomRegion *zoom_region) gtk_fixed_put (parent, border, zoom_region->viewport.x1, zoom_region->viewport.y1); - gtk_fixed_put (parent, zoomer, + gtk_fixed_put (parent, GTK_WIDGET (zoom_region), zoom_region->viewport.x1 + zoom_region->border_size_left, zoom_region->viewport.y1 + zoom_region->border_size_top); gtk_widget_show (GTK_WIDGET (border)); - gtk_widget_show (GTK_WIDGET (zoomer)); + gtk_widget_show (GTK_WIDGET (zoom_region)); gtk_widget_show (GTK_WIDGET (parent)); - zoom_region->priv->expose_handler_id = - g_signal_connect (G_OBJECT (zoom_region->priv->w), - "expose_event", - G_CALLBACK (zoom_region_expose_handler), - zoom_region); + DBG(fprintf (stderr, "New window created\n")); } @@ -2089,13 +2034,13 @@ timing_report(ZoomRegion *zoom_region) x_scroll_incr = (float)mag_timing.dx_total / (float)mag_timing.num_line_samples; y_scroll_incr = (float)mag_timing.dy_total / (float)mag_timing.num_line_samples; - gdk_drawable_get_size (GDK_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w)), + gdk_drawable_get_size (GDK_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region))), &x, &y); fprintf(stderr, " Frames Processed = %ld\n", mag_timing.num_frame_samples + 1); fprintf(stderr, " Width/Height/Depth = %d/%d/%d\n", x, y, - gdk_drawable_get_depth (gtk_widget_get_window (zoom_region->priv->w))); + gdk_drawable_get_depth (gtk_widget_get_window (GTK_WIDGET (zoom_region)))); fprintf(stderr, " Zoom Factor (x/y) = %f/%f\n", zoom_region->xscale, zoom_region->yscale); if (mag_timing.num_scale_samples != 0) { @@ -2243,26 +2188,26 @@ zoom_region_get_move_x_y (ZoomRegion *zoom_region, long *x, long *y) zoom_region->yscale; switch (zoom_region->x_align_policy) { - case GNOME_Magnifier_ZoomRegion_ALIGN_MAX: + case ALIGN_MAX: *x = zoom_region->roi.x2 - width; break; - case GNOME_Magnifier_ZoomRegion_ALIGN_MIN: + case ALIGN_MIN: *x = zoom_region->roi.x1; break; - case GNOME_Magnifier_ZoomRegion_ALIGN_CENTER: + case ALIGN_CENTER: default: *x = ((zoom_region->roi.x1 + zoom_region->roi.x2) - width ) / 2; } switch (zoom_region->y_align_policy) { - case GNOME_Magnifier_ZoomRegion_ALIGN_MAX: + case ALIGN_MAX: *y = zoom_region->roi.y2 - height; break; - case GNOME_Magnifier_ZoomRegion_ALIGN_MIN: + case ALIGN_MIN: *y = zoom_region->roi.y1; break; - case GNOME_Magnifier_ZoomRegion_ALIGN_CENTER: + case ALIGN_CENTER: default: *y = ((zoom_region->roi.y1 + zoom_region->roi.y2) - height ) / 2; @@ -2284,7 +2229,7 @@ zoom_region_align (ZoomRegion *zoom_region) if (zoom_region->timing_output) { gint x, y; - gdk_drawable_get_size (GDK_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w)), + gdk_drawable_get_size (GDK_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region))), &x, &y); fprintf(stderr, "\nTiming Information - ROI = (%d, %d) (%d, %d):\n", @@ -2293,7 +2238,7 @@ zoom_region_align (ZoomRegion *zoom_region) fprintf(stderr, " Frame Number = %ld\n", mag_timing.num_frame_samples + 1); fprintf(stderr, " Width/Height/Depth = %d/%d/%d\n", x, y, - gdk_drawable_get_depth (gtk_widget_get_window (zoom_region->priv->w))); + gdk_drawable_get_depth (gtk_widget_get_window (GTK_WIDGET (zoom_region)))); } /* @@ -2335,8 +2280,12 @@ zoom_region_align (ZoomRegion *zoom_region) static void zoom_region_set_viewport (ZoomRegion *zoom_region, - const GNOME_Magnifier_RectBounds *viewport) + const RectBounds *viewport) { + Magnifier *magnifier; + GtkFixed *fixed; + RectBounds *bounds = NULL; + #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif @@ -2353,183 +2302,55 @@ zoom_region_set_viewport (ZoomRegion *zoom_region, (int) viewport->x2, (int) viewport->y2); #endif zoom_region_align (zoom_region); - if (!zoom_region->priv->w) { - zoom_region_init_window (zoom_region); - } else { - CORBA_any *any; - CORBA_Environment ev; - Bonobo_PropertyBag properties; - Magnifier *magnifier = (Magnifier *) zoom_region->priv->parent; - GtkFixed *fixed = GTK_FIXED (magnifier->priv->canvas); - gtk_fixed_move (fixed, - zoom_region->priv->border, - zoom_region->viewport.x1, - zoom_region->viewport.y1); - gtk_fixed_move (fixed, - zoom_region->priv->w, - zoom_region->viewport.x1 + - zoom_region->border_size_left, - zoom_region->viewport.y1 + - zoom_region->border_size_top); - gtk_widget_set_size_request ( + + magnifier = (Magnifier *) zoom_region->priv->parent; + fixed = GTK_FIXED (magnifier->priv->canvas); + gtk_fixed_move (fixed, + zoom_region->priv->border, + zoom_region->viewport.x1, + zoom_region->viewport.y1); + gtk_fixed_move (fixed, + GTK_WIDGET (zoom_region), + zoom_region->viewport.x1 + + zoom_region->border_size_left, + zoom_region->viewport.y1 + + zoom_region->border_size_top); + gtk_widget_set_size_request ( GTK_WIDGET (zoom_region->priv->border), zoom_region->viewport.x2 - zoom_region->viewport.x1, zoom_region->viewport.y2 - zoom_region->viewport.y1); - gtk_widget_set_size_request (GTK_WIDGET (zoom_region->priv->w), - zoom_region->viewport.x2 - - zoom_region->viewport.x1 - - (zoom_region->border_size_right + - zoom_region->border_size_left), - zoom_region->viewport.y2 - - zoom_region->viewport.y1 - - (zoom_region->border_size_bottom + - zoom_region->border_size_top)); - CORBA_exception_init (&ev); - properties = - GNOME_Magnifier_Magnifier_getProperties( - BONOBO_OBJREF ( - (Magnifier *) zoom_region->priv->parent), &ev); - if (!BONOBO_EX (&ev)) - any = Bonobo_PropertyBag_getValue ( - properties, "source-display-bounds", &ev); - if (!BONOBO_EX (&ev)) - zoom_region->priv->source_area = - *((GNOME_Magnifier_RectBounds *) any->_value); - if (zoom_region->priv->pixmap) - g_object_unref (zoom_region->priv->pixmap); - zoom_region_create_pixmap (zoom_region); - if (zoom_region->priv->scaled_pixbuf) - g_object_unref (zoom_region->priv->scaled_pixbuf); + gtk_widget_set_size_request (GTK_WIDGET (zoom_region), + zoom_region->viewport.x2 - + zoom_region->viewport.x1 - + (zoom_region->border_size_right + + zoom_region->border_size_left), + zoom_region->viewport.y2 - + zoom_region->viewport.y1 - + (zoom_region->border_size_bottom + + zoom_region->border_size_top)); + g_object_get (magnifier, "source-display-bounds", &bounds, NULL); + zoom_region->priv->source_area = *bounds; + g_free (bounds); + + if (zoom_region->priv->pixmap) + g_object_unref (zoom_region->priv->pixmap); + zoom_region_create_pixmap (zoom_region); + if (zoom_region->priv->scaled_pixbuf) + g_object_unref (zoom_region->priv->scaled_pixbuf); - 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); - } + zoom_region_queue_update (zoom_region, zoom_region_source_rect_from_view_bounds ( zoom_region, &zoom_region->viewport)); } static void -zoom_region_get_property (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - ZoomRegion *zoom_region = user_data; - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DBG (fprintf (stderr, "Get zoom-region property: %s\n", prop_names[arg_id])); - - switch (arg_id) { - case ZOOM_REGION_MANAGED_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->is_managed); - break; - case ZOOM_REGION_POLL_MOUSE_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->poll_mouse); - break; - case ZOOM_REGION_DRAW_CURSOR_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->draw_cursor); - break; - case ZOOM_REGION_INVERT_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->invert); - break; - case ZOOM_REGION_SMOOTHSCROLL_PROP: - BONOBO_ARG_SET_SHORT (arg, zoom_region->smooth_scroll_policy); - break; - case ZOOM_REGION_COLORBLIND_PROP: - BONOBO_ARG_SET_SHORT (arg, zoom_region->color_blind_filter); - break; - case ZOOM_REGION_TESTPATTERN_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->priv->test); - break; - case ZOOM_REGION_SMOOTHING_PROP: - BONOBO_ARG_SET_STRING (arg, zoom_region->smoothing); - break; - case ZOOM_REGION_CONTRASTR_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->contrast_r); - break; - case ZOOM_REGION_CONTRASTG_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->contrast_g); - break; - case ZOOM_REGION_CONTRASTB_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->contrast_b); - break; - case ZOOM_REGION_BRIGHTR_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->bright_r); - break; - case ZOOM_REGION_BRIGHTG_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->bright_g); - break; - case ZOOM_REGION_BRIGHTB_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->bright_b); - break; - case ZOOM_REGION_XSCALE_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->xscale); - break; - case ZOOM_REGION_YSCALE_PROP: - BONOBO_ARG_SET_FLOAT (arg, zoom_region->yscale); - break; - case ZOOM_REGION_BORDERSIZE_PROP: - BONOBO_ARG_SET_LONG ( - arg, (zoom_region->border_size_top + - zoom_region->border_size_left + - zoom_region->border_size_right + - zoom_region->border_size_bottom) / 4); - break; - case ZOOM_REGION_BORDERSIZETOP_PROP: - BONOBO_ARG_SET_LONG (arg, zoom_region->border_size_top); - break; - case ZOOM_REGION_BORDERSIZELEFT_PROP: - BONOBO_ARG_SET_LONG (arg, zoom_region->border_size_left); - break; - case ZOOM_REGION_BORDERSIZERIGHT_PROP: - BONOBO_ARG_SET_LONG (arg, zoom_region->border_size_right); - break; - case ZOOM_REGION_BORDERSIZEBOTTOM_PROP: - BONOBO_ARG_SET_LONG (arg, zoom_region->border_size_bottom); - break; - case ZOOM_REGION_XALIGN_PROP: - /* TODO: enums here */ - BONOBO_ARG_SET_INT (arg, zoom_region->x_align_policy); - break; - case ZOOM_REGION_YALIGN_PROP: - BONOBO_ARG_SET_INT (arg, zoom_region->y_align_policy); - break; - case ZOOM_REGION_BORDERCOLOR_PROP: - BONOBO_ARG_SET_LONG (arg, - zoom_region->border_color); - break; - case ZOOM_REGION_VIEWPORT_PROP: - BONOBO_ARG_SET_GENERAL (arg, zoom_region->viewport, - TC_GNOME_Magnifier_RectBounds, - GNOME_Magnifier_RectBounds, - NULL); - break; - case ZOOM_REGION_TIMING_TEST_PROP: - BONOBO_ARG_SET_INT (arg, zoom_region->timing_iterations); - break; - case ZOOM_REGION_TIMING_OUTPUT_PROP: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->timing_output); - break; - case ZOOM_REGION_TIMING_PAN_RATE_PROP: - BONOBO_ARG_SET_INT (arg, zoom_region->timing_pan_rate); - break; - case ZOOM_REGION_EXIT_MAGNIFIER: - BONOBO_ARG_SET_BOOLEAN (arg, zoom_region->exit_magnifier); - break; - default: - bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound); - }; -} - -static void zoom_region_update_borders (ZoomRegion *zoom_region) { gtk_widget_set_size_request (GTK_WIDGET (zoom_region->priv->border), @@ -2537,7 +2358,7 @@ zoom_region_update_borders (ZoomRegion *zoom_region) zoom_region->viewport.x1, zoom_region->viewport.y2 - zoom_region->viewport.y1); - gtk_widget_set_size_request (GTK_WIDGET (zoom_region->priv->w), + gtk_widget_set_size_request (GTK_WIDGET (zoom_region), zoom_region->viewport.x2 - zoom_region->viewport.x1 - (zoom_region->border_size_right + @@ -2547,485 +2368,102 @@ zoom_region_update_borders (ZoomRegion *zoom_region) (zoom_region->border_size_bottom + zoom_region->border_size_top)); gtk_fixed_move (GTK_FIXED (((Magnifier *)zoom_region->priv->parent)->priv->canvas), zoom_region->priv->border, zoom_region->viewport.x1, zoom_region->viewport.y1); - gtk_fixed_move (GTK_FIXED (((Magnifier *)zoom_region->priv->parent)->priv->canvas), zoom_region->priv->w, zoom_region->viewport.x1 + zoom_region->border_size_left, zoom_region->viewport.y1 + zoom_region->border_size_top); -} - -gboolean -impl_dbus_zoom_region_set_managed (ZoomRegion *zoom_region, gboolean managed) -{ - zoom_region->is_managed = managed; - - return TRUE; -} - -gboolean -impl_dbus_zoom_region_get_managed (ZoomRegion *zoom_region) -{ - return zoom_region->is_managed; + gtk_fixed_move (GTK_FIXED (((Magnifier *)zoom_region->priv->parent)->priv->canvas), GTK_WIDGET (zoom_region), zoom_region->viewport.x1 + zoom_region->border_size_left, zoom_region->viewport.y1 + zoom_region->border_size_top); } gboolean -impl_dbus_zoom_region_set_poll_mouse (ZoomRegion *zoom_region, gboolean poll_mouse) +zoom_region_set_mag_factor (ZoomRegion *zoom_region, + gdouble mag_factor_x, + gdouble mag_factor_y) { - zoom_region->poll_mouse = poll_mouse; - if (zoom_region->poll_mouse) { - g_message ("Adding polling timer"); - zoom_region->priv->update_pointer_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, - 200, - zoom_region_update_pointer_timeout, - zoom_region, - NULL); - } else if (zoom_region->priv->update_pointer_id) { - g_message ("Removing polling time"); - g_source_remove (zoom_region->priv->update_pointer_id); - zoom_region->priv->update_pointer_id = 0; - } - - return TRUE; -} + RectBounds *bounds; + gboolean retval; -gboolean -impl_dbus_zoom_region_get_poll_mouse (ZoomRegion *zoom_region) -{ - return zoom_region->poll_mouse; -} - -gboolean -impl_dbus_zoom_region_set_draw_cursor (ZoomRegion *zoom_region, gboolean draw_cursor) -{ - zoom_region->draw_cursor = draw_cursor; - if (!zoom_region->draw_cursor) { - zoom_region_unpaint_cursor (zoom_region, NULL); + if ((zoom_region->xscale == mag_factor_x) && + (zoom_region->yscale == mag_factor_y)) { + return TRUE; } - - return TRUE; -} - -gboolean -impl_dbus_zoom_region_get_draw_cursor (ZoomRegion *zoom_region) -{ - return zoom_region->draw_cursor; -} - -gboolean -impl_dbus_zoom_region_set_invert (ZoomRegion *zoom_region, gboolean invert) -{ - zoom_region->invert = invert; - zoom_region_update_current (zoom_region); - - return TRUE; -} -gboolean -impl_dbus_zoom_region_get_invert (ZoomRegion *zoom_region) -{ - return zoom_region->invert; -} - -gboolean -impl_dbus_zoom_region_set_smoothscroll (ZoomRegion *zoom_region, gshort smoothscroll) -{ - zoom_region->smooth_scroll_policy = smoothscroll; - - return TRUE; -} + g_object_get (zoom_region->priv->parent, + "source-display-bounds", &bounds, + NULL); + zoom_region->priv->source_area = *bounds; + g_free (bounds); -gshort -impl_dbus_zoom_region_get_smoothscroll (ZoomRegion *zoom_region) -{ - return zoom_region->smooth_scroll_policy; -} + retval = zoom_region_update_scale (zoom_region, mag_factor_x, mag_factor_y); + zoom_region_sync (zoom_region); -gboolean -impl_dbus_zoom_region_set_colorblind (ZoomRegion *zoom_region, gshort colorblind) -{ - zoom_region->color_blind_filter = colorblind; - zoom_region_update_current (zoom_region); - - return TRUE; + return retval; } -gshort -impl_dbus_zoom_region_get_colorblind (ZoomRegion *zoom_region) +void +zoom_region_set_roi (ZoomRegion *zoom_region, + RectBounds *bounds) { - return zoom_region->color_blind_filter; -} + DBG (fprintf (stderr, "Set ROI: \t%d,%d %d,%d\n", + bounds->x1, bounds->y1, bounds->x2, bounds->y2)); -gboolean -impl_dbus_zoom_region_set_smoothing (ZoomRegion *zoom_region, gchar *smoothing) -{ - zoom_region->smoothing = g_strdup (smoothing); - if (!strncmp (zoom_region->smoothing, "bilinear", 8)) { - zoom_region->priv->gdk_interp_type = GDK_INTERP_BILINEAR; - } else { - zoom_region->priv->gdk_interp_type = GDK_INTERP_NEAREST; + if ((zoom_region->roi.x1 == bounds->x1) && + (zoom_region->roi.x2 == bounds->x2) && + (zoom_region->roi.y1 == bounds->y1) && + (zoom_region->roi.y2 == bounds->y2)) { + return; } - zoom_region_update_current (zoom_region); - - return TRUE; -} -gchar* -impl_dbus_zoom_region_get_smoothing (ZoomRegion *zoom_region) -{ - return g_strdup (zoom_region->smoothing); -} - -gboolean -impl_dbus_zoom_region_set_testpattern (ZoomRegion *zoom_region, gboolean test) -{ - zoom_region->priv->test = test; - if (zoom_region->priv->source_drawable) { - g_object_unref (zoom_region->priv->source_drawable); - zoom_region->priv->source_drawable = NULL; + /* if these bounds are clearly bogus, warn and ignore */ + if (!bounds || (bounds->x2 <= bounds->x1) + || (bounds->y2 < bounds->y1) || + ((bounds->x1 + bounds->x2)/2 < 0) || + ((bounds->y1 + bounds->y2)/2 < 0)) + { + g_warning ("Bad bounds request (%d,%d to %d,%d), ignoring.\n", + bounds->x1, bounds->y1, bounds->x2, bounds->y2); + return; } - zoom_region_update_current (zoom_region); - - return TRUE; -} - -gboolean -impl_dbus_zoom_region_get_testpattern (ZoomRegion *zoom_region) -{ - return zoom_region->priv->test; -} - -gboolean -impl_dbus_zoom_region_set_bordersizes (ZoomRegion *zoom_region, gint32 **bordersizes) -{ - zoom_region->border_size_left = (*bordersizes)[0]; - zoom_region->border_size_top = (*bordersizes)[1]; - zoom_region->border_size_right = (*bordersizes)[2]; - zoom_region->border_size_bottom = (*bordersizes)[3]; - zoom_region_update_borders (zoom_region); - - return TRUE; -} - -GArray* -impl_dbus_zoom_region_get_bordersizes (ZoomRegion *zoom_region) -{ - GArray *ret; - - ret = g_array_new (FALSE, FALSE, sizeof (gint32)); - - g_array_append_val (ret, zoom_region->border_size_left); - g_array_append_val (ret, zoom_region->border_size_top); - g_array_append_val (ret, zoom_region->border_size_right); - g_array_append_val (ret, zoom_region->border_size_bottom); - - return ret; -} - -gboolean -impl_dbus_zoom_region_set_bordercolor (ZoomRegion *zoom_region, guint32 bordercolor) -{ - zoom_region->border_color = bordercolor; - zoom_region_paint_border (zoom_region); - - return TRUE; -} - -guint32 -impl_dbus_zoom_region_get_bordercolor (ZoomRegion *zoom_region) -{ - return zoom_region->border_color; -} - -gboolean -impl_dbus_zoom_region_set_xalign (ZoomRegion *zoom_region, gint32 align) -{ - zoom_region->x_align_policy = align; - zoom_region_align (zoom_region); - - return TRUE; -} - -gint32 -impl_dbus_zoom_region_get_xalign (ZoomRegion *zoom_region) -{ - return zoom_region->x_align_policy; -} - -gboolean -impl_dbus_zoom_region_set_yalign (ZoomRegion *zoom_region, gint32 align) -{ - zoom_region->y_align_policy = align; - zoom_region_align (zoom_region); - - return TRUE; -} - -gint32 -impl_dbus_zoom_region_get_yalign (ZoomRegion *zoom_region) -{ - return zoom_region->y_align_policy; -} - -gboolean -impl_dbus_zoom_region_set_viewport (ZoomRegion *zoom_region, gint32 **viewport) -{ - GNOME_Magnifier_RectBounds *bounds = g_malloc (sizeof (GNOME_Magnifier_RectBounds)); - - bounds->x1 = (*viewport)[0]; - bounds->y1 = (*viewport)[1]; - bounds->x2 = (*viewport)[2]; - bounds->y2 = (*viewport)[3]; - - zoom_region_set_viewport (zoom_region, bounds); - - g_free (bounds); - - return TRUE; -} - -GArray* -impl_dbus_zoom_region_get_viewport (ZoomRegion *zoom_region) -{ - GArray *ret; - - ret = g_array_new (FALSE, FALSE, sizeof (gint32)); - - g_array_append_val (ret, zoom_region->viewport.x1); - g_array_append_val (ret, zoom_region->viewport.y1); - g_array_append_val (ret, zoom_region->viewport.x2); - g_array_append_val (ret, zoom_region->viewport.y2); - - return ret; -} - -gboolean -impl_dbus_zoom_region_set_timing_test (ZoomRegion *zoom_region, gint32 timing_iterations) -{ - zoom_region->timing_iterations = timing_iterations; - timing_test = TRUE; - - return TRUE; -} - -gint32 -impl_dbus_zoom_region_get_timing_test (ZoomRegion *zoom_region) -{ - return zoom_region->timing_iterations; -} -gboolean -impl_dbus_zoom_region_set_timing_output (ZoomRegion *zoom_region, gboolean timing_output) -{ - zoom_region->timing_output = timing_output; - - return TRUE; -} - -gboolean -impl_dbus_zoom_region_get_timing_output (ZoomRegion *zoom_region) -{ - return zoom_region->timing_output; -} - -gboolean -impl_dbus_zoom_region_set_timing_pan_rate (ZoomRegion *zoom_region, gint32 timing_pan_rate) -{ - zoom_region->timing_pan_rate = timing_pan_rate; - timing_test = TRUE; - - return TRUE; -} + zoom_region->roi = *bounds; -gint32 -impl_dbus_zoom_region_get_timing_pan_rate (ZoomRegion *zoom_region) -{ - return zoom_region->timing_pan_rate; -} + if (zoom_region->timing_pan_rate > 0) { + /* Set idle handler to do panning test */ + g_idle_add_full (GDK_PRIORITY_REDRAW + 3, + zoom_region_pan_test, zoom_region, NULL); + } -gboolean -impl_dbus_zoom_region_set_exit_magnifier (ZoomRegion *zoom_region, gboolean exit_magnifier) -{ - zoom_region->exit_magnifier = exit_magnifier; - - return TRUE; -} + if (zoom_region->exit_magnifier) { + if (timing_test) { + fprintf(stderr, "\n### Timing Summary:\n\n"); + if (zoom_region->timing_pan_rate) + fprintf(stderr, " Pan Rate = %d\n", zoom_region->timing_pan_rate); + timing_report(zoom_region); + } + exit(0); + } -gboolean -impl_dbus_zoom_region_get_exit_magnifier (ZoomRegion *zoom_region) -{ - return zoom_region->exit_magnifier; -} + /* + * Do not bother trying to update the screen if the last + * screen update has not had time to complete. + */ + if (processing_updates) { + /* Remove any previous idle handler */ + if (pending_idle_handler != 0) { + g_source_remove(pending_idle_handler); + pending_idle_handler = 0; + } -static void -zoom_region_set_property (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - ZoomRegion *zoom_region = user_data; - GNOME_Magnifier_RectBounds bounds; - gfloat t; + /* Set idle handler to process this pending update when possible */ -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DBG (fprintf (stderr, "Set zoom-region property: %s\n", prop_names[arg_id])); + pending_idle_handler = g_idle_add_full (GDK_PRIORITY_REDRAW + 2, + zoom_region_process_pending, zoom_region, NULL); - switch (arg_id) { - case ZOOM_REGION_MANAGED_PROP: - zoom_region->is_managed = BONOBO_ARG_GET_BOOLEAN (arg); - break; - case ZOOM_REGION_POLL_MOUSE_PROP: - zoom_region->poll_mouse = BONOBO_ARG_GET_BOOLEAN (arg); - if (zoom_region->poll_mouse) - { - g_message ("Adding polling timer"); - zoom_region->priv->update_pointer_id = - g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, - 200, - zoom_region_update_pointer_timeout, - zoom_region, - NULL); - } - else if (zoom_region->priv->update_pointer_id) - { - g_message ("Removing polling timer"); - g_source_remove (zoom_region->priv->update_pointer_id); - zoom_region->priv->update_pointer_id = 0; - } - break; - case ZOOM_REGION_DRAW_CURSOR_PROP: - zoom_region->draw_cursor = BONOBO_ARG_GET_BOOLEAN (arg); - if (!zoom_region->draw_cursor) - zoom_region_unpaint_cursor (zoom_region, NULL); - break; - case ZOOM_REGION_INVERT_PROP: - zoom_region->invert = BONOBO_ARG_GET_BOOLEAN (arg); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_SMOOTHSCROLL_PROP: - zoom_region->smooth_scroll_policy = BONOBO_ARG_GET_SHORT (arg); - break; - case ZOOM_REGION_COLORBLIND_PROP: - zoom_region->color_blind_filter = BONOBO_ARG_GET_SHORT (arg); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_SMOOTHING_PROP: - zoom_region->smoothing = BONOBO_ARG_GET_STRING (arg); - if (!strncmp (zoom_region->smoothing, "bilinear", 8)) - zoom_region->priv->gdk_interp_type = GDK_INTERP_BILINEAR; - else - zoom_region->priv->gdk_interp_type = GDK_INTERP_NEAREST; - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_TESTPATTERN_PROP: - zoom_region->priv->test = BONOBO_ARG_GET_BOOLEAN (arg); - if (zoom_region->priv->source_drawable) { - g_object_unref (zoom_region->priv->source_drawable); - zoom_region->priv->source_drawable = NULL; + if (zoom_region->timing_output) { + fprintf(stderr, + "\n [Last update not finished, pending - ROI=(%d, %d) (%d, %d)]\n\n", + zoom_region->roi.x1, zoom_region->roi.y1, zoom_region->roi.x2, + zoom_region->roi.y2); } - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_CONTRASTR_PROP: - zoom_region->contrast_r = - CLAMP_B_C (BONOBO_ARG_GET_FLOAT (arg)); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_CONTRASTG_PROP: - zoom_region->contrast_g = - CLAMP_B_C (BONOBO_ARG_GET_FLOAT (arg)); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_CONTRASTB_PROP: - zoom_region->contrast_b = - CLAMP_B_C (BONOBO_ARG_GET_FLOAT (arg)); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_BRIGHTR_PROP: - zoom_region->bright_r = - CLAMP_B_C (BONOBO_ARG_GET_FLOAT (arg)); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_BRIGHTG_PROP: - zoom_region->bright_g = - CLAMP_B_C (BONOBO_ARG_GET_FLOAT (arg)); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_BRIGHTB_PROP: - zoom_region->bright_b = - CLAMP_B_C (BONOBO_ARG_GET_FLOAT (arg)); - zoom_region_update_current (zoom_region); - break; - case ZOOM_REGION_XSCALE_PROP: - (void) zoom_region_update_scale (zoom_region, - BONOBO_ARG_GET_FLOAT (arg), - zoom_region->yscale); - break; - case ZOOM_REGION_YSCALE_PROP: - (void) zoom_region_update_scale (zoom_region, - zoom_region->xscale, - BONOBO_ARG_GET_FLOAT (arg)); - - break; - case ZOOM_REGION_BORDERSIZE_PROP: - zoom_region->border_size_left = - zoom_region->border_size_top = - zoom_region->border_size_right = - zoom_region->border_size_bottom = - BONOBO_ARG_GET_LONG (arg); - zoom_region_update_borders (zoom_region); - break; - case ZOOM_REGION_BORDERSIZELEFT_PROP: - zoom_region->border_size_left = BONOBO_ARG_GET_LONG (arg); - zoom_region_update_borders (zoom_region); - break; - case ZOOM_REGION_BORDERSIZETOP_PROP: - zoom_region->border_size_top = BONOBO_ARG_GET_LONG (arg); - zoom_region_update_borders (zoom_region); - break; - case ZOOM_REGION_BORDERSIZERIGHT_PROP: - zoom_region->border_size_right = BONOBO_ARG_GET_LONG (arg); - zoom_region_update_borders (zoom_region); - break; - case ZOOM_REGION_BORDERSIZEBOTTOM_PROP: - zoom_region->border_size_bottom = BONOBO_ARG_GET_LONG (arg); - zoom_region_update_borders (zoom_region); - break; - case ZOOM_REGION_BORDERCOLOR_PROP: - zoom_region->border_color = - BONOBO_ARG_GET_LONG (arg); - zoom_region_paint_border (zoom_region); - break; - case ZOOM_REGION_XALIGN_PROP: - zoom_region->x_align_policy = BONOBO_ARG_GET_INT (arg); - zoom_region_align (zoom_region); - break; - case ZOOM_REGION_YALIGN_PROP: - /* TODO: enums here */ - zoom_region->y_align_policy = BONOBO_ARG_GET_INT (arg); + } else { zoom_region_align (zoom_region); - break; - case ZOOM_REGION_VIEWPORT_PROP: - bounds = BONOBO_ARG_GET_GENERAL (arg, - TC_GNOME_Magnifier_RectBounds, - GNOME_Magnifier_RectBounds, - NULL); - zoom_region_set_viewport (zoom_region, &bounds); - break; - case ZOOM_REGION_TIMING_TEST_PROP: - zoom_region->timing_iterations = BONOBO_ARG_GET_INT (arg); - timing_test = TRUE; - break; - case ZOOM_REGION_TIMING_OUTPUT_PROP: - zoom_region->timing_output = BONOBO_ARG_GET_BOOLEAN (arg); - break; - case ZOOM_REGION_TIMING_PAN_RATE_PROP: - zoom_region->timing_pan_rate = BONOBO_ARG_GET_INT (arg); - timing_test = TRUE; - break; - case ZOOM_REGION_EXIT_MAGNIFIER: - zoom_region->exit_magnifier = BONOBO_ARG_GET_BOOLEAN (arg); - break; - default: - bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound); - }; + } } static int @@ -3044,10 +2482,9 @@ static int zoom_region_pan_test (gpointer data) { ZoomRegion *zoom_region = (ZoomRegion *) data; + GList *zoom_regions; Magnifier *magnifier = zoom_region->priv->parent; - GNOME_Magnifier_ZoomRegionList *zoom_regions; - GNOME_Magnifier_RectBounds roi; - CORBA_Environment ev; + RectBounds roi; static int counter = 0; static gboolean finished_update = !TRUE; static float last_pixels_at_speed = -1; @@ -3110,12 +2547,10 @@ zoom_region_pan_test (gpointer data) if (counter > zoom_region->timing_iterations - 1) zoom_region->exit_magnifier = TRUE; - zoom_regions = GNOME_Magnifier_Magnifier_getZoomRegions ( - BONOBO_OBJREF (magnifier), &ev); + zoom_regions = magnifier->zoom_regions; - if (zoom_regions && (zoom_regions->_length > 0)) { - GNOME_Magnifier_ZoomRegion_setROI ( - zoom_regions->_buffer[0], &roi, &ev); + if (zoom_regions) { + zoom_region_set_roi (ZOOM_REGION (zoom_regions->data), &roi); } if (!finished_update) { @@ -3132,364 +2567,444 @@ zoom_region_pan_test (gpointer data) } static void -impl_zoom_region_set_pointer_pos (PortableServer_Servant servant, - const CORBA_long mouse_x, - const CORBA_long mouse_y, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - GdkRectangle paint_area, *clip = NULL; - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DBG (fprintf (stderr, "Set Pointer: \t%ld,%ld\n", - (long) mouse_x, (long) mouse_y)); - - fprintf (stderr, "Set Pointer: \t%ld,%ld\n", - (long) mouse_x, (long) mouse_y); - - zoom_region_set_cursor_pos (zoom_region, (int) mouse_x, (int) mouse_y); - - if (GTK_IS_WIDGET (zoom_region->priv->w) && - GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) - { - gdk_drawable_get_size ( - GDK_DRAWABLE ( - gtk_widget_get_window (zoom_region->priv->w)), - &paint_area.width, &paint_area.height); - paint_area.x = 0; - paint_area.y = 0; - clip = &paint_area; - paint_area = zoom_region_clip_to_source ( - zoom_region, paint_area); - } - /* - * if we update the cursor now, it causes flicker if the client - * subsequently calls setROI, so we wait for a redraw. - * Perhaps we should cue a redraw on idle instead? - */ -} - -static void -impl_zoom_region_set_contrast (PortableServer_Servant servant, - const CORBA_float R, - const CORBA_float G, - const CORBA_float B, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); +method_call_cb (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + ZoomRegion *zoom_region = ZOOM_REGION (user_data); gfloat t; #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - DBG (fprintf (stderr, "Set contrast: \t%f,%f %f\n", R, G, B)); - - /* if the contrast values are the same, this is a NOOP */ - if (zoom_region->contrast_r == R && - zoom_region->contrast_g == G && - zoom_region->contrast_b == B) - return; - - zoom_region->contrast_r = CLAMP_B_C (R); - zoom_region->contrast_g = CLAMP_B_C (G); - zoom_region->contrast_b = CLAMP_B_C (B); - - zoom_region_update_current (zoom_region); -} - -static void -impl_zoom_region_get_contrast (PortableServer_Servant servant, - CORBA_float *R, - CORBA_float *G, - CORBA_float *B, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - *R = zoom_region->contrast_r; - *G = zoom_region->contrast_g; - *B = zoom_region->contrast_b; -} - -static void -impl_zoom_region_set_brightness (PortableServer_Servant servant, - const CORBA_float R, - const CORBA_float G, - const CORBA_float B, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - gfloat t; - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DBG (fprintf (stderr, "Set brightness: \t%f,%f %f\n", R, G, B)); - - /* if the contrast values are the same, this is a NOOP */ - if (zoom_region->bright_r == R && - zoom_region->bright_g == G && - zoom_region->bright_b == B) - return; - - zoom_region->bright_r = CLAMP_B_C (R); - zoom_region->bright_g = CLAMP_B_C (G); - zoom_region->bright_b = CLAMP_B_C (B); - - zoom_region_update_current (zoom_region); -} - -static void -impl_zoom_region_get_brightness (PortableServer_Servant servant, - CORBA_float *R, - CORBA_float *G, - CORBA_float *B, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - - *R = zoom_region->bright_r; - *G = zoom_region->bright_g; - *B = zoom_region->bright_b; -} - -static void -impl_zoom_region_set_roi (PortableServer_Servant servant, - const GNOME_Magnifier_RectBounds *bounds, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); + if (g_strcmp0 (method_name, "setMagFactor") == 0) { + gdouble mag_factor_x, mag_factor_y; + gboolean retval; + + g_variant_get (parameters, "(dd)", &mag_factor_x, &mag_factor_y); + retval = zoom_region_set_mag_factor (zoom_region, mag_factor_x, mag_factor_y); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(b)", retval)); + } else if (g_strcmp0 (method_name, "getMagFactor") == 0) { + GVariant *children[2]; + + children[0] = g_variant_new_double (zoom_region->xscale); + children[1] = g_variant_new_double (zoom_region->yscale); + g_dbus_method_invocation_return_value (invocation, + g_variant_new_array (G_VARIANT_TYPE_DOUBLE, children, 2)); + } else if (g_strcmp0 (method_name, "setRoi") == 0) { + RectBounds bounds; + GVariant *roi; + const int *items; + gsize n_items; + + g_variant_get (parameters, "(@ai)", &roi); + items = g_variant_get_fixed_array (roi, &n_items, sizeof (gint32)); + if (n_items == 4) { + bounds.x1 = items[0]; + bounds.y1 = items[1]; + bounds.x2 = items[2]; + bounds.y2 = items[3]; + } + g_variant_unref (roi); + + zoom_region_set_roi (zoom_region, &bounds); + + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "updatePointer") == 0) { + zoom_region_update_cursor (zoom_region, 0, 0, NULL); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "markDirty") == 0) { + RectBounds roi_dirty; + GVariant *roi; + const int *items; + gsize n_items; + + g_variant_get (parameters, "(@ai)", &roi); + items = g_variant_get_fixed_array (roi, &n_items, sizeof (gint32)); + if (n_items == 4) { + roi_dirty.x1 = items[0]; + roi_dirty.y1 = items[1]; + roi_dirty.x2 = items[2]; + roi_dirty.y2 = items[3]; + } + g_variant_unref (roi); + + zoom_region_mark_dirty (zoom_region, &roi_dirty); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "getRoi") == 0) { + GVariant *children[4]; + + children[0] = g_variant_new_int32 (zoom_region->roi.x1); + children[1] = g_variant_new_int32 (zoom_region->roi.y1); + children[2] = g_variant_new_int32 (zoom_region->roi.x2); + children[3] = g_variant_new_int32 (zoom_region->roi.y2); + g_dbus_method_invocation_return_value (invocation, + g_variant_new_array (G_VARIANT_TYPE_INT32, children, 4)); + } else if (g_strcmp0 (method_name, "moveResize") == 0) { + RectBounds viewport; + GVariant *viewport_v; + const int *items; + gsize n_items; + + g_variant_get (parameters, "(@ai)", &viewport_v); + items = g_variant_get_fixed_array (viewport_v, &n_items, sizeof (gint32)); + if (n_items == 4) { + viewport.x1 = items[0]; + viewport.y1 = items[1]; + viewport.x2 = items[2]; + viewport.y2 = items[3]; + } + g_variant_unref (viewport_v); -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DBG (fprintf (stderr, "Set ROI: \t%d,%d %d,%d\n", - bounds->x1, bounds->y1, bounds->x2, bounds->y2)); + zoom_region_set_viewport (zoom_region, &viewport); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "dispose") == 0) { + zoom_region_do_dispose (zoom_region); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "setPointerPos") == 0) { + GdkRectangle paint_area, *clip = NULL; + gint32 mouse_x, mouse_y; - if ((zoom_region->roi.x1 == bounds->x1) && - (zoom_region->roi.x2 == bounds->x2) && - (zoom_region->roi.y1 == bounds->y1) && - (zoom_region->roi.y2 == bounds->y2)) { - return; - } + g_variant_get (parameters, "(ii)", &mouse_x, &mouse_y); - /* if these bounds are clearly bogus, warn and ignore */ - if (!bounds || (bounds->x2 <= bounds->x1) - || (bounds->y2 < bounds->y1) || - ((bounds->x1 + bounds->x2)/2 < 0) || - ((bounds->y1 + bounds->y2)/2 < 0)) - { - g_warning ("Bad bounds request (%d,%d to %d,%d), ignoring.\n", - bounds->x1, bounds->y1, bounds->x2, bounds->y2); - return; - } + DBG (fprintf (stderr, "Set Pointer: \t%ld,%ld\n", + (long) mouse_x, (long) mouse_y)); - zoom_region->roi = *bounds; + fprintf (stderr, "Set Pointer: \t%ld,%ld\n", + (long) mouse_x, (long) mouse_y); - if (zoom_region->timing_pan_rate > 0) { - /* Set idle handler to do panning test */ - g_idle_add_full (GDK_PRIORITY_REDRAW + 3, - zoom_region_pan_test, zoom_region, NULL); - } + zoom_region_set_cursor_pos (zoom_region, (int) mouse_x, (int) mouse_y); - if (zoom_region->exit_magnifier) { - if (timing_test) { - fprintf(stderr, "\n### Timing Summary:\n\n"); - if (zoom_region->timing_pan_rate) - fprintf(stderr, " Pan Rate = %d\n", zoom_region->timing_pan_rate); - timing_report(zoom_region); + if (GTK_IS_WIDGET (zoom_region) && + GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region)))) + { + gdk_drawable_get_size ( + GDK_DRAWABLE ( + gtk_widget_get_window (GTK_WIDGET (zoom_region))), + &paint_area.width, &paint_area.height); + paint_area.x = 0; + paint_area.y = 0; + clip = &paint_area; + paint_area = zoom_region_clip_to_source ( + zoom_region, paint_area); } - exit(0); - } - - /* - * Do not bother trying to update the screen if the last - * screen update has not had time to complete. - */ - if (processing_updates) { - /* Remove any previous idle handler */ - if (pending_idle_handler != 0) { - g_source_remove(pending_idle_handler); - pending_idle_handler = 0; + /* + * if we update the cursor now, it causes flicker if the client + * subsequently calls setROI, so we wait for a redraw. + * Perhaps we should cue a redraw on idle instead? + */ + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "setContrast") == 0) { + gdouble R, G, B; + + g_variant_get (parameters, "(ddd)", &R, &G, &B); + DBG (fprintf (stderr, "Set contrast: \t%f,%f %f\n", R, G, B)); + + /* if the contrast values are the same, this is a NOOP */ + if (zoom_region->contrast_r == R && + zoom_region->contrast_g == G && + zoom_region->contrast_b == B) { + g_dbus_method_invocation_return_value (invocation, NULL); + return; } - /* Set idle handler to process this pending update when possible */ + zoom_region->contrast_r = CLAMP_B_C (R); + zoom_region->contrast_g = CLAMP_B_C (G); + zoom_region->contrast_b = CLAMP_B_C (B); - pending_idle_handler = g_idle_add_full (GDK_PRIORITY_REDRAW + 2, - zoom_region_process_pending, zoom_region, NULL); - - if (zoom_region->timing_output) { - fprintf(stderr, - "\n [Last update not finished, pending - ROI=(%d, %d) (%d, %d)]\n\n", - zoom_region->roi.x1, zoom_region->roi.y1, zoom_region->roi.x2, - zoom_region->roi.y2); + zoom_region_update_current (zoom_region); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "getContrast") == 0) { + GVariant *children[3]; + + children[0] = g_variant_new_double (zoom_region->contrast_r); + children[1] = g_variant_new_double (zoom_region->contrast_g); + children[2] = g_variant_new_double (zoom_region->contrast_b); + g_dbus_method_invocation_return_value (invocation, + g_variant_new_array (G_VARIANT_TYPE_DOUBLE, children, 3)); + } else if (g_strcmp0 (method_name, "setBrightness") == 0) { + gdouble R, G, B; + + g_variant_get (parameters, "(ddd)", &R, &G, &B); + DBG (fprintf (stderr, "Set brightness: \t%f,%f %f\n", R, G, B)); + + /* if the contrast values are the same, this is a NOOP */ + if (zoom_region->bright_r == R && + zoom_region->bright_g == G && + zoom_region->bright_b == B) { + g_dbus_method_invocation_return_value (invocation, NULL); + return; } - } else { - zoom_region_align (zoom_region); - } -} - -static CORBA_boolean -impl_zoom_region_set_mag_factor (PortableServer_Servant servant, - const CORBA_float mag_factor_x, - const CORBA_float mag_factor_y, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - CORBA_any *any; - CORBA_boolean retval = CORBA_TRUE; + zoom_region->bright_r = CLAMP_B_C (R); + zoom_region->bright_g = CLAMP_B_C (G); + zoom_region->bright_b = CLAMP_B_C (B); - if ((zoom_region->xscale == mag_factor_x) && - (zoom_region->yscale == mag_factor_y)) { - return retval; + zoom_region_update_current (zoom_region); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_strcmp0 (method_name, "getBrightness") == 0) { + GVariant *children[3]; + + children[0] = g_variant_new_double (zoom_region->bright_r); + children[1] = g_variant_new_double (zoom_region->bright_g); + children[2] = g_variant_new_double (zoom_region->bright_b); + g_dbus_method_invocation_return_value (invocation, + g_variant_new_array (G_VARIANT_TYPE_DOUBLE, children, 3)); + } +} + +static GVariant * +get_property_cb (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + ZoomRegion *zoom_region = ZOOM_REGION (user_data); + GVariant *retval = NULL; + + if (g_strcmp0 (property_name, "Managed") == 0) { + retval = g_variant_new_boolean (zoom_region->is_managed); + } else if (g_strcmp0 (property_name, "PollMouse") == 0) { + retval = g_variant_new_boolean (zoom_region->poll_mouse); + } else if (g_strcmp0 (property_name, "DrawCursor") == 0) { + retval = g_variant_new_boolean (zoom_region->draw_cursor); + } else if (g_strcmp0 (property_name, "Invert") == 0) { + retval = g_variant_new_boolean (zoom_region->invert); + } else if (g_strcmp0 (property_name, "Smoothscroll") == 0) { + retval = g_variant_new_uint32 (zoom_region->smooth_scroll_policy); + } else if (g_strcmp0 (property_name, "Colorblind") == 0) { + retval = g_variant_new_uint32 (zoom_region->color_blind_filter); + } else if (g_strcmp0 (property_name, "Smoothing") == 0) { + retval = g_variant_new_string (zoom_region->smoothing ? zoom_region->smoothing : ""); + } else if (g_strcmp0 (property_name, "Testpattern") == 0) { + retval = g_variant_new_boolean (zoom_region->priv->test); + } else if (g_strcmp0 (property_name, "Bordersizes") == 0) { + GVariant *children[4]; + + children[0] = g_variant_new_int32 (zoom_region->border_size_left); + children[1] = g_variant_new_int32 (zoom_region->border_size_top); + children[2] = g_variant_new_int32 (zoom_region->border_size_right); + children[3] = g_variant_new_int32 (zoom_region->border_size_bottom); + retval = g_variant_new_array (G_VARIANT_TYPE_INT32, children, 4); + } else if (g_strcmp0 (property_name, "Bordercolor") == 0) { + retval = g_variant_new_int32 (zoom_region->border_color); + } else if (g_strcmp0 (property_name, "Xalign") == 0) { + retval = g_variant_new_int32 (zoom_region->x_align_policy); + } else if (g_strcmp0 (property_name, "Yalign") == 0) { + retval = g_variant_new_int32 (zoom_region->y_align_policy); + } else if (g_strcmp0 (property_name, "Viewport") == 0) { + GVariant *children[4]; + + children[0] = g_variant_new_int32 (zoom_region->viewport.x1); + children[1] = g_variant_new_int32 (zoom_region->viewport.y1); + children[2] = g_variant_new_int32 (zoom_region->viewport.x2); + children[3] = g_variant_new_int32 (zoom_region->viewport.y2); + retval = g_variant_new_array (G_VARIANT_TYPE_INT32, children, 4); + } else if (g_strcmp0 (property_name, "TimingTest") == 0) { + retval = g_variant_new_int32 (zoom_region->timing_iterations); + } else if (g_strcmp0 (property_name, "TimingOutput") == 0) { + retval = g_variant_new_boolean (zoom_region->timing_output); + } else if (g_strcmp0 (property_name, "TimingPanRate") == 0) { + retval = g_variant_new_int32 (zoom_region->timing_pan_rate); + } else if (g_strcmp0 (property_name, "ExitMagnifier") == 0) { + retval = g_variant_new_boolean (zoom_region->exit_magnifier); } - /* TODO: assert that parent is magnifier object */ - Bonobo_PropertyBag properties = - GNOME_Magnifier_Magnifier_getProperties( - BONOBO_OBJREF ( - (Magnifier *) zoom_region->priv->parent), ev); - any = Bonobo_PropertyBag_getValue ( - properties, "source-display-bounds", ev); - if (!BONOBO_EX (ev)) - zoom_region->priv->source_area = - *((GNOME_Magnifier_RectBounds *) any->_value); - else - retval = CORBA_FALSE; - - retval = zoom_region_update_scale (zoom_region, - mag_factor_x, mag_factor_y); - zoom_region_sync (zoom_region); - - bonobo_object_release_unref (properties, NULL); return retval; } -static void -impl_zoom_region_get_mag_factor (PortableServer_Servant servant, - CORBA_float *mag_factor_x, - CORBA_float *mag_factor_y, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - *mag_factor_x = zoom_region->xscale; - *mag_factor_y = zoom_region->yscale; -} - -static Bonobo_PropertyBag -impl_zoom_region_get_properties (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - return bonobo_object_dup_ref ( - BONOBO_OBJREF (zoom_region->properties), ev); -} - -static void -impl_zoom_region_update_pointer (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - - zoom_region_update_cursor (zoom_region, 0, 0, NULL); -} - -static void -impl_zoom_region_mark_dirty (PortableServer_Servant servant, - const GNOME_Magnifier_RectBounds *roi_dirty, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DEBUG_RECT ("mark dirty", zoom_region_rect_from_bounds ( - zoom_region, roi_dirty) ); - - zoom_region_update_pointer (zoom_region, TRUE); - /* XXX ? should we clip here, or wait till process_updates? */ - zoom_region_queue_update (zoom_region, - zoom_region_clip_to_source (zoom_region, - zoom_region_rect_from_bounds (zoom_region, roi_dirty))); -} - -static GNOME_Magnifier_RectBounds -impl_zoom_region_get_roi (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); +static gboolean +set_property_cb (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + ZoomRegion *zoom_region = ZOOM_REGION (user_data); + + if (g_strcmp0 (property_name, "Managed") == 0) { + g_object_set (zoom_region, + "is-managed", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "PollMouse") == 0) { + g_object_set (zoom_region, + "poll-mouse", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "DrawCursor") == 0) { + g_object_set (zoom_region, + "draw-cursor", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "Invert") == 0) { + g_object_set (zoom_region, + "inverse-video", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "Smoothscroll") == 0) { + g_object_set (zoom_region, + "smooth-scroll-policy", g_variant_get_uint32 (value), + NULL); + } else if (g_strcmp0 (property_name, "Colorblind") == 0) { + g_object_set (zoom_region, + "color-blind-filter", g_variant_get_uint32 (value), + NULL); + } else if (g_strcmp0 (property_name, "Smoothing") == 0) { + g_object_set (zoom_region, + "smoothing-type", g_variant_get_string (value, NULL), + NULL); + } else if (g_strcmp0 (property_name, "Testpattern") == 0) { + g_object_set (zoom_region, + "use-test-pattern", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "Bordersizes") == 0) { + const int *items; + gsize n_items; + + items = g_variant_get_fixed_array (value, &n_items, sizeof (gint32)); + if (n_items == 4) { + g_object_set (zoom_region, + "border-size-left", items[0], + "border-size-top", items[1], + "border-size-right", items[2], + "border-size-bottom", items[3], + NULL); + } + } else if (g_strcmp0 (property_name, "Bordercolor") == 0) { + g_object_set (zoom_region, + "border-color", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "Xalign") == 0) { + g_object_set (zoom_region, + "x-alignment", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "Yalign") == 0) { + g_object_set (zoom_region, + "y-alignment", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "Viewport") == 0) { + const int *items; + gsize n_items; + RectBounds viewport; + + items = g_variant_get_fixed_array (value, &n_items, sizeof (gint32)); + if (n_items == 4) { + viewport.x1 = items[0]; + viewport.y1 = items[1]; + viewport.x2 = items[2]; + viewport.y2 = items[3]; + } + g_object_set (zoom_region, "viewport", &viewport, NULL); + } else if (g_strcmp0 (property_name, "TimingTest") == 0) { + g_object_set (zoom_region, + "timing-iterations", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "TimingOutput") == 0) { + g_object_set (zoom_region, + "timing-output", g_variant_get_boolean (value), + NULL); + } else if (g_strcmp0 (property_name, "TimingPanRate") == 0) { + g_object_set (zoom_region, + "timing-pan-rate", g_variant_get_int32 (value), + NULL); + } else if (g_strcmp0 (property_name, "ExitMagnifier") == 0) { + g_object_set (zoom_region, + "exit-magnifier", g_variant_get_boolean (value), + NULL); + } -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - return zoom_region->roi; + return TRUE; } -static void -impl_zoom_region_move_resize (PortableServer_Servant servant, - const GNOME_Magnifier_RectBounds *viewport_bounds, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); +static const gchar introspection_xml[] = +"<node>" + "<interface name='org.freedesktop.gnome.Magnifier.ZoomRegion'>" + "<method name='setMagFactor'>" + "<arg type='d' name='magX' direction='in'/>" + "<arg type='d' name='magY' direction='in'/>" + "<arg type='b' name='b_ret' direction='out'/>" + "</method>" + "<method name='getMagFactor'>" + "<arg type='ad' name='factors' direction='out'/>" + "</method>" + "<method name='setRoi'>" + "<arg type='ai' name='Roi' direction='in'/>" + "</method>" + "<method name='updatePointer'/>" + "<method name='markDirty'>" + "<arg type='ai' name='dirtyRegion' direction='in'/>" + "</method>" + "<method name='getRoi'>" + "<arg type='ai' name='Roi-ret' direction='out'/>" + "</method>" + "<method name='moveResize'>" + "<arg type='ai' name='bounds' direction='in'/>" + "</method>" + "<method name='dispose'/>" + "<method name='setPointerPos'>" + "<arg type='i' name='mouse_x' direction='in'/>" + "<arg type='i' name='mouse_y' direction='in'/>" + "</method>" + "<method name='setContrast'>" + "<arg type='d' name='R' direction='in'/>" + "<arg type='d' name='G' direction='in'/>" + "<arg type='d' name='B' direction='in'/>" + "</method>" + "<method name='getContrast'>" + "<arg type='ad' name='RGB' direction='out'/>" + "</method>" + "<method name='setBrightness'>" + "<arg type='d' name='R' direction='in'/>" + "<arg type='d' name='G' direction='in'/>" + "<arg type='d' name='B' direction='in'/>" + "</method>" + "<method name='getBrightness'>" + "<arg type='d' name='RGB' direction='out'/>" + "</method>" + "<property name='Managed' type='b' access='readwrite'/>" + "<property name='PollMouse' type='b' access='readwrite'/>" + "<property name='DrawCursor' type='b' access='readwrite'/>" + "<property name='Invert' type='b' access='readwrite'/>" + "<property name='Smoothscroll' type='u' access='readwrite'/>" + "<property name='Colorblind' type='u' access='readwrite'/>" + "<property name='Smoothing' type='s' access='readwrite'/>" + "<property name='Testpattern' type='b' access='readwrite'/>" + "<property name='Bordersizes' type='ai' access='readwrite'/>" + "<property name='Bordercolor' type='i' access='readwrite'/>" + "<property name='Xalign' type='i' access='readwrite'/>" + "<property name='Yalign' type='i' access='readwrite'/>" + "<property name='Viewport' type='ai' access='readwrite'/>" + "<property name='TimingTest' type='i' access='readwrite'/>" + "<property name='TimingOutput' type='b' access='readwrite'/>" + "<property name='TimingPanRate' type='i' access='readwrite'/>" + "<property name='ExitMagnifier' type='b' access='readwrite'/>" + "</interface>" +"</node>"; + +static const GDBusInterfaceVTable interface_vtable = { + method_call_cb, + get_property_cb, + set_property_cb +}; -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - zoom_region_set_viewport (zoom_region, viewport_bounds); -} +static GDBusNodeInfo *introspection_data = NULL; /* could be called multiple times... */ static void zoom_region_do_dispose (ZoomRegion *zoom_region) { DBG(g_message ("disposing region %p", zoom_region)); - if (zoom_region->priv && zoom_region->priv->expose_handler_id && - GTK_IS_WIDGET (zoom_region->priv->w)) { - g_signal_handler_disconnect ( - zoom_region->priv->w, - zoom_region->priv->expose_handler_id); - zoom_region->priv->expose_handler_id = 0; - } + if (zoom_region->priv && zoom_region->priv->update_pointer_id) g_source_remove (zoom_region->priv->update_pointer_id); if (zoom_region->priv && zoom_region->priv->update_handler_id) @@ -3501,799 +3016,592 @@ zoom_region_do_dispose (ZoomRegion *zoom_region) #endif } +/* this one really shuts down the object - called once only */ static void -impl_zoom_region_dispose (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - ZoomRegion *zoom_region = - ZOOM_REGION (bonobo_object_from_servant (servant)); - zoom_region_do_dispose (zoom_region); -} - -gboolean -impl_dbus_zoom_region_dispose (ZoomRegion *zoom_region) -{ - zoom_region_do_dispose (zoom_region); - - return TRUE; -} - -gboolean -impl_dbus_zoom_region_set_mag_factor (ZoomRegion *zoom_region, const gdouble mag_factor_x, const gdouble mag_factor_y) -{ -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - CORBA_Environment ev; - CORBA_exception_init (&ev); - CORBA_any *any; - gboolean retval = TRUE; - - if ((zoom_region->xscale == mag_factor_x) && - (zoom_region->yscale == mag_factor_y)) { - return retval; - } - - /* TODO: assert that parent is magnifier object */ - Bonobo_PropertyBag properties = - GNOME_Magnifier_Magnifier_getProperties( - BONOBO_OBJREF ( - (Magnifier *) zoom_region->priv->parent), &ev); - any = Bonobo_PropertyBag_getValue ( - properties, "source-display-bounds", &ev); - if (!BONOBO_EX (&ev)) - zoom_region->priv->source_area = - *((GNOME_Magnifier_RectBounds *) any->_value); - else { - retval = FALSE; - return retval; - } - - retval = zoom_region_update_scale (zoom_region, mag_factor_x, mag_factor_y); - zoom_region_sync (zoom_region); - - return retval; -} - -GArray* -impl_dbus_zoom_region_get_mag_factor (ZoomRegion *zoom_region) -{ - GArray *ret; - - ret = g_array_new (FALSE, FALSE, sizeof (gdouble)); - - g_array_append_val (ret, zoom_region->xscale); - g_array_append_val (ret, zoom_region->yscale); - - return ret; -} - -gboolean -impl_dbus_zoom_region_set_roi (ZoomRegion *zoom_region, const gint32 **roi) +zoom_region_finalize (GObject *region) { - RectBounds *bounds = g_malloc(sizeof(RectBounds)); - _set_bounds (bounds, roi); + ZoomRegion *zoom_region = (ZoomRegion *) region; - #ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - DBG (fprintf (stderr, "Set ROI: \t%d,%d %d,%d\n", - bounds->x1, bounds->y1, bounds->x2, bounds->y2)); + DBG(g_message ("finalizing region %p", zoom_region)); - if ((zoom_region->roi.x1 == bounds->x1) && - (zoom_region->roi.x2 == bounds->x2) && - (zoom_region->roi.y1 == bounds->y1) && - (zoom_region->roi.y2 == bounds->y2)) { - return TRUE; + if (zoom_region->priv && zoom_region->priv->dbus_object_id > 0) { + g_dbus_connection_unregister_object (dbus_connection, zoom_region->priv->dbus_object_id); + zoom_region->priv->dbus_object_id = 0; } - /* if these bounds are clearly bogus, warn and ignore */ - if (!bounds || (bounds->x2 <= bounds->x1) - || (bounds->y2 < bounds->y1) || - ((bounds->x1 + bounds->x2)/2 < 0) || - ((bounds->y1 + bounds->y2)/2 < 0)) + if (zoom_region->priv && zoom_region->priv->q) { - g_warning ("Bad bounds request (%d,%d to %d,%d), ignoring.\n", - bounds->x1, bounds->y1, bounds->x2, bounds->y2); - return FALSE; - } - - zoom_region->roi.x1 = bounds->x1; - zoom_region->roi.y1 = bounds->y1; - zoom_region->roi.x2 = bounds->x2; - zoom_region->roi.y2 = bounds->y2; - - if (zoom_region->timing_pan_rate > 0) { - /* Set idle handler to do panning test */ - g_idle_add_full (GDK_PRIORITY_REDRAW + 3, - zoom_region_pan_test, zoom_region, NULL); - } - - if (zoom_region->exit_magnifier) { - if (timing_test) { - fprintf(stderr, "\n### Timing Summary:\n\n"); - if (zoom_region->timing_pan_rate) - fprintf(stderr, " Pan Rate = %d\n", zoom_region->timing_pan_rate); - timing_report(zoom_region); - } - exit(0); - } - - /* - * Do not bother trying to update the screen if the last - * screen update has not had time to complete. - */ - if (processing_updates) { - /* Remove any previous idle handler */ - if (pending_idle_handler != 0) { - g_source_remove(pending_idle_handler); - pending_idle_handler = 0; - } - - /* Set idle handler to process this pending update when possible */ - - pending_idle_handler = g_idle_add_full (GDK_PRIORITY_REDRAW + 2, - zoom_region_process_pending, zoom_region, NULL); - - if (zoom_region->timing_output) { - fprintf(stderr, - "\n [Last update not finished, pending - ROI=(%d, %d) (%d, %d)]\n\n", - zoom_region->roi.x1, zoom_region->roi.y1, zoom_region->roi.x2, - zoom_region->roi.y2); - } - } else { - zoom_region_align (zoom_region); + g_list_free (zoom_region->priv->q); + zoom_region->priv->q = NULL; } - - return TRUE; -} - -/* TODO: Deprecate this RPC */ -gboolean -impl_dbus_zoom_region_update_pointer (ZoomRegion *zoom_region) -{ -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - - zoom_region_update_cursor (zoom_region, 0, 0, NULL); - - return TRUE; -} - -gboolean -impl_dbus_zoom_region_mark_dirty (ZoomRegion *zoom_region, gint32 **bounds) -{ - GNOME_Magnifier_RectBounds *roi_dirty = g_malloc(sizeof(GNOME_Magnifier_RectBounds)); - roi_dirty->x1 = (*bounds)[0]; - roi_dirty->y1 = (*bounds)[1]; - roi_dirty->x2 = (*bounds)[2]; - roi_dirty->y2 = (*bounds)[3]; - + if (GTK_IS_WIDGET (zoom_region)) + gtk_container_remove (GTK_CONTAINER (((Magnifier *) zoom_region->priv->parent)->priv->canvas), GTK_WIDGET (zoom_region)); + if (GTK_IS_WIDGET (zoom_region->priv->border)) + gtk_container_remove (GTK_CONTAINER (((Magnifier *) zoom_region->priv->parent)->priv->canvas), GTK_WIDGET (zoom_region->priv->border)); + if (zoom_region->priv->source_pixbuf_cache) + g_object_unref (zoom_region->priv->source_pixbuf_cache); + if (zoom_region->priv->scaled_pixbuf) + g_object_unref (zoom_region->priv->scaled_pixbuf); + if (zoom_region->priv->pixmap) + g_object_unref (zoom_region->priv->pixmap); + zoom_region->priv->pixmap = NULL; + zoom_region->priv->parent = NULL; + if (zoom_region->priv->cursor_backing_pixels) + g_object_unref (zoom_region->priv->cursor_backing_pixels); + g_free (zoom_region->priv); + zoom_region->priv = NULL; #ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); + zoom_region->alive = FALSE; #endif - DEBUG_RECT ("mark dirty", zoom_region_rect_from_bounds ( - zoom_region, roi_dirty) ); - - zoom_region_update_pointer (zoom_region, TRUE); - /* XXX ? should we clip here, or wait till process_updates? */ - zoom_region_queue_update (zoom_region, - zoom_region_clip_to_source (zoom_region, - zoom_region_rect_from_bounds (zoom_region, roi_dirty))); - - return TRUE; + G_OBJECT_CLASS (zoom_region_parent_class)->finalize (region); } -GArray* -impl_dbus_zoom_region_get_roi (ZoomRegion *zoom_region) +/* could be called multiple times */ +static void +zoom_region_dispose (GObject *object) { - GArray *ret; - - ret = g_array_new (FALSE, FALSE, sizeof (gint32)); - - g_array_append_val (ret, zoom_region->roi.x1); - g_array_append_val (ret, zoom_region->roi.y1); - g_array_append_val (ret, zoom_region->roi.x2); - g_array_append_val (ret, zoom_region->roi.y2); - - return ret; -} + zoom_region_do_dispose (ZOOM_REGION (object)); -gboolean -impl_dbus_zoom_region_move_resize (ZoomRegion *zoom_region, const gint32 **viewport) -{ -#ifdef ZOOM_REGION_DEBUG - g_assert (zoom_region->alive); -#endif - GNOME_Magnifier_RectBounds *viewport_bounds = g_malloc (sizeof (GNOME_Magnifier_RectBounds)); - viewport_bounds->x1 = (*viewport)[0]; - viewport_bounds->y1 = (*viewport)[1]; - viewport_bounds->x2 = (*viewport)[2]; - viewport_bounds->y2 = (*viewport)[3]; - - zoom_region_set_viewport (zoom_region, viewport_bounds); - - return TRUE; + G_OBJECT_CLASS (zoom_region_parent_class)->dispose (object); } -gboolean -impl_dbus_zoom_region_set_pointer_pos (ZoomRegion *zoom_region, gint32 mouse_x, gint32 mouse_y) +static void +zoom_region_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) { - GdkRectangle paint_area, *clip = NULL; + ZoomRegion *zoom_region = ZOOM_REGION (object); #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - DBG (fprintf (stderr, "Set Pointer: \t%ld,%ld\n", - (long) mouse_x, (long) mouse_y)); + DBG (fprintf (stderr, "Get zoom-region property: %s\n", g_param_spec_get_name (pspec))); - fprintf (stderr, "Set Pointer: \t%ld,%ld\n", - (long) mouse_x, (long) mouse_y); - - zoom_region_set_cursor_pos (zoom_region, (int) mouse_x, (int) mouse_y); + switch (prop_id) { + case ZOOM_REGION_MANAGED_PROP: + g_value_set_boolean (value, zoom_region->is_managed); + break; + case ZOOM_REGION_POLL_MOUSE_PROP: + g_value_set_boolean (value, zoom_region->poll_mouse); + break; + case ZOOM_REGION_DRAW_CURSOR_PROP: + g_value_set_boolean (value, zoom_region->draw_cursor); + break; + case ZOOM_REGION_INVERT_PROP: + g_value_set_boolean (value, zoom_region->invert); + break; + case ZOOM_REGION_SMOOTHSCROLL_PROP: + g_value_set_uint (value, zoom_region->smooth_scroll_policy); + break; + case ZOOM_REGION_COLORBLIND_PROP: + g_value_set_uint (value, zoom_region->color_blind_filter); + break; + case ZOOM_REGION_TESTPATTERN_PROP: + g_value_set_boolean (value, zoom_region->priv->test); + break; + case ZOOM_REGION_SMOOTHING_PROP: + g_value_set_string (value, zoom_region->smoothing); + break; + case ZOOM_REGION_CONTRASTR_PROP: + g_value_set_float (value, zoom_region->contrast_r); + break; + case ZOOM_REGION_CONTRASTG_PROP: + g_value_set_float (value, zoom_region->contrast_g); + break; + case ZOOM_REGION_CONTRASTB_PROP: + g_value_set_float (value, zoom_region->contrast_b); + break; + case ZOOM_REGION_BRIGHTR_PROP: + g_value_set_float (value, zoom_region->bright_r); + break; + case ZOOM_REGION_BRIGHTG_PROP: + g_value_set_float (value, zoom_region->bright_g); + break; + case ZOOM_REGION_BRIGHTB_PROP: + g_value_set_float (value, zoom_region->bright_b); + break; + case ZOOM_REGION_XSCALE_PROP: + g_value_set_float (value, zoom_region->xscale); + break; + case ZOOM_REGION_YSCALE_PROP: + g_value_set_float (value, zoom_region->yscale); + break; + case ZOOM_REGION_BORDERSIZE_PROP: + g_value_set_long (value, (zoom_region->border_size_top + + zoom_region->border_size_left + + zoom_region->border_size_right + + zoom_region->border_size_bottom) / 4); + break; + case ZOOM_REGION_BORDERSIZETOP_PROP: + g_value_set_long (value, zoom_region->border_size_top); + break; + case ZOOM_REGION_BORDERSIZELEFT_PROP: + g_value_set_long (value, zoom_region->border_size_left); + break; + case ZOOM_REGION_BORDERSIZERIGHT_PROP: + g_value_set_long (value, zoom_region->border_size_right); + break; + case ZOOM_REGION_BORDERSIZEBOTTOM_PROP: + g_value_set_long (value, zoom_region->border_size_bottom); + break; + case ZOOM_REGION_XALIGN_PROP: + /* TODO: enums here */ + g_value_set_int (value, zoom_region->x_align_policy); + break; + case ZOOM_REGION_YALIGN_PROP: + g_value_set_int (value, zoom_region->y_align_policy); + break; + case ZOOM_REGION_BORDERCOLOR_PROP: + g_value_set_long (value, zoom_region->border_color); + break; + case ZOOM_REGION_VIEWPORT_PROP: { + RectBounds *rect = g_new (RectBounds, 1); - if (GTK_IS_WIDGET (zoom_region->priv->w) && - GDK_IS_DRAWABLE (gtk_widget_get_window (zoom_region->priv->w))) - { - gdk_drawable_get_size ( - GDK_DRAWABLE ( - gtk_widget_get_window (zoom_region->priv->w)), - &paint_area.width, &paint_area.height); - paint_area.x = 0; - paint_area.y = 0; - clip = &paint_area; - paint_area = zoom_region_clip_to_source ( - zoom_region, paint_area); + *rect = zoom_region->viewport; + g_value_set_pointer (value, rect); + } + break; + case ZOOM_REGION_TIMING_TEST_PROP: + g_value_set_int (value, zoom_region->timing_iterations); + break; + case ZOOM_REGION_TIMING_OUTPUT_PROP: + g_value_set_boolean (value, zoom_region->timing_output); + break; + case ZOOM_REGION_TIMING_PAN_RATE_PROP: + g_value_set_int (value, zoom_region->timing_pan_rate); + break; + case ZOOM_REGION_EXIT_MAGNIFIER: + g_value_set_boolean (value, zoom_region->exit_magnifier); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } - /* - * if we update the cursor now, it causes flicker if the client - * subsequently calls setROI, so we wait for a redraw. - * Perhaps we should cue a redraw on idle instead? - */ - - return TRUE; } -gboolean -impl_dbus_zoom_region_set_contrast (ZoomRegion *zoom_region, gdouble R, gdouble G, gdouble B) +static void +zoom_region_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) { + ZoomRegion *zoom_region = ZOOM_REGION (object); gfloat t; #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - DBG (fprintf (stderr, "Set contrast: \t%f,%f %f\n", R, G, B)); - - /* if the contrast values are the same, this is a NOOP */ - if (zoom_region->contrast_r == R && - zoom_region->contrast_g == G && - zoom_region->contrast_b == B) - return TRUE; - - zoom_region->contrast_r = CLAMP_B_C (R); - zoom_region->contrast_g = CLAMP_B_C (G); - zoom_region->contrast_b = CLAMP_B_C (B); + DBG (fprintf (stderr, "Set zoom-region property: %s\n", g_param_spec_get_name (pspec))); - zoom_region_update_current (zoom_region); + switch (prop_id) { + case ZOOM_REGION_MANAGED_PROP: + zoom_region->is_managed = g_value_get_boolean (value); + break; + case ZOOM_REGION_POLL_MOUSE_PROP: + zoom_region->poll_mouse = g_value_get_boolean (value); + if (zoom_region->poll_mouse) + { + g_message ("Adding polling timer"); + zoom_region->priv->update_pointer_id = + g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, + 200, + zoom_region_update_pointer_timeout, + zoom_region, + NULL); + } + else if (zoom_region->priv->update_pointer_id) + { + g_message ("Removing polling timer"); + g_source_remove (zoom_region->priv->update_pointer_id); + zoom_region->priv->update_pointer_id = 0; + } + break; + case ZOOM_REGION_DRAW_CURSOR_PROP: + zoom_region->draw_cursor = g_value_get_boolean (value); + if (!zoom_region->draw_cursor) + zoom_region_unpaint_cursor (zoom_region, NULL); + break; + case ZOOM_REGION_INVERT_PROP: + zoom_region->invert = g_value_get_boolean (value); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_SMOOTHSCROLL_PROP: + zoom_region->smooth_scroll_policy = g_value_get_uint (value); + break; + case ZOOM_REGION_COLORBLIND_PROP: + zoom_region->color_blind_filter = g_value_get_uint (value); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_SMOOTHING_PROP: + zoom_region->smoothing = g_value_dup_string (value); + if (!strncmp (zoom_region->smoothing, "bilinear", 8)) + zoom_region->priv->gdk_interp_type = GDK_INTERP_BILINEAR; + else + zoom_region->priv->gdk_interp_type = GDK_INTERP_NEAREST; + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_TESTPATTERN_PROP: + zoom_region->priv->test = g_value_get_boolean (value); + if (zoom_region->priv->source_drawable) { + g_object_unref (zoom_region->priv->source_drawable); + zoom_region->priv->source_drawable = NULL; + } + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_CONTRASTR_PROP: + zoom_region->contrast_r = + CLAMP_B_C (g_value_get_float (value)); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_CONTRASTG_PROP: + zoom_region->contrast_g = + CLAMP_B_C (g_value_get_float (value)); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_CONTRASTB_PROP: + zoom_region->contrast_b = + CLAMP_B_C (g_value_get_float (value)); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_BRIGHTR_PROP: + zoom_region->bright_r = + CLAMP_B_C (g_value_get_float (value)); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_BRIGHTG_PROP: + zoom_region->bright_g = + CLAMP_B_C (g_value_get_float (value)); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_BRIGHTB_PROP: + zoom_region->bright_b = + CLAMP_B_C (g_value_get_float (value)); + zoom_region_update_current (zoom_region); + break; + case ZOOM_REGION_XSCALE_PROP: + (void) zoom_region_update_scale (zoom_region, + g_value_get_float (value), + zoom_region->yscale); + break; + case ZOOM_REGION_YSCALE_PROP: + (void) zoom_region_update_scale (zoom_region, + zoom_region->xscale, + g_value_get_float (value)); + break; + case ZOOM_REGION_BORDERSIZE_PROP: + zoom_region->border_size_left = + zoom_region->border_size_top = + zoom_region->border_size_right = + zoom_region->border_size_bottom = + g_value_get_long (value); + zoom_region_update_borders (zoom_region); + break; + case ZOOM_REGION_BORDERSIZELEFT_PROP: + zoom_region->border_size_left = g_value_get_long (value); + zoom_region_update_borders (zoom_region); + break; + case ZOOM_REGION_BORDERSIZETOP_PROP: + zoom_region->border_size_top = g_value_get_long (value); + zoom_region_update_borders (zoom_region); + break; + case ZOOM_REGION_BORDERSIZERIGHT_PROP: + zoom_region->border_size_right = g_value_get_long (value); + zoom_region_update_borders (zoom_region); + break; + case ZOOM_REGION_BORDERSIZEBOTTOM_PROP: + zoom_region->border_size_bottom = g_value_get_long (value); + zoom_region_update_borders (zoom_region); + break; + case ZOOM_REGION_BORDERCOLOR_PROP: + zoom_region->border_color = g_value_get_long (value); + zoom_region_paint_border (zoom_region); + break; + case ZOOM_REGION_XALIGN_PROP: + zoom_region->x_align_policy = g_value_get_int (value); + zoom_region_align (zoom_region); + break; + case ZOOM_REGION_YALIGN_PROP: + /* TODO: enums here */ + zoom_region->y_align_policy = g_value_get_int (value); + zoom_region_align (zoom_region); + break; + case ZOOM_REGION_VIEWPORT_PROP: { + RectBounds *bounds = g_value_get_pointer (value); - return TRUE; + zoom_region_set_viewport (zoom_region, bounds); + } + break; + case ZOOM_REGION_TIMING_TEST_PROP: + zoom_region->timing_iterations = g_value_get_int (value); + timing_test = TRUE; + break; + case ZOOM_REGION_TIMING_OUTPUT_PROP: + zoom_region->timing_output = g_value_get_boolean (value); + break; + case ZOOM_REGION_TIMING_PAN_RATE_PROP: + zoom_region->timing_pan_rate = g_value_get_int (value); + timing_test = TRUE; + break; + case ZOOM_REGION_EXIT_MAGNIFIER: + zoom_region->exit_magnifier = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } -GArray* -impl_dbus_zoom_region_get_contrast (ZoomRegion *zoom_region) +static gboolean +zoom_region_expose (GtkWidget *w, + GdkEventExpose *event) { - GArray *ret; - - ret = g_array_new (FALSE, FALSE, sizeof (gdouble)); - - g_array_append_val (ret, zoom_region->contrast_r); - g_array_append_val (ret, zoom_region->contrast_g); - g_array_append_val (ret, zoom_region->contrast_b); - - return ret; -} + ZoomRegion *zoom_region = ZOOM_REGION (w); + DEBUG_RECT ("expose", event->area); -gboolean -impl_dbus_zoom_region_set_brightness (ZoomRegion *zoom_region, gdouble R, gdouble G, gdouble B) -{ - gfloat t; + if (!gtk_widget_get_visible (w)) + return FALSE; #ifdef ZOOM_REGION_DEBUG g_assert (zoom_region->alive); #endif - DBG (fprintf (stderr, "Set brightness: \t%f,%f %f\n", R, G, B)); - - /* if the contrast values are the same, this is a NOOP */ - if (zoom_region->bright_r == R && - zoom_region->bright_g == G && - zoom_region->bright_b == B) - return TRUE; - - zoom_region->bright_r = CLAMP_B_C (R); - zoom_region->bright_g = CLAMP_B_C (G); - zoom_region->bright_b = CLAMP_B_C (B); + if (zoom_region->priv->pixmap == NULL) + { + ZoomRegionPixmapCreationError ret; + /* TODO: scale down if this fails here */ + while ((ret = zoom_region_create_pixmap (zoom_region)) == + ZOOM_REGION_ERROR_TOO_BIG) { + zoom_region->xscale -= 1.0; + zoom_region->yscale -= 1.0; + zoom_region->priv->pixmap = NULL; + g_warning ("Scale factor too big to fit in memory; shrinking."); + } + if (ret == ZOOM_REGION_ERROR_NO_TARGET_DRAWABLE) + g_warning ("create-pixmap: no target drawable"); + else + zoom_region_update_pixmap (zoom_region, event->area, + NULL); + } + zoom_region_paint (zoom_region, &event->area); - zoom_region_update_current (zoom_region); - return TRUE; } -GArray* -impl_dbus_zoom_region_get_brightness (ZoomRegion *zoom_region) -{ - GArray *ret; - - ret = g_array_new (FALSE, FALSE, sizeof (gdouble)); - - g_array_append_val (ret, zoom_region->bright_r); - g_array_append_val (ret, zoom_region->bright_g); - g_array_append_val (ret, zoom_region->bright_b); - - return ret; -} - -/* could be called multiple times */ -static void -zoom_region_dispose (GObject *object) -{ - ZoomRegion *zoom_region = ZOOM_REGION (object); - - zoom_region_do_dispose (zoom_region); - - BONOBO_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); -} - static void zoom_region_class_init (ZoomRegionClass *klass) { GObjectClass * object_class = (GObjectClass *) klass; - POA_GNOME_Magnifier_ZoomRegion__epv *epv = &klass->epv; - parent_class = g_type_class_peek (BONOBO_TYPE_OBJECT); /* needed by BONOBO_CALL_PARENT! */ + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; 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; - epv->getProperties = impl_zoom_region_get_properties; - epv->setROI = impl_zoom_region_set_roi; - epv->setPointerPos = impl_zoom_region_set_pointer_pos; - epv->updatePointer = impl_zoom_region_update_pointer; - epv->markDirty = impl_zoom_region_mark_dirty; - epv->getROI = impl_zoom_region_get_roi; - epv->moveResize = impl_zoom_region_move_resize; - epv->dispose = impl_zoom_region_dispose; - epv->setContrast = impl_zoom_region_set_contrast; - epv->getContrast = impl_zoom_region_get_contrast; - epv->setBrightness = impl_zoom_region_set_brightness; - epv->getBrightness = impl_zoom_region_get_brightness; - - reset_timing_stats(); -#ifdef DEBUG_CLIENT_CALLS - client_debug = (g_getenv ("MAG_CLIENT_DEBUG") != NULL); -#endif -} - -static void -zoom_region_properties_init (ZoomRegion *zoom_region) -{ - BonoboArg *def; - - zoom_region->properties = - bonobo_property_bag_new_closure ( - g_cclosure_new_object ( - G_CALLBACK (zoom_region_get_property), - G_OBJECT (zoom_region)), - g_cclosure_new_object ( - G_CALLBACK (zoom_region_set_property), - G_OBJECT (zoom_region))); - - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, TRUE); - - bonobo_property_bag_add (zoom_region->properties, - "is-managed", - ZOOM_REGION_MANAGED_PROP, - BONOBO_ARG_BOOLEAN, - def, - "If false, zoom region does not auto-update, but is drawn into directly by the client", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, TRUE); - - bonobo_property_bag_add (zoom_region->properties, - "poll-mouse", - ZOOM_REGION_POLL_MOUSE_PROP, - BONOBO_ARG_BOOLEAN, - NULL, - "If false, zoom region does not poll for pointer location, but is (exclusively) given it by the client", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, TRUE); - - bonobo_property_bag_add (zoom_region->properties, - "draw-cursor", - ZOOM_REGION_DRAW_CURSOR_PROP, - BONOBO_ARG_BOOLEAN, - NULL, - "If false, zoom region does not draw the cursor.", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_SHORT); - BONOBO_ARG_SET_SHORT (def, GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST); - - bonobo_property_bag_add (zoom_region->properties, - "smooth-scroll-policy", - ZOOM_REGION_SMOOTHSCROLL_PROP, - BONOBO_ARG_SHORT, - def, - "scrolling policy, slower versus faster", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_SHORT); - BONOBO_ARG_SET_SHORT ( - def, - GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_NO_FILTER); - - bonobo_property_bag_add (zoom_region->properties, - "color-blind-filter", - ZOOM_REGION_COLORBLIND_PROP, - BONOBO_ARG_SHORT, - def, - "color blind filter to apply in an image", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, FALSE); - - bonobo_property_bag_add (zoom_region->properties, - "use-test-pattern", - ZOOM_REGION_TESTPATTERN_PROP, - BONOBO_ARG_BOOLEAN, - def, - "use test pattern for source", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, TRUE); - - bonobo_property_bag_add (zoom_region->properties, - "inverse-video", - ZOOM_REGION_INVERT_PROP, - BONOBO_ARG_BOOLEAN, - def, - "inverse video display", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - - bonobo_property_bag_add (zoom_region->properties, - "smoothing-type", - ZOOM_REGION_SMOOTHING_PROP, - BONOBO_ARG_STRING, - NULL, - "image smoothing algorithm used", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 0.0); - - bonobo_property_bag_add (zoom_region->properties, - "red-contrast", - ZOOM_REGION_CONTRASTR_PROP, - BONOBO_ARG_FLOAT, - def, - "red image contrast ratio", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 0.0); - - bonobo_property_bag_add (zoom_region->properties, - "green-contrast", - ZOOM_REGION_CONTRASTG_PROP, - BONOBO_ARG_FLOAT, - def, - "green image contrast ratio", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 0.0); - - bonobo_property_bag_add (zoom_region->properties, - "blue-contrast", - ZOOM_REGION_CONTRASTB_PROP, - BONOBO_ARG_FLOAT, - def, - "blue image contrast ratio", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 0.0); - - bonobo_property_bag_add (zoom_region->properties, - "red-brightness", - ZOOM_REGION_BRIGHTR_PROP, - BONOBO_ARG_FLOAT, - def, - "red image brightness ratio", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 0.0); - - bonobo_property_bag_add (zoom_region->properties, - "green-brightness", - ZOOM_REGION_BRIGHTG_PROP, - BONOBO_ARG_FLOAT, - def, - "green image brightness ratio", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 0.0); - - bonobo_property_bag_add (zoom_region->properties, - "blue-brightness", - ZOOM_REGION_BRIGHTB_PROP, - BONOBO_ARG_FLOAT, - def, - "blue image brightness ratio", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 2.0); - - bonobo_property_bag_add (zoom_region->properties, - "mag-factor-x", - ZOOM_REGION_XSCALE_PROP, - BONOBO_ARG_FLOAT, - def, - "x scale factor", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_FLOAT); - BONOBO_ARG_SET_FLOAT (def, 2.0); - - bonobo_property_bag_add (zoom_region->properties, - "mag-factor-y", - ZOOM_REGION_YSCALE_PROP, - BONOBO_ARG_FLOAT, - def, - "y scale factor", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_LONG); - BONOBO_ARG_SET_LONG (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "border-size", - ZOOM_REGION_BORDERSIZE_PROP, - BONOBO_ARG_LONG, - def, - "size of zoom-region borders, in pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_LONG); - BONOBO_ARG_SET_LONG (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "border-size-left", - ZOOM_REGION_BORDERSIZELEFT_PROP, - BONOBO_ARG_LONG, - def, - "size of left zoom-region border, in pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_LONG); - BONOBO_ARG_SET_LONG (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "border-size-top", - ZOOM_REGION_BORDERSIZETOP_PROP, - BONOBO_ARG_LONG, - def, - "size of top zoom-region border, in pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_LONG); - BONOBO_ARG_SET_LONG (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "border-size-right", - ZOOM_REGION_BORDERSIZERIGHT_PROP, - BONOBO_ARG_LONG, - def, - "size of right zoom-region border, in pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_LONG); - BONOBO_ARG_SET_LONG (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "border-size-bottom", - ZOOM_REGION_BORDERSIZEBOTTOM_PROP, - BONOBO_ARG_LONG, - def, - "size of bottom zoom-region border, in " - "pixels", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_LONG); - BONOBO_ARG_SET_LONG (def, 0x00000000); - - bonobo_property_bag_add (zoom_region->properties, - "border-color", - ZOOM_REGION_BORDERCOLOR_PROP, - BONOBO_ARG_LONG, - def, - "border color, as RGBA32", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_INT); - BONOBO_ARG_SET_INT (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "x-alignment", - ZOOM_REGION_XALIGN_PROP, - BONOBO_ARG_INT, - def, - "x-alignment policy for this region", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - def = bonobo_arg_new (BONOBO_ARG_INT); - BONOBO_ARG_SET_INT (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "y-alignment", - ZOOM_REGION_YALIGN_PROP, - BONOBO_ARG_INT, - def, - "y-alignment policy for this region", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - bonobo_property_bag_add (zoom_region->properties, - "viewport", - ZOOM_REGION_VIEWPORT_PROP, - TC_GNOME_Magnifier_RectBounds, - NULL, - "viewport bounding box", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - def = bonobo_arg_new (BONOBO_ARG_INT); - BONOBO_ARG_SET_INT (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "timing-iterations", - ZOOM_REGION_TIMING_TEST_PROP, - BONOBO_ARG_INT, - def, - "timing iterations", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, FALSE); - - bonobo_property_bag_add (zoom_region->properties, - "timing-output", - ZOOM_REGION_TIMING_OUTPUT_PROP, - BONOBO_ARG_BOOLEAN, - def, - "timing output", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_INT); - BONOBO_ARG_SET_INT (def, 0); - - bonobo_property_bag_add (zoom_region->properties, - "timing-pan-rate", - ZOOM_REGION_TIMING_PAN_RATE_PROP, - BONOBO_ARG_INT, - def, - "timing pan rate", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - bonobo_arg_release (def); - - def = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (def, FALSE); - - bonobo_property_bag_add (zoom_region->properties, - "exit-magnifier", - ZOOM_REGION_EXIT_MAGNIFIER, - BONOBO_ARG_BOOLEAN, - def, - "timing output", - Bonobo_PROPERTY_READABLE | - Bonobo_PROPERTY_WRITEABLE); - - bonobo_arg_release (def); - -} - -static void -zoom_region_private_init (ZoomRegionPrivate *priv) -{ - GdkRectangle rect = {0, 0, 0, 0}; - GNOME_Magnifier_RectBounds rectbounds = {0, 0, 0, 0}; - priv->parent = NULL; - priv->w = NULL; - priv->default_gc = NULL; - priv->paint_cursor_gc = NULL; - priv->crosswire_gc = NULL; - priv->q = NULL; - priv->scaled_pixbuf = NULL; - priv->source_pixbuf_cache = NULL; - priv->source_drawable = NULL; - priv->pixmap = NULL; - priv->cursor_backing_rect = rect; - priv->cursor_backing_pixels = NULL; - priv->gdk_interp_type = GDK_INTERP_NEAREST; - priv->expose_handler_id = 0; - priv->test = FALSE; - priv->last_cursor_pos.x = 0; - priv->last_cursor_pos.y = 0; - priv->last_drawn_crosswire_pos.x = 0; - priv->last_drawn_crosswire_pos.y = 0; - priv->exposed_bounds = rectbounds; - priv->source_area = rectbounds; - priv->update_pointer_id = 0; - priv->update_handler_id = 0; + object_class->get_property = zoom_region_get_property; + object_class->set_property = zoom_region_set_property; + + widget_class->expose_event = zoom_region_expose; + + g_object_class_install_property (object_class, + ZOOM_REGION_MANAGED_PROP, + g_param_spec_boolean ("is-managed", + "IsManaged", + "If false, zoom region does not auto-update, but is drawn into directly by the client", + TRUE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_POLL_MOUSE_PROP, + g_param_spec_boolean ("poll-mouse", + "PollMouse", + "If false, zoom region does not poll for pointer location, but is (exclusively) given it by the client", + TRUE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_DRAW_CURSOR_PROP, + g_param_spec_boolean ("draw-cursor", + "DrawCursor", + "If false, zoom region does not draw the cursor.", + TRUE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_SMOOTHSCROLL_PROP, + g_param_spec_uint ("smooth-scroll-policy", + "SmoothScrollPolicy", + "scrolling policy, slower versus faster", + SCROLL_FASTEST, SCROLL_SMOOTHEST, SCROLL_FASTEST, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_COLORBLIND_PROP, + g_param_spec_uint ("color-blind-filter", + "ColorBlibndFilter", + "color blind filter to apply in an image", + COLORBLIND_FILTER_T_NO_FILTER, + COLORBLIND_FILTER_T_MONOCHRONE_OTHERS, + COLORBLIND_FILTER_T_NO_FILTER, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_TESTPATTERN_PROP, + g_param_spec_boolean ("use-test-pattern", + "UseTestPattern", + "use test pattern for source", + FALSE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_INVERT_PROP, + g_param_spec_boolean ("inverse-video", + "InverseVideo", + "inverse video display", + TRUE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_SMOOTHING_PROP, + g_param_spec_string ("smoothing-type", + "SmoothingType", + "image smoothing algorithm used", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_CONTRASTR_PROP, + g_param_spec_float ("red-contrast", + "RedContrast", + "red image contrast ratio", + 0., G_MAXFLOAT, 0., + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_CONTRASTG_PROP, + g_param_spec_float ("green-contrast", + "GreenContrast", + "green image contrast ratio", + 0., G_MAXFLOAT, 0., + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_CONTRASTB_PROP, + g_param_spec_float ("blue-contrast", + "BlueContrast", + "blue image contrast ratio", + 0., G_MAXFLOAT, 0., + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BRIGHTR_PROP, + g_param_spec_float ("red-brightness", + "RedBrightness", + "red image brightness ratio", + 0., G_MAXFLOAT, 0., + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BRIGHTG_PROP, + g_param_spec_float ("green-brightness", + "GreenBrightness", + "green image brightness ratio", + 0., G_MAXFLOAT, 0., + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BRIGHTB_PROP, + g_param_spec_float ("blue-brightness", + "BlueBrightness", + "blue image brightness ratio", + 0., G_MAXFLOAT, 0., + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_XSCALE_PROP, + g_param_spec_float ("mag-factor-x", + "MagFactorX", + "x scale factor", + 0., G_MAXFLOAT, 2.0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_YSCALE_PROP, + g_param_spec_float ("mag-factor-y", + "MagFactorY", + "y scale factor", + 0., G_MAXFLOAT, 2.0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BORDERSIZE_PROP, + g_param_spec_long ("border-size", + "BorderSize", + "size of zoom-region borders, in pixels", + 0, G_MAXLONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BORDERSIZELEFT_PROP, + g_param_spec_long ("border-size-left", + "BorderSizeLeft", + "size of left zoom-region border, in pixels", + 0, G_MAXLONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BORDERSIZETOP_PROP, + g_param_spec_long ("border-size-top", + "BorderSizeTop", + "size of top zoom-region border, in pixels", + 0, G_MAXLONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BORDERSIZERIGHT_PROP, + g_param_spec_long ("border-size-right", + "BorderSizeRight", + "size of right zoom-region border, in pixels", + 0, G_MAXLONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BORDERSIZEBOTTOM_PROP, + g_param_spec_long ("border-size-bottom", + "BorderSizeBottom", + "size of bottom zoom-region border, in pixels", + 0, G_MAXLONG, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_BORDERCOLOR_PROP, + g_param_spec_long ("border-color", + "BorderColor", + "border color, as RGBA32", + 0, G_MAXLONG, 0x00000000, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_XALIGN_PROP, + g_param_spec_int ("x-alignment", + "XAlignment", + "x-alignment policy for this region", + 0, G_MAXINT, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_YALIGN_PROP, + g_param_spec_int ("y-alignment", + "YAlignment", + "y-alignment policy for this region", + 0, G_MAXINT, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_VIEWPORT_PROP, + g_param_spec_pointer ("viewport", + "Viewport", + "viewport bounding box", + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_TIMING_TEST_PROP, + g_param_spec_int ("timing-iterations", + "TimingIterations", + "timing iterations", + 0, G_MAXINT, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_TIMING_OUTPUT_PROP, + g_param_spec_boolean ("timing-output", + "TimingOutput", + "timing output", + FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_TIMING_PAN_RATE_PROP, + g_param_spec_int ("timing-pan-rate", + "TimingPanRate", + "timing pan rate", + 0, G_MAXINT, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + ZOOM_REGION_EXIT_MAGNIFIER, + g_param_spec_boolean ("exit-magnifier", + "ExitMagnifier", + "exit magnifier", + FALSE, G_PARAM_READWRITE)); + + g_type_class_add_private (klass, sizeof (ZoomRegionPrivate)); } static void @@ -4301,112 +3609,57 @@ zoom_region_init (ZoomRegion *zoom_region) { DBG(g_message ("initializing region %p", zoom_region)); - zoom_region_properties_init (zoom_region); + zoom_region->priv = ZOOM_REGION_GET_PRIVATE (zoom_region); zoom_region->draw_cursor = TRUE; - zoom_region->smooth_scroll_policy = - GNOME_Magnifier_ZoomRegion_SCROLL_SMOOTH; - zoom_region->color_blind_filter = - GNOME_Magnifier_ZoomRegion_COLORBLIND_FILTER_T_NO_FILTER; - zoom_region->contrast_r = 0.0; - zoom_region->contrast_g = 0.0; - zoom_region->contrast_b = 0.0; - zoom_region->bright_r = 0.0; - zoom_region->bright_g = 0.0; - zoom_region->bright_b = 0.0; - zoom_region->invert = FALSE; - zoom_region->cache_source = FALSE; - zoom_region->border_size_left = 0; - zoom_region->border_size_top = 0; - zoom_region->border_size_right = 0; - zoom_region->border_size_bottom = 0; - zoom_region->border_color = 0; - zoom_region->roi.x1 = 0; - zoom_region->roi.x1 = 0; - zoom_region->roi.x2 = 1; - zoom_region->roi.x2 = 1; - zoom_region->x_align_policy = GNOME_Magnifier_ZoomRegion_ALIGN_CENTER; - zoom_region->y_align_policy = GNOME_Magnifier_ZoomRegion_ALIGN_CENTER; + zoom_region->smooth_scroll_policy = SCROLL_SMOOTH; + zoom_region->color_blind_filter = COLORBLIND_FILTER_T_NO_FILTER; + zoom_region->x_align_policy = ALIGN_CENTER; + zoom_region->y_align_policy = ALIGN_CENTER; zoom_region->coalesce_func = _coalesce_update_rects; - zoom_region->poll_mouse = TRUE; - zoom_region->priv = g_malloc (sizeof (ZoomRegionPrivate)); - zoom_region_private_init (zoom_region->priv); - bonobo_object_add_interface (BONOBO_OBJECT (zoom_region), - BONOBO_OBJECT (zoom_region->properties)); - zoom_region->timing_output = FALSE; + zoom_region->poll_mouse = TRUE; #ifdef ZOOM_REGION_DEBUG zoom_region->alive = TRUE; #endif zoom_region->priv->update_pointer_id = - g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, - 200, - zoom_region_update_pointer_timeout, - zoom_region, - NULL); + g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, + 200, + zoom_region_update_pointer_timeout, + zoom_region, + NULL); } ZoomRegion * -zoom_region_new (void) +zoom_region_new (GDBusConnection *connection, + GtkWidget *parent) { - ZoomRegionClass *klass = NULL; - GError *error = NULL; ZoomRegion *_this_zoom_region = g_object_new (zoom_region_get_type(), NULL); + GError *error = NULL; + + dbus_connection = connection; + _this_zoom_region->priv->parent = MAGNIFIER (parent); + zoom_region_init_window (_this_zoom_region); + _this_zoom_region->object_path = g_strdup_printf("/org/freedesktop/gnome/ZoomRegion/%i", zoom_region_number); - klass = ZOOM_REGION_GET_CLASS (_this_zoom_region); - - klass->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - if (klass->connection == NULL) { - g_warning ("Unable to connect to dbus: %s", error->message); + if (!introspection_data) + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + + _this_zoom_region->priv->dbus_object_id = + g_dbus_connection_register_object (connection, + _this_zoom_region->object_path, + introspection_data->interfaces[0], + &interface_vtable, + _this_zoom_region, NULL, + &error); + if (error) { + g_printerr ("Failed to register zoom-region object: %s\n", error->message); g_error_free (error); + g_object_unref (_this_zoom_region); + return NULL; } - - dbus_g_object_type_install_info (ZOOM_REGION_TYPE, &dbus_glib_impl_dbus_zoom_region_object_info); - - dbus_g_connection_register_g_object (klass->connection, _this_zoom_region->object_path, - G_OBJECT (_this_zoom_region)); - - zoom_region_number++; - - return _this_zoom_region; -} -/* this one really shuts down the object - called once only */ -static void -zoom_region_finalize (GObject *region) -{ - ZoomRegion *zoom_region = (ZoomRegion *) region; - - DBG(g_message ("finalizing region %p", zoom_region)); + zoom_region_number++; - if (zoom_region->priv && zoom_region->priv->q) - { - g_list_free (zoom_region->priv->q); - zoom_region->priv->q = NULL; - } - if (GTK_IS_WIDGET (zoom_region->priv->w)) - gtk_container_remove (GTK_CONTAINER (((Magnifier *) zoom_region->priv->parent)->priv->canvas), GTK_WIDGET (zoom_region->priv->w)); - if (GTK_IS_WIDGET (zoom_region->priv->border)) - gtk_container_remove (GTK_CONTAINER (((Magnifier *) zoom_region->priv->parent)->priv->canvas), GTK_WIDGET (zoom_region->priv->border)); - if (zoom_region->priv->source_pixbuf_cache) - g_object_unref (zoom_region->priv->source_pixbuf_cache); - if (zoom_region->priv->scaled_pixbuf) - g_object_unref (zoom_region->priv->scaled_pixbuf); - if (zoom_region->priv->pixmap) - g_object_unref (zoom_region->priv->pixmap); - zoom_region->priv->pixmap = NULL; - zoom_region->priv->parent = NULL; - if (zoom_region->priv->cursor_backing_pixels) - g_object_unref (zoom_region->priv->cursor_backing_pixels); - g_free (zoom_region->priv); - zoom_region->priv = NULL; -#ifdef ZOOM_REGION_DEBUG - zoom_region->alive = FALSE; -#endif - BONOBO_CALL_PARENT (G_OBJECT_CLASS, finalize, (region)); + return _this_zoom_region; } - -BONOBO_TYPE_FUNC_FULL (ZoomRegion, - GNOME_Magnifier_ZoomRegion, - BONOBO_TYPE_OBJECT, - zoom_region); diff --git a/magnifier/zoom-region.h b/magnifier/zoom-region.h index f678fcd..00b57ff 100644 --- a/magnifier/zoom-region.h +++ b/magnifier/zoom-region.h @@ -23,13 +23,11 @@ #ifndef ZOOM_REGION_H_ #define ZOOM_REGION_H_ +#include <glib.h> +#include <glib-object.h> +#include <gtk/gtk.h> -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include <bonobo/bonobo-object.h> -#include "GNOME_Magnifier.h" +G_BEGIN_DECLS #define ZOOM_REGION_TYPE (zoom_region_get_type ()) #define ZOOM_REGION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ZOOM_REGION_TYPE, ZoomRegion)) @@ -38,13 +36,53 @@ extern "C" { #define IS_ZOOM_REGION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ZOOM_REGION_TYPE)) #define ZOOM_REGION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ZOOM_REGION_TYPE, ZoomRegionClass)) +typedef struct { + gint32 x1; + gint32 y1; + gint32 x2; + gint32 y2; +} RectBounds; + +typedef struct { + gint32 x; + gint32 y; +} Point; + +typedef enum { + ALIGN_CENTER, + ALIGN_MIN, + ALIGN_MAX +} AlignPolicy; + +typedef enum { + SCROLL_FASTEST, + SCROLL_FAST, + SCROLL_NORMAL, + SCROLL_SMOOTH, + SCROLL_SMOOTHEST +} ScrollingPolicy; + +typedef enum { + COLORBLIND_FILTER_T_NO_FILTER, + COLORBLIND_FILTER_T_SELECTIVE_SATURATE_RED, + COLORBLIND_FILTER_T_SELECTIVE_SATURATE_GREEN, + COLORBLIND_FILTER_T_SELECTIVE_SATURATE_BLUE, + COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_RED, + COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_GREEN, + COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE_BLUE, + COLORBLIND_FILTER_T_HUE_SHIFT_POSITIVE, + COLORBLIND_FILTER_T_HUE_SHIFT_NEGATIVE, + COLORBLIND_FILTER_T_SELECTIVE_SATURATE, + COLORBLIND_FILTER_T_SELECTIVE_DESSATURATE, + COLORBLIND_FILTER_T_MONOCHRONE_OTHERS +} ColorBlindFilter; + typedef GList * (*CoalesceFunc)(GList *, int); typedef struct _ZoomRegionPrivate ZoomRegionPrivate; typedef struct { - BonoboObject parent; - BonoboPropertyBag *properties; + GtkDrawingArea parent; gboolean invert; gboolean is_managed; gboolean draw_cursor; @@ -67,11 +105,11 @@ typedef struct { guint32 border_color; /* A-RGB, 8 bits each, MSB==alpha */ gint x_align_policy; /* TODO: enums here */ gint y_align_policy; - GNOME_Magnifier_ZoomRegion_ScrollingPolicy smooth_scroll_policy; - GNOME_Magnifier_ZoomRegion_ColorBlindFilter color_blind_filter; + ScrollingPolicy smooth_scroll_policy; + ColorBlindFilter color_blind_filter; /* bounds of viewport, in target magnifier window coords */ - GNOME_Magnifier_RectBounds roi; - GNOME_Magnifier_RectBounds viewport; + RectBounds roi; + RectBounds viewport; ZoomRegionPrivate *priv; CoalesceFunc coalesce_func; gint timing_iterations; @@ -85,66 +123,24 @@ typedef struct { } ZoomRegion; typedef struct { - BonoboObjectClass parent_class; - POA_GNOME_Magnifier_ZoomRegion__epv epv; - DBusGConnection *connection; + GtkDrawingAreaClass parent_class; } ZoomRegionClass; -GType zoom_region_get_type (void); -ZoomRegion *zoom_region_new (void); - -/* D-BUS methods */ -gboolean impl_dbus_zoom_region_set_mag_factor (ZoomRegion *zoom_region, const gdouble mag_factor_x, - const gdouble mag_factor_y); -GArray* impl_dbus_zoom_region_get_mag_factor (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_roi (ZoomRegion *zoom_region, const gint32 **roi); -gboolean impl_dbus_zoom_region_update_pointer (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_mark_dirty (ZoomRegion *zoom_region, gint32 **bounds); -GArray* impl_dbus_zoom_region_get_roi (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_move_resize (ZoomRegion *zoom_region, const gint32 **viewport); -gboolean impl_dbus_zoom_region_dispose (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_pointer_pos (ZoomRegion *zoom_region, gint32 mouse_x, gint32 mouse_y); -gboolean impl_dbus_zoom_region_set_contrast (ZoomRegion *zoom_region, gdouble R, gdouble G, gdouble B); -GArray* impl_dbus_zoom_region_get_contrast (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_brightness (ZoomRegion *zoom_region, gdouble R, gdouble G, gdouble B); -GArray* impl_dbus_zoom_region_get_brightness (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_managed (ZoomRegion *zoom_region, gboolean managed); -gboolean impl_dbus_zoom_region_get_managed (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_poll_mouse (ZoomRegion *zoom_region, gboolean poll_mouse); -gboolean impl_dbus_zoom_region_get_poll_mouse (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_draw_cursor (ZoomRegion *zoom_region, gboolean draw_cursor); -gboolean impl_dbus_zoom_region_get_draw_cursor (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_invert (ZoomRegion *zoom_region, gboolean invert); -gboolean impl_dbus_zoom_region_get_invert (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_smoothscroll (ZoomRegion *zoom_region, gshort smoothscroll); -gshort impl_dbus_zoom_region_get_smoothscroll (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_colorblind (ZoomRegion *zoom_region, gshort colorblind); -gshort impl_dbus_zoom_region_get_colorblind (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_smoothing (ZoomRegion *zoom_region, gchar *smoothing); -gchar* impl_dbus_zoom_region_get_smoothing (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_testpattern (ZoomRegion *zoom_region, gboolean test); -gboolean impl_dbus_zoom_region_get_testpattern (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_bordersizes (ZoomRegion *zoom_region, gint32 **bordersizes); -GArray* impl_dbus_zoom_region_get_bordersizes (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_bordercolor (ZoomRegion *zoom_region, guint32 bordercolor); -guint32 impl_dbus_zoom_region_get_bordercolor (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_xalign (ZoomRegion *zoom_region, gint32 align); -gint32 impl_dbus_zoom_region_get_xalign (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_yalign (ZoomRegion *zoom_region, gint32 align); -gint32 impl_dbus_zoom_region_get_yalign (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_viewport (ZoomRegion *zoom_region, gint32 **viewport); -GArray* impl_dbus_zoom_region_get_viewport (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_timing_test (ZoomRegion *zoom_region, gint32 timing_iterations); -gint32 impl_dbus_zoom_region_get_timing_test (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_timing_output (ZoomRegion *zoom_region, gboolean timing_output); -gboolean impl_dbus_zoom_region_get_timing_output (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_timing_pan_rate (ZoomRegion *zoom_region, gint32 timing_pan_rate); -gint32 impl_dbus_zoom_region_get_timing_pan_rate (ZoomRegion *zoom_region); -gboolean impl_dbus_zoom_region_set_exit_magnifier (ZoomRegion *zoom_region, gboolean exit_magnifier); -gboolean impl_dbus_zoom_region_get_exit_magnifier (ZoomRegion *zoom_region); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ +GType zoom_region_get_type (void) G_GNUC_CONST; +ZoomRegion *zoom_region_new (GDBusConnection *connection, + GtkWidget *parent); +void zoom_region_update_cursor (ZoomRegion *zoom_region, + int dx, + int dy, + GdkRectangle *clip_rect); +void zoom_region_mark_dirty (ZoomRegion *zoom_region, + RectBounds *roi_dirty); +void zoom_region_set_roi (ZoomRegion *zoom_region, + RectBounds *bounds); +gboolean zoom_region_set_mag_factor (ZoomRegion *zoom_region, + gdouble mag_factor_x, + gdouble mag_factor_y); + +G_END_DECLS #endif /* ZOOM_REGION_H_ */ diff --git a/test/Makefile.am b/test/Makefile.am index 3467183..e0876e1 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,7 +1,8 @@ -noinst_PROGRAMS = control-client mag-test +#noinst_PROGRAMS = control-client mag-test +noinst_PROGRAMS = mag-test -control_client_SOURCES = control-client.c +#control_client_SOURCES = control-client.c mag_test_SOURCES = mag-test.c @@ -9,10 +10,9 @@ INCLUDES = \ $(DEPS_CFLAGS) \ -I$(top_srcdir) \ -I$(top_builddir) \ - -I$(top_builddir)/magnifier \ - -I$(top_srcdir)/idl + -I$(top_builddir)/magnifier -LDADD = $(DEPS_LIBS) $(top_builddir)/magnifier/libgnome-mag.la $(X_LIBS) $(POPT_LIBS) +LDADD = $(DEPS_LIBS) $(X_LIBS) $(POPT_LIBS) diff --git a/test/mag-test.c b/test/mag-test.c index db6a166..036ce75 100644 --- a/test/mag-test.c +++ b/test/mag-test.c @@ -23,53 +23,22 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> -#include <libbonobo.h> +#include <gtk/gtk.h> #include <gdk/gdk.h> -#include "GNOME_Magnifier.h" -static GNOME_Magnifier_Magnifier _the_magnifier = NULL; +typedef enum { + ALIGN_CENTER, + ALIGN_MIN, + ALIGN_MAX +} AlignPolicy; -static void -init_rect_bounds (GNOME_Magnifier_RectBounds *bounds, - long x1, long y1, long x2, long y2) -{ - bounds->x1 = x1; - bounds->y1 = y1; - bounds->x2 = x2; - bounds->y2 = y2; -} - -static GNOME_Magnifier_Magnifier -get_magnifier() -{ - CORBA_Object oclient; - char *obj_id; - CORBA_Environment ev; - - if (!_the_magnifier) - { - CORBA_exception_init (&ev); - obj_id = "OAFIID:GNOME_Magnifier_Magnifier:0.9"; - - oclient = bonobo_activation_activate_from_id (obj_id, 0, NULL, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - fprintf (stderr, - ("Activation error: during magnifier activation: %s\n"), - CORBA_exception_id(&ev)); - CORBA_exception_free(&ev); - } - - if (CORBA_Object_is_nil (oclient, &ev)) - { - g_error ("Could not locate magnifier"); - } - - _the_magnifier = (GNOME_Magnifier_Magnifier) oclient; - - } - - return _the_magnifier; -} +typedef enum { + SCROLL_FASTEST, + SCROLL_FAST, + SCROLL_NORMAL, + SCROLL_SMOOTH, + SCROLL_SMOOTHEST +} ScrollingPolicy; #ifdef WE_USE_THIS_AGAIN static GNOME_Magnifier_ZoomRegion @@ -86,123 +55,160 @@ test_client_magnifier_get_zoomer (GNOME_Magnifier_Magnifier magnifier, int index } #endif -static void -init_rectbounds (GNOME_Magnifier_RectBounds *bounds, int x1, int y1, int x2, int y2) +static GVariant * +get_rectbounds (int x1, int y1, int x2, int y2) { - bounds->x1 = x1; - bounds->y1 = y1; - bounds->x2 = x2; - bounds->y2 = y2; + GVariant *children[4]; + + children[0] = g_variant_new_int32 (x1); + children[1] = g_variant_new_int32 (y1); + children[2] = g_variant_new_int32 (x2); + children[3] = g_variant_new_int32 (y2); + + return g_variant_new_array (G_VARIANT_TYPE_INT32, children, 4); } static void -test_new_region (GNOME_Magnifier_Magnifier magnifier, +test_new_region (GDBusProxy *magnifier, float xscale, float yscale, int x1, int y1, int x2, int y2, - GNOME_Magnifier_ZoomRegion_ScrollingPolicy scroll_policy, + ScrollingPolicy scroll_policy, gchar *smoothing_type, gboolean is_inverse, - GNOME_Magnifier_ZoomRegion_AlignPolicy align) + AlignPolicy align) { - GNOME_Magnifier_RectBounds *viewport = GNOME_Magnifier_RectBounds__alloc (); - GNOME_Magnifier_RectBounds *roi = GNOME_Magnifier_RectBounds__alloc (); - GNOME_Magnifier_ZoomRegion zoomer; - Bonobo_PropertyBag properties; - CORBA_Environment ev; + GVariant *result; + const gchar *zoomer_object_path; + GDBusProxy *zoomer; + GError *error = NULL; + + result = g_dbus_proxy_call_sync (magnifier, + "createZoomRegion", + g_variant_new ("(dd@ai@ai)", + xscale, yscale, + get_rectbounds (0, 0, 100, 100), + get_rectbounds (x1, y1, x2, y2)), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, &error); + if (error) { + g_printerr ("Error calling method createZoomRegion: %s\n", error->message); + g_error_free (error); + + return; + } - CORBA_exception_init (&ev); + g_variant_get (result, "(&o)", &zoomer_object_path); + zoomer = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (magnifier), + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.gnome.Magnifier.ZoomRegion", + zoomer_object_path, + "org.freedesktop.gnome.Magnifier.ZoomRegion", + NULL, &error); + g_variant_unref (result); + if (!zoomer) { + g_printerr ("Error creating zoomer proxy: %s\n", error->message); + g_error_free (error); + + return; + } + + result = g_dbus_proxy_call_sync (magnifier, + "addZoomRegion", + g_variant_new ("(o)", + g_dbus_proxy_get_object_path (zoomer)), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, &error); + if (error) { + g_printerr ("Error calling method addZoomRegion: %s\n", error->message); + g_error_free (error); + g_object_unref (zoomer); + + return; + } + g_variant_unref (result); + + g_dbus_proxy_set_cached_property (zoomer, "Smoothscroll", + g_variant_new_uint32 (scroll_policy)); + g_dbus_proxy_set_cached_property (zoomer, "Xalign", + g_variant_new_int32 (align)); + g_dbus_proxy_set_cached_property (zoomer, "Yalign", + g_variant_new_int32 (align)); - init_rectbounds (roi, 0, 0, 100, 100); - init_rectbounds (viewport, x1, y1, x2, y2); - - zoomer = GNOME_Magnifier_Magnifier_createZoomRegion (magnifier, - xscale, - yscale, - roi, - viewport, - &ev); - GNOME_Magnifier_Magnifier_addZoomRegion (magnifier, - zoomer, - &ev); - - properties = GNOME_Magnifier_ZoomRegion_getProperties (zoomer, &ev); - - Bonobo_PropertyBag_setValue (properties, "smooth-scroll-policy", - bonobo_arg_new_from (BONOBO_ARG_INT, - &scroll_policy), &ev); - Bonobo_PropertyBag_setValue (properties, "x-alignment", - bonobo_arg_new_from (BONOBO_ARG_INT, - &align), &ev); - Bonobo_PropertyBag_setValue (properties, "y-alignment", - bonobo_arg_new_from (BONOBO_ARG_INT, - &align), &ev); - if (smoothing_type) { - BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING); - BONOBO_ARG_SET_STRING (arg, smoothing_type); - Bonobo_PropertyBag_setValue (properties, "smoothing-type", - arg, &ev); + g_dbus_proxy_set_cached_property (zoomer, "Smoothing", + g_variant_new_string (smoothing_type)); } - + if (is_inverse) - Bonobo_PropertyBag_setValue (properties, "inverse-video", - bonobo_arg_new_from (BONOBO_ARG_BOOLEAN, - &is_inverse), - &ev); + g_dbus_proxy_set_cached_property (zoomer, "Invert", + g_variant_new_boolean (is_inverse)); + g_object_unref (zoomer); } -int main(int argc, char ** argv){ - - GNOME_Magnifier_Magnifier magnifier; - GNOME_Magnifier_RectBounds *viewport = NULL; - CORBA_Environment ev; - CORBA_any *rect_any; - Bonobo_PropertyBag properties; +int main(int argc, char ** argv) +{ + GDBusProxy *magnifier; int x, y, width, height; - - CORBA_exception_init (&ev); - - if (!bonobo_init (&argc, argv)) - { - g_error ("Could not initialize Bonobo"); + GError *error = NULL; + + gtk_init (&argc, &argv); + + magnifier = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.gnome.Magnifier", + "/org/freedesktop/gnome/Magnifier", + "org.freedesktop.gnome.Magnifier", + NULL, &error); + if (!magnifier) { + g_printerr ("Error creating magnifier proxy: %s\n", error->message); + g_error_free (error); + + return 1; } - - magnifier = get_magnifier (); - gdk_init (&argc, &argv); - properties = GNOME_Magnifier_Magnifier_getProperties (magnifier, &ev); width = gdk_screen_get_width (gdk_screen_get_default ()); height = gdk_screen_get_height (gdk_screen_get_default ()); x = width / 2; y = 0; - viewport = GNOME_Magnifier_RectBounds__alloc (); - init_rect_bounds (viewport, x, y, width - x, height); - rect_any = bonobo_arg_new_from (TC_GNOME_Magnifier_RectBounds, - viewport); - bonobo_pbclient_set_value (properties, "target-display-bounds", - rect_any, &ev); - bonobo_arg_release (rect_any); - bonobo_object_release_unref (properties, NULL); - - GNOME_Magnifier_Magnifier_clearAllZoomRegions (magnifier, &ev); - - test_new_region (magnifier, 2.0, 2.0, 0, 0, 400, 200, - GNOME_Magnifier_ZoomRegion_SCROLL_SMOOTHEST, - NULL, FALSE, GNOME_Magnifier_ZoomRegion_ALIGN_CENTER); - test_new_region (magnifier, 2.0, 2.0, 0, 200, 400, 400, - GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST, - NULL, FALSE, GNOME_Magnifier_ZoomRegion_ALIGN_CENTER); - test_new_region (magnifier, 0.75, 1.5, 0, 400, 200, 600, - GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST, - "bilinear", TRUE, GNOME_Magnifier_ZoomRegion_ALIGN_CENTER); - test_new_region (magnifier, 3.0, 3.0, 200, 400, 400, 600, - GNOME_Magnifier_ZoomRegion_SCROLL_FASTEST, - "bilinear", FALSE, GNOME_Magnifier_ZoomRegion_ALIGN_MIN); + g_dbus_proxy_set_cached_property (magnifier, + "TargetSize", + get_rectbounds (x, y, width - x, height)); + + g_dbus_proxy_call_sync (magnifier, + "clearAllZoomRegions", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, &error); + if (!error) { + test_new_region (magnifier, 2.0, 2.0, 0, 0, 400, 200, + SCROLL_SMOOTHEST, + NULL, FALSE, ALIGN_CENTER); + test_new_region (magnifier, 2.0, 2.0, 0, 200, 400, 400, + SCROLL_FASTEST, + NULL, FALSE, ALIGN_CENTER); + test_new_region (magnifier, 0.75, 1.5, 0, 400, 200, 600, + SCROLL_FASTEST, + "bilinear", TRUE, ALIGN_CENTER); + test_new_region (magnifier, 3.0, 3.0, 200, 400, 400, 600, + SCROLL_FASTEST, + "bilinear", FALSE, ALIGN_MIN); + } else { + g_printerr ("Error calling method clearAllZoomRegions: %s\n", error->message); + g_error_free (error); + g_object_unref (magnifier); + + return 1; + } + + g_object_unref (magnifier); + return 0; } |