290
ido_user_menu_item_set_icon (IdoUserMenuItem * self, const char * icon_filename)
293
ido_user_menu_item_set_icon (IdoUserMenuItem * self, GIcon * icon)
292
gboolean updated = FALSE;
293
295
IdoUserMenuItemPrivate * p = self->priv;
294
296
GtkImage * image = GTK_IMAGE (p->user_image);
296
/* make a private copy of the icon name */
297
g_free (p->icon_filename);
298
self->priv->icon_filename = g_strdup (icon_filename);
300
/* now try to use it */
301
if (icon_filename && *icon_filename)
303
int width = 18; /* arbitrary default values */
306
GdkPixbuf * pixbuf = NULL;
309
gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &width, &height);
310
pixbuf = gdk_pixbuf_new_from_file_at_size (icon_filename,
311
width, height, &err);
314
gtk_image_set_from_pixbuf (image, pixbuf);
315
g_object_unref (pixbuf);
320
g_warning ("Couldn't load the image \"%s\": %s",
321
icon_filename, err->message);
322
g_clear_error (&err);
326
/* as a fallback, use the default user icon */
329
gtk_image_set_from_icon_name (image,
298
g_clear_object (&p->icon);
303
icon = g_themed_icon_new_with_default_fallbacks (FALLBACK_ICON_NAME);
305
gtk_image_set_from_gicon (image, icon, GTK_ICON_SIZE_MENU);
309
ido_user_menu_item_set_icon_from_file (IdoUserMenuItem * self, const char * filename)
311
GFile * file = filename ? g_file_new_for_path (filename) : NULL;
312
GIcon * icon = file ? g_file_icon_new (file) : NULL;
314
ido_user_menu_item_set_icon (self, icon);
316
g_clear_object (&icon);
317
g_clear_object (&file);
357
342
return GTK_WIDGET (g_object_new (IDO_USER_MENU_ITEM_TYPE, NULL));
350
* This is a helper function for creating user menuitems for both
351
* "indicator.user-menu-item" and "indicator.guest-menu-item",
352
* since they only differ in how they use their action's state.
355
user_menu_item_new_from_model (GMenuItem * menuitem,
356
GActionGroup * actions,
357
GCallback state_changed_callback)
361
IdoUserMenuItem * ido_user;
365
GParameter parameters[4];
367
/* create the ido_user */
371
if (g_menu_item_get_attribute (menuitem, G_MENU_ATTRIBUTE_LABEL, "s", &str))
373
GParameter p = { "label", G_VALUE_INIT };
374
g_value_init (&p.value, G_TYPE_STRING);
375
g_value_take_string (&p.value, str);
379
if ((v = g_menu_item_get_attribute_value (menuitem, G_MENU_ATTRIBUTE_ICON, NULL)))
381
GParameter p = { "icon", G_VALUE_INIT };
382
GIcon * icon = g_icon_deserialize (v);
383
g_value_init (&p.value, G_TYPE_OBJECT);
384
g_value_take_object (&p.value, icon);
389
g_assert (n <= G_N_ELEMENTS (parameters));
390
ido_user = g_object_newv (IDO_USER_MENU_ITEM_TYPE, n, parameters);
393
g_value_unset (¶meters[i].value);
395
/* gie it an ActionHelper */
397
if (g_menu_item_get_attribute (menuitem, G_MENU_ATTRIBUTE_ACTION, "s", &action))
399
IdoActionHelper *helper;
402
target = g_menu_item_get_attribute_value (menuitem, G_MENU_ATTRIBUTE_TARGET, G_VARIANT_TYPE_ANY);
404
helper = ido_action_helper_new (GTK_WIDGET (ido_user), actions, action, target);
405
g_signal_connect (helper, "action-state-changed",
406
state_changed_callback, NULL);
408
g_signal_connect_object (ido_user, "activate",
409
G_CALLBACK (ido_action_helper_activate),
410
helper, G_CONNECT_SWAPPED);
411
g_signal_connect_swapped (ido_user, "destroy", G_CALLBACK (g_object_unref), helper);
414
g_variant_unref (target);
418
return GTK_MENU_ITEM (ido_user);
422
**** indicator.user-menu-item handler
361
426
* user_menu_item_state_changed:
371
436
gpointer user_data)
438
gboolean is_logged_in = FALSE;
439
gboolean is_current_user = FALSE;
373
440
IdoUserMenuItem *item;
374
441
GVariant *target;
377
444
item = IDO_USER_MENU_ITEM (ido_action_helper_get_widget (helper));
379
ido_user_menu_item_set_current_user (item, FALSE);
380
ido_user_menu_item_set_logged_in (item, FALSE);
382
446
target = ido_action_helper_get_action_target (helper);
383
447
g_return_if_fail (g_variant_is_of_type (target, G_VARIANT_TYPE_STRING));
385
449
if ((v = g_variant_lookup_value (state, "active-user", G_VARIANT_TYPE_STRING)))
387
451
if (g_variant_equal (v, target))
388
ido_user_menu_item_set_current_user (item, TRUE);
452
is_current_user = TRUE;
390
454
g_variant_unref (v);
399
463
while ((user = g_variant_iter_next_value (&it)))
401
465
if (g_variant_equal (user, target))
402
ido_user_menu_item_set_logged_in (item, TRUE);
403
468
g_variant_unref (user);
406
471
g_variant_unref (v);
474
ido_user_menu_item_set_logged_in (item, is_logged_in);
475
ido_user_menu_item_set_current_user (item, is_current_user);
419
487
ido_user_menu_item_new_from_model (GMenuItem *menuitem,
420
488
GActionGroup *actions)
422
IdoUserMenuItem *item;
426
item = IDO_USER_MENU_ITEM (ido_user_menu_item_new ());
428
if (g_menu_item_get_attribute (menuitem, "label", "s", &label))
430
ido_user_menu_item_set_label (item, label);
434
if (g_menu_item_get_attribute (menuitem, "action", "s", &action))
436
IdoActionHelper *helper;
439
target = g_menu_item_get_attribute_value (menuitem, "target", G_VARIANT_TYPE_ANY);
441
helper = ido_action_helper_new (GTK_WIDGET (item), actions, action, target);
442
g_signal_connect (helper, "action-state-changed",
443
G_CALLBACK (user_menu_item_state_changed), NULL);
445
g_signal_connect_object (item, "activate",
446
G_CALLBACK (ido_action_helper_activate),
447
helper, G_CONNECT_SWAPPED);
448
g_signal_connect_swapped (item, "destroy", G_CALLBACK (g_object_unref), helper);
451
g_variant_unref (target);
455
return GTK_MENU_ITEM (item);
490
return user_menu_item_new_from_model (menuitem,
492
G_CALLBACK(user_menu_item_state_changed));
496
**** indicator.guest-menu-item handler
500
guest_menu_item_state_changed (IdoActionHelper *helper,
504
IdoUserMenuItem * item = IDO_USER_MENU_ITEM (ido_action_helper_get_widget (helper));
507
if ((g_variant_lookup (state, "is-active", "b", &b)))
508
ido_user_menu_item_set_current_user (item, b);
510
if ((g_variant_lookup (state, "is-logged-in", "b", &b)))
511
ido_user_menu_item_set_current_user (item, b);
515
* ido_guest_menu_item_new_from_model:
517
* Creates an #IdoUserMenuItem. If @menuitem contains an action, the
518
* widget is bound to that action in @actions.
520
* Returns: (transfer full): a new #IdoUserMenuItem
523
ido_guest_menu_item_new_from_model (GMenuItem *menuitem,
524
GActionGroup *actions)
526
return user_menu_item_new_from_model (menuitem,
528
G_CALLBACK(guest_menu_item_state_changed));