2
* xfdesktop - xfce4's desktop manager
4
* Copyright (c) 2006-2007 Brian Tarricone, <bjt23@cornell.edu>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU Library General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29
#include <glib-object.h>
30
#include <gobject/gmarshal.h>
32
#include "xfdesktop-icon.h"
33
#include "xfdesktop-marshal.h"
35
struct _XfdesktopIconPrivate
40
gboolean extents_dirty;
41
GdkRectangle pixbuf_extents;
42
GdkRectangle text_extents;
43
GdkRectangle total_extents;
47
SIG_PIXBUF_CHANGED = 0,
56
static guint __signals[SIG_N_SIGNALS] = { 0, };
59
G_DEFINE_ABSTRACT_TYPE(XfdesktopIcon, xfdesktop_icon, G_TYPE_OBJECT)
63
xfdesktop_icon_class_init(XfdesktopIconClass *klass)
65
g_type_class_add_private(klass, sizeof(XfdesktopIconPrivate));
67
__signals[SIG_PIXBUF_CHANGED] = g_signal_new("pixbuf-changed",
70
G_STRUCT_OFFSET(XfdesktopIconClass,
73
g_cclosure_marshal_VOID__VOID,
76
__signals[SIG_LABEL_CHANGED] = g_signal_new("label-changed",
79
G_STRUCT_OFFSET(XfdesktopIconClass,
82
g_cclosure_marshal_VOID__VOID,
85
__signals[SIG_POS_CHANGED] = g_signal_new("position-changed",
88
G_STRUCT_OFFSET(XfdesktopIconClass,
91
g_cclosure_marshal_VOID__VOID,
94
__signals[SIG_SELECTED] = g_signal_new("selected",
97
G_STRUCT_OFFSET(XfdesktopIconClass,
100
g_cclosure_marshal_VOID__VOID,
103
__signals[SIG_ACTIVATED] = g_signal_new("activated",
105
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
106
G_STRUCT_OFFSET(XfdesktopIconClass,
108
g_signal_accumulator_true_handled,
110
xfdesktop_marshal_BOOLEAN__VOID,
115
xfdesktop_icon_init(XfdesktopIcon *icon)
117
icon->priv = G_TYPE_INSTANCE_GET_PRIVATE(icon, XFDESKTOP_TYPE_ICON,
118
XfdesktopIconPrivate);
119
icon->priv->extents_dirty = TRUE;
124
xfdesktop_icon_set_position(XfdesktopIcon *icon,
128
g_return_if_fail(XFDESKTOP_IS_ICON(icon));
130
icon->priv->row = row;
131
icon->priv->col = col;
133
g_signal_emit(G_OBJECT(icon), __signals[SIG_POS_CHANGED], 0, NULL);
137
xfdesktop_icon_get_position(XfdesktopIcon *icon,
141
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon) && row && col, FALSE);
143
*row = icon->priv->row;
144
*col = icon->priv->col;
150
xfdesktop_icon_set_extents(XfdesktopIcon *icon,
151
const GdkRectangle *pixbuf_extents,
152
const GdkRectangle *text_extents,
153
const GdkRectangle *total_extents)
155
g_return_if_fail(XFDESKTOP_IS_ICON(icon) && pixbuf_extents
156
&& text_extents && total_extents);
158
icon->priv->pixbuf_extents = *pixbuf_extents;
159
icon->priv->text_extents = *text_extents;
160
icon->priv->total_extents = *total_extents;
161
icon->priv->extents_dirty = FALSE;
165
xfdesktop_icon_get_extents(XfdesktopIcon *icon,
166
GdkRectangle *pixbuf_extents,
167
GdkRectangle *text_extents,
168
GdkRectangle *total_extents)
170
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
172
if(icon->priv->extents_dirty)
176
*pixbuf_extents = icon->priv->pixbuf_extents;
178
*text_extents = icon->priv->text_extents;
180
*total_extents = icon->priv->total_extents;
186
xfdesktop_icon_mark_extents_dirty(XfdesktopIcon *icon)
188
g_return_if_fail(XFDESKTOP_IS_ICON(icon));
190
icon->priv->extents_dirty = TRUE;
197
xfdesktop_icon_peek_pixbuf(XfdesktopIcon *icon,
200
XfdesktopIconClass *klass;
202
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
203
klass = XFDESKTOP_ICON_GET_CLASS(icon);
204
g_return_val_if_fail(klass->peek_pixbuf, NULL);
206
return klass->peek_pixbuf(icon, size);
210
G_CONST_RETURN gchar *
211
xfdesktop_icon_peek_label(XfdesktopIcon *icon)
213
XfdesktopIconClass *klass;
215
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
216
klass = XFDESKTOP_ICON_GET_CLASS(icon);
217
g_return_val_if_fail(klass->peek_label, NULL);
219
return klass->peek_label(icon);
222
/*< optional; drags aren't allowed if not provided >*/
224
xfdesktop_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
226
XfdesktopIconClass *klass;
228
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
230
klass = XFDESKTOP_ICON_GET_CLASS(icon);
232
if(!klass->get_allowed_drag_actions)
235
return klass->get_allowed_drag_actions(icon);
238
/*< optional; drops aren't allowed if not provided >*/
240
xfdesktop_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
242
XfdesktopIconClass *klass;
244
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
246
klass = XFDESKTOP_ICON_GET_CLASS(icon);
248
if(!klass->get_allowed_drop_actions)
251
return klass->get_allowed_drop_actions(icon);
254
/*< optional; required if get_allowed_drop_actions() can return nonzero >*/
256
xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
257
XfdesktopIcon *src_icon,
258
GdkDragAction action)
260
XfdesktopIconClass *klass;
262
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
263
klass = XFDESKTOP_ICON_GET_CLASS(icon);
264
g_return_val_if_fail(klass->do_drop_dest, FALSE);
266
return klass->do_drop_dest(icon, src_icon, action);
270
G_CONST_RETURN gchar *
271
xfdesktop_icon_peek_tooltip(XfdesktopIcon *icon)
273
XfdesktopIconClass *klass;
275
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
277
klass = XFDESKTOP_ICON_GET_CLASS(icon);
279
if(!klass->peek_tooltip)
282
return klass->peek_tooltip(icon);
287
xfdesktop_icon_populate_context_menu(XfdesktopIcon *icon,
290
XfdesktopIconClass *klass;
292
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
294
klass = XFDESKTOP_ICON_GET_CLASS(icon);
296
if(!klass->populate_context_menu)
299
return klass->populate_context_menu(icon, menu);
303
xfdesktop_icon_peek_icon_view(XfdesktopIcon *icon)
305
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
306
return g_object_get_data(G_OBJECT(icon), "--xfdesktop-icon-view");
309
/*< signal triggers >*/
312
xfdesktop_icon_pixbuf_changed(XfdesktopIcon *icon)
314
g_return_if_fail(XFDESKTOP_IS_ICON(icon));
315
xfdesktop_icon_mark_extents_dirty(icon);
316
g_signal_emit(icon, __signals[SIG_PIXBUF_CHANGED], 0);
320
xfdesktop_icon_label_changed(XfdesktopIcon *icon)
322
g_return_if_fail(XFDESKTOP_IS_ICON(icon));
323
xfdesktop_icon_mark_extents_dirty(icon);
324
g_signal_emit(icon, __signals[SIG_LABEL_CHANGED], 0);
328
xfdesktop_icon_position_changed(XfdesktopIcon *icon)
330
g_return_if_fail(XFDESKTOP_IS_ICON(icon));
331
xfdesktop_icon_mark_extents_dirty(icon);
332
g_signal_emit(icon, __signals[SIG_POS_CHANGED], 0);
337
xfdesktop_icon_selected(XfdesktopIcon *icon)
339
g_return_if_fail(XFDESKTOP_IS_ICON(icon));
340
xfdesktop_icon_mark_extents_dirty(icon);
341
g_signal_emit(G_OBJECT(icon), __signals[SIG_SELECTED], 0, NULL);
345
xfdesktop_icon_activated(XfdesktopIcon *icon)
347
gboolean ret = FALSE;
349
g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
351
g_signal_emit(G_OBJECT(icon), __signals[SIG_ACTIVATED], 0, &ret);