diff options
author | Carlos Eduardo Rodrigues DiÃgenes <cerdiogenes@gmail.com> | 2010-01-23 12:03:50 -0200 |
---|---|---|
committer | Carlos Eduardo Rodrigues DiÃgenes <cerdiogenes@gmail.com> | 2010-01-23 12:03:50 -0200 |
commit | 78430636689160bc03f6b13859d0c437f4ccad5a (patch) | |
tree | f2720fa306149c09439b62f35278115ddd823665 | |
parent | e8aa4ff7c7d782d8319482418bbb945f6373e9d9 (diff) |
d-bus changes that where not committed last time
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | configure.in | 9 | ||||
-rw-r--r-- | magnifier/Makefile.am | 30 | ||||
-rw-r--r-- | magnifier/magnifier-main.c | 16 | ||||
-rw-r--r-- | magnifier/magnifier-private.h | 30 | ||||
-rw-r--r-- | magnifier/magnifier.c | 254 | ||||
-rw-r--r-- | magnifier/magnifier.h | 109 | ||||
-rw-r--r-- | magnifier/zoom-region.c | 233 | ||||
-rw-r--r-- | magnifier/zoom-region.h | 27 | ||||
-rw-r--r-- | test/control-client.c | 4 |
10 files changed, 623 insertions, 91 deletions
diff --git a/Makefile.am b/Makefile.am index 0bc7d6c..5a45d0e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ # Process this file with automake to create Makefile.in. -SUBDIRS = idl magnifier test $(CB_DIR) po cursors docs +SUBDIRS = idl xml magnifier test $(CB_DIR) po cursors docs pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA= gnome-mag-1.0.pc diff --git a/configure.in b/configure.in index 2a147e1..73cc787 100644 --- a/configure.in +++ b/configure.in @@ -250,6 +250,7 @@ PKG_CHECK_MODULES(DEPS, [ glib-2.0 >= 2.11.1 gtk+-2.0 >= 2.1.0 gdk-pixbuf-2.0 >= 2.1.0 + dbus-glib-1 ]) AC_SUBST(DEPS_LIBS) AC_SUBST(DEPS_CFLAGS) @@ -291,6 +292,13 @@ 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.]) +if test -z "$DEFAULT_GMAG_INTROSPECTION_PATH"; then + DEFAULT_GMAG_INTROSPECTION_PATH=gnome-mag/dbus +fi + AC_OUTPUT([ Makefile gnome-mag-1.0.pc @@ -298,6 +306,7 @@ gnome-mag-1.0-uninstalled.pc po/Makefile.in idl/Makefile magnifier/Makefile +xml/Makefile cursors/Makefile cursors/1_32/Makefile test/Makefile diff --git a/magnifier/Makefile.am b/magnifier/Makefile.am index c410a2c..2828ee7 100644 --- a/magnifier/Makefile.am +++ b/magnifier/Makefile.am @@ -6,7 +6,7 @@ bin_PROGRAMS = magnifier libgnome_mag_la_SOURCES = \ GNOME_Magnifier-common.c \ - GNOME_Magnifier-stubs.c + GNOME_Magnifier-stubs.c libgnome_mag_la_DEPENDENCIES = \ GNOME_Magnifier.h @@ -32,6 +32,7 @@ magnifier_SOURCES = magnifier-main.c \ 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 \ @@ -85,9 +86,18 @@ $(server_in_files): $(server_in_files).in server_in_files = GNOME_Magnifier.server.in serverinfo_DATA = $(server_in_files:.server.in=.server) +servicedir = $(datadir)/dbus-1/services +service_in_files= org.freedesktop.gnome.Magnifier.service.in +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 +EXTRA_DIST = $(server_in_files).in $(IDL_OUT) : $(IDL) $(ORBIT_IDL) $(ORBIT_IDL) $(IDLFLAGS) $(IDL) @@ -96,6 +106,22 @@ DONT_DIST_SOURCE = $(IDL_OUT) CLEANFILES += $(server_in_files) $(serverinfo_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 $< > $@ + +zoom-region-server.h: $(top_srcdir)/xml/org.freedesktop.gnome.ZoomRegion.xml + dbus-binding-tool --prefix=impl_dbus_zoom_region --mode=glib-server $< > $@ + +zoom-region-client.h: $(top_srcdir)/xml/org.freedesktop.gnome.ZoomRegion.xml + dbus-binding-tool --prefix=impl_dbus_zoom_region --mode=glib-client $< > $@ + dist-hook: for file in $(DONT_DIST_SOURCE) ; do \ rm -f $(distdir)/$$file ; \ diff --git a/magnifier/magnifier-main.c b/magnifier/magnifier-main.c index a2f89a1..5c41f6b 100644 --- a/magnifier/magnifier-main.c +++ b/magnifier/magnifier-main.c @@ -27,6 +27,8 @@ #include "gmag-graphical-server.h" #include "GNOME_Magnifier.h" +#include <unistd.h> + #include <string.h> #include <stdlib.h> #include <sys/time.h> @@ -179,7 +181,7 @@ magnifier_main_test_image (gpointer data) CORBA_Environment ev; GNOME_Magnifier_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) { @@ -373,7 +375,7 @@ main (int argc, char** argv) guint pan_handle = 0, refresh_handle = 0; CORBA_Environment ev; Bonobo_PropertyBag properties; - + Magnifier *magnifier; if (!bonobo_init (&argc, argv)) { @@ -403,7 +405,7 @@ main (int argc, char** argv) string = g_strconcat ("DISPLAY=", global_options.target_display, NULL); putenv (string); } else { - global_options.target_display = getenv ("DISPLAY"); + global_options.target_display = g_getenv ("DISPLAY"); if (!global_options.target_display) { fprintf (stderr, _("Can't open display: DISPLAY is not set")); exit (1); @@ -436,15 +438,15 @@ main (int argc, char** argv) 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.target_display) - bonobo_pbclient_set_string (properties, "target-display-screen", - global_options.target_display, NULL); - if (global_options.cursor_set) bonobo_pbclient_set_string (properties, "cursor-set", global_options.cursor_set, NULL); diff --git a/magnifier/magnifier-private.h b/magnifier/magnifier-private.h index 318362f..a518975 100644 --- a/magnifier/magnifier-private.h +++ b/magnifier/magnifier-private.h @@ -28,22 +28,22 @@ G_BEGIN_DECLS #include <gtk/gtk.h> struct _MagnifierPrivate { - GtkWidget *w; - GtkWidget *canvas; - GdkWindow *root; - GdkWindow *overlay; - GdkPixmap *source_drawable; + GtkWidget *w; + GtkWidget *canvas; + GdkWindow *root; + GdkWindow *overlay; + GdkPixmap *source_drawable; GdkDrawable *cursor; - int cursor_default_size_x; - int cursor_default_size_y; - gboolean crosswire; - GdkBitmap *cursor_mask; - int cursor_x; - int cursor_y; - int cursor_hotspot_x; - int cursor_hotspot_y; - gboolean use_source_cursor; - GHashTable *cursorlist; + int cursor_default_size_x; + int cursor_default_size_y; + gboolean crosswire; + GdkBitmap *cursor_mask; + int cursor_x; + int cursor_y; + int cursor_hotspot_x; + int cursor_hotspot_y; + gboolean use_source_cursor; + GHashTable *cursorlist; }; G_END_DECLS diff --git a/magnifier/magnifier.c b/magnifier/magnifier.c index c51d6c1..88e1254 100644 --- a/magnifier/magnifier.c +++ b/magnifier/magnifier.c @@ -28,6 +28,7 @@ #include "gmag-cursor.h" #include "gmag-graphical-server.h" #include "GNOME_Magnifier.h" +#include "magnifier-server.h" #include <stdlib.h> #include <string.h> @@ -36,6 +37,8 @@ #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> @@ -84,19 +87,20 @@ enum { typedef struct { GNOME_Magnifier_RectBounds rectbounds; + RectBounds dbus_rectbounds; GNOME_Magnifier_RectBounds viewport; - gboolean is_managed; - gint scroll_policy; - gfloat contrast; - gfloat zx; - gfloat zy; - gint32 xalign; - gint32 yalign; - guint32 border_color; - gint32 border_size; - gchar *smoothing_type; - gboolean inverse; - + RectBounds dbus_viewport; + gboolean is_managed; + gint scroll_policy; + gfloat contrast; + gfloat zx; + gfloat zy; + gint32 xalign; + gint32 yalign; + guint32 border_color; + gint32 border_size; + gchar *smoothing_type; + gboolean inverse; } MagnifierZoomRegionSaveProps; #ifdef DEBUG_CLIENT_CALLS @@ -128,6 +132,8 @@ static void magnifier_init_window (Magnifier *magnifier, GdkScreen *screen); static void magnifier_adjust_source_size (Magnifier *magnifier); static gboolean _is_override_redirect = FALSE; +static GHashTable *zoom_hash = NULL; + static Window* mag_login_helper_get_raise_windows (LoginHelper *helper) { @@ -149,7 +155,6 @@ 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; @@ -484,8 +489,8 @@ magnifier_adjust_source_size (Magnifier *magnifier) magnifier->target_bounds.y2) / (double) rect_bounds.y2; - /* we make our 'source' rectangle the largest available subsection which we aren't occupying */ if (magnifier_full_screen_capable (magnifier)) { + /* we make our 'source' rectangle the largest available subsection which we aren't occupying */ magnifier->source_bounds = rect_bounds; } else if (MAX (hfract_left, hfract_right) > MAX (vfract_top, vfract_bottom)) { /* vertical split, @@ -534,6 +539,17 @@ magnifier_unref_zoom_region (gpointer data, gpointer user_data) Bonobo_Unknown_unref (zoom_region, &ev); } +static void +magnifier_dbus_unref_zoom_region (gpointer data, gpointer user_data) +{ +/* Magnifier *magnifier = user_data; NOT USED */ + ZoomRegion *zoom_region = data; + + DBG(g_message ("unreffing zoom region")); + + impl_dbus_zoom_region_dispose (zoom_region); +} + static GSList* magnifier_zoom_regions_save (Magnifier *magnifier) { @@ -582,6 +598,7 @@ magnifier_zoom_regions_save (Magnifier *magnifier) } magnifier->zoom_regions = NULL; + magnifier->zoom_regions_dbus = NULL; return save_props; } @@ -960,6 +977,40 @@ magnifier_get_property (BonoboPropertyBag *bag, } static void +magnifier_set_target_size (gpointer data) +{ + Magnifier *magnifier = (Magnifier *) data; + + magnifier->target_bounds.x1 = 150; + magnifier->target_bounds.y1 = 150; + magnifier->target_bounds.x2 = 300; + magnifier->target_bounds.y2 = 300; + + 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); +} + +static void magnifier_set_property (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, @@ -1199,9 +1250,12 @@ magnifier_do_dispose (Magnifier *magnifier) bonobo_activation_active_server_unregister ( MAGNIFIER_OAFIID, BONOBO_OBJREF (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 (); } @@ -1258,6 +1312,141 @@ impl_magnifier_full_screen_capable (PortableServer_Servant servant, 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) +{ + magnifier_set_target_size (magnifier); + + 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) +{ + 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; +} + +gboolean +impl_dbus_magnifier_dispose (Magnifier *magnifier) +{ + magnifier_do_dispose (magnifier); + + return TRUE; +} + static void impl_magnifier_set_source_display (PortableServer_Servant servant, const CORBA_char *display, @@ -1475,6 +1664,7 @@ impl_magnifier_clear_all_zoom_regions (PortableServer_Servant servant, magnifier_unref_zoom_region, magnifier); g_list_free (magnifier->zoom_regions); magnifier->zoom_regions = NULL; + magnifier->zoom_regions_dbus = NULL; } static void @@ -1497,8 +1687,7 @@ magnifier_class_init (MagnifierClass *klass) 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->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; @@ -1526,7 +1715,6 @@ magnifier_properties_init (Magnifier *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)); @@ -1710,6 +1898,7 @@ 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"); @@ -1746,6 +1935,8 @@ magnifier_init (Magnifier *magnifier) #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); } GdkDrawable * @@ -1782,6 +1973,10 @@ 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; @@ -1806,10 +2001,33 @@ magnifier_new (gboolean override_redirect) } 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; } diff --git a/magnifier/magnifier.h b/magnifier/magnifier.h index fcd8527..0127d10 100644 --- a/magnifier/magnifier.h +++ b/magnifier/magnifier.h @@ -38,45 +38,62 @@ extern "C" { #include <login-helper/login-helper.h> +#include <dbus/dbus-glib.h> + #define MAGNIFIER_TYPE (magnifier_get_type ()) #define MAGNIFIER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MAGNIFIER_TYPE, Magnifier)) #define MAGNIFIER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), MAGNIFIER_TYPE, MagnifierClass)) -#define IS_MAGNIFIER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MAGNIFIER_TYPE)) -#define IS_MAGNIFIER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), MAGNIFIER_TYPE)) +#define IS_MAGNIFIER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MAGNIFIER_TYPE)) +#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 { - BonoboObject parent; - BonoboPropertyBag *property_bag; - GdkDisplay *source_display; - GdkDisplay *target_display; - gchar *source_display_name; - gchar *target_display_name; - int source_screen_num; - int target_screen_num; - GList *zoom_regions; - gboolean source_initialized; - gint crosswire_size; - gint crosswire_length; - guint32 crosswire_color; - gboolean crosswire_clip; - gchar *cursor_set; - gint cursor_size_x; - gint cursor_size_y; - guint32 cursor_color; - float cursor_scale_factor; + gint32 x1; + gint32 y1; + gint32 x2; + gint32 y2; +} RectBounds; + +typedef struct { + gint32 x; + gint32 y; +} Point; + +typedef struct { + BonoboObject parent; + BonoboPropertyBag *property_bag; + GdkDisplay *source_display; + GdkDisplay *target_display; + gchar *source_display_name; + gchar *target_display_name; + int source_screen_num; + int target_screen_num; + GList *zoom_regions; + GList *zoom_regions_dbus; + gboolean source_initialized; + gint crosswire_size; + gint crosswire_length; + guint32 crosswire_color; + gboolean crosswire_clip; + gchar *cursor_set; + gint cursor_size_x; + 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; - MagnifierPrivate *priv; + GNOME_Magnifier_Point cursor_hotspot; + MagnifierPrivate *priv; } Magnifier; typedef struct { - BonoboObjectClass parent_class; - POA_GNOME_Magnifier_Magnifier__epv epv; + BonoboObjectClass parent_class; + POA_GNOME_Magnifier_Magnifier__epv epv; + DBusGConnection *connection; } MagnifierClass; /* @@ -129,27 +146,27 @@ typedef struct { */ typedef struct timing { - GTimer *process; - GTimer *frame; - GTimer *scale; - GTimer *idle; + GTimer *process; + GTimer *frame; + GTimer *scale; + GTimer *idle; gdouble scale_val; gdouble idle_val; gdouble frame_val; - int dx; - int dy; + int dx; + int dy; gdouble scale_total; gdouble idle_total; gdouble frame_total; - int dx_total; - int dy_total; - long update_pixels_total; - long num_scale_samples; - long num_idle_samples; - long num_frame_samples; - long num_line_samples; + int dx_total; + int dy_total; + long update_pixels_total; + long num_scale_samples; + long num_idle_samples; + long num_frame_samples; + long num_line_samples; gdouble last_frame_val; - int last_dy; + int last_dy; } TimingStruct; TimingStruct mag_timing; @@ -168,6 +185,20 @@ void magnifier_set_cursor_pixmap_by_name (Magnifier *magnifier, 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); + + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/magnifier/zoom-region.c b/magnifier/zoom-region.c index add7a0a..0c8e12b 100644 --- a/magnifier/zoom-region.c +++ b/magnifier/zoom-region.c @@ -48,6 +48,7 @@ #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 @@ -148,6 +149,8 @@ static gboolean timing_start = FALSE; static gboolean can_coalesce = TRUE ; /* change this when event coalescing is working */ +static int zoom_region_number = 0; + #define CLAMP_B_C(v) (t = (v), CLAMP (t, -1, 1)); static void zoom_region_sync (ZoomRegion *region); @@ -209,6 +212,15 @@ _debug_announce_rect (char *msg, GdkRectangle rect) msg, rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); } +static void +_set_bounds (RectBounds *struct_bounds, const gint32 **vector_bounds) +{ + struct_bounds->x1 = (*vector_bounds)[0]; + struct_bounds->y1 = (*vector_bounds)[1]; + struct_bounds->x2 = (*vector_bounds)[2]; + struct_bounds->y2 = (*vector_bounds)[3]; +} + static gboolean _diff_pixbufs (const GdkPixbuf *a, const GdkPixbuf *b) { @@ -706,7 +718,7 @@ zoom_region_update_scale (ZoomRegion *zoom_region, gdouble x, gdouble y) 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); - return CORBA_FALSE; + return FALSE; } zoom_region_get_move_x_y (zoom_region, &x_move, &y_move); @@ -715,7 +727,7 @@ zoom_region_update_scale (ZoomRegion *zoom_region, gdouble x, gdouble y) zoom_region_recompute_exposed_bounds (zoom_region); zoom_region_update_current (zoom_region); - return CORBA_TRUE; + return TRUE; } static void @@ -3196,6 +3208,200 @@ impl_zoom_region_dispose (PortableServer_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 float mag_factor_x, const float 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; +} + +gboolean +impl_dbus_zoom_region_get_mag_factor (ZoomRegion *zoom_region) +{ + return TRUE; +} + +gboolean +impl_dbus_zoom_region_set_roi (ZoomRegion *zoom_region, const gint32 **roi) +{ + RectBounds *bounds = g_malloc(sizeof(RectBounds)); + _set_bounds (bounds, roi); + + #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)); + + 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 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 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); + } + + return TRUE; +} + +gboolean +impl_dbus_zoom_region_update_pointer (ZoomRegion *zoom_region) +{ + return TRUE; +} + +gboolean +impl_dbus_zoom_region_mark_dirty (ZoomRegion *zoom_region) +{ + return TRUE; +} + +gboolean +impl_dbus_zoom_region_get_roi (ZoomRegion *zoom_region) +{ + return TRUE; +} + +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; +} + +gboolean +impl_dbus_zoom_region_set_pointer_pos (ZoomRegion *zoom_region) { + return TRUE; +} + +gboolean +impl_dbus_zoom_region_set_contrast (ZoomRegion *zoom_region) +{ + return TRUE; +} + +gboolean +impl_dbus_zoom_region_get_contrast (ZoomRegion *zoom_region) +{ + return TRUE; +} + +gboolean +impl_dbus_zoom_region_set_brightness (ZoomRegion *zoom_region) +{ + return TRUE; +} + +gboolean +impl_dbus_zoom_region_get_brightness (ZoomRegion *zoom_region) +{ + return TRUE; +} /* could be called multiple times */ static void @@ -3711,7 +3917,28 @@ zoom_region_init (ZoomRegion *zoom_region) ZoomRegion * zoom_region_new (void) { - return g_object_new (zoom_region_get_type(), NULL); + ZoomRegionClass *klass = NULL; + GError *error = NULL; + ZoomRegion *_this_zoom_region = g_object_new (zoom_region_get_type(), NULL); + _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); + g_error_free (error); + 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 */ diff --git a/magnifier/zoom-region.h b/magnifier/zoom-region.h index 546652e..ef22889 100644 --- a/magnifier/zoom-region.h +++ b/magnifier/zoom-region.h @@ -34,8 +34,9 @@ extern "C" { #define ZOOM_REGION_TYPE (zoom_region_get_type ()) #define ZOOM_REGION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ZOOM_REGION_TYPE, ZoomRegion)) #define ZOOM_REGION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), ZOOM_REGION_TYPE, ZoomRegionClass)) -#define IS_ZOOM_REGION(o) (G_TYPE_CHECK__INSTANCE_TYPE ((o), ZOOM_REGION_TYPE)) -#define IS_ZOOM_REGION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ZOOM_REGION_TYPE)) +#define IS_ZOOM_REGION(o) (G_TYPE_CHECK__INSTANCE_TYPE ((o), ZOOM_REGION_TYPE)) +#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 GList * (*CoalesceFunc)(GList *, int); @@ -49,6 +50,7 @@ typedef struct { gboolean draw_cursor; gboolean cache_source; gchar *smoothing; + gchar *object_path; gfloat contrast; gfloat xscale; gfloat yscale; @@ -83,13 +85,30 @@ typedef struct { } ZoomRegion; typedef struct { - BonoboObjectClass parent_class; - POA_GNOME_Magnifier_ZoomRegion__epv epv; + BonoboObjectClass parent_class; + POA_GNOME_Magnifier_ZoomRegion__epv epv; + DBusGConnection *connection; } 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 float mag_factor_x, + const float mag_factor_y); +gboolean 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); +gboolean 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); +gboolean impl_dbus_zoom_region_set_contrast (ZoomRegion *zoom_region); +gboolean impl_dbus_zoom_region_get_contrast (ZoomRegion *zoom_region); +gboolean impl_dbus_zoom_region_set_brightness (ZoomRegion *zoom_region); +gboolean impl_dbus_zoom_region_get_brightness (ZoomRegion *zoom_region); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/test/control-client.c b/test/control-client.c index 0e63419..ff6741e 100644 --- a/test/control-client.c +++ b/test/control-client.c @@ -358,8 +358,8 @@ int main(int argc, char ** argv){ rect_any->_type = TC_GNOME_Magnifier_RectBounds; rect_any->_value = ORBit_copy_value (rectangle, TC_GNOME_Magnifier_RectBounds); properties = GNOME_Magnifier_Magnifier_getProperties (magnifier, &ev); - Bonobo_PropertyBag_setValue (properties, "target-display-bounds", rect_any, NULL); - bonobo_object_release_unref (properties, NULL); + Bonobo_PropertyBag_setValue (properties, "target-display-bounds", rect_any, &ev); + bonobo_object_release_unref (properties, &ev); break; case 'X': if (zoom_region == CORBA_OBJECT_NIL) return -1; |