[cairo-compmgr] magnifier plugin

[ Thread Index | Date Index | More lists.tuxfamily.org/cairo-compmgr Archives ]


Hi,

Attached is a example implementation of a magnifier plugin. It still
lacks much things that a magnifier must have, like the ability to an
external application, like Orca, start and finalize it (so a support
to load and unload plugins on the fly is needed), but I think that how
it's fit in the actual code base is fine.

I also want to support the gnome-mag API[1] in this plugin, so screen
readers can use it to magnify portions of the screen, so I will start
to explore how to use D-BUS in ccm.

Any comments on this will be very appreciated.

Best regards,
Carlos.

[1] http://svn.gnome.org/viewvc/gnome-mag/trunk/idl/GNOME_Magnifier.idl?annotate=664
diff --git a/configure.ac b/configure.ac
index 750513b..342dca9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -113,6 +113,7 @@ plugins/opacity/Makefile
 plugins/fade/Makefile
 plugins/freeze/Makefile
 plugins/menu-animation/Makefile
+plugins/magnifier/Makefile
 data/Makefile
 data/cairo-compmgr.desktop.in
 ])
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 75fedc5..e792782 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -4,7 +4,8 @@ SUBDIRS = \
 	opacity\
     fade \
     freeze \
-    menu-animation
+    menu-animation \
+	magnifier
 
 ## File created by the gnome-build tools
 
