Provided a way to connect child widget signals in the GTK+ sysData and connected Area to draw. I think I'm getting the wrong child widget, though...
This commit is contained in:
parent
a61b43f50c
commit
6cdda6ebec
14
area_unix.go
14
area_unix.go
|
@ -16,7 +16,7 @@ import (
|
||||||
// #define GDK_VERSION_MIN_REQUIRED GDK_VERSION_3_4
|
// #define GDK_VERSION_MIN_REQUIRED GDK_VERSION_3_4
|
||||||
// #define GDK_VERSION_MAX_ALLOWED GDK_VERSION_3_4
|
// #define GDK_VERSION_MAX_ALLOWED GDK_VERSION_3_4
|
||||||
// #include <gtk/gtk.h>
|
// #include <gtk/gtk.h>
|
||||||
// extern gboolean our_draw_callback(GtkWidget *, cairo_t *, gpointer);
|
// extern gboolean our_area_draw_callback(GtkWidget *, cairo_t *, gpointer);
|
||||||
// /* HACK - see https://code.google.com/p/go/issues/detail?id=7548 */
|
// /* HACK - see https://code.google.com/p/go/issues/detail?id=7548 */
|
||||||
// struct _cairo {};
|
// struct _cairo {};
|
||||||
import "C"
|
import "C"
|
||||||
|
@ -30,8 +30,14 @@ func gtkAreaNew() *gtkWidget {
|
||||||
return fromgtkwidget(scrollarea)
|
return fromgtkwidget(scrollarea)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export our_draw_callback
|
func gtkAreaGetControl(scrollarea *gtkWidget) *gtkWidget {
|
||||||
func our_draw_callback(widget *C.GtkWidget, cr *C.cairo_t, data C.gpointer) C.gboolean {
|
viewport := C.gtk_bin_get_child((*C.GtkBin)(unsafe.Pointer(scrollarea)))
|
||||||
|
control := C.gtk_bin_get_child((*C.GtkBin)(unsafe.Pointer(viewport)))
|
||||||
|
return fromgtkwidget(control)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export our_area_draw_callback
|
||||||
|
func our_area_draw_callback(widget *C.GtkWidget, cr *C.cairo_t, data C.gpointer) C.gboolean {
|
||||||
var x, y, w, h C.double
|
var x, y, w, h C.double
|
||||||
|
|
||||||
s := (*sysData)(unsafe.Pointer(data))
|
s := (*sysData)(unsafe.Pointer(data))
|
||||||
|
@ -64,4 +70,4 @@ func our_draw_callback(widget *C.GtkWidget, cr *C.cairo_t, data C.gpointer) C.gb
|
||||||
return C.FALSE // signals handled without stopping the event chain (thanks to desrt again)
|
return C.FALSE // signals handled without stopping the event chain (thanks to desrt again)
|
||||||
}
|
}
|
||||||
|
|
||||||
var draw_callback = C.GCallback(C.our_draw_callback)
|
var area_draw_callback = C.GCallback(C.our_area_draw_callback)
|
||||||
|
|
|
@ -49,7 +49,7 @@ As the GTK+ main loop system does not quite run in a sane way (it allows recursi
|
||||||
|
|
||||||
GTK+ layout managers are not used since the UI library's layout managers are coded in a portable way. (`GtkFixed` is used instead.) This isn't ideal, but it works for now.
|
GTK+ layout managers are not used since the UI library's layout managers are coded in a portable way. (`GtkFixed` is used instead.) This isn't ideal, but it works for now.
|
||||||
|
|
||||||
All event handlers take the `sysData` as their user data parameter; this means all the event-handling code is stored in static functions in callbacks_unix.go. (Early versions of the package generated signal handlers for each control on the fly, but this needed to be changed to accommodoate Area, which not only needs the `sysData` but also needs to connect to a subwidget of a subwidget (specifically the subwidget of the `GtkViewport` of a `GtkScrolledWindow`); the current setup also avoids creating closures for each and every Window and Button created, and also means we can stop having to shove those callbacks in an ever-growing slice to prevent them from being garbage collected.)
|
All event handlers take the `sysData` as their user data parameter; this means all the event-handling code is stored in static functions in callbacks_unix.go. (Early versions of the package generated signal handlers for each control on the fly, but this needed to be changed to accommodoate Area, which not only needs the `sysData` but also needs to connect to a subwidget of a subwidget (specifically the subwidget of the `GtkViewport` of a `GtkScrolledWindow`); the current setup also avoids creating closures for each and every Window and Button created, and also means we can stop having to shove those callbacks in an ever-growing slice to prevent them from being garbage collected.) Should the widget actually be a child widget of a `GtkScrolledWindow`, the `child` function and `childsigs` signal list are used to assign signals as well.
|
||||||
|
|
||||||
The only major snag with the GTK+ implementation is the implementation of `Listbox`; see `listbox_unix.go` for details.
|
The only major snag with the GTK+ implementation is the implementation of `Listbox`; see `listbox_unix.go` for details.
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,8 @@ type classData struct {
|
||||||
len func(widget *gtkWidget) int
|
len func(widget *gtkWidget) int
|
||||||
// ...
|
// ...
|
||||||
signals callbackMap
|
signals callbackMap
|
||||||
|
child func(widget *gtkWidget) *gtkWidget
|
||||||
|
childsigs callbackMap
|
||||||
}
|
}
|
||||||
|
|
||||||
var classTypes = [nctypes]*classData{
|
var classTypes = [nctypes]*classData{
|
||||||
|
@ -94,6 +96,10 @@ var classTypes = [nctypes]*classData{
|
||||||
},
|
},
|
||||||
c_area: &classData{
|
c_area: &classData{
|
||||||
make: gtkAreaNew,
|
make: gtkAreaNew,
|
||||||
|
child: gtkAreaGetControl,
|
||||||
|
childsigs: callbackMap{
|
||||||
|
"draw": area_draw_callback,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +133,12 @@ func (s *sysData) make(initText string, window *sysData) error {
|
||||||
for signame, sigfunc := range ct.signals {
|
for signame, sigfunc := range ct.signals {
|
||||||
g_signal_connect(s.widget, signame, sigfunc, s)
|
g_signal_connect(s.widget, signame, sigfunc, s)
|
||||||
}
|
}
|
||||||
|
if ct.child != nil {
|
||||||
|
child := ct.child(s.widget)
|
||||||
|
for signame, sigfunc := range ct.childsigs {
|
||||||
|
g_signal_connect(child, signame, sigfunc, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
ret <- nil
|
ret <- nil
|
||||||
}
|
}
|
||||||
<-ret
|
<-ret
|
||||||
|
|
Loading…
Reference in New Issue