1 // This file is a part of Simple Launcher
3 // Copyright (C) 2006, 2007, 2008 Mikhail Sobolev <mss@mawhrin.net>
5 // Simple Launcher is free software; you can redistribute it and/or modify it
6 // under the terms of the GNU General Public License version 2 as published by
7 // the Free Software Foundation.
9 // This program is distributed in the hope that it will be useful, but WITHOUT
10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 // You should have received a copy of the GNU General Public License along with
15 // this program; if not, write to the Free Software Foundation, Inc., 51
16 // Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #include <cairo/cairo.h>
21 #include <libhildondesktop/libhildondesktop.h>
22 #include "applet-wrapper.h"
24 #include "simple-launcher.h"
26 struct _SLAWrapperPrivate {
27 SimpleLauncherApplet *applet;
28 GdkPixmap *background_pixmap;
32 static void sla_wrapper_init(SLAWrapper *self);
33 static void sla_wrapper_class_init(SLAWrapperClass *klass);
34 static void sla_wrapper_finalize(GObject *object);
35 static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event);
36 static void sla_wrapper_size_allocate(GtkWidget *widget, GtkAllocation *alloc);
37 static void sla_wrapper_size_request(GtkWidget *widget, GtkRequisition *requisition);
38 static void sla_wrapper_make_background(GtkWidget *widget, SLAWrapperPrivate *priv);
39 static GtkWidget *sla_wrapper_settings(HildonDesktopHomeItem *applet, GtkWidget *parent);
41 HD_DEFINE_PLUGIN(SLAWrapper, sla_wrapper, HILDON_DESKTOP_TYPE_HOME_ITEM)
44 static void __logger(const std::string& what) {
45 std::ofstream log("/tmp/sla.log", std::fstream::app);
48 log << what << std::endl;
52 static void sla_wrapper_init(SLAWrapper *self) {
53 __logger("sla_wrapper_init: begin");
55 GdkColormap *colormap = NULL;
57 self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, SLA_TYPE_APPLET, SLAWrapperPrivate);
58 self->priv->background_pixmap = NULL;
60 self->priv->applet = new SimpleLauncherApplet(SL_APPLET_GCONF_PATH);
61 self->priv->applet->doInit(); // FIXME: check the result
63 gtk_container_add(GTK_CONTAINER(self), self->priv->applet->getWidget());
65 if ((colormap = gdk_screen_get_rgba_colormap(gdk_screen_get_default())) != NULL) {
66 gtk_widget_set_colormap(GTK_WIDGET(self), colormap);
69 __logger("sla_wrapper_init: end");
72 static void sla_wrapper_class_init(SLAWrapperClass *klass) {
73 __logger("sla_wrapper_class_init: end");
75 GtkWidgetClass *widget_class;
76 GObjectClass *object_class;
78 widget_class = GTK_WIDGET_CLASS(klass);
79 object_class = G_OBJECT_CLASS(klass);
81 object_class->finalize = sla_wrapper_finalize;
83 widget_class->expose_event = sla_wrapper_expose;
84 widget_class->size_allocate = sla_wrapper_size_allocate;
85 widget_class->size_request = sla_wrapper_size_request;
87 HILDON_DESKTOP_HOME_ITEM_CLASS(klass)->settings = sla_wrapper_settings;
89 g_type_class_add_private(klass, sizeof(SLAWrapperPrivate)); // Do I need this?
91 __logger("sla_wrapper_class_init: end");
94 static void sla_wrapper_finalize(GObject *self) {
95 SLAWrapperPrivate *priv = SLA_APPLET(self)->priv;
97 if (priv->background_pixmap != NULL) {
98 g_object_unref(priv->background_pixmap);
99 priv->background_pixmap = NULL;
102 if (priv->applet != NULL) {
107 static GtkWidget *sla_wrapper_settings(HildonDesktopHomeItem *self, GtkWidget *parent) {
108 if (GTK_IS_WINDOW(parent)) {
109 SLAWrapperPrivate *priv = SLA_APPLET(self)->priv;
111 return priv->applet->settings(GTK_WINDOW(parent));
117 static void sla_wrapper_make_background(GtkWidget *widget, SLAWrapperPrivate *priv) {
118 if (priv->background_pixmap != NULL) {
119 g_object_unref(priv->background_pixmap);
120 priv->background_pixmap = NULL;
123 priv->background_pixmap = gdk_pixmap_new(widget->window, priv->applet->getWidth(), priv->applet->getHeight(), 32);
125 cairo_t *cr = gdk_cairo_create(priv->background_pixmap);
126 double red, green, blue, alpha;
128 priv->applet->getBackgroundColour(red, green, blue, alpha);
130 cairo_set_source_rgba(cr, red, green, blue, alpha);
131 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
136 static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event) {
137 if (GTK_WIDGET_DRAWABLE(widget)) {
138 SLAWrapperPrivate *priv = SLA_APPLET(widget)->priv;
140 if (priv->background_pixmap == NULL) {
141 sla_wrapper_make_background(widget, priv);
144 cairo_t *cr = gdk_cairo_create(widget->window);
145 gdk_cairo_set_source_pixmap(cr, priv->background_pixmap, 0, 0);
147 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
151 return GTK_WIDGET_CLASS(sla_wrapper_parent_class)->expose_event(widget, event);
157 static void sla_wrapper_size_allocate(GtkWidget *widget, GtkAllocation *alloc) {
158 GTK_WIDGET_CLASS(sla_wrapper_parent_class)->size_allocate(widget, alloc);
161 static void sla_wrapper_size_request(GtkWidget *widget, GtkRequisition *requisition) {
162 if (GTK_WIDGET_DRAWABLE(widget)) {
163 SLAWrapperPrivate *priv = SLA_APPLET(widget)->priv;
165 requisition->width = priv->applet->getWidth();
166 requisition->height = priv->applet->getHeight();