~noskcaj/ubuntu/trusty/xfdesktop4/4.11.2-1

« back to all changes in this revision

Viewing changes to .pc/0003-Thumbnail-desktop-icon-previews-using-tumblerd.patch/src/xfdesktop-icon.c

  • Committer: Package Import Robot
  • Author(s): Lionel Le Folgoc
  • Date: 2012-05-18 22:18:02 UTC
  • mfrom: (3.1.7 experimental)
  • Revision ID: package-import@ubuntu.com-20120518221802-htmj6h4apaij25l2
Tags: 4.10.0-1ubuntu1
* Merge from Debian experimental, remaining Ubuntu change:
  - debian/patches/xubuntu_improve-nautilus-interactions.patch: added,
    should prevent nautilus from taking over the desktop if xfdesktop is
    running (and vice-versa).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 *  xfdesktop - xfce4's desktop manager
3
 
 *
4
 
 *  Copyright (c) 2006-2007 Brian Tarricone, <bjt23@cornell.edu>
5
 
 *
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.
10
 
 *
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.
15
 
 *
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.
19
 
 */
20
 
 
21
 
#ifdef HAVE_CONFIG_H
22
 
#include <config.h>
23
 
#endif
24
 
 
25
 
#ifdef HAVE_STRING_H
26
 
#include <string.h>
27
 
#endif
28
 
 
29
 
#include <glib-object.h>
30
 
#include <gobject/gmarshal.h>
31
 
 
32
 
#include "xfdesktop-icon.h"
33
 
#include "xfdesktop-marshal.h"
34
 
 
35
 
struct _XfdesktopIconPrivate
36
 
{
37
 
    gint16 row;
38
 
    gint16 col;
39
 
 
40
 
    gboolean extents_dirty;
41
 
    GdkRectangle pixbuf_extents;
42
 
    GdkRectangle text_extents;
43
 
    GdkRectangle total_extents;
44
 
};
45
 
 
46
 
enum {
47
 
    SIG_PIXBUF_CHANGED = 0,
48
 
    SIG_LABEL_CHANGED,
49
 
    SIG_POS_CHANGED,
50
 
    SIG_SELECTED,
51
 
    SIG_ACTIVATED,
52
 
    SIG_N_SIGNALS,
53
 
};
54
 
 
55
 
 
56
 
static guint __signals[SIG_N_SIGNALS] = { 0, };
57
 
 
58
 
 
59
 
G_DEFINE_ABSTRACT_TYPE(XfdesktopIcon, xfdesktop_icon, G_TYPE_OBJECT)
60
 
 
61
 
 
62
 
static void
63
 
xfdesktop_icon_class_init(XfdesktopIconClass *klass)
64
 
{
65
 
    g_type_class_add_private(klass, sizeof(XfdesktopIconPrivate));
66
 
    
67
 
    __signals[SIG_PIXBUF_CHANGED] = g_signal_new("pixbuf-changed",
68
 
                                                 XFDESKTOP_TYPE_ICON,
69
 
                                                 G_SIGNAL_RUN_LAST,
70
 
                                                 G_STRUCT_OFFSET(XfdesktopIconClass,
71
 
                                                                 pixbuf_changed),
72
 
                                                 NULL, NULL,
73
 
                                                 g_cclosure_marshal_VOID__VOID,
74
 
                                                 G_TYPE_NONE, 0);
75
 
    
76
 
    __signals[SIG_LABEL_CHANGED] = g_signal_new("label-changed",
77
 
                                                XFDESKTOP_TYPE_ICON,
78
 
                                                G_SIGNAL_RUN_LAST,
79
 
                                                G_STRUCT_OFFSET(XfdesktopIconClass,
80
 
                                                                label_changed),
81
 
                                                NULL, NULL,
82
 
                                                g_cclosure_marshal_VOID__VOID,
83
 
                                                G_TYPE_NONE, 0);
84
 
    
85
 
    __signals[SIG_POS_CHANGED] = g_signal_new("position-changed",
86
 
                                              XFDESKTOP_TYPE_ICON,
87
 
                                              G_SIGNAL_RUN_LAST,
88
 
                                              G_STRUCT_OFFSET(XfdesktopIconClass,
89
 
                                                              position_changed),
90
 
                                              NULL, NULL,
91
 
                                              g_cclosure_marshal_VOID__VOID,
92
 
                                              G_TYPE_NONE, 0);
93
 
    
94
 
    __signals[SIG_SELECTED] = g_signal_new("selected",
95
 
                                           XFDESKTOP_TYPE_ICON,
96
 
                                           G_SIGNAL_RUN_LAST,
97
 
                                           G_STRUCT_OFFSET(XfdesktopIconClass,
98
 
                                                           selected),
99
 
                                           NULL, NULL,
100
 
                                           g_cclosure_marshal_VOID__VOID,
101
 
                                           G_TYPE_NONE, 0);
102
 
    
103
 
    __signals[SIG_ACTIVATED] = g_signal_new("activated",
104
 
                                            XFDESKTOP_TYPE_ICON,
105
 
                                            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
106
 
                                            G_STRUCT_OFFSET(XfdesktopIconClass,
107
 
                                                            activated),
108
 
                                            g_signal_accumulator_true_handled,
109
 
                                            NULL,
110
 
                                            xfdesktop_marshal_BOOLEAN__VOID,
111
 
                                            G_TYPE_BOOLEAN, 0);
112
 
}
113
 
 
114
 
