Skip to content

Commit aa294e8

Browse files
committed
Merge pull request conformal#77 from twstrike/glib_menus
Add almost all GMenuModel, GMenu and GMenuItem methods
2 parents 94da9c0 + 00701d3 commit aa294e8

3 files changed

Lines changed: 366 additions & 1 deletion

File tree

glib/glib.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
// and later.
1919
package glib
2020

21-
// #cgo pkg-config: glib-2.0 gobject-2.0
21+
// #cgo pkg-config: glib-2.0 gobject-2.0 gio-2.0
2222
// #include <gio/gio.h>
2323
// #include <glib.h>
2424
// #include <glib-object.h>
@@ -744,6 +744,20 @@ func (v *Object) HandlerDisconnect(handle SignalHandle) {
744744
delete(signals, handle)
745745
}
746746

747+
// Wrapper function for new objects with reference management.
748+
func wrapObject(ptr unsafe.Pointer) *Object {
749+
obj := &Object{ToGObject(ptr)}
750+
751+
if obj.IsFloating() {
752+
obj.RefSink()
753+
} else {
754+
obj.Ref()
755+
}
756+
757+
runtime.SetFinalizer(obj, (*Object).Unref)
758+
return obj
759+
}
760+
747761
/*
748762
* GInitiallyUnowned
749763
*/

glib/glib.go.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
#include <stdlib.h>
2424
#include <stdio.h>
2525

26+
#include <gio/gio.h>
27+
#include <glib.h>
28+
#include <glib-object.h>
2629
#include <glib/gi18n.h>
2730
#include <locale.h>
2831

@@ -32,6 +35,25 @@ toGObject(void *p)
3235
{
3336
return (G_OBJECT(p));
3437
}
38+
39+
static GMenuModel *
40+
toGMenuModel(void *p)
41+
{
42+
return (G_MENU_MODEL(p));
43+
}
44+
45+
static GMenu *
46+
toGMenu(void *p)
47+
{
48+
return (G_MENU(p));
49+
}
50+
51+
static GMenuItem *
52+
toGMenuItem(void *p)
53+
{
54+
return (G_MENU_ITEM(p));
55+
}
56+
3557

3658
static GType
3759
_g_type_from_instance(gpointer instance)

