Mercurial > geeqie
annotate src/dnd.c @ 1367:fe4da037be21
When g_new0() is used, drop redundant initializations to NULL, FALSE or 0, second pass.
| author | zas_ |
|---|---|
| date | Sun, 01 Mar 2009 23:14:19 +0000 |
| parents | 8b89e3ff286b |
| children | 79b32088ecc4 |
| rev | line source |
|---|---|
| 1 | 1 /* |
| 196 | 2 * Geeqie |
| 9 | 3 * (C) 2004 John Ellis |
| 1284 | 4 * Copyright (C) 2008 - 2009 The Geeqie Team |
| 1 | 5 * |
| 6 * Author: John Ellis | |
| 7 * | |
| 9 | 8 * This software is released under the GNU General Public License (GNU GPL). |
| 9 * Please read the included file COPYING for more information. | |
| 10 * This software comes with no warranty of any kind, use at your own risk! | |
| 1 | 11 */ |
| 12 | |
| 9 | 13 |
| 281 | 14 #include "main.h" |
| 9 | 15 #include "dnd.h" |
| 1 | 16 |
| 9 | 17 #include "collect.h" |
| 18 #include "image.h" | |
| 19 #include "ui_fileops.h" | |
| 1 | 20 |
| 9 | 21 |
| 22 GtkTargetEntry dnd_file_drag_types[] = { | |
| 1 | 23 { "text/uri-list", 0, TARGET_URI_LIST }, |
| 24 { "text/plain", 0, TARGET_TEXT_PLAIN } | |
| 25 }; | |
| 9 | 26 gint dnd_file_drag_types_count = 2; |
| 1 | 27 |
| 9 | 28 GtkTargetEntry dnd_file_drop_types[] = { |
| 316 | 29 { TARGET_APP_COLLECTION_MEMBER_STRING, 0, TARGET_APP_COLLECTION_MEMBER }, |
|
1202
8bf3fff49ddd
Allow to drag keywords on files in list or icon view. Dragged text is appended to keywords list of the destination file.
zas_
parents:
1055
diff
changeset
|
30 { "text/uri-list", 0, TARGET_URI_LIST }, |
|
8bf3fff49ddd
Allow to drag keywords on files in list or icon view. Dragged text is appended to keywords list of the destination file.
zas_
parents:
1055
diff
changeset
|
31 { "text/plain", 0, TARGET_TEXT_PLAIN }, |
| 1 | 32 }; |
|
1202
8bf3fff49ddd
Allow to drag keywords on files in list or icon view. Dragged text is appended to keywords list of the destination file.
zas_
parents:
1055
diff
changeset
|
33 gint dnd_file_drop_types_count = 3; |
| 9 | 34 |
| 1 | 35 |
|
458
7a69309b91c8
Allow the user to set the drag'n drop icon size through
zas_
parents:
316
diff
changeset
|
36 #define DND_ICON_SIZE (options->dnd_icon_size) |
| 9 | 37 |
| 1 | 38 |
| 9 | 39 static void pixbuf_draw_border(GdkPixbuf *pixbuf, gint w, gint h) |
| 40 { | |
| 41 gint alpha; | |
| 42 gint rs; | |
| 43 guchar *pix; | |
| 44 guchar *p; | |
| 45 gint i; | |
| 1 | 46 |
| 9 | 47 alpha = gdk_pixbuf_get_has_alpha(pixbuf); |
| 48 rs = gdk_pixbuf_get_rowstride(pixbuf); | |
| 49 pix = gdk_pixbuf_get_pixels(pixbuf); | |
| 1 | 50 |
| 9 | 51 p = pix; |
| 52 for (i = 0; i < w; i++) | |
| 53 { | |
| 54 *p = 0; p++; *p = 0; p++; *p = 0; p++; | |
| 55 if (alpha) { *p= 255; p++; } | |
| 56 } | |
| 57 for (i = 1; i < h - 1; i++) | |
| 58 { | |
| 59 p = pix + rs * i; | |
| 60 *p = 0; p++; *p = 0; p++; *p = 0; p++; | |
| 61 if (alpha) *p= 255; | |
| 1 | 62 |
| 9 | 63 p = pix + rs * i + (w - 1) * ((alpha == TRUE) ? 4 : 3); |
| 64 *p = 0; p++; *p = 0; p++; *p = 0; p++; | |
| 65 if (alpha) *p= 255; | |
| 66 } | |
| 67 p = pix + rs * (h - 1); | |
| 68 for (i = 0; i < w; i++) | |
| 1 | 69 { |
| 9 | 70 *p = 0; p++; *p = 0; p++; *p = 0; p++; |
| 71 if (alpha) { *p= 255; p++; } | |
| 1 | 72 } |
| 73 } | |
| 74 | |
| 9 | 75 static void pixbuf_draw_rect(GdkPixbuf *pixbuf, gint x, gint y, gint w, gint h, guint8 val) |
| 1 | 76 { |
| 9 | 77 gint alpha; |
| 78 gint rs; | |
| 79 guchar *pix; | |
| 80 guchar *p; | |
| 81 gint i, j; | |
| 1 | 82 |
| 9 | 83 alpha = gdk_pixbuf_get_has_alpha(pixbuf); |
| 84 rs = gdk_pixbuf_get_rowstride(pixbuf); | |
| 85 pix = gdk_pixbuf_get_pixels(pixbuf); | |
| 1 | 86 |
| 9 | 87 for (j = 0; j < h; j++) |
| 88 { | |
| 89 p = pix + (rs * (y + j)) + (x * ((alpha) ? 4 : 3)); | |
| 90 for (i = 0; i < w; i++) | |
| 91 { | |
| 92 *p = (*p * (256-val)) >> 8; p++; | |
| 93 *p = (*p * (256-val)) >> 8; p++; | |
| 94 *p = (*p * (256-val)) >> 8; p++; | |
| 95 if (alpha) { *p = 255; p++; } | |
| 1 | 96 } |
| 97 } | |
| 98 } | |
| 99 | |
| 9 | 100 void dnd_set_drag_icon(GtkWidget *widget, GdkDragContext *context, GdkPixbuf *pixbuf, gint items) |
| 1 | 101 { |
| 977 | 102 GdkPixmap *pixmap; |
| 103 GdkBitmap *mask; | |
| 104 GdkPixbuf *dest; | |
| 105 gint w, h; | |
| 106 gint sw, sh; | |
| 107 PangoLayout *layout = NULL; | |
| 108 gint x, y; | |
| 1 | 109 |
| 977 | 110 x = y = 0; |
| 1 | 111 |
| 977 | 112 sw = gdk_pixbuf_get_width(pixbuf); |
| 113 sh = gdk_pixbuf_get_height(pixbuf); | |
| 1 | 114 |
| 977 | 115 if (sw <= DND_ICON_SIZE && sh <= DND_ICON_SIZE) |
| 116 { | |
| 117 w = sw; | |
| 118 h = sh; | |
| 119 } | |
| 120 else if (sw < sh) | |
| 121 { | |
| 122 w = sw * DND_ICON_SIZE / sh; | |
| 123 h = DND_ICON_SIZE; | |
| 124 } | |
| 125 else | |
| 126 { | |
| 127 w = DND_ICON_SIZE; | |
| 128 h = sh * DND_ICON_SIZE / sw; | |
| 129 } | |
| 1 | 130 |
| 977 | 131 dest = gdk_pixbuf_scale_simple(pixbuf, w, h, GDK_INTERP_BILINEAR); |
| 132 pixbuf_draw_border(dest, w, h); | |
| 1 | 133 |
| 977 | 134 if (items > 1) |
| 135 { | |
| 136 gchar *buf; | |
| 137 gint lw,lh; | |
| 1 | 138 |
| 977 | 139 layout = gtk_widget_create_pango_layout(widget, NULL); |
| 140 buf = g_strdup_printf("<small> %d </small>", items); | |
| 141 pango_layout_set_markup(layout, buf, -1); | |
| 142 g_free(buf); | |
| 1 | 143 |
| 977 | 144 pango_layout_get_pixel_size(layout, &lw, &lh); |
| 1 | 145 |
| 977 | 146 x = MAX(0, w - lw); |
| 147 y = MAX(0, h - lh); | |
| 148 lw = CLAMP(lw, 0, w - x - 1); | |
| 149 lh = CLAMP(lh, 0, h - y - 1); | |
| 1 | 150 |
| 977 | 151 pixbuf_draw_rect(dest, x, y, lw, lh, 128); |
| 152 } | |
| 1 | 153 |
| 977 | 154 gdk_pixbuf_render_pixmap_and_mask(dest, &pixmap, &mask, 128); |
| 155 g_object_unref(dest); | |
| 1 | 156 |
| 977 | 157 if (layout) |
| 158 { | |
| 159 gdk_draw_layout(pixmap, widget->style->black_gc, x+1, y+1, layout); | |
| 160 gdk_draw_layout(pixmap, widget->style->white_gc, x, y, layout); | |
| 1 | 161 |
| 977 | 162 g_object_unref(G_OBJECT(layout)); |
| 163 } | |
| 1 | 164 |
| 977 | 165 gtk_drag_set_icon_pixmap(context, gtk_widget_get_colormap(widget), pixmap, mask, -8, -6); |
| 1 | 166 |
| 977 | 167 g_object_unref(pixmap); |
| 168 if (mask) g_object_unref(mask); | |
| 1 | 169 } |
|
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
977
diff
changeset
|
170 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |
