some code to actuall deal with transparency (this commit does not even build)
[simple-launcher] / applet-wrapper.cc
index 059e753..9ea7f11 100644 (file)
@@ -24,6 +24,7 @@
 
 struct _SLAWrapperPrivate {
   void *applet;
+  GdkPixmap *background_pixmap;
 };
 
   static void sla_wrapper_init(SLAWrapper *self);
@@ -38,6 +39,9 @@ HD_DEFINE_PLUGIN(SLAWrapper, sla_wrapper, HILDON_DESKTOP_TYPE_HOME_ITEM)
 static void sla_wrapper_init(SLAWrapper *self) {
   GdkColormap *colormap = NULL;
 
+  self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, SLA_TYPE_WRAPPER);
+  self->priv->background_pixmap = NULL;
+
   if ((colormap = gdk_screen_get_rgba_colormap(gdk_screen_get_default())) != NULL) {
     gtk_widget_set_colormap(GTK_WIDGET(self), colormap);
   }
@@ -59,16 +63,42 @@ static void sla_wrapper_class_init(SLAWrapperClass *klass) {
   g_type_class_add_private(klass, sizeof(SLAWrapperPrivate));   // Do I need this?
 }
 
-static void sla_wrapper_finalize(GObject *object) {
-#if 0
-  _SLAWrapperPrivate *priv = SLA_WRAPPER(object)->priv;
+static void sla_wrapper_finalize(GObject *self) {
+  SLAWrapperPrivate *priv = SLA_WRAPPER(self)->priv;
 
+  if (priv->background_pixmap != NULL) {
+    g_object_unref(priv->background_pixmap);
+    priv->background_pixmap = NULL;
+  }
+#if 0
   free(priv->applet);
 #endif
 }
 
 static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event) {
   if (GTK_WIDGET_DRAWABLE(widget)) {
+    cairo_t *cr;
+
+    SLAWrapperPrivate *priv = SLA_WRAPPER(widget)->priv;
+
+    if (priv->background_pixmap == NULL) {
+      priv->background_pixmap = gdk_pixmap_new(widget->window, SOME_WIDTH, SOME_HEIGHT, 32);
+
+      cr = gdk_cairo_create(priv->background_pixmap);
+
+      cairo_set_source_rgba(cr, OUR_R, OUR_G, OUR_B, OUR_A);
+      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+      cairo_paint(cr);
+      cairo_destroy(cr);
+    }
+
+    cr = gdk_cairo_create(widget->window);
+    gdk_cairo_set_source_pixmap(cr, priv->background_pixmap, 0, 0);
+
+    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+    cairo_paint(cr);
+    cairo_destroy(cr);
+
     return GTK_WIDGET_CLASS(sla_wrapper_parent_class)->expose_event(widget, event);
   } else {
     return FALSE;