static void
115
 
xfdesktop_icon_init(XfdesktopIcon *icon)
116
 
{
117
 
    icon->priv = G_TYPE_INSTANCE_GET_PRIVATE(icon, XFDESKTOP_TYPE_ICON,
118
 
                                             XfdesktopIconPrivate);
119
 
    icon->priv->extents_dirty = TRUE;
120
 
}
121
 
 
122
 
 
123
 
void
124
 
xfdesktop_icon_set_position(XfdesktopIcon *icon,
125
 
                            gint16 row,
126
 
                            gint16 col)
127
 
{
128
 
    g_return_if_fail(XFDESKTOP_IS_ICON(icon));
129
 
    
130
 
    icon->priv->row = row;
131
 
    icon->priv->col = col;
132
 
    
133
 
    g_signal_emit(G_OBJECT(icon), __signals[SIG_POS_CHANGED], 0, NULL);
134
 
}
135
 
 
136
 
gboolean
137
 
xfdesktop_icon_get_position(XfdesktopIcon *icon,
138
 
                            guint16 *row,
139
 
                            guint16 *col)
140
 
{
141
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon) && row && col, FALSE);
142
 
    
143
 
    *row = icon->priv->row;
144
 
    *col = icon->priv->col;
145
 
    
146
 
    return TRUE;
147
 
}
148
 
 
149
 
void
150
 
xfdesktop_icon_set_extents(XfdesktopIcon *icon,
151
 
                           const GdkRectangle *pixbuf_extents,
152
 
                           const GdkRectangle *text_extents,
153
 
                           const GdkRectangle *total_extents)
154
 
{
155
 
    g_return_if_fail(XFDESKTOP_IS_ICON(icon) && pixbuf_extents
156
 
                     && text_extents && total_extents);
157
 
 
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;
162
 
}
163
 
 
164
 
gboolean
165
 
xfdesktop_icon_get_extents(XfdesktopIcon *icon,
166
 
                           GdkRectangle *pixbuf_extents,
167
 
                           GdkRectangle *text_extents,
168
 
                           GdkRectangle *total_extents)
169
 
{
170
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
171
 
 
172
 
    if(icon->priv->extents_dirty)
173
 
        return FALSE;
174
 
 
175
 
    if(pixbuf_extents)
176
 
        *pixbuf_extents = icon->priv->pixbuf_extents;
177
 
    if(text_extents)
178
 
        *text_extents = icon->priv->text_extents;
179
 
    if(total_extents)
180
 
        *total_extents = icon->priv->total_extents;
181
 
 
182
 
    return TRUE;
183
 
}
184
 
 
185
 
void
186
 
xfdesktop_icon_mark_extents_dirty(XfdesktopIcon *icon)
187
 
{
188
 
    g_return_if_fail(XFDESKTOP_IS_ICON(icon));
189
 
 
190
 
    icon->priv->extents_dirty = TRUE;
191
 
}
192
 
 
193
 
 
194
 
 
195
 
/*< required >*/
196
 
GdkPixbuf *
197
 
xfdesktop_icon_peek_pixbuf(XfdesktopIcon *icon,
198
 
                           gint size)
199
 
{
200
 
    XfdesktopIconClass *klass;
201
 
    
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);
205
 
    
206
 
    return klass->peek_pixbuf(icon, size);
