| [cairo-compmgr] Re: magnifier plugin prove of concept |
[ Thread Index | Date Index | More lists.tuxfamily.org/cairo-compmgr Archives ]
Sorry, I just forget to include the attachments. 2008/1/18, Carlos Diógenes <cerdiogenes@xxxxxxxxx>: > Hi, > > This is a initial implementation of a magnifier plugin, just as a > prove of concept. > > I'm send this because I'm having the following issues: > > [1] This also doens't work very well :-). The magnified screen isn't > draw right. Sometimes a window disappear, if you move a window with > ALT + clicking and moving a window over the top panel, the window will > override the panel and leave thrash in the magnified window. > > [2] Some work in menu-animation and shadow plugins must be done so > they play well with the magnifier plugin. > > I really need some feedback about [1], since I don't know what is > causing this. I disabled all the others plugins to try catch the > problem easily, but I don't find the problem. > > The problems in [2] I don't investigate much, but regarding the > menu-animation the conflicts are in impl_ccm_window_paint, in the > cairo_translate call, since the division make the magnifier paint in > wrong positions and without the division the menu-animation paint in > wrong positions. > > Regarding the shadow plugin I don't investigate anything, so I have no > idea what is wrong in the intereraction. > > Best regards, > Carlos. >
diff --git a/configure.ac b/configure.ac
index 04d3734..768c4db 100644
--- a/configure.ac
+++ b/configure.ac
@@ -111,6 +111,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..c0f8c83 100644
--- a/plugins/shadow/ccm-shadow.c
+++ b/plugins/shadow/ccm-shadow.c
@@ -267,7 +267,7 @@ ccm_shadow_paint(CCMWindowPlugin* plugin, CCMWindow* window,
cairo_save(context);
cairo_get_matrix (context, &matrix);
- cairo_translate (context, area.x / matrix.xx, area.y / matrix.yy);
+ cairo_translate (context, area.x, area.y);
cairo_set_source_surface(context, self->priv->shadow_right,
area.width - border * 2, offset);
cairo_paint_with_alpha(context,
diff --git a/src/ccm-screen-plugin.c b/src/ccm-screen-plugin.c
index 655167d..75f6465 100644
--- a/src/ccm-screen-plugin.c
+++ b/src/ccm-screen-plugin.c
@@ -72,11 +72,11 @@ ccm_screen_plugin_load_options(CCMScreenPlugin* self, CCMScreen* screen)
CCM_SCREEN_PLUGIN_GET_INTERFACE (plugin)->load_options (plugin, screen);
}
-void
+gboolean
ccm_screen_plugin_paint (CCMScreenPlugin* self, CCMScreen* screen)
{
- g_return_if_fail (CCM_IS_SCREEN_PLUGIN (self));
- g_return_if_fail (screen != NULL);
+ g_return_val_if_fail (CCM_IS_SCREEN_PLUGIN (self), FALSE);
+ g_return_val_if_fail (screen != NULL, FALSE);
CCMScreenPlugin* plugin;
for (plugin = self;
@@ -85,7 +85,9 @@ ccm_screen_plugin_paint (CCMScreenPlugin* self, CCMScreen* screen)
plugin = CCM_SCREEN_PLUGIN_PARENT(plugin));
if (CCM_SCREEN_PLUGIN_GET_INTERFACE (plugin)->paint)
- CCM_SCREEN_PLUGIN_GET_INTERFACE (plugin)->paint (plugin, screen);
+ return CCM_SCREEN_PLUGIN_GET_INTERFACE (plugin)->paint (plugin, screen);
+ else
+ return FALSE;
}
gboolean
diff --git a/src/ccm-screen-plugin.h b/src/ccm-screen-plugin.h
index 8c63b64..49ee30d 100644
--- a/src/ccm-screen-plugin.h
+++ b/src/ccm-screen-plugin.h
@@ -44,7 +44,7 @@ struct _CCMScreenPluginClass
GTypeInterface base_iface;
void (*load_options) (CCMScreenPlugin* self, CCMScreen* screen);
- void (*paint) (CCMScreenPlugin* self, CCMScreen* screen);
+ gboolean (*paint) (CCMScreenPlugin* self, CCMScreen* screen);
gboolean (*add_window) (CCMScreenPlugin* self, CCMScreen* screen,
CCMWindow* window);
void (*remove_window) (CCMScreenPlugin* self, CCMScreen* screen,
@@ -55,7 +55,7 @@ GType ccm_screen_plugin_get_type (void) G_GNUC_CONST;
void ccm_screen_plugin_load_options (CCMScreenPlugin* self,
CCMScreen* screen);
-void ccm_screen_plugin_paint (CCMScreenPlugin* self,
+gboolean ccm_screen_plugin_paint (CCMScreenPlugin* self,
CCMScreen* screen);
gboolean ccm_screen_plugin_add_window (CCMScreenPlugin* self,
CCMScreen* screen,
diff --git a/src/ccm-screen.c b/src/ccm-screen.c
index 3d424bc..93f0607 100644
--- a/src/ccm-screen.c
+++ b/src/ccm-screen.c
@@ -92,7 +92,7 @@ struct _CCMScreenPrivate
#define CCM_SCREEN_GET_PRIVATE(o) \
((CCMScreenPrivate*)G_TYPE_INSTANCE_GET_PRIVATE ((o), CCM_TYPE_SCREEN, CCMScreenClass))
-static void impl_ccm_screen_paint(CCMScreenPlugin* plugin, CCMScreen* self);
+static gboolean impl_ccm_screen_paint(CCMScreenPlugin* plugin, CCMScreen* self);
static gboolean impl_ccm_screen_add_window(CCMScreenPlugin* plugin,
CCMScreen* self, CCMWindow* window);
static void impl_ccm_screen_remove_window(CCMScreenPlugin* plugin,
@@ -399,10 +399,10 @@ ccm_screen_restack(CCMScreen* self, CCMWindow* above, CCMWindow* below)
ccm_drawable_damage (CCM_DRAWABLE(above));
}
-static void
+static gboolean
impl_ccm_screen_paint(CCMScreenPlugin* plugin, CCMScreen* self)
{
- g_return_if_fail(self != NULL);
+ g_return_val_if_fail(self != NULL, FALSE);
static gboolean have_desktop = FALSE;
gboolean ret = FALSE;
@@ -458,6 +458,8 @@ impl_ccm_screen_paint(CCMScreenPlugin* plugin, CCMScreen* self)
ccm_drawable_flush(CCM_DRAWABLE(self->priv->cow));
}
}
+
+ return ret;
}
static gboolean
@@ -959,11 +961,19 @@ _ccm_screen_use_buffered(CCMScreen* self)
}
CCMScreenPlugin*
-_ccm_screen_get_plugin(CCMScreen *self)
+_ccm_screen_get_plugin(CCMScreen *self, GType type)
{
g_return_val_if_fail(self != NULL, NULL);
+
+ CCMScreenPlugin* plugin;
- return self->priv->plugin;
+ for (plugin = self->priv->plugin; plugin != (CCMScreenPlugin*)self; plugin = CCM_SCREEN_PLUGIN_PARENT(plugin))
+ {
+ if (g_type_is_a(G_OBJECT_TYPE(plugin), type))
+ return plugin;
+ }
+
+ return NULL;
}
GSList*
diff --git a/src/ccm-screen.h b/src/ccm-screen.h
index a6af249..e8e820b 100644
--- a/src/ccm-screen.h
+++ b/src/ccm-screen.h
@@ -65,7 +65,7 @@ gboolean _ccm_screen_sync_with_blank (CCMScreen* self);
GSList* _ccm_screen_get_window_plugins (CCMScreen* self);
gchar* _ccm_screen_get_window_backend (CCMScreen* self);
gboolean _ccm_screen_native_pixmap_bind (CCMScreen* self);
-CCMScreenPlugin* _ccm_screen_get_plugin (CCMScreen *self);
+CCMScreenPlugin* _ccm_screen_get_plugin (CCMScreen *self, GType type);
void _ccm_screen_add_animation (CCMScreen* self,
CCMAnimation* animation);
void _ccm_screen_remove_animation (CCMScreen* self,
diff --git a/src/ccm-window.c b/src/ccm-window.c
index 675deb0..e8b6e45 100644
--- a/src/ccm-window.c
+++ b/src/ccm-window.c
@@ -608,12 +608,16 @@ impl_ccm_window_paint(CCMWindowPlugin* plugin, CCMWindow* self,
cairo_rectangle_t geometry;
cairo_matrix_t matrix;
+
+ cairo_save (context);
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, geometry.y);
cairo_set_source_surface(context, surface, 0.0f, 0.0f);
cairo_paint_with_alpha(context, self->priv->opacity);
+
+ cairo_restore (context);
return TRUE;
}
Attachment:
magnifier.tar.bz2
Description: BZip2 compressed data
| Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |