From c2aed4d9edcfedd0be71dffd742f937c38e381d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 19:12:57 -0300 Subject: [PATCH 01/15] Added XGrabKey --- xlib.go | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/xlib.go b/xlib.go index 8a1aabd..cd01f1e 100644 --- a/xlib.go +++ b/xlib.go @@ -1,14 +1,11 @@ - // Copyright 2016 Vitali Baumtrok // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE or copy at // http://www.boost.org/LICENSE_1_0.txt) - // Binding of Xlib (version 11, release 6.7). package xlib - // #cgo LDFLAGS: -lX11 // #include // #include @@ -21,19 +18,20 @@ import ( type Display C.Display type Screen C.Screen type Window C.Window +type Bool C.Bool -func strConcat ( a []interface{} ) string { +func strConcat(a []interface{}) string { str := "" for _, strPart := range a { switch s := strPart.(type) { - case string: - str += s + case string: + str += s } } return str } -func XOpenDisplay ( displayNameParts ...interface{} ) *Display { +func XOpenDisplay(displayNameParts ...interface{}) *Display { if len(displayNameParts) == 0 { display := C.XOpenDisplay(nil) return (*Display)(display) @@ -53,12 +51,12 @@ func XOpenDisplay ( displayNameParts ...interface{} ) *Display { } } -func XCloseDisplay ( display *Display ) { +func XCloseDisplay(display *Display) { displayC := (*C.Display)(display) C.XCloseDisplay(displayC) } -func XDisplayString ( display *Display ) string { +func XDisplayString(display *Display) string { displayC := (*C.Display)(display) displayNameC := C.XDisplayString(displayC) displayName := C.GoString(displayNameC) @@ -66,43 +64,43 @@ func XDisplayString ( display *Display ) string { return displayName } -func XScreenCount ( display *Display ) int { +func XScreenCount(display *Display) int { displayC := (*C.Display)(display) screenCount := C.XScreenCount(displayC) return int(screenCount) } -func XScreenOfDisplay ( display *Display, screenNumber int ) *Screen { +func XScreenOfDisplay(display *Display, screenNumber int) *Screen { displayC := (*C.Display)(display) screen := C.XScreenOfDisplay(displayC, C.int(screenNumber)) return (*Screen)(screen) } -func XWidthOfScreen ( screen *Screen ) int { +func XWidthOfScreen(screen *Screen) int { screenC := (*C.Screen)(screen) width := C.XWidthOfScreen(screenC) return int(width) } -func XHeightOfScreen ( screen *Screen ) int { +func XHeightOfScreen(screen *Screen) int { screenC := (*C.Screen)(screen) height := C.XHeightOfScreen(screenC) return int(height) } -func XDefaultScreenOfDisplay ( display *Display ) *Screen { +func XDefaultScreenOfDisplay(display *Display) *Screen { displayC := (*C.Display)(display) defaultScreen := C.XDefaultScreenOfDisplay(displayC) return (*Screen)(defaultScreen) } -func XRootWindowOfScreen ( screen *Screen ) Window { +func XRootWindowOfScreen(screen *Screen) Window { screenC := (*C.Screen)(screen) rootWindow := C.XRootWindowOfScreen(screenC) return Window(rootWindow) } -func XCreateSimpleWindow ( display *Display, parent Window, x, y int, width, height, borderWidth uint, border, background uint64) Window { +func XCreateSimpleWindow(display *Display, parent Window, x, y int, width, height, borderWidth uint, border, background uint64) Window { displayC := (*C.Display)(display) windowC := (C.Window)(parent) xC := C.int(x) @@ -116,16 +114,28 @@ func XCreateSimpleWindow ( display *Display, parent Window, x, y int, width, hei return Window(window) } -func XMapWindow ( display *Display, window Window) { +func XMapWindow(display *Display, window Window) { displayC := (*C.Display)(display) windowC := (C.Window)(window) C.XMapWindow(displayC, windowC) } -func XSelectInput ( display *Display, window Window, eventMask int64) { +func XSelectInput(display *Display, window Window, eventMask int64) { displayC := (*C.Display)(display) windowC := (C.Window)(window) eventMaskC := (C.long)(eventMask) - C.XSelectInput ( displayC, windowC, eventMaskC ) + C.XSelectInput(displayC, windowC, eventMaskC) } +func XGrabKey(display *Display, keycode int, modifiers int, grab_window Window, owner_events Bool, pointer_mode int, keyboard_mode int) int { + displayC := (*C.Display)(display) + keycodeC := (C.int)(keycode) + modifiersC := (C.uint)(modifiers) + grab_windowC := (C.Window)(grab_window) + owner_eventsC := (C.Bool)(owner_events) + pointer_modeC := (C.int)(pointer_mode) + keyboard_modeC := (C.int)(keyboard_mode) + status := C.XGrabKey(displayC, keycodeC, modifiersC, grab_windowC, owner_eventsC, pointer_modeC, keyboard_modeC) + return int(status) + +} From 12b468574c0cdad380c692854437b310fbe85306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 19:15:42 -0300 Subject: [PATCH 02/15] Fix module name --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 3758285..17c1a1a 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/vbsw/xlib +module github.com/daviseidel/xlib go 1.13 From f82a260f21993f457e9aa9141dac98eb4608dd2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 19:36:31 -0300 Subject: [PATCH 03/15] Changed go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 17c1a1a..f0d386f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/daviseidel/xlib -go 1.13 +go 1.18 From db0fb61ad45056aac9b36774b52f2d4ac23dd5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 19:50:27 -0300 Subject: [PATCH 04/15] Added more Xlib functions --- xlib.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/xlib.go b/xlib.go index cd01f1e..df31548 100644 --- a/xlib.go +++ b/xlib.go @@ -139,3 +139,41 @@ func XGrabKey(display *Display, keycode int, modifiers int, grab_window Window, return int(status) } + +func XRaiseWindow(display *Display, window Window) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + C.XRaiseWindow(displayC, windowC) +} + +func XGetWindowAttributes(display *Display, window Window) *C.XWindowAttributes { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + windowAttributes := new(C.XWindowAttributes) + C.XGetWindowAttributes(displayC, windowC, windowAttributes) + return windowAttributes +} + +func XMoveResizeWindow(display *Display, window Window, x, y int, width, height uint) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + xC := (C.int)(x) + yC := (C.int)(y) + widthC := (C.uint)(width) + heightC := (C.uint)(height) + C.XMoveResizeWindow(displayC, windowC, xC, yC, widthC, heightC) +} + +func XKeysymToKeycode(display *Display, keysym uint64) int { + displayC := (*C.Display)(display) + keysymC := (C.KeySym)(keysym) + keycode := C.XKeysymToKeycode(displayC, keysymC) + return int(keycode) +} + +func XStringToKeysym(string string) uint64 { + stringC := C.CString(string) + keysym := C.XStringToKeysym(stringC) + C.free(unsafe.Pointer(stringC)) + return uint64(keysym) +} From da4601fa66b29e10ca8399db3d095329e575d12e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 19:56:30 -0300 Subject: [PATCH 05/15] Added Window Atributes --- xlib.go | 1 + 1 file changed, 1 insertion(+) diff --git a/xlib.go b/xlib.go index df31548..a887551 100644 --- a/xlib.go +++ b/xlib.go @@ -19,6 +19,7 @@ type Display C.Display type Screen C.Screen type Window C.Window type Bool C.Bool +type XWindowAttributes C.XWindowAttributes func strConcat(a []interface{}) string { str := "" From 2b8f9ed24e9490a276b75aae978b69acef093f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 20:06:17 -0300 Subject: [PATCH 06/15] Added Window Atributes --- xlib.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xlib.go b/xlib.go index a887551..7e06a58 100644 --- a/xlib.go +++ b/xlib.go @@ -19,7 +19,7 @@ type Display C.Display type Screen C.Screen type Window C.Window type Bool C.Bool -type XWindowAttributes C.XWindowAttributes +type WindowAttributes C.XWindowAttributes func strConcat(a []interface{}) string { str := "" From d0b16782ca6ca0648aa280c0159d7bd114fe44ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 21:11:14 -0300 Subject: [PATCH 07/15] Added GrabModeSync and Async --- events.go | 90 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/events.go b/events.go index 0a568da..9d42d63 100644 --- a/events.go +++ b/events.go @@ -1,23 +1,18 @@ - // Copyright 2016 Vitali Baumtrok // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE or copy at // http://www.boost.org/LICENSE_1_0.txt) - // Binding of Xlib (version 11, release 6.7). package xlib - // #cgo LDFLAGS: -lX11 // #include // #include // #include "xlib.h" import "C" -import ( - //"unsafe" -) +//"unsafe" const ( Expose = int(C.Expose) @@ -52,6 +47,8 @@ const ( PropertyChangeMask = int64(C.PropertyChangeMask) ColormapChangeMask = int64(C.ColormapChangeMask) OwnerGrabButtonMask = int64(C.OwnerGrabButtonMask) + GrabModeSync = int64(C.GrabModeSync) + GrabModeAsync = int64(C.GrabModeAsync) ) type XEvent interface { @@ -64,53 +61,70 @@ type tEventType struct { type XKeyEvent struct { tEventType - Serial uint64 - SendEvent bool - Display *Display - Window Window - Root Window - Subwindow Window - Time uint64 - X, Y int + Serial uint64 + SendEvent bool + Display *Display + Window Window + Root Window + Subwindow Window + Time uint64 + X, Y int XRoot, YRoot int - State uint - KeyCode uint - SameScreen bool + State uint + KeyCode uint + SameScreen bool } -func XNextEvent ( display *Display ) XEvent { +func XNextEvent(display *Display) XEvent { displayC := (*C.Display)(display) var xeventC C.XEvent var xeventTypeC C.int - C.XNextEvent(displayC,&xeventC) - C.xlib_xevent_type(&xeventC,&xeventTypeC) + C.XNextEvent(displayC, &xeventC) + C.xlib_xevent_type(&xeventC, &xeventTypeC) switch xeventTypeC { - case C.KeyPress: - return newXKeyEvent(&xeventC,xeventTypeC) - case C.KeyRelease: - return newXKeyEvent(&xeventC,xeventTypeC) + case C.KeyPress: + return newXKeyEvent(&xeventC, xeventTypeC) + case C.KeyRelease: + return newXKeyEvent(&xeventC, xeventTypeC) } return nil } -func newXKeyEvent ( xeventC *C.XEvent, xeventTypeC C.int ) *XKeyEvent { +func newXKeyEvent(xeventC *C.XEvent, xeventTypeC C.int) *XKeyEvent { xKeyEvent := new(XKeyEvent) - var serialC C.ulong; var sendEventC C.Bool; var displayC *C.Display; var windowC C.Window - var rootC C.Window; var subwindowC C.Window; var timeC C.Time; var xC, yC C.int - var xRootC, yRootC C.int; var stateC C.uint; var keyCodeC C.uint; var sameScreenC C.Bool - C.xlib_xkeyevent_values(xeventC,&serialC,&sendEventC,&displayC,&windowC,&rootC,&subwindowC, - &timeC,&xC,&yC,&xRootC,&yRootC,&stateC,&keyCodeC,&sameScreenC) - xKeyEvent.typeCode = int(xeventTypeC); xKeyEvent.Serial = uint64(serialC) - xKeyEvent.SendEvent = (sendEventC != 0); xKeyEvent.Display = (*Display)(displayC) - xKeyEvent.Window = Window(windowC); xKeyEvent.Root = Window(rootC) - xKeyEvent.Subwindow = Window(subwindowC); xKeyEvent.Time = uint64(timeC) - xKeyEvent.X = int(xC); xKeyEvent.Y = int(yC); xKeyEvent.XRoot = int(xRootC); xKeyEvent.YRoot = int(yRootC) - xKeyEvent.State = uint(stateC); xKeyEvent.KeyCode = uint(keyCodeC); xKeyEvent.SameScreen = (sameScreenC != 0) + var serialC C.ulong + var sendEventC C.Bool + var displayC *C.Display + var windowC C.Window + var rootC C.Window + var subwindowC C.Window + var timeC C.Time + var xC, yC C.int + var xRootC, yRootC C.int + var stateC C.uint + var keyCodeC C.uint + var sameScreenC C.Bool + C.xlib_xkeyevent_values(xeventC, &serialC, &sendEventC, &displayC, &windowC, &rootC, &subwindowC, + &timeC, &xC, &yC, &xRootC, &yRootC, &stateC, &keyCodeC, &sameScreenC) + xKeyEvent.typeCode = int(xeventTypeC) + xKeyEvent.Serial = uint64(serialC) + xKeyEvent.SendEvent = (sendEventC != 0) + xKeyEvent.Display = (*Display)(displayC) + xKeyEvent.Window = Window(windowC) + xKeyEvent.Root = Window(rootC) + xKeyEvent.Subwindow = Window(subwindowC) + xKeyEvent.Time = uint64(timeC) + xKeyEvent.X = int(xC) + xKeyEvent.Y = int(yC) + xKeyEvent.XRoot = int(xRootC) + xKeyEvent.YRoot = int(yRootC) + xKeyEvent.State = uint(stateC) + xKeyEvent.KeyCode = uint(keyCodeC) + xKeyEvent.SameScreen = (sameScreenC != 0) return xKeyEvent } -func (this *tEventType) Type ( ) int { +func (this *tEventType) Type() int { return this.typeCode } - From b44f96f41c3e583999fdfc447d4af30e4e722c1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 21:14:39 -0300 Subject: [PATCH 08/15] Fixed int type GrabMode --- events.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/events.go b/events.go index 9d42d63..939671b 100644 --- a/events.go +++ b/events.go @@ -47,8 +47,8 @@ const ( PropertyChangeMask = int64(C.PropertyChangeMask) ColormapChangeMask = int64(C.ColormapChangeMask) OwnerGrabButtonMask = int64(C.OwnerGrabButtonMask) - GrabModeSync = int64(C.GrabModeSync) - GrabModeAsync = int64(C.GrabModeAsync) + GrabModeSync = int(C.GrabModeSync) + GrabModeAsync = int(C.GrabModeAsync) ) type XEvent interface { From b60a26dc39db11b9f0dbd67a07db942ca000006d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Thu, 28 Dec 2023 21:29:42 -0300 Subject: [PATCH 09/15] Updated Events --- events.go | 6 ++++-- xlib.go | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/events.go b/events.go index 939671b..af4947d 100644 --- a/events.go +++ b/events.go @@ -12,8 +12,6 @@ package xlib // #include "xlib.h" import "C" -//"unsafe" - const ( Expose = int(C.Expose) KeyPress = int(C.KeyPress) @@ -49,6 +47,10 @@ const ( OwnerGrabButtonMask = int64(C.OwnerGrabButtonMask) GrabModeSync = int(C.GrabModeSync) GrabModeAsync = int(C.GrabModeAsync) + Mod1Mask = int64(C.Mod1Mask) + Mod2Mask = int64(C.Mod2Mask) + Mod3Mask = int64(C.Mod3Mask) + Mod4Mask = int64(C.Mod4Mask) ) type XEvent interface { diff --git a/xlib.go b/xlib.go index 7e06a58..1c4a71e 100644 --- a/xlib.go +++ b/xlib.go @@ -20,6 +20,7 @@ type Screen C.Screen type Window C.Window type Bool C.Bool type WindowAttributes C.XWindowAttributes +type Cursor C.Cursor func strConcat(a []interface{}) string { str := "" @@ -178,3 +179,18 @@ func XStringToKeysym(string string) uint64 { C.free(unsafe.Pointer(stringC)) return uint64(keysym) } + +func XGrabButton(display *Display, button int, modifiers int, grab_window Window, owner_events Bool, event_mask int64, pointer_mode int, keyboard_mode int, confine_to Window, cursor Cursor) int { + displayC := (*C.Display)(display) + buttonC := (C.uint)(button) + modifiersC := (C.uint)(modifiers) + grab_windowC := (C.Window)(grab_window) + owner_eventsC := (C.Bool)(owner_events) + event_maskC := (C.uint)(event_mask) + pointer_modeC := (C.int)(pointer_mode) + keyboard_modeC := (C.int)(keyboard_mode) + confine_toC := (C.Window)(confine_to) + cursorC := (C.Cursor)(cursor) + status := C.XGrabButton(displayC, buttonC, modifiersC, grab_windowC, owner_eventsC, event_maskC, pointer_modeC, keyboard_modeC, confine_toC, cursorC) + return int(status) +} From 6719afaf8d4a5060a745f345203c65d20d80bcea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= Date: Fri, 29 Dec 2023 18:47:06 -0300 Subject: [PATCH 10/15] Added multiple event types and methods --- events.go | 45 +++++++++-- xlib.go | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 267 insertions(+), 6 deletions(-) diff --git a/events.go b/events.go index af4947d..d3fd19e 100644 --- a/events.go +++ b/events.go @@ -19,6 +19,7 @@ const ( ) const ( + // All Event masks. NoEventMask = int64(C.NoEventMask) KeyPressMask = int64(C.KeyPressMask) KeyReleaseMask = int64(C.KeyReleaseMask) @@ -47,10 +48,37 @@ const ( OwnerGrabButtonMask = int64(C.OwnerGrabButtonMask) GrabModeSync = int(C.GrabModeSync) GrabModeAsync = int(C.GrabModeAsync) - Mod1Mask = int64(C.Mod1Mask) - Mod2Mask = int64(C.Mod2Mask) - Mod3Mask = int64(C.Mod3Mask) - Mod4Mask = int64(C.Mod4Mask) + Mod1Mask = int(C.Mod1Mask) + Mod2Mask = int(C.Mod2Mask) + Mod3Mask = int(C.Mod3Mask) + Mod4Mask = int(C.Mod4Mask) + Mod5Mask = int(C.Mod5Mask) + ShiftMask = int(C.ShiftMask) + LockMask = int(C.LockMask) + ControlMask = int(C.ControlMask) + AnyModifier = int(C.AnyModifier) + Button1Mask = int(C.Button1Mask) + Button2Mask = int(C.Button2Mask) + Button3Mask = int(C.Button3Mask) + Button4Mask = int(C.Button4Mask) + Button5Mask = int(C.Button5Mask) + ShiftMapIndex = int(C.ShiftMapIndex) + LockMapIndex = int(C.LockMapIndex) + ControlMapIndex = int(C.ControlMapIndex) + Mod1MapIndex = int(C.Mod1MapIndex) + Mod2MapIndex = int(C.Mod2MapIndex) + Mod3MapIndex = int(C.Mod3MapIndex) + Mod4MapIndex = int(C.Mod4MapIndex) + Mod5MapIndex = int(C.Mod5MapIndex) + PointerWindow = int(C.PointerWindow) + InputFocus = int(C.InputFocus) + PointerRoot = int(C.PointerRoot) + AnyPropertyType = int(C.AnyPropertyType) + AnyKey = int(C.AnyKey) + AnyButton = int(C.AnyButton) + AllTemporary = int(C.AllTemporary) + CurrentTime = int(C.CurrentTime) + NoSymbol = int(C.NoSymbol) ) type XEvent interface { @@ -127,6 +155,11 @@ func newXKeyEvent(xeventC *C.XEvent, xeventTypeC C.int) *XKeyEvent { return xKeyEvent } -func (this *tEventType) Type() int { - return this.typeCode +func XNextRequest(display *Display) uint64 { + displayC := (*C.Display)(display) + return uint64(C.XNextRequest(displayC)) +} + +func (ev *tEventType) Type() int { + return ev.typeCode } diff --git a/xlib.go b/xlib.go index 1c4a71e..2e787ef 100644 --- a/xlib.go +++ b/xlib.go @@ -194,3 +194,231 @@ func XGrabButton(display *Display, button int, modifiers int, grab_window Window status := C.XGrabButton(displayC, buttonC, modifiersC, grab_windowC, owner_eventsC, event_maskC, pointer_modeC, keyboard_modeC, confine_toC, cursorC) return int(status) } + +func XDefaultRootWindow(display *Display) Window { + displayC := (*C.Display)(display) + rootWindow := C.XDefaultRootWindow(displayC) + return Window(rootWindow) +} + +func XUngrabKey(display *Display, keycode int, modifiers int, grab_window Window) { + displayC := (*C.Display)(display) + keycodeC := (C.int)(keycode) + modifiersC := (C.uint)(modifiers) + grab_windowC := (C.Window)(grab_window) + C.XUngrabKey(displayC, keycodeC, modifiersC, grab_windowC) +} + +func XUngrabButton(display *Display, button int, modifiers int, grab_window Window) { + displayC := (*C.Display)(display) + buttonC := (C.uint)(button) + modifiersC := (C.uint)(modifiers) + grab_windowC := (C.Window)(grab_window) + C.XUngrabButton(displayC, buttonC, modifiersC, grab_windowC) +} + +func XGrabPointer(display *Display, grab_window Window, owner_events Bool, event_mask int64, pointer_mode int, keyboard_mode int, confine_to Window, cursor Cursor, time uint64) int { + displayC := (*C.Display)(display) + grab_windowC := (C.Window)(grab_window) + owner_eventsC := (C.Bool)(owner_events) + event_maskC := (C.uint)(event_mask) + pointer_modeC := (C.int)(pointer_mode) + keyboard_modeC := (C.int)(keyboard_mode) + confine_toC := (C.Window)(confine_to) + cursorC := (C.Cursor)(cursor) + timeC := (C.Time)(time) + status := C.XGrabPointer(displayC, grab_windowC, owner_eventsC, event_maskC, pointer_modeC, keyboard_modeC, confine_toC, cursorC, timeC) + return int(status) +} + +func XUngrabPointer(display *Display, time uint64) { + displayC := (*C.Display)(display) + timeC := (C.Time)(time) + C.XUngrabPointer(displayC, timeC) +} + +func XWarpPointer(display *Display, src_window Window, dest_window Window, src_x, src_y int, src_width, src_height uint, dest_x, dest_y int) { + displayC := (*C.Display)(display) + src_windowC := (C.Window)(src_window) + dest_windowC := (C.Window)(dest_window) + src_xC := (C.int)(src_x) + src_yC := (C.int)(src_y) + src_widthC := (C.uint)(src_width) + src_heightC := (C.uint)(src_height) + dest_xC := (C.int)(dest_x) + dest_yC := (C.int)(dest_y) + C.XWarpPointer(displayC, src_windowC, dest_windowC, src_xC, src_yC, src_widthC, src_heightC, dest_xC, dest_yC) +} + +func XQueryPointer(display *Display, window Window) (root_return Window, child_return Window, root_x_return, root_y_return, win_x_return, win_y_return int, mask_return uint) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + var root_returnC C.Window + var child_returnC C.Window + var root_x_returnC C.int + var root_y_returnC C.int + var win_x_returnC C.int + var win_y_returnC C.int + var mask_returnC C.uint + C.XQueryPointer(displayC, windowC, &root_returnC, &child_returnC, &root_x_returnC, &root_y_returnC, &win_x_returnC, &win_y_returnC, &mask_returnC) + root_return = Window(root_returnC) + child_return = Window(child_returnC) + root_x_return = int(root_x_returnC) + root_y_return = int(root_y_returnC) + win_x_return = int(win_x_returnC) + win_y_return = int(win_y_returnC) + mask_return = uint(mask_returnC) + return +} + +func XUnmapWindow(display *Display, window Window) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + C.XUnmapWindow(displayC, windowC) +} + +func XDestroyWindow(display *Display, window Window) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + C.XDestroyWindow(displayC, windowC) +} + +func XFree(data unsafe.Pointer) { + C.XFree(data) +} + +func XFlush(display *Display) { + displayC := (*C.Display)(display) + C.XFlush(displayC) +} + +func XStoreName(display *Display, window Window, name string) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + nameC := C.CString(name) + C.XStoreName(displayC, windowC, nameC) + C.free(unsafe.Pointer(nameC)) +} + +func XCreateFontCursor(display *Display, shape uint) Cursor { + displayC := (*C.Display)(display) + shapeC := (C.uint)(shape) + cursor := C.XCreateFontCursor(displayC, shapeC) + return Cursor(cursor) +} + +func XDefineCursor(display *Display, window Window, cursor Cursor) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + cursorC := (C.Cursor)(cursor) + C.XDefineCursor(displayC, windowC, cursorC) +} + +func XUndefineCursor(display *Display, window Window) { + displayC := (*C.Display)(display) + windowC := (C.Window)(window) + C.XUndefineCursor(displayC, windowC) +} + +func XCreateGC(display *Display, drawable Window, mask uint64, values *C.XGCValues) C.GC { + displayC := (*C.Display)(display) + drawableC := (C.Drawable)(drawable) + gc := C.XCreateGC(displayC, drawableC, C.ulong(mask), values) + return gc +} + +func XFreeGC(display *Display, gc C.GC) { + displayC := (*C.Display)(display) + C.XFreeGC(displayC, gc) +} + +func XSetForeground(display *Display, gc C.GC, foreground uint64) { + displayC := (*C.Display)(display) + foregroundC := (C.ulong)(foreground) + C.XSetForeground(displayC, gc, foregroundC) +} + +func XSetBackground(display *Display, gc C.GC, background uint64) { + displayC := (*C.Display)(display) + backgroundC := (C.ulong)(background) + C.XSetBackground(displayC, gc, backgroundC) +} + +func XSetLineAttributes(display *Display, gc C.GC, line_width uint, line_style int, cap_style int, join_style int) { + displayC := (*C.Display)(display) + line_widthC := (C.uint)(line_width) + line_styleC := (C.int)(line_style) + cap_styleC := (C.int)(cap_style) + join_styleC := (C.int)(join_style) + C.XSetLineAttributes(displayC, gc, line_widthC, line_styleC, cap_styleC, join_styleC) +} + +func XDrawLine(display *Display, drawable Window, gc C.GC, x1, y1, x2, y2 int) { + displayC := (*C.Display)(display) + drawableC := (C.Drawable)(drawable) + x1C := (C.int)(x1) + y1C := (C.int)(y1) + x2C := (C.int)(x2) + y2C := (C.int)(y2) + C.XDrawLine(displayC, drawableC, gc, x1C, y1C, x2C, y2C) +} + +func XDrawRectangle(display *Display, drawable Window, gc C.GC, x, y int, width, height uint) { + displayC := (*C.Display)(display) + drawableC := (C.Drawable)(drawable) + xC := (C.int)(x) + yC := (C.int)(y) + widthC := (C.uint)(width) + heightC := (C.uint)(height) + C.XDrawRectangle(displayC, drawableC, gc, xC, yC, widthC, heightC) +} + +func XFillRectangle(display *Display, drawable Window, gc C.GC, x, y int, width, height uint) { + displayC := (*C.Display)(display) + drawableC := (C.Drawable)(drawable) + xC := (C.int)(x) + yC := (C.int)(y) + widthC := (C.uint)(width) + heightC := (C.uint)(height) + C.XFillRectangle(displayC, drawableC, gc, xC, yC, widthC, heightC) +} + +func XQlength(display *Display) int { + displayC := (*C.Display)(display) + length := C.XQLength(displayC) + return int(length) +} + +func XRootWindow(display *Display, screenNumber int) Window { + displayC := (*C.Display)(display) + screenNumberC := (C.int)(screenNumber) + rootWindow := C.XRootWindow(displayC, screenNumberC) + return Window(rootWindow) +} + +func XServerVendor(display *Display) string { + displayC := (*C.Display)(display) + serverVendorC := C.XServerVendor(displayC) + serverVendor := C.GoString(serverVendorC) + C.free(unsafe.Pointer(serverVendorC)) + return serverVendor +} + +func XVendorRelease(display *Display) int { + displayC := (*C.Display)(display) + vendorRelease := C.XVendorRelease(displayC) + return int(vendorRelease) +} + +func XDefaultScreen(display *Display) int { + displayC := (*C.Display)(display) + screenNumber := C.XDefaultScreen(displayC) + return int(screenNumber) +} + +func XDefaultDepth(display *Display, screenNumber int) int { + displayC := (*C.Display)(display) + screenNumberC := (C.int)(screenNumber) + depth := C.XDefaultDepth(displayC, screenNumberC) + return int(depth) +} From 4f0baa0530959b1cf753854f5996e565ad70dfc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= <81316663+daviseidel@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:25:24 -0300 Subject: [PATCH 11/15] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 339f686..cead9f4 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ ## About Xlib Binding is a binding of Xlib (version 11, release 6.7) for the programming language Go. -Xlib Binding is published at . +This is a more complete fork of the one by vbsw: . ## Copyright Copyright 2016 Vitali Baumtrok (vbsw@mailbox.org) +Copyright 2023 Davi Seidel (daviseidel.brandao@gmail.com) Xlib Binding is distributed under the terms of the Boost Software License, version 1.0. (See accompanying file LICENSE or copy at ) From acb57b0d531bef29d9c9c8f3721cdc578ee3dd0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= <81316663+daviseidel@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:26:14 -0300 Subject: [PATCH 12/15] Update godoc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cead9f4..6c858e4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Xlib Binding -[![GoDoc](https://godoc.org/github.com/vbsw/xlib?status.svg)](https://godoc.org/github.com/vbsw/xlib) +[![GoDoc](https://godoc.org/github.com/vbsw/xlib?status.svg)](https://godoc.org/github.com/daviseidel/xlib) ## About Xlib Binding is a binding of Xlib (version 11, release 6.7) for the programming language Go. From 752d6f1101978e0829f04a38a69d79ce1e776393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= <81316663+daviseidel@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:35:27 -0300 Subject: [PATCH 13/15] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6c858e4..a52c4c6 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ This is a more complete fork of the one by vbsw: . ## Copyright Copyright 2016 Vitali Baumtrok (vbsw@mailbox.org) + Copyright 2023 Davi Seidel (daviseidel.brandao@gmail.com) Xlib Binding is distributed under the terms of the Boost Software License, version 1.0. From a8956fe1cfc8faea45ee848060e3fd5c3ab7e889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= <81316663+daviseidel@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:36:13 -0300 Subject: [PATCH 14/15] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a52c4c6..db389b9 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ Xlib Binding is a binding of Xlib (version 11, release 6.7) for the programming This is a more complete fork of the one by vbsw: . ## Copyright -Copyright 2016 Vitali Baumtrok (vbsw@mailbox.org) - Copyright 2023 Davi Seidel (daviseidel.brandao@gmail.com) +Copyright 2016 Vitali Baumtrok (vbsw@mailbox.org) + Xlib Binding is distributed under the terms of the Boost Software License, version 1.0. (See accompanying file LICENSE or copy at ) From 297eca7904b7192c88a5a8405c95e58f9e5aef59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davi=20Seidel=20Brand=C3=A3o?= <81316663+daviseidel@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:37:21 -0300 Subject: [PATCH 15/15] Create go.yml Add a workflow for testing --- .github/workflows/go.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/go.yml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..0065213 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,28 @@ +# This workflow will build a golang project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go + +name: Go + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.20' + + - name: Build + run: go build -v ./... + + - name: Test + run: go test -v ./...