207
 
}
208
 
 
209
 
/*< required >*/
210
 
G_CONST_RETURN gchar *
211
 
xfdesktop_icon_peek_label(XfdesktopIcon *icon)
212
 
{
213
 
    XfdesktopIconClass *klass;
214
 
    
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);
218
 
    
219
 
    return klass->peek_label(icon);
220
 
}
221
 
 
222
 
/*< optional; drags aren't allowed if not provided >*/
223
 
GdkDragAction
224
 
xfdesktop_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
225
 
{
226
 
    XfdesktopIconClass *klass;
227
 
    
228
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
229
 
    
230
 
    klass = XFDESKTOP_ICON_GET_CLASS(icon);
231
 
    
232
 
    if(!klass->get_allowed_drag_actions)
233
 
        return 0;
234
 
    
235
 
    return klass->get_allowed_drag_actions(icon);
236
 
}
237
 
 
238
 
/*< optional; drops aren't allowed if not provided >*/
239
 
GdkDragAction
240
 
xfdesktop_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
241
 
{
242
 
    XfdesktopIconClass *klass;
243
 
    
244
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
245
 
    
246
 
    klass = XFDESKTOP_ICON_GET_CLASS(icon);
247
 
    
248
 
    if(!klass->get_allowed_drop_actions)
249
 
        return 0;
250
 
    
251
 
    return klass->get_allowed_drop_actions(icon);
252
 
}
253
 
 
254
 
/*< optional; required if get_allowed_drop_actions() can return nonzero >*/
255
 
gboolean
256
 
xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
257
 
                            XfdesktopIcon *src_icon,
258
 
                            GdkDragAction action)
259
 
{
260
 
    XfdesktopIconClass *klass;
261
 
    
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);
265
 
    
266
 
    return klass->do_drop_dest(icon, src_icon, action);
267
 
}
268
 
 
269
 
/*< optional >*/
270
 
G_CONST_RETURN gchar *
271
 
xfdesktop_icon_peek_tooltip(XfdesktopIcon *icon)
272
 
{
273
 
    XfdesktopIconClass *klass;
274
 
    
275
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
276
 
    
277
 
    klass = XFDESKTOP_ICON_GET_CLASS(icon);
278
 
    
279
 
    if(!klass->peek_tooltip)
280
 
        return NULL;
281
 
    
282
 
    return klass->peek_tooltip(icon);
283
 
}
284
 
 
285
 
/*< optional >*/
286
 
gboolean
287
 
xfdesktop_icon_populate_context_menu(XfdesktopIcon *icon,
288
 
                                     GtkWidget *menu)
289
 
{
290
 
    XfdesktopIconClass *klass;
291
 
    
292
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
293
 
    
294
 
    klass = XFDESKTOP_ICON_GET_CLASS(icon);
295
 
    
296
 
    if(!klass->populate_context_menu)
297
 
        return FALSE;
298
 
    
299
 
    return klass->populate_context_menu(icon, menu);
300
 
}
301
 
 
302
 
GtkWidget *
303
 
xfdesktop_icon_peek_icon_view(XfdesktopIcon *icon)
304
 
{
305
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
306
 
    return g_object_get_data(G_OBJECT(icon), "--xfdesktop-icon-view");
307
 
}
308
 
 
309
 
/*< signal triggers >*/
310
 
 
311
 
void
312
 
xfdesktop_icon_pixbuf_changed(XfdesktopIcon *icon)
313
 
{
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);
317
 
}
318
 
 
319
 
void
320
 
xfdesktop_icon_label_changed(XfdesktopIcon *icon)
321
 
{
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);
325
 
}
326
 
 
327
 
void
328
 
xfdesktop_icon_position_changed(XfdesktopIcon *icon)
329
 
{
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);
333
 
}
334
 
 
335
 
 
336
 
void
337
 
xfdesktop_icon_selected(XfdesktopIcon *icon)
338
 
{
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);
342
 
}
343
 
 
344
 
gboolean
345
 
xfdesktop_icon_activated(XfdesktopIcon *icon)
346
 
{
347
 
    gboolean ret = FALSE;
348
 
    
349
 
    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
350
 
    
351
 
    g_signal_emit(G_OBJECT(icon), __signals[SIG_ACTIVATED], 0, &ret);
352
 
    
353
 
    return ret;
354
 
}