diff --git a/plugins/shadow/ccm-shadow.c b/plugins/shadow/ccm-shadow.c
index e9d294e..659867d 100644
--- a/plugins/shadow/ccm-shadow.c
+++ b/plugins/shadow/ccm-shadow.c
@@ -261,13 +261,19 @@ ccm_shadow_paint(CCMWindowPlugin* plugin, CCMWindow* window,
 			gint nb_rects, cpt;
 			cairo_matrix_t matrix;
 			int border, offset;
+			CCMScreen *screen = ccm_drawable_get_screen (CCM_DRAWABLE (window));
+			gfloat *x_scale, *y_scale;
+
+			x_scale = g_object_get_data (G_OBJECT (screen), "x_scale");
+			y_scale = g_object_get_data (G_OBJECT (screen), "y_scale");
 	
 			border = ccm_config_get_integer(self->priv->options[CCM_SHADOW_BORDER]);
 			offset = ccm_config_get_integer(self->priv->options[CCM_SHADOW_OFFSET]);
 			
 			cairo_save(context);
 			cairo_get_matrix (context, &matrix);
-			cairo_translate (context, area.x / matrix.xx, area.y / matrix.yy);
+			cairo_translate (context, area.x / matrix.xx * (*x_scale),
+							 area.y / matrix.yy * (*y_scale));
 			cairo_set_source_surface(context, self->priv->shadow_right, 
 									 area.width - border * 2, offset);
 			cairo_paint_with_alpha(context,
@@ -281,7 +287,8 @@ ccm_shadow_paint(CCMWindowPlugin* plugin, CCMWindow* window,
 			ccm_region_get_rectangles (self->priv->geometry, &rects, &nb_rects);
 			for (cpt = 0; cpt < nb_rects; cpt++)
 			{
-				cairo_rectangle(context, rects[cpt].x / matrix.xx, rects[cpt].y / matrix.yy, 
+				cairo_rectangle(context, rects[cpt].x / matrix.xx * (*x_scale),
+								rects[cpt].y / matrix.yy * (*y_scale), 
 								rects[cpt].width, rects[cpt].height);
 			}
 			g_free(rects);
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
index d2d4e4c..b630d54 100644
--- a/po/Makefile.in.in
+++ b/po/Makefile.in.in
@@ -25,7 +25,7 @@ SHELL = /bin/sh
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
-top_builddir = ..
+top_builddir = @top_builddir@
 VPATH = @srcdir@
 
 prefix = @prefix@
@@ -56,15 +56,19 @@ ALL_LINGUAS = @ALL_LINGUAS@
 
 PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; fi)
 
-POFILES=$(shell if test -n "$(PO_LINGUAS)"; then LINGUAS="$(PO_LINGUAS)"; else LINGUAS="$(ALL_LINGUAS)"; fi; for lang in $$LINGUAS; do printf "$$lang.po "; done)
+USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep ^$$lang$$ $(srcdir)/LINGUAS`" -o -n "`echo $$ALINGUAS|grep ' ?$$lang ?'`"; then printf "$$lang "; fi; done; fi)
+
+USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
+
+POFILES=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
 
 DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(POFILES)
 EXTRA_DISTFILES = POTFILES.skip Makevars LINGUAS
 
 POTFILES = \
-#This Gets Replace for some reason
+# This comment gets stripped out
 
-CATALOGS=$(shell if test -n "$(PO_LINGUAS)"; then LINGUAS="$(PO_LINGUAS)"; else LINGUAS="$(ALL_LINGUAS)"; fi; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
+CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
 
 .SUFFIXES:
 .SUFFIXES: .po .pox .gmo .mo .msg .cat
@@ -98,11 +102,7 @@ install-data: install-data-@USE_NLS@
 install-data-no: all
 install-data-yes: all
 	$(mkdir_p) $(DESTDIR)$(itlocaledir)
-	if test -n "$(PO_LINGUAS)"; then \
-	  linguas="$(PO_LINGUAS)"; \
-	else \
-	  linguas="$(ALL_LINGUAS)"; \
-	fi; \
+	linguas="$(USE_LINGUAS)"; \
 	for lang in $$linguas; do \
 	  dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
 	  $(mkdir_p) $$dir; \
@@ -133,20 +133,21 @@ install-data-yes: all
 dvi info tags TAGS ID:
 
 # Define this as empty until I found a useful application.
-installcheck:
+install-exec installcheck:
 
 uninstall:
-	if test -n "$(PO_LINGUAS)"; then \
-	  linguas="$(PO_LINGUAS)"; \
-	else \
-	  linguas="$(ALL_LINGUAS)"; \
-	fi; \
+	linguas="$(USE_LINGUAS)"; \
 	for lang in $$linguas; do \
 	  rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
 	  rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
 	done
 
 check: all $(GETTEXT_PACKAGE).pot
+	rm -f missing notexist
+	srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
+	if [ -r missing -o -r notexist ]; then \
+	  exit 1; \
+	fi
 
 mostlyclean:
 	rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
@@ -179,11 +180,7 @@ dist distdir: $(DISTFILES)
 update-po: Makefile
 	$(MAKE) $(GETTEXT_PACKAGE).pot
 	tmpdir=`pwd`; \
-	if test -n "$(PO_LINGUAS)"; then \
-	  linguas="$(PO_LINGUAS)"; \
-	else \
-	  linguas="$(ALL_LINGUAS)"; \
-	fi; \
+	linguas="$(USE_LINGUAS)"; \
 	for lang in $$linguas; do \
 	  echo "$$lang:"; \
 	  result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
@@ -211,8 +208,8 @@ Makefile POTFILES: stamp-it
 	  $(MAKE) stamp-it; \
 	fi
 
-stamp-it: Makefile.in.in ../config.status POTFILES.in
-	cd .. \
+stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
+	cd $(top_builddir) \
 	  && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
 	       $(SHELL) ./config.status
 
diff --git a/src/ccm-screen-plugin.h b/src/ccm-screen-plugin.h
diff --git a/src/ccm-screen.c b/src/ccm-screen.c
index d3e33b1..47a304c 100644
--- a/src/ccm-screen.c
+++ b/src/ccm-screen.c
@@ -105,6 +105,9 @@ static void on_window_damaged(CCMScreen* self, CCMRegion* area,
 static void
 ccm_screen_init (CCMScreen *self)
 {
+	gint *magrun;
+	gfloat *x_scale, *y_scale;
+
 	self->priv = CCM_SCREEN_GET_PRIVATE(self);
 	
 	self->priv->display = NULL;
@@ -118,6 +121,22 @@ ccm_screen_init (CCMScreen *self)
 	self->priv->id_paint = 0;
 	self->priv->plugin_loader = NULL;
 	self->priv->animations = NULL;
+
+	x_scale = g_object_get_data (G_OBJECT (self), "x_scale");
+	y_scale = g_object_get_data (G_OBJECT (self), "y_scale");
+	magrun = g_object_get_data (G_OBJECT (self), "mag_run");
+
+	if (!magrun) magrun = g_new (gint, 1);
+
+	if (!x_scale) x_scale = g_malloc (sizeof (gfloat));
+	if (!y_scale) y_scale = g_malloc (sizeof (gfloat));
+
+	*magrun = 0;
+	*x_scale = *y_scale = 1.0f;
+
+	g_object_set_data (G_OBJECT (self), "x_scale", x_scale);
+	g_object_set_data (G_OBJECT (self), "y_scale", y_scale);
+	g_object_set_data (G_OBJECT (self), "mag_run", magrun);
 }
 
 static void
@@ -433,8 +452,14 @@ impl_ccm_screen_paint(CCMScreenPlugin* plugin, CCMScreen* self, cairo_t* ctx)
 		
 		if (!window->is_input_only)
 		{
-			if (ccm_window_paint(window, self->priv->ctx))
-				ret = TRUE;
+			gboolean *mag_run = g_object_get_data (G_OBJECT (self), "mag_run");
+			if (*mag_run) {
+				if (ccm_window_paint(window, self->priv->ctx, FALSE))
+					ret = TRUE;
+			} else {
+				if (ccm_window_paint(window, self->priv->ctx, TRUE))
+					ret = TRUE;
+			}
 		}
 	}
 	
@@ -1173,3 +1198,19 @@ ccm_screen_damage_region(CCMScreen* self, CCMRegion* area)
 		}
 	}
 }
+
+GList*
+ccm_screen_get_windows (CCMScreen *self)
+{
+	g_return_val_if_fail (self != NULL, NULL);
+
+	return self->priv->windows;
+}
+
+CCMRegion*
+ccm_screen_get_damaged (CCMScreen *self)
+{
+	g_return_val_if_fail (self != NULL, NULL);
+
+	return self->priv->damaged;
+}
diff --git a/src/ccm-window.c b/src/ccm-window.c
index 675deb0..5552349 100644
--- a/src/ccm-window.c
+++ b/src/ccm-window.c
@@ -608,10 +608,16 @@ impl_ccm_window_paint(CCMWindowPlugin* plugin, CCMWindow* self,
 	
 	cairo_rectangle_t geometry;
 	cairo_matrix_t matrix;
+	CCMScreen *screen = ccm_drawable_get_screen (CCM_DRAWABLE (self));
+	gfloat *x_scale, *y_scale;
+
+	x_scale = g_object_get_data (G_OBJECT (screen), "x_scale");
+	y_scale = g_object_get_data (G_OBJECT (screen), "y_scale");
 	
 	ccm_drawable_get_geometry_clipbox (CCM_DRAWABLE(self), &geometry);
 	cairo_get_matrix (context, &matrix);
-	cairo_translate (context, geometry.x / matrix.xx, geometry.y / matrix.yy);
+	cairo_translate (context, geometry.x / matrix.xx * (*x_scale),
+					 geometry.y / matrix.yy * (*y_scale));
 	cairo_set_source_surface(context, surface, 0.0f, 0.0f);
 	cairo_paint_with_alpha(context, self->priv->opacity);
 		
@@ -1077,7 +1083,7 @@ ccm_window_set_opacity (CCMWindow* self, gfloat opacity)
 }
 
 gboolean
-ccm_window_paint (CCMWindow* self, cairo_t* context)
+ccm_window_paint (CCMWindow* self, cairo_t* context, gboolean repair)
 {
 	g_return_val_if_fail(self != NULL, FALSE);
 	g_return_val_if_fail(context != NULL, FALSE);
@@ -1090,7 +1096,7 @@ ccm_window_paint (CCMWindow* self, cairo_t* context)
 		return ret;
 	
 	cairo_save(context);
-	cairo_reset_clip (context);
+	/* cairo_reset_clip (context); */
 			
 	damaged = ccm_drawable_get_damage_path(CCM_DRAWABLE(self), context);
 	cairo_clip(context);
@@ -1119,7 +1125,8 @@ ccm_window_paint (CCMWindow* self, cairo_t* context)
 	}
 	cairo_restore(context);
 	
-	if (ret) ccm_drawable_repair(CCM_DRAWABLE(self));
+	if (ret)
+		if (repair) ccm_drawable_repair(CCM_DRAWABLE(self));
 	
 	return ret;
 }
diff --git a/src/ccm.h b/src/ccm.h
index 172e958..e8ae5eb 100644
--- a/src/ccm.h
+++ b/src/ccm.h
@@ -172,6 +172,7 @@ void            ccm_screen_damage_region        (CCMScreen* self,
 void            ccm_screen_restack              (CCMScreen* self, 
                                                  CCMWindow* above, 
                                                  CCMWindow* below);
+GList*           ccm_screen_get_windows         (CCMScreen *self);
 /******************************************************************************/
 
 /****************************** Drawable **************************************/
@@ -219,7 +220,7 @@ CCMPixmap*		ccm_window_get_pixmap				(CCMWindow* self);
 cairo_format_t	ccm_window_get_format 				(CCMWindow* self);
 guint			ccm_window_get_depth 				(CCMWindow* self);
 gboolean		ccm_window_paint 					(CCMWindow* self, 
-                                                     cairo_t* ctx);
+										 cairo_t* ctx, gboolean repair);
 void			ccm_window_map						(CCMWindow* self);
 void			ccm_window_unmap					(CCMWindow* self);
 void 			ccm_window_query_opacity			(CCMWindow* self);

Attachment: magnifier.tar.bz2
Description: BZip2 compressed data



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/