glib/menu.go

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
package glib
2+
3+
// #cgo pkg-config: glib-2.0 gobject-2.0
4+
// #include <gio/gio.h>
5+
// #include <glib.h>
6+
// #include <glib-object.h>
7+
// #include "glib.go.h"
8+
import "C"
9+
import "unsafe"
10+
11+
// MenuModel is a representation of GMenuModel.
12+
type MenuModel struct {
13+
*Object
14+
}
15+
16+
// native() returns a pointer to the underlying GMenuModel.
17+
func (v *MenuModel) native() *C.GMenuModel {
18+
if v == nil || v.GObject == nil {
19+
return nil
20+
}
21+
return C.toGMenuModel(unsafe.Pointer(v.GObject))
22+
}
23+
24+
func marshalMenuModel(p uintptr) (interface{}, error) {
25+
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
26+
return wrapMenuModel(wrapObject(unsafe.Pointer(c))), nil
27+
}
28+
29+
func wrapMenuModel(obj *Object) *MenuModel {
30+
return &MenuModel{obj}
31+
}
32+
33+
// IsMutable is a wrapper around g_menu_model_is_mutable().
34+
func (v *MenuModel) IsMutable() bool {
35+
return gobool(C.g_menu_model_is_mutable(v.native()))
36+
}
37+
38+
// GetNItems is a wrapper around g_menu_model_get_n_items().
39+
func (v *MenuModel) GetNItems() int {
40+
return int(C.g_menu_model_get_n_items(v.native()))
41+
}
42+
43+
// GetItemLink is a wrapper around g_menu_model_get_item_link().
44+
func (v *MenuModel) GetItemLink(index int, link string) *MenuModel {
45+
cstr := (*C.gchar)(C.CString(link))
46+
defer C.free(unsafe.Pointer(cstr))
47+
c := C.g_menu_model_get_item_link(v.native(), C.gint(index), cstr)
48+
if c == nil {
49+
return nil
50+
}
51+
return wrapMenuModel(wrapObject(unsafe.Pointer(c)))
52+
}
53+
54+
// ItemsChanged is a wrapper around g_menu_model_items_changed().
55+
func (v *MenuModel) ItemsChanged(position, removed, added int) {
56+
C.g_menu_model_items_changed(v.native(), C.gint(position), C.gint(removed), C.gint(added))
57+
}
58+
59+
// GVariant * g_menu_model_get_item_attribute_value ()
60+
// gboolean g_menu_model_get_item_attribute ()
61+
// GMenuAttributeIter * g_menu_model_iterate_item_attributes ()
62+
// GMenuLinkIter * g_menu_model_iterate_item_links ()
63+
64+
// Menu is a representation of GMenu.
65+
type Menu struct {
66+
MenuModel
67+
}
68+
69+
// native() returns a pointer to the underlying GMenu.
70+
func (m *Menu) native() *C.GMenu {
71+
if m == nil || m.GObject == nil {
72+
return nil
73+
}
74+
p := unsafe.Pointer(m.GObject)
75+
return C.toGMenu(p)
76+
}
77+
78+
func marshalMenu(p uintptr) (interface{}, error) {
79+
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
80+
return wrapMenu(wrapObject(unsafe.Pointer(c))), nil
81+
}
82+
83+
func wrapMenu(obj *Object) *Menu {
84+
return &Menu{MenuModel{obj}}
85+
}
86+
87+
// MenuNew is a wrapper around g_menu_new().
88+
func MenuNew() *Menu {
89+
c := C.g_menu_new()
90+
if c == nil {
91+
return nil
92+
}
93+
return wrapMenu(wrapObject(unsafe.Pointer(c)))
94+
}
95+
96+
// Freeze is a wrapper around g_menu_freeze().
97+
func (v *Menu) Freeze() {
98+
C.g_menu_freeze(v.native())
99+
}
100+
101+
// Insert is a wrapper around g_menu_insert().
102+
func (v *Menu) Insert(position int, label, detailed_action string) {
103+
cstr1 := (*C.gchar)(C.CString(label))
104+
defer C.free(unsafe.Pointer(cstr1))
105+
106+
cstr2 := (*C.gchar)(C.CString(detailed_action))
107+
defer C.free(unsafe.Pointer(cstr2))
108+
109+
C.g_menu_insert(v.native(), C.gint(position), cstr1, cstr2)
110+
}
111+
112+
// Prepend is a wrapper around g_menu_prepend().
113+
func (v *Menu) Prepend(label, detailed_action string) {
114+
cstr1 := (*C.gchar)(C.CString(label))
115+
defer C.free(unsafe.Pointer(cstr1))
116+
117+
cstr2 := (*C.gchar)(C.CString(detailed_action))
118+
defer C.free(unsafe.Pointer(cstr2))
119+
120+
C.g_menu_prepend(v.native(), cstr1, cstr2)
121+
}
122+
123+
// Append is a wrapper around g_menu_append().
124+
func (v *Menu) Append(label, detailed_action string) {
125+
cstr1 := (*C.gchar)(C.CString(label))
126+
defer C.free(unsafe.Pointer(cstr1))
127+
128+
cstr2 := (*C.gchar)(C.CString(detailed_action))
129+
defer C.free(unsafe.Pointer(cstr2))
130+
131+
C.g_menu_append(v.native(), cstr1, cstr2)
132+
}
133+
134+
// InsertItem is a wrapper around g_menu_insert_item().
135+
func (v *Menu) InsertItem(position int, item *MenuItem) {
136+
C.g_menu_insert_item(v.native(), C.gint(position), item.native())
137+
}
138+
139+
// AppendItem is a wrapper around g_menu_append_item().
140+
func (v *Menu) AppendItem(item *MenuItem) {
141+
C.g_menu_append_item(v.native(), item.native())
142+
}
143+
144+
// PrependItem is a wrapper around g_menu_prepend_item().
145+
func (v *Menu) PrependItem(item *MenuItem) {
146+
C.g_menu_prepend_item(v.native(), item.native())
147+
}
148+
149+
// InsertSection is a wrapper around g_menu_insert_section().
150+
func (v *Menu) InsertSection(position int, label string, section *MenuModel) {
151+
cstr1 := (*C.gchar)(C.CString(label))
152+
defer C.free(unsafe.Pointer(cstr1))
153+
154+
C.g_menu_insert_section(v.native(), C.gint(position), cstr1, section.native())
155+
}
156+
157+
// PrependSection is a wrapper around g_menu_prepend_section().
158+
func (v *Menu) PrependSection(label string, section *MenuModel) {
159+
cstr1 := (*C.gchar)(C.CString(label))
160+
defer C.free(unsafe.Pointer(cstr1))
161+
162+
C.g_menu_prepend_section(v.native(), cstr1, section.native())
163+
}
164+
165+
// AppendSection is a wrapper around g_menu_append_section().
166+
func (v *Menu) AppendSection(label string, section *MenuModel) {
167+
cstr1 := (*C.gchar)(C.CString(label))
168+
defer C.free(unsafe.Pointer(cstr1))
169+
170+
C.g_menu_append_section(v.native(), cstr1, section.native())
171+
}
172+
173+
// InsertSubmenu is a wrapper around g_menu_insert_submenu().
174+
func (v *Menu) InsertSubmenu(position int, label string, submenu *MenuModel) {
175+
cstr1 := (*C.gchar)(C.CString(label))
176+
defer C.free(unsafe.Pointer(cstr1))
177+
178+
C.g_menu_insert_submenu(v.native(), C.gint(position), cstr1, submenu.native())
179+
}
180+
181+
// PrependSubmenu is a wrapper around g_menu_prepend_submenu().
182+
func (v *Menu) PrependSubmenu(label string, submenu *MenuModel) {
183+
cstr1 := (*C.gchar)(C.CString(label))
184+
defer C.free(unsafe.Pointer(cstr1))
185+
186+
C.g_menu_prepend_submenu(v.native(), cstr1, submenu.native())
187+
}
188+
189+
// AppendSubmenu is a wrapper around g_menu_append_submenu().
190+
func (v *Menu) AppendSubmenu(label string, submenu *MenuModel) {
191+
cstr1 := (*C.gchar)(C.CString(label))
192+
defer C.free(unsafe.Pointer(cstr1))
193+
194+
C.g_menu_append_submenu(v.native(), cstr1, submenu.native())
195+
}
196+
197+
// Remove is a wrapper around g_menu_remove().
198+
func (v *Menu) Remove(position int) {
199+
C.g_menu_remove(v.native(), C.gint(position))
200+
}
201+
202+
// RemoveAll is a wrapper around g_menu_remove_all().
203+
func (v *Menu) RemoveAll() {
204+
C.g_menu_remove_all(v.native())
205+
}
206+
207+
// MenuItem is a representation of GMenuItem.
208+
type MenuItem struct {
209+
*Object
210+
}
211+
212+
// native() returns a pointer to the underlying GMenuItem.
213+
func (m *MenuItem) native() *C.GMenuItem {
214+
if m == nil || m.GObject == nil {
215+
return nil
216+
}
217+
p := unsafe.Pointer(m.GObject)
218+
return C.toGMenuItem(p)
219+
}
220+
221+
func marshalMenuItem(p uintptr) (interface{}, error) {
222+
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
223+
return wrapMenuItem(wrapObject(unsafe.Pointer(c))), nil
224+
}
225+
226+
func wrapMenuItem(obj *Object) *MenuItem {
227+
return &MenuItem{obj}
228+
}
229+
230+
// MenuItemNew is a wrapper around g_menu_item_new().
231+
func MenuItemNew(label, detailed_action string) *MenuItem {
232+
cstr1 := (*C.gchar)(C.CString(label))
233+
defer C.free(unsafe.Pointer(cstr1))
234+
235+
cstr2 := (*C.gchar)(C.CString(detailed_action))
236+
defer C.free(unsafe.Pointer(cstr2))
237+
238+
c := C.g_menu_item_new(cstr1, cstr2)
239+
if c == nil {
240+
return nil
241+
}
242+
return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
243+
}
244+
245+
// MenuItemNewSection is a wrapper around g_menu_item_new_section().
246+
func MenuItemNewSection(label string, section *MenuModel) *MenuItem {
247+
cstr1 := (*C.gchar)(C.CString(label))
248+
defer C.free(unsafe.Pointer(cstr1))
249+
250+
c := C.g_menu_item_new_section(cstr1, section.native())
251+
if c == nil {
252+
return nil
253+
}
254+
return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
255+
}
256+
257+
// MenuItemNewSubmenu is a wrapper around g_menu_item_new_submenu().
258+
func MenuItemNewSubmenu(label string, submenu *MenuModel) *MenuItem {
259+
cstr1 := (*C.gchar)(C.CString(label))
260+
defer C.free(unsafe.Pointer(cstr1))
261+
262+
c := C.g_menu_item_new_submenu(cstr1, submenu.native())
263+
if c == nil {
264+
return nil
265+
}
266+
return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
267+
}
268+
269+
// MenuItemNewFromModel is a wrapper around g_menu_item_new_from_model().
270+
func MenuItemNewFromModel(model *MenuModel, index int) *MenuItem {
271+
c := C.g_menu_item_new_from_model(model.native(), C.gint(index))
272+
if c == nil {
273+
return nil
274+
}
275+
return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
276+
}
277+
278+
//SetLabel is a wrapper around g_menu_item_set_label().
279+
func (v *MenuItem) SetLabel(label string) {
280+
cstr1 := (*C.gchar)(C.CString(label))
281+
defer C.free(unsafe.Pointer(cstr1))
282+
283+
C.g_menu_item_set_label(v.native(), cstr1)
284+
}
285+
286+
//SetDetailedAction is a wrapper around g_menu_item_set_detailed_action().
287+
func (v *MenuItem) SetDetailedAction(act string) {
288+
cstr1 := (*C.gchar)(C.CString(act))
289+
defer C.free(unsafe.Pointer(cstr1))
290+
291+
C.g_menu_item_set_detailed_action(v.native(), cstr1)
292+
}
293+
294+
//SetSection is a wrapper around g_menu_item_set_section().
295+
func (v *MenuItem) SetSection(section *MenuModel) {
296+
C.g_menu_item_set_section(v.native(), section.native())
297+
}
298+
299+
//SetSubmenu is a wrapper around g_menu_item_set_submenu().
300+
func (v *MenuItem) SetSubmenu(submenu *MenuModel) {
301+
C.g_menu_item_set_submenu(v.native(), submenu.native())
302+
}
303+
304+
//GetLink is a wrapper around g_menu_item_get_link().
305+
func (v *MenuItem) GetLink(link string) *MenuModel {
306+
cstr1 := (*C.gchar)(C.CString(link))
307+
defer C.free(unsafe.Pointer(cstr1))
308+
309+
c := C.g_menu_item_get_link(v.native(), cstr1)
310+
if c == nil {
311+
return nil
312+
}
313+
return wrapMenuModel(wrapObject(unsafe.Pointer(c)))
314+
}
315+
316+
//SetLink is a wrapper around g_menu_item_Set_link().
317+
func (v *MenuItem) SetLink(link string, model *MenuModel) {
318+
cstr1 := (*C.gchar)(C.CString(link))
319+
defer C.free(unsafe.Pointer(cstr1))
320+
321+
C.g_menu_item_set_link(v.native(), cstr1, model.native())
322+
}
323+
324+
// void g_menu_item_set_action_and_target_value ()
325+
// void g_menu_item_set_action_and_target ()
326+
// GVariant * g_menu_item_get_attribute_value ()
327+
// gboolean g_menu_item_get_attribute ()
328+
// void g_menu_item_set_attribute_value ()
329+
// void g_menu_item_set_attribute ()

0 commit comments

Comments
 (0)