1 | #include "prop-holder.h" |
2 | |
3 | enum { |
4 | PROP_OBJECT = 1, |
5 | PROP_PSPEC, |
6 | PROP_NAME, |
7 | NUM_PROPERTIES |
8 | }; |
9 | |
10 | static GParamSpec *properties[NUM_PROPERTIES]; |
11 | |
12 | struct _PropHolder { |
13 | GObject instance; |
14 | |
15 | GObject *object; |
16 | GParamSpec *pspec; |
17 | }; |
18 | |
19 | G_DEFINE_TYPE (PropHolder, prop_holder, G_TYPE_OBJECT) |
20 | |
21 | static void |
22 | prop_holder_init (PropHolder *holder) |
23 | { |
24 | } |
25 | |
26 | static void |
27 | prop_holder_set_property (GObject *object, |
28 | guint prop_id, |
29 | const GValue *value, |
30 | GParamSpec *pspec) |
31 | { |
32 | PropHolder *holder = PROP_HOLDER (ptr: object); |
33 | |
34 | switch (prop_id) |
35 | { |
36 | case PROP_OBJECT: |
37 | holder->object = g_value_dup_object (value); |
38 | break; |
39 | |
40 | case PROP_PSPEC: |
41 | holder->pspec = g_value_get_param (value); |
42 | break; |
43 | |
44 | default: |
45 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
46 | break; |
47 | } |
48 | } |
49 | |
50 | static void |
51 | prop_holder_get_property (GObject *object, |
52 | guint prop_id, |
53 | GValue *value, |
54 | GParamSpec *pspec) |
55 | { |
56 | PropHolder *holder = PROP_HOLDER (ptr: object); |
57 | |
58 | switch (prop_id) |
59 | { |
60 | case PROP_OBJECT: |
61 | g_value_set_object (value, v_object: holder->object); |
62 | break; |
63 | |
64 | case PROP_PSPEC: |
65 | g_value_set_param (value, param: holder->pspec); |
66 | break; |
67 | |
68 | case PROP_NAME: |
69 | g_value_set_string (value, v_string: holder->pspec->name); |
70 | break; |
71 | |
72 | default: |
73 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
74 | break; |
75 | } |
76 | } |
77 | |
78 | static void |
79 | prop_holder_finalize (GObject *object) |
80 | { |
81 | PropHolder *holder = PROP_HOLDER (ptr: object); |
82 | |
83 | g_object_unref (object: holder->object); |
84 | |
85 | G_OBJECT_CLASS (prop_holder_parent_class)->finalize (object); |
86 | } |
87 | |
88 | static void |
89 | prop_holder_class_init (PropHolderClass *class) |
90 | { |
91 | GObjectClass *object_class = G_OBJECT_CLASS (class); |
92 | |
93 | object_class->finalize = prop_holder_finalize; |
94 | object_class->set_property = prop_holder_set_property; |
95 | object_class->get_property = prop_holder_get_property; |
96 | |
97 | properties[PROP_OBJECT] = |
98 | g_param_spec_object (name: "object" , nick: "object" , blurb: "object" , |
99 | G_TYPE_OBJECT, |
100 | flags: G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); |
101 | |
102 | properties[PROP_PSPEC] = |
103 | g_param_spec_param (name: "pspec" , nick: "pspec" , blurb: "pspec" , |
104 | G_TYPE_PARAM, |
105 | flags: G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); |
106 | |
107 | properties[PROP_NAME] = |
108 | g_param_spec_string (name: "name" , nick: "name" , blurb: "name" , |
109 | NULL, |
110 | flags: G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); |
111 | |
112 | g_object_class_install_properties (oclass: object_class, n_pspecs: NUM_PROPERTIES, pspecs: properties); |
113 | } |
114 | |
115 | PropHolder * |
116 | prop_holder_new (GObject *object, |
117 | GParamSpec *pspec) |
118 | { |
119 | PropHolder *holder; |
120 | |
121 | holder = g_object_new (PROP_TYPE_HOLDER, |
122 | first_property_name: "object" , object, |
123 | "pspec" , pspec, |
124 | NULL); |
125 | |
126 | return holder; |
127 | } |
128 | |
129 | GObject * |
130 | prop_holder_get_object (PropHolder *holder) |
131 | { |
132 | return holder->object; |
133 | } |
134 | |
135 | GParamSpec * |
136 | prop_holder_get_pspec (PropHolder *holder) |
137 | { |
138 | return holder->pspec; |
139 | } |
140 | |
141 | const char * |
142 | prop_holder_get_name (PropHolder *holder) |
143 | { |
144 | return holder->pspec->name; |
145 | } |
146 | |