comparison gtk/gtkstatusbox.c @ 14561:3ff55ec8203a

[gaim-migrate @ 17284] GtkCellRendererExpander draws an expander in a renderer to avoid a large, needless margin. The approach is a bit hacky, but it's a good job. - RTL fix in GtkStatusBox - Drag-and-drop image into the global buddy icon selector to set a buddy icon committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Fri, 15 Sep 2006 22:05:34 +0000
parents 776975f2c550
children 26e7d03d40c5
comparison
equal deleted inserted replaced
14560:16bba6d02c2a 14561:3ff55ec8203a
236 box->buddy_icon_sel = gaim_gtk_buddy_icon_chooser_new(NULL, icon_choose_cb, box); 236 box->buddy_icon_sel = gaim_gtk_buddy_icon_chooser_new(NULL, icon_choose_cb, box);
237 gtk_widget_show_all(box->buddy_icon_sel); 237 gtk_widget_show_all(box->buddy_icon_sel);
238 return FALSE; 238 return FALSE;
239 } 239 }
240 240
241 static void
242 icon_box_dnd_cb(GtkWidget *widget, GdkDragContext *dc, gint x, gint y,
243 GtkSelectionData *sd, guint info, guint t, GtkGaimStatusBox *box)
244 {
245 gchar *name = (gchar *)sd->data;
246
247 if ((sd->length >= 0) && (sd->format == 8)) {
248 /* Well, it looks like the drag event was cool.
249 * Let's do something with it */
250 if (!g_ascii_strncasecmp(name, "file://", 7)) {
251 GError *converr = NULL;
252 gchar *tmp, *rtmp;
253
254 if(!(tmp = g_filename_from_uri(name, NULL, &converr))) {
255 gaim_debug(GAIM_DEBUG_ERROR, "buddyicon", "%s\n",
256 (converr ? converr->message :
257 "g_filename_from_uri error"));
258 return;
259 }
260 if ((rtmp = strchr(tmp, '\r')) || (rtmp = strchr(tmp, '\n')))
261 *rtmp = '\0';
262 icon_choose_cb(tmp, box);
263 g_free(tmp);
264 }
265 gtk_drag_finish(dc, TRUE, FALSE, t);
266 }
267 gtk_drag_finish(dc, FALSE, FALSE, t);
268 }
269
270
241 static gboolean 271 static gboolean
242 icon_box_enter_cb(GtkWidget *widget, GdkEventCrossing *event, GtkGaimStatusBox *box) 272 icon_box_enter_cb(GtkWidget *widget, GdkEventCrossing *event, GtkGaimStatusBox *box)
243 { 273 {
244 gdk_window_set_cursor(widget->window, box->hand_cursor); 274 gdk_window_set_cursor(widget->window, box->hand_cursor);
245 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon_hover); 275 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon_hover);
252 gdk_window_set_cursor(widget->window, box->arrow_cursor); 282 gdk_window_set_cursor(widget->window, box->arrow_cursor);
253 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon) ; 283 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon) ;
254 return FALSE; 284 return FALSE;
255 } 285 }
256 286
287
288 static const GtkTargetEntry dnd_targets[] = {
289 {"text/plain", 0, 0},
290 {"text/uri-list", 0, 1},
291 {"STRING", 0, 2}
292 };
293
257 static void 294 static void
258 setup_icon_box(GtkGaimStatusBox *status_box) 295 setup_icon_box(GtkGaimStatusBox *status_box)
259 { 296 {
260 if (status_box->icon_box != NULL) 297 if (status_box->icon_box != NULL)
261 return; 298 return;
271 { 308 {
272 gtk_gaim_status_box_set_buddy_icon(status_box, gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon")); 309 gtk_gaim_status_box_set_buddy_icon(status_box, gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon"));
273 } 310 }
274 status_box->icon = gtk_image_new_from_pixbuf(status_box->buddy_icon); 311 status_box->icon = gtk_image_new_from_pixbuf(status_box->buddy_icon);
275 status_box->icon_box = gtk_event_box_new(); 312 status_box->icon_box = gtk_event_box_new();
313
276 status_box->hand_cursor = gdk_cursor_new (GDK_HAND2); 314 status_box->hand_cursor = gdk_cursor_new (GDK_HAND2);
277 status_box->arrow_cursor = gdk_cursor_new (GDK_LEFT_PTR); 315 status_box->arrow_cursor = gdk_cursor_new (GDK_LEFT_PTR);
278 316
317 /* Set up DND */
318 gtk_drag_dest_set(status_box->icon_box,
319 GTK_DEST_DEFAULT_MOTION |
320 GTK_DEST_DEFAULT_DROP,
321 dnd_targets,
322 sizeof(dnd_targets) / sizeof(GtkTargetEntry),
323 GDK_ACTION_COPY);
324
325 g_signal_connect(G_OBJECT(status_box->icon_box), "drag_data_received", G_CALLBACK(icon_box_dnd_cb), status_box);
279 g_signal_connect(G_OBJECT(status_box->icon_box), "enter-notify-event", G_CALLBACK(icon_box_enter_cb), status_box); 326 g_signal_connect(G_OBJECT(status_box->icon_box), "enter-notify-event", G_CALLBACK(icon_box_enter_cb), status_box);
280 g_signal_connect(G_OBJECT(status_box->icon_box), "leave-notify-event", G_CALLBACK(icon_box_leave_cb), status_box); 327 g_signal_connect(G_OBJECT(status_box->icon_box), "leave-notify-event", G_CALLBACK(icon_box_leave_cb), status_box);
281 g_signal_connect(G_OBJECT(status_box->icon_box), "button-press-event", G_CALLBACK(icon_box_press_cb), status_box); 328 g_signal_connect(G_OBJECT(status_box->icon_box), "button-press-event", G_CALLBACK(icon_box_press_cb), status_box);
282 329
283 gtk_container_add(GTK_CONTAINER(status_box->icon_box), status_box->icon); 330 gtk_container_add(GTK_CONTAINER(status_box->icon_box), status_box->icon);
1270 parent_alc.x += border_width; 1317 parent_alc.x += border_width;
1271 parent_alc.y += border_width; 1318 parent_alc.y += border_width;
1272 1319
1273 if (status_box->icon_box) 1320 if (status_box->icon_box)
1274 { 1321 {
1322 GtkTextDirection dir = gtk_widget_get_direction(widget);
1275 parent_alc.width -= (parent_alc.height + border_width); 1323 parent_alc.width -= (parent_alc.height + border_width);
1276 icon_alc = *allocation; 1324 icon_alc = *allocation;
1277 icon_alc.height = MAX(1,req.height) - (border_width); 1325 icon_alc.height = MAX(1,req.height) - (border_width);
1278 icon_alc.width = icon_alc.height; 1326 icon_alc.width = icon_alc.height;
1279 icon_alc.x = allocation->width - (icon_alc.width + border_width); 1327 if (dir == GTK_TEXT_DIR_RTL) {
1328 icon_alc.x = parent_alc.x;
1329 parent_alc.x += icon_alc.width + border_width;
1330 } else {
1331 icon_alc.x = allocation->width - (icon_alc.width + border_width);
1332 }
1280 icon_alc.y += border_width; 1333 icon_alc.y += border_width;
1281 1334
1282 if (status_box->icon_size != icon_alc.height) 1335 if (status_box->icon_size != icon_alc.height)
1283 { 1336 {
1284 if (status_box->buddy_icon_hover) 1337 if (status_box->buddy_icon_hover)