~ci-train-bot/libdbusmenu/libdbusmenu-ubuntu-zesty-2254

« back to all changes in this revision

Viewing changes to libdbusmenu-gtk/parser.c

  • Committer: Dan Williams
  • Date: 2016-02-23 20:08:49 UTC
  • mto: This revision was merged to the branch mainline in revision 479.
  • Revision ID: dcbw@redhat.com-20160223200849-wimn8qo08lx4kwe7
gtk: look for GtkImages on regular GtkMenuItems too

GtkImageMenuItem is deprecated, and the recommended replacement
is a normal GtkMenuItem packed manually with a label and an image.
To ensure applications that use recommended GTK practices can still
show menu item images, check the children of a normal GtkMenuItem
for a GtkImage too, just like is done for the label child.

Show diffs side-by-side

added added

removed removed

Lines of Context:
82
82
static void           update_icon              (DbusmenuMenuitem *  menuitem,
83
83
                                                ParserData *        pdata,
84
84
                                                GtkImage *          image);
85
 
static GtkWidget *    find_menu_label          (GtkWidget *         widget);
 
85
static GtkWidget *    find_menu_child          (GtkWidget *         widget,
 
86
                                                GType               child_type);
86
87
static void           label_notify_cb          (GtkWidget *         widget,
87
88
                                                GParamSpec *        pspec,
88
89
                                                gpointer            data);
648
649
 
649
650
      gboolean visible = FALSE;
650
651
      gboolean sensitive = FALSE;
651
 
      if (GTK_IS_SEPARATOR_MENU_ITEM (widget) || !find_menu_label (widget))
 
652
      if (GTK_IS_SEPARATOR_MENU_ITEM (widget) || !find_menu_child (widget, GTK_TYPE_LABEL))
652
653
        {
653
654
          dbusmenu_menuitem_property_set (mi,
654
655
                                          DBUSMENU_MENUITEM_PROP_TYPE,
659
660
        }
660
661
      else
661
662
        {
 
663
          GtkWidget *image = NULL;
 
664
 
662
665
          pdata->widget_accel_handler_id = g_signal_connect (widget, "accel-closures-changed",
663
666
                                                             G_CALLBACK (accel_changed), mi);
664
667
 
674
677
 
675
678
              pdata->widget_toggle_handler_id = g_signal_connect (widget, "activate", G_CALLBACK (checkbox_toggled), mi);
676
679
            }
677
 
 
678
 
          if (GTK_IS_IMAGE_MENU_ITEM (widget))
 
680
          else if (GTK_IS_IMAGE_MENU_ITEM (widget))
679
681
            {
680
 
              GtkWidget *image;
681
682
 
682
683
              image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (widget));
683
684
 
684
 
              if (GTK_IS_IMAGE (image))
685
 
                {
686
 
                  update_icon (mi, pdata, GTK_IMAGE (image));
687
 
                }
688
 
            }
689
 
 
690
 
          GtkWidget *label = find_menu_label (widget);
 
685
            }
 
686
          else
 
687
            {
 
688
              // GtkImageMenuItem is deprecated, so check regular GtkMenuItems
 
689
              // for an image child too
 
690
              image = find_menu_child (widget, GTK_TYPE_IMAGE);
 
691
            }
 
692
 
 
693
          if (GTK_IS_IMAGE (image))
 
694
            {
 
695
              update_icon (mi, pdata, GTK_IMAGE (image));
 
696
            }
 
697
 
 
698
 
 
699
          GtkWidget *label = find_menu_child (widget, GTK_TYPE_LABEL);
691
700
 
692
701
          // Sometimes, an app will directly find and modify the label
693
702
          // (like empathy), so watch the label especially for that.
948
957
}
949
958
 
950
959
static GtkWidget *
951
 
find_menu_label (GtkWidget *widget)
 
960
find_menu_child (GtkWidget *widget, GType child_type)
952
961
{
953
 
  GtkWidget *label = NULL;
 
962
  GtkWidget *child = NULL;
954
963
 
955
 
  if (GTK_IS_LABEL (widget))
 
964
  if (G_TYPE_CHECK_INSTANCE_TYPE (widget, child_type))
956
965
    return widget;
957
966
 
958
967
  if (GTK_IS_CONTAINER (widget))
964
973
 
965
974
      for (l = children; l; l = l->next)
966
975
        {
967
 
          label = find_menu_label (l->data);
 
976
          child = find_menu_child (l->data, child_type);
968
977
 
969
 
          if (label)
 
978
          if (child)
970
979
            break;
971
980
        }
972
981
 
973
982
      g_list_free (children);
974
983
    }
975
984
 
976
 
  return label;
 
985
  return child;
977
986
}
978
987
 
979
988
static void
1125
1134
    {
1126
1135
      DbusmenuMenuitem * item = DBUSMENU_MENUITEM(data);
1127
1136
      GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
1128
 
      GtkWidget *label = find_menu_label (widget);
 
1137
      GtkWidget *label = find_menu_child (widget, GTK_TYPE_LABEL);
1129
1138
      const gchar *label_text = gtk_label_get_text (GTK_LABEL (label));
1130
1139
      const gchar *name = atk_object_get_name (accessible);
1131
1140
 
1339
1348
               GtkWidget *child,
1340
1349
               gpointer   data)
1341
1350
{
1342
 
  if (find_menu_label (child) != NULL)
 
1351
  if (find_menu_child (widget, GTK_TYPE_LABEL) != NULL)
1343
1352
    handle_first_label (data);
1344
1353
}
1345
1354
 
1437
1446
 
1438
1447
  item = gtk_widget_get_ancestor (GTK_WIDGET (image),
1439
1448
                                  GTK_TYPE_IMAGE_MENU_ITEM);
 
1449
  if (!item)
 
1450
    item = gtk_widget_get_ancestor (GTK_WIDGET (image),
 
1451
                                    GTK_TYPE_MENU_ITEM);
1440
1452
 
1441
1453
  if (item)
1442
1454
    {
1450
1462
      if (gtk_menu_images)
1451
1463
        return TRUE;
1452
1464
 
1453
 
      return gtk_image_menu_item_get_always_show_image (GTK_IMAGE_MENU_ITEM (item));
 
1465
      if (GTK_IS_IMAGE_MENU_ITEM (item))
 
1466
        return gtk_image_menu_item_get_always_show_image (GTK_IMAGE_MENU_ITEM (item));
1454
1467
    }
1455
1468
 
1456
1469
  return FALSE;