neko/internal/desktop/xevent/xevent.go

85 lines
1.9 KiB
Go
Raw Normal View History

2021-01-11 03:55:29 +13:00
package xevent
/*
2021-01-12 03:57:14 +13:00
#cgo linux LDFLAGS: -lX11 -lXfixes
2021-01-11 03:55:29 +13:00
#include "xevent.h"
*/
import "C"
import (
2021-02-15 02:40:17 +13:00
"strings"
"time"
2021-01-11 03:55:29 +13:00
"unsafe"
"github.com/kataras/go-events"
)
2021-03-01 05:22:55 +13:00
var Emmiter events.EventEmmiter
var file_chooser_dialog_window uint32 = 0
2021-01-11 03:55:29 +13:00
func init() {
2021-03-01 05:22:55 +13:00
Emmiter = events.New()
2021-01-11 03:55:29 +13:00
}
func EventLoop(display string) {
displayUnsafe := C.CString(display)
defer C.free(unsafe.Pointer(displayUnsafe))
C.XEventLoop(displayUnsafe)
}
//export goXEventCursorChanged
func goXEventCursorChanged(event C.XFixesCursorNotifyEvent) {
2021-03-01 05:22:55 +13:00
Emmiter.Emit("cursor-changed", uint64(event.cursor_serial))
2021-01-11 03:55:29 +13:00
}
2021-01-12 03:30:53 +13:00
//export goXEventClipboardUpdated
func goXEventClipboardUpdated() {
2021-03-01 05:22:55 +13:00
Emmiter.Emit("clipboard-updated")
2021-01-12 03:30:53 +13:00
}
//export goXEventConfigureNotify
2021-02-01 03:01:46 +13:00
func goXEventConfigureNotify(display *C.Display, window C.Window, name *C.char, role *C.char) {
if C.GoString(role) != "GtkFileChooserDialog" {
return
}
// TODO: Refactor. Right now processing of this dialog relies on identifying
// via its name. When that changes to role, this condition should be removed.
if !strings.HasPrefix(C.GoString(name), "Open File") {
return
}
C.XFileChooserHide(display, window)
// Because first dialog is not put properly to background
time.Sleep(10 * time.Millisecond)
C.XFileChooserHide(display, window)
if file_chooser_dialog_window == 0 {
file_chooser_dialog_window = uint32(window)
2021-03-01 05:22:55 +13:00
Emmiter.Emit("file-chooser-dialog-opened")
}
2021-01-19 09:40:57 +13:00
}
//export goXEventUnmapNotify
func goXEventUnmapNotify(window C.Window) {
if uint32(window) != file_chooser_dialog_window {
return
}
file_chooser_dialog_window = 0
2021-03-01 05:22:55 +13:00
Emmiter.Emit("file-chooser-dialog-closed")
2021-01-12 12:09:43 +13:00
}
2021-01-11 03:55:29 +13:00
//export goXEventError
func goXEventError(event *C.XErrorEvent, message *C.char) {
2021-03-01 05:22:55 +13:00
Emmiter.Emit("event-error", uint8(event.error_code), C.GoString(message), uint8(event.request_code), uint8(event.minor_code))
2021-01-11 03:55:29 +13:00
}
//export goXEventActive
func goXEventActive() C.int {
return C.int(1)
}