added "extern C" stuff to avoid C++ name mungling
[simple-launcher] / applet-wrapper.cc
1 // This file is a part of Simple Launcher
2 //
3 // Copyright (C) 2006, 2007, Mikhail Sobolev
4 //
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.
8 //
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
12 // more details.
13 //
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
17
18 #include <cairo/cairo.h>
19
20 #include <libhildondesktop/libhildondesktop.h>
21 #include "applet-wrapper.h"
22
23 #include "simple-launcher.h"
24
25 struct _SLAWrapperPrivate {
26   SimpleLauncherApplet *applet;
27   GdkPixmap *background_pixmap;
28 };
29
30 extern "C" {
31   static void sla_wrapper_init(SLAWrapper *self);
32   static void sla_wrapper_class_init(SLAWrapperClass *klass);
33   static void sla_wrapper_finalize(GObject *object);
34   static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event);
35   static void sla_wrapper_size_allocate(GtkWidget *widget, GtkAllocation *alloc);
36   static void sla_wrapper_size_request(GtkWidget *widget, GtkRequisition *requisition);
37   static void sla_wrapper_make_background(GtkWidget *widget, SLAWrapperPrivate *priv);
38   static GtkWidget *sla_wrapper_settings(HildonDesktopHomeItem *applet, GtkWidget *parent);
39
40 HD_DEFINE_PLUGIN(SLAWrapper, sla_wrapper, HILDON_DESKTOP_TYPE_HOME_ITEM)
41 };
42
43 static void sla_wrapper_init(SLAWrapper *self) {
44   GdkColormap *colormap = NULL;
45
46   self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, SLA_TYPE_APPLET, SLAWrapperPrivate);
47   self->priv->background_pixmap = NULL;
48
49   self->priv->applet = new SimpleLauncherApplet(SL_APPLET_GCONF_PATH);
50   self->priv->applet->doInit();   // FIXME: check the result
51
52   gtk_container_add(GTK_CONTAINER(self), self->priv->applet->getWidget());
53
54   if ((colormap = gdk_screen_get_rgba_colormap(gdk_screen_get_default())) != NULL) {
55     gtk_widget_set_colormap(GTK_WIDGET(self), colormap);
56   }
57 }
58
59 static void sla_wrapper_class_init(SLAWrapperClass *klass) {
60   GtkWidgetClass *widget_class;
61   GObjectClass *object_class;
62
63   widget_class = GTK_WIDGET_CLASS(klass);
64   object_class = G_OBJECT_CLASS(klass);
65
66   object_class->finalize = sla_wrapper_finalize;
67
68   widget_class->expose_event = sla_wrapper_expose;
69   widget_class->size_allocate = sla_wrapper_size_allocate;
70   widget_class->size_request = sla_wrapper_size_request;
71
72   HILDON_DESKTOP_HOME_ITEM_CLASS(klass)->settings = sla_wrapper_settings;
73
74   g_type_class_add_private(klass, sizeof(SLAWrapperPrivate));   // Do I need this?
75 }
76
77 static void sla_wrapper_finalize(GObject *self) {
78   SLAWrapperPrivate *priv = SLA_APPLET(self)->priv;
79
80   if (priv->background_pixmap != NULL) {
81     g_object_unref(priv->background_pixmap);
82     priv->background_pixmap = NULL;
83   }
84
85   if (priv->applet != NULL) {
86     delete priv->applet;
87   }
88 }
89
90 static GtkWidget *sla_wrapper_settings(HildonDesktopHomeItem *self, GtkWidget *parent) {
91   if (GTK_IS_WINDOW(parent)) {
92     SLAWrapperPrivate *priv = SLA_APPLET(self)->priv;
93
94     return priv->applet->settings(GTK_WINDOW(parent));
95   } else {
96     return NULL;
97   }
98 }
99
100 static void sla_wrapper_make_background(GtkWidget *widget, SLAWrapperPrivate *priv) {
101   if (priv->background_pixmap != NULL) {
102     g_object_unref(priv->background_pixmap);
103     priv->background_pixmap = NULL;
104   }
105
106   priv->background_pixmap = gdk_pixmap_new(widget->window, priv->applet->getWidth(), priv->applet->getHeight(), 32);
107
108   cairo_t *cr = gdk_cairo_create(priv->background_pixmap);
109   double red, green, blue, alpha;
110
111   priv->applet->getBackgroundColour(red, green, blue, alpha);
112
113   cairo_set_source_rgba(cr, red, green, blue, alpha);
114   cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
115   cairo_paint(cr);
116   cairo_destroy(cr);
117 }
118
119 static gboolean sla_wrapper_expose(GtkWidget *widget, GdkEventExpose *event) {
120   if (GTK_WIDGET_DRAWABLE(widget)) {
121     SLAWrapperPrivate *priv = SLA_APPLET(widget)->priv;
122
123     if (priv->background_pixmap == NULL) {
124       sla_wrapper_make_background(widget, priv);
125     }
126
127     cairo_t *cr = gdk_cairo_create(widget->window);
128     gdk_cairo_set_source_pixmap(cr, priv->background_pixmap, 0, 0);
129
130     cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
131     cairo_paint(cr);
132     cairo_destroy(cr);
133
134     return GTK_WIDGET_CLASS(sla_wrapper_parent_class)->expose_event(widget, event);
135   } else {
136     return FALSE;
137   }
138 }
139
140 static void sla_wrapper_size_allocate(GtkWidget *widget, GtkAllocation *alloc) {
141   GTK_WIDGET_CLASS(sla_wrapper_parent_class)->size_allocate(widget, alloc);
142 }
143
144 static void sla_wrapper_size_request(GtkWidget *widget, GtkRequisition *requisition) {
145   if (GTK_WIDGET_DRAWABLE(widget)) {
146     SLAWrapperPrivate *priv = SLA_APPLET(widget)->priv;
147
148     requisition->width = priv->applet->getWidth();
149     requisition->height = priv->applet->getHeight();
150   }
151 }
152
153 // vim:ts=2:sw=2:et