#include <cairo/cairo.h>
#include <libhildondesktop/libhildondesktop.h>
-
#include "applet-wrapper.h"
#include "simple-launcher.h"
- static void sla_wrapper_init(SLAWrapper *applet);
+struct _SLAWrapperPrivate {
+ SimpleLauncherApplet *applet;
+ GdkPixmap *background_pixmap;
+};
+
+ static void sla_wrapper_init(SLAWrapper *self);
static void sla_wrapper_class_init(SLAWrapperClass *klass);
static void sla_wrapper_finalize(GObject *object);
static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event);
static void sla_wrapper_size_allocate(GtkWidget *widget, GtkAllocation *alloc);
static void sla_wrapper_size_request(GtkWidget *widget, GtkRequisition *requisition);
-
-struct _SLAWrapperPrivate {
- void *applet;
-};
+ static void sla_wrapper_make_background(GtkWidget *widget, SLAWrapperPrivate *priv);
+ static GtkWidget *sla_wrapper_settings(HildonDesktopHomeItem *applet, GtkWidget *parent);
HD_DEFINE_PLUGIN(SLAWrapper, sla_wrapper, HILDON_DESKTOP_TYPE_HOME_ITEM)
-static void sla_wrapper_init(SLAWrapper *applet) {
+static void sla_wrapper_init(SLAWrapper *self) {
GdkColormap *colormap = NULL;
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, SLA_TYPE_APPLET, SLAWrapperPrivate);
+ self->priv->background_pixmap = NULL;
+
+ self->priv->applet = new SimpleLauncherApplet(SL_APPLET_GCONF_PATH);
+ self->priv->applet->doInit(); // FIXME: check the result
+
if ((colormap = gdk_screen_get_rgba_colormap(gdk_screen_get_default())) != NULL) {
- gtk_widget_set_colormap(GTK_WIDGET(applet), colormap);
+ gtk_widget_set_colormap(GTK_WIDGET(self), colormap);
}
}
widget_class->size_allocate = sla_wrapper_size_allocate;
widget_class->size_request = sla_wrapper_size_request;
+ HILDON_DESKTOP_HOME_ITEM_CLASS(klass)->settings = sla_wrapper_settings;
+
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_APPLET(self)->priv;
+
+ if (priv->background_pixmap != NULL) {
+ g_object_unref(priv->background_pixmap);
+ priv->background_pixmap = NULL;
+ }
+
+ if (priv->applet != NULL) {
+ delete priv->applet;
+ }
+}
+
+static GtkWidget *sla_wrapper_settings(HildonDesktopHomeItem *self, GtkWidget *parent) {
+ if (GTK_IS_WINDOW(parent)) {
+ SLAWrapperPrivate *priv = SLA_APPLET(self)->priv;
- free(priv->applet);
-#endif
+ return priv->applet->settings(GTK_WINDOW(parent));
+ } else {
+ return NULL;
+ }
+}
+
+static void sla_wrapper_make_background(GtkWidget *widget, SLAWrapperPrivate *priv) {
+ if (priv->background_pixmap != NULL) {
+ g_object_unref(priv->background_pixmap);
+ priv->background_pixmap = NULL;
+ }
+
+ priv->background_pixmap = gdk_pixmap_new(widget->window, priv->applet->getWidth(), priv->applet->getHeight(), 32);
+
+ cairo_t *cr = gdk_cairo_create(priv->background_pixmap);
+ double red, green, blue, alpha;
+
+ priv->applet->getBackgroundColour(red, green, blue, alpha);
+
+ cairo_set_source_rgba(cr, red, green, blue, alpha);
+ cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint(cr);
+ cairo_destroy(cr);
}
static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event) {
if (GTK_WIDGET_DRAWABLE(widget)) {
+ SLAWrapperPrivate *priv = SLA_APPLET(widget)->priv;
+
+ if (priv->background_pixmap == NULL) {
+ sla_wrapper_make_background(widget, priv);
+ }
+
+ cairo_t *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;
}
static void sla_wrapper_size_request(GtkWidget *widget, GtkRequisition *requisition) {
-#if 0
- requisition->width = our_desired_width;
- requisition->height = our_desired_height;
-#endif
+ if (GTK_WIDGET_DRAWABLE(widget)) {
+ SLAWrapperPrivate *priv = SLA_APPLET(widget)->priv;
+
+ requisition->width = priv->applet->getWidth();
+ requisition->height = priv->applet->getHeight();
+ }
}
// vim:ts=2:sw=2:et