从 GValue 中获取对象

Getting objects out of a GValue

因为gtk_style_context_get_background_color从gtk v3.16版本开始被弃用我想读出以下样式-属性:GTK_STYLE_PROPERTY_BACKGROUND_COLOR

目前我的代码如下所示:

  GdkRGBA         *color;

  ...
  GValue value = G_VALUE_INIT;
  gtk_style_context_get_property (context,GTK_STYLE_PROPERTY_BACKGROUND_COLOR, state, &value);
  color = g_value_get_object (&value);

不过我好像做错了。在运行时,我只得到以下 GLib-GObject-CRITICAL:

(thunar:6564): GLib-GObject-CRITICAL **: g_value_get_object: assertion 'G_VALUE_HOLDS_OBJECT (value)' failed

那么我如何利用包含更复杂数据类型的 gtk 属性?

编辑: 这是现在对我有用的完整解决方案:

  GtkStateFlags    state;
  GdkRGBA          *color;
  GtkStyleContext *context = gtk_widget_get_style_context (widget);

  // get the color
  gtk_style_context_get (context, GTK_STATE_FLAG_SELECTED, GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &color, NULL);

  // do something with the color
  gdk_cairo_set_source_rgba (cr, color);

  // dont forget to free it afterwards !! (Otherwise segfaults may occur)
  gdk_rgba_free (color);

您可以完全跳过 GValue:

GdkRGBA *c;
gtk_style_context_get (context,
                       GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &c,
                       NULL);
// ...
gdk_rgba_free (c);