Question

I'm trying to write a composite widget using GTK+3 in C.

the composite widget set property and get property are using alsa_device_item ** which is a type struct to _alsa_device_items.

my include file is this;

#ifndef AUDIO_DEVICE_DIALOG_WIDGET_H
#define AUDIO_DEVICE_DIALOG_WIDGET_H

#ifdef  __cplusplus
extern "C" {
#endif


#include <gtk-3.0/gtk/gtk.h>

#define AUDIO_DEVICE_DIALOG_WIDGET_TYPE (audio_device_dialog_widget_get_type())
#define AUDIO_DEVICE_DIALOG_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), AUDIO_DEVICE_DIALOG_WIDGET_TYPE, AudioDeviceDialogWidget))
GType           audio_device_dialog_widget_get_type    (void);

typedef struct _audio_device_dialog_widget AudioDeviceDialogWidget;
typedef struct _audio_device_dialog_widget_class AudioDeviceDialogWidgetClass;

struct _audio_device_item {
 char *device_name;
 char *device_desc;
 gboolean is_available;
};

typedef struct _audio_device_item audio_device_item;

AudioDeviceDialogWidget     *audio_device_dialog_widget_new         (audio_device_item **device_items);        


#ifdef  __cplusplus
}
#endif

#endif  /* AUDIO_DEVICE_DIALOG_WIDGET_H */

as you see in the include file i define the struct and typedef of alsa_device_item.

the c file is this:

#include <gtk-3.0/gtk/gtk.h>
#include <string.h>
#include "audio_device_dialog_widget.h"
#include "audio_dev_box_widget.h"

typedef struct audio_device_dialog_widget_private AudioDeviceDialogWidgetPrivate;


struct _audio_device_dialog_widget 
{
GtkDialog parent;
AudioDeviceDialogWidgetPrivate *priv;

 };

 struct _audio_device_dialog_widget_class
{
GtkDialogClass parent_class;
};

struct audio_device_dialog_widget_private 
{
GtkWidget *save_button, *cancel_button, *audio_dialog_box;

};



G_DEFINE_TYPE_WITH_PRIVATE(AudioDeviceDialogWidget,audio_device_dialog_widget,GTK_TYPE_DIALOG);

enum {
PROP_0,
PROP_DEVICE_NAMES
};


static void audio_device_dialog_widget_init(AudioDeviceDialogWidget *widget) {
widget->priv = G_TYPE_INSTANCE_GET_PRIVATE(widget, AUDIO_DEVICE_DIALOG_WIDGET_TYPE, AudioDeviceDialogWidgetPrivate);
gtk_widget_init_template(GTK_WIDGET(widget));    
}


AudioDeviceDialogWidget *audio_device_dialog_widget_new(audio_device_item **device_items) {
return g_object_new(AUDIO_DEVICE_DIALOG_WIDGET_TYPE,"devices_list",device_items,NULL);
}

static void audio_device_dialog_widget_set_devices(AudioDeviceDialogWidget *widget,const audio_device_item **device_items) {
g_return_if_fail(AUDIO_DEVICE_DIALOG_WIDGET(widget));
int i=0;
while (device_items[i] != NULL) {
    AudioDevBoxWidget *audio_dev_box_widget = audio_dev_box_widget_new(device_items[i]->device_name, device_items[i]->device_desc, device_items[i]->is_available);
    gtk_box_pack_start(GTK_BOX(widget->priv->audio_dialog_box),GTK_WIDGET(audio_dev_box_widget),FALSE, FALSE, 0);        
    i++;
}
}

const audio_device_item **audio_device_dialog_widget_get_devices(AudioDeviceDialogWidget *widget) {
    g_return_val_if_fail (AUDIO_DEVICE_DIALOG_WIDGET (widget), NULL);
   const audio_device_item **devices = NULL;
    return devices;
}

static void
audio_device_dialog_widget_set_property (GObject         *object,
                     guint            prop_id,
                     const GValue    *value,
                     GParamSpec      *pspec)
{
  AudioDeviceDialogWidget *widget = AUDIO_DEVICE_DIALOG_WIDGET (object);

  switch (prop_id)
    {
case PROP_DEVICE_NAMES:
    audio_device_dialog_widget_set_devices(widget, g_value_get_pointer(value));
      break;
default:
  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
  break;
}
}

static void
audio_device_dialog_widget_get_property (GObject         *object,
                    guint            prop_id,
                    GValue          *value,
                    GParamSpec      *pspec)
 {^
  AudioDeviceDialogWidget *widget = AUDIO_DEVICE_DIALOG_WIDGET (object);

switch (prop_id)
{
case PROP_DEVICE_NAMES:
  g_value_set_pointer (value, audio_device_dialog_widget_get_devices(widget));      
  break;
default:
  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
  break;
}
}


static void audio_device_dialog_widget_class_init(AudioDeviceDialogWidgetClass *class) {
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class);
GObjectClass *gobject_class = G_OBJECT_CLASS(class);

gobject_class->set_property=audio_device_dialog_widget_set_property;
gobject_class->get_property=audio_device_dialog_widget_get_property;
GParamSpec *obj_properties = 
        g_param_spec_string("devices_list","Devices List","Devices List",NULL,G_PARAM_READWRITE);


g_object_class_install_property(gobject_class, PROP_DEVICE_NAMES,obj_properties);

  gtk_widget_class_set_template_from_resource (widget_class,
                                           "/com/tuxin/tuxmusicstudio/audio_device_dialog.glade");

 gtk_widget_class_bind_template_child_private(widget_class, AudioDeviceDialogWidget, save_button);
 gtk_widget_class_bind_template_child_private(widget_class, AudioDeviceDialogWidget, cancel_button);
 gtk_widget_class_bind_template_child_private(widget_class, AudioDeviceDialogWidget, audio_dialog_box);

}

when I run my application i get the following critical message:

(tuxmusicstudio:15946): GLib-GObject-CRITICAL **: g_value_get_pointer: assertion 'G_VALUE_HOLDS_POINTER (value)' failed

so as you can see the g_value_get_pointer won't accept my typedef struct pointer.

any ideas?^

Was it helpful?

Solution

You need to make sure a couple of things:

  1. make sure the GValue-pointer is not NULL
  2. make sure on get and set that G_VALUE_HOLDS_POINTER(value) is TRUE
  3. check what G_VALUE_TYPE_NAME (value) says (what type it actually holds)
  4. add more debug flags - there is not much to say with the limit of debug info you provided.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top