Added the framework code for handling keyboard events in GTK+ Areas. Oh boy... this is gonna hurt (as I will describe shortly).
This commit is contained in:
parent
ac684b15a5
commit
92dc282ffd
23
area_unix.go
23
area_unix.go
|
@ -7,6 +7,7 @@ package ui
|
||||||
import (
|
import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
"image"
|
"image"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// #cgo pkg-config: gtk+-3.0
|
// #cgo pkg-config: gtk+-3.0
|
||||||
|
@ -15,6 +16,8 @@ import (
|
||||||
// extern gboolean our_area_button_press_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
// extern gboolean our_area_button_press_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
||||||
// extern gboolean our_area_button_release_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
// extern gboolean our_area_button_release_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
||||||
// extern gboolean our_area_motion_notify_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
// extern gboolean our_area_motion_notify_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
||||||
|
// extern gboolean our_area_key_press_event_callback(GtkWidget *, GdkEvent *, gpointer);
|
||||||
|
// extern gboolean our_area_key_release_event_callback(GtkWidget *, GdkEvent *, 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"
|
||||||
|
@ -25,6 +28,8 @@ func gtkAreaNew() *gtkWidget {
|
||||||
// we need to explicitly subscribe to mouse events with GtkDrawingArea
|
// we need to explicitly subscribe to mouse events with GtkDrawingArea
|
||||||
C.gtk_widget_add_events(drawingarea,
|
C.gtk_widget_add_events(drawingarea,
|
||||||
C.GDK_BUTTON_PRESS_MASK | C.GDK_BUTTON_RELEASE_MASK | C.GDK_POINTER_MOTION_MASK | C.GDK_BUTTON_MOTION_MASK)
|
C.GDK_BUTTON_PRESS_MASK | C.GDK_BUTTON_RELEASE_MASK | C.GDK_POINTER_MOTION_MASK | C.GDK_BUTTON_MOTION_MASK)
|
||||||
|
// and we need to allow focusing on a GtkDrawingArea to enable keyboard events
|
||||||
|
C.gtk_widget_set_can_focus(drawingarea, C.TRUE)
|
||||||
scrollarea := C.gtk_scrolled_window_new((*C.GtkAdjustment)(nil), (*C.GtkAdjustment)(nil))
|
scrollarea := C.gtk_scrolled_window_new((*C.GtkAdjustment)(nil), (*C.GtkAdjustment)(nil))
|
||||||
// need a viewport because GtkDrawingArea isn't natively scrollable
|
// need a viewport because GtkDrawingArea isn't natively scrollable
|
||||||
C.gtk_scrolled_window_add_with_viewport((*C.GtkScrolledWindow)(unsafe.Pointer(scrollarea)), drawingarea)
|
C.gtk_scrolled_window_add_with_viewport((*C.GtkScrolledWindow)(unsafe.Pointer(scrollarea)), drawingarea)
|
||||||
|
@ -151,3 +156,21 @@ func our_area_motion_notify_event_callback(widget *C.GtkWidget, event *C.GdkEven
|
||||||
}
|
}
|
||||||
|
|
||||||
var area_motion_notify_event_callback = C.GCallback(C.our_area_motion_notify_event_callback)
|
var area_motion_notify_event_callback = C.GCallback(C.our_area_motion_notify_event_callback)
|
||||||
|
|
||||||
|
//export our_area_key_press_event_callback
|
||||||
|
func our_area_key_press_event_callback(widget *C.GtkWidget, event *C.GdkEvent, data C.gpointer) C.gboolean {
|
||||||
|
e := (*C.GdkEventKey)(unsafe.Pointer(event))
|
||||||
|
fmt.Printf("PRESS %#v\n", e)
|
||||||
|
return C.FALSE // TODO really false?
|
||||||
|
}
|
||||||
|
|
||||||
|
var area_key_press_event_callback = C.GCallback(C.our_area_key_press_event_callback)
|
||||||
|
|
||||||
|
//export our_area_key_release_event_callback
|
||||||
|
func our_area_key_release_event_callback(widget *C.GtkWidget, event *C.GdkEvent, data C.gpointer) C.gboolean {
|
||||||
|
e := (*C.GdkEventKey)(unsafe.Pointer(event))
|
||||||
|
fmt.Printf("RELEASE %#v\n", e)
|
||||||
|
return C.FALSE // TODO really false?
|
||||||
|
}
|
||||||
|
|
||||||
|
var area_key_release_event_callback = C.GCallback(C.our_area_key_release_event_callback)
|
||||||
|
|
|
@ -102,6 +102,8 @@ var classTypes = [nctypes]*classData{
|
||||||
"button-press-event": area_button_press_event_callback,
|
"button-press-event": area_button_press_event_callback,
|
||||||
"button-release-event": area_button_release_event_callback,
|
"button-release-event": area_button_release_event_callback,
|
||||||
"motion-notify-event": area_motion_notify_event_callback,
|
"motion-notify-event": area_motion_notify_event_callback,
|
||||||
|
"key-press-event": area_key_press_event_callback,
|
||||||
|
"key-release-event": area_key_release_event_callback,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue