summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Eduardo Rodrigues DiÃgenes <cerdiogenes@gmail.com>2010-01-23 12:03:50 -0200
committerCarlos Eduardo Rodrigues DiÃgenes <cerdiogenes@gmail.com>2010-01-23 12:03:50 -0200
commit78430636689160bc03f6b13859d0c437f4ccad5a (patch)
treef2720fa306149c09439b62f35278115ddd823665
parente8aa4ff7c7d782d8319482418bbb945f6373e9d9 (diff)
d-bus changes that where not committed last time
-rw-r--r--Makefile.am2
-rw-r--r--configure.in9
-rw-r--r--magnifier/Makefile.am30
-rw-r--r--magnifier/magnifier-main.c16
-rw-r--r--magnifier/magnifier-private.h30
-rw-r--r--magnifier/magnifier.c254
-rw-r--r--magnifier/magnifier.h109
-rw-r--r--magnifier/zoom-region.c233
-rw-r--r--magnifier/zoom-region.h27
-rw-r--r--test/control-client.c4
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;