muxed interactions with xserver, fix for #28?
This commit is contained in:
parent
3fc7737442
commit
2680a1f702
@ -1,23 +0,0 @@
|
|||||||
#include "clip.h"
|
|
||||||
|
|
||||||
#include <libclipboard.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
clipboard_c *CLIPBOARD = NULL;
|
|
||||||
|
|
||||||
clipboard_c *getClipboard(void) {
|
|
||||||
if (CLIPBOARD == NULL) {
|
|
||||||
CLIPBOARD = clipboard_new(NULL);
|
|
||||||
}
|
|
||||||
return CLIPBOARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_clipboard(char *src) {
|
|
||||||
clipboard_c *cb = getClipboard();
|
|
||||||
clipboard_set_text_ex(cb, src, strlen(src), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
char * get_clipboard() {
|
|
||||||
clipboard_c *cb = getClipboard();
|
|
||||||
return clipboard_text_ex(cb, NULL, 0);
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
// NOTE: I have no fucking clue what I'm doing with this,
|
|
||||||
// it works, but I am positive I'm doing this very wrong...
|
|
||||||
// should I be freeing these strings? does go cg them?
|
|
||||||
// pretty sure this *isn't* thread safe either.... /shrug
|
|
||||||
|
|
||||||
package clip
|
|
||||||
|
|
||||||
/*
|
|
||||||
#cgo linux LDFLAGS: -lclipboard
|
|
||||||
|
|
||||||
#include "clip.h"
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
func Read() string {
|
|
||||||
return C.GoString(C.get_clipboard())
|
|
||||||
}
|
|
||||||
|
|
||||||
func Write(data string) {
|
|
||||||
C.set_clipboard(C.CString(data))
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
#include <libclipboard.h>
|
|
||||||
|
|
||||||
clipboard_c *getClipboard(void);
|
|
||||||
void set_clipboard(char *src);
|
|
||||||
char * get_clipboard();
|
|
@ -1,5 +1,6 @@
|
|||||||
#include "hid.h"
|
#include "hid.h"
|
||||||
|
|
||||||
|
static clipboard_c *CLIPBOARD = NULL;
|
||||||
static Display *DISPLAY = NULL;
|
static Display *DISPLAY = NULL;
|
||||||
static char *NAME = ":0.0";
|
static char *NAME = ":0.0";
|
||||||
static int REGISTERED = 0;
|
static int REGISTERED = 0;
|
||||||
@ -32,6 +33,13 @@ Display *getXDisplay(void) {
|
|||||||
return DISPLAY;
|
return DISPLAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clipboard_c *getClipboard(void) {
|
||||||
|
if (CLIPBOARD == NULL) {
|
||||||
|
CLIPBOARD = clipboard_new(NULL);
|
||||||
|
}
|
||||||
|
return CLIPBOARD;
|
||||||
|
}
|
||||||
|
|
||||||
void closeXDisplay(void) {
|
void closeXDisplay(void) {
|
||||||
if (DISPLAY != NULL) {
|
if (DISPLAY != NULL) {
|
||||||
XCloseDisplay(DISPLAY);
|
XCloseDisplay(DISPLAY);
|
||||||
@ -92,3 +100,13 @@ void XKey(unsigned long key, int down) {
|
|||||||
XTestFakeKeyEvent(display, code, down, CurrentTime);
|
XTestFakeKeyEvent(display, code, down, CurrentTime);
|
||||||
XSync(display, 0);
|
XSync(display, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XClipboardSet(char *src) {
|
||||||
|
clipboard_c *cb = getClipboard();
|
||||||
|
clipboard_set_text_ex(cb, src, strlen(src), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *XClipboardGet() {
|
||||||
|
clipboard_c *cb = getClipboard();
|
||||||
|
return clipboard_text_ex(cb, NULL, 0);
|
||||||
|
}
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
|
// NOTE: I have no fucking clue what I'm doing with this,
|
||||||
|
// it works, but I am positive I'm doing this very wrong...
|
||||||
|
// should I be freeing these strings? does go cg them?
|
||||||
|
// pretty sure this *isn't* thread safe either.... /shrug
|
||||||
|
|
||||||
package hid
|
package hid
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#cgo linux CFLAGS: -I/usr/src
|
#cgo linux CFLAGS: -I/usr/src
|
||||||
#cgo linux LDFLAGS: -L/usr/src -lX11 -lXtst
|
#cgo linux LDFLAGS: -L/usr/src -lX11 -lXtst -lclipboard
|
||||||
|
|
||||||
#include "hid.h"
|
#include "hid.h"
|
||||||
*/
|
*/
|
||||||
@ -10,6 +15,7 @@ import "C"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"n.eko.moe/neko/internal/hid/keycode"
|
"n.eko.moe/neko/internal/hid/keycode"
|
||||||
@ -18,6 +24,7 @@ import (
|
|||||||
var debounce = make(map[int]time.Time)
|
var debounce = make(map[int]time.Time)
|
||||||
var buttons = make(map[int]keycode.Button)
|
var buttons = make(map[int]keycode.Button)
|
||||||
var keys = make(map[int]keycode.Key)
|
var keys = make(map[int]keycode.Key)
|
||||||
|
var mu = sync.Mutex{}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
keys[keycode.BACKSPACE.Code] = keycode.BACKSPACE
|
keys[keycode.BACKSPACE.Code] = keycode.BACKSPACE
|
||||||
@ -130,18 +137,30 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Display(display string) {
|
func Display(display string) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
C.setXDisplay(C.CString(display))
|
C.setXDisplay(C.CString(display))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Move(x, y int) {
|
func Move(x, y int) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
C.XMove(C.int(x), C.int(y))
|
C.XMove(C.int(x), C.int(y))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Scroll(x, y int) {
|
func Scroll(x, y int) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
C.XScroll(C.int(x), C.int(y))
|
C.XScroll(C.int(x), C.int(y))
|
||||||
}
|
}
|
||||||
|
|
||||||
func ButtonDown(code int) (*keycode.Button, error) {
|
func ButtonDown(code int) (*keycode.Button, error) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
button, ok := buttons[code]
|
button, ok := buttons[code]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("invalid button %v", code)
|
return nil, fmt.Errorf("invalid button %v", code)
|
||||||
@ -158,6 +177,9 @@ func ButtonDown(code int) (*keycode.Button, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func KeyDown(code int) (*keycode.Key, error) {
|
func KeyDown(code int) (*keycode.Key, error) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
key, ok := keys[code]
|
key, ok := keys[code]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("invalid key %v", code)
|
return nil, fmt.Errorf("invalid key %v", code)
|
||||||
@ -174,6 +196,9 @@ func KeyDown(code int) (*keycode.Key, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ButtonUp(code int) (*keycode.Button, error) {
|
func ButtonUp(code int) (*keycode.Button, error) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
button, ok := buttons[code]
|
button, ok := buttons[code]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("invalid button %v", code)
|
return nil, fmt.Errorf("invalid button %v", code)
|
||||||
@ -190,6 +215,9 @@ func ButtonUp(code int) (*keycode.Button, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func KeyUp(code int) (*keycode.Key, error) {
|
func KeyUp(code int) (*keycode.Key, error) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
key, ok := keys[code]
|
key, ok := keys[code]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("invalid key %v", code)
|
return nil, fmt.Errorf("invalid key %v", code)
|
||||||
@ -205,6 +233,20 @@ func KeyUp(code int) (*keycode.Key, error) {
|
|||||||
return &key, nil
|
return &key, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ReadClipboard() string {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
return C.GoString(C.XClipboardGet())
|
||||||
|
}
|
||||||
|
|
||||||
|
func WriteClipboard(data string) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
C.XClipboardSet(C.CString(data))
|
||||||
|
}
|
||||||
|
|
||||||
func Reset() {
|
func Reset() {
|
||||||
for key := range debounce {
|
for key := range debounce {
|
||||||
if key < 8 {
|
if key < 8 {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/extensions/XTest.h>
|
#include <X11/extensions/XTest.h>
|
||||||
|
#include <libclipboard.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h> /* For fputs() */
|
#include <stdio.h> /* For fputs() */
|
||||||
@ -16,20 +17,16 @@
|
|||||||
*
|
*
|
||||||
* Note that this is almost certainly not thread safe. */
|
* Note that this is almost certainly not thread safe. */
|
||||||
Display *getXDisplay(void);
|
Display *getXDisplay(void);
|
||||||
|
clipboard_c *getClipboard(void);
|
||||||
|
|
||||||
|
void XClipboardSet(char *src);
|
||||||
|
char *XClipboardGet();
|
||||||
void XMove(int x, int y);
|
void XMove(int x, int y);
|
||||||
void XScroll(int x, int y);
|
void XScroll(int x, int y);
|
||||||
void XButton(unsigned int button, int down);
|
void XButton(unsigned int button, int down);
|
||||||
void XKey(unsigned long key, int down);
|
void XKey(unsigned long key, int down);
|
||||||
|
|
||||||
void closeXDisplay(void);
|
void closeXDisplay(void);
|
||||||
#ifdef __cplusplus
|
void setXDisplay(char *input);
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
void setXDisplay(char *input);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package websocket
|
package websocket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"n.eko.moe/neko/internal/clip"
|
"n.eko.moe/neko/internal/hid"
|
||||||
"n.eko.moe/neko/internal/types"
|
"n.eko.moe/neko/internal/types"
|
||||||
"n.eko.moe/neko/internal/types/event"
|
"n.eko.moe/neko/internal/types/event"
|
||||||
"n.eko.moe/neko/internal/types/message"
|
"n.eko.moe/neko/internal/types/message"
|
||||||
@ -113,6 +113,6 @@ func (h *MessageHandler) controlClipboard(id string, session types.Session, payl
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
clip.Write(payload.Text)
|
hid.WriteClipboard(payload.Text)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
|
|
||||||
"n.eko.moe/neko/internal/clip"
|
"n.eko.moe/neko/internal/hid"
|
||||||
"n.eko.moe/neko/internal/types"
|
"n.eko.moe/neko/internal/types"
|
||||||
"n.eko.moe/neko/internal/types/config"
|
"n.eko.moe/neko/internal/types/config"
|
||||||
"n.eko.moe/neko/internal/types/event"
|
"n.eko.moe/neko/internal/types/event"
|
||||||
@ -81,7 +81,7 @@ func (ws *WebSocketHandler) Start() error {
|
|||||||
ws.logger.Info().Msg("shutdown")
|
ws.logger.Info().Msg("shutdown")
|
||||||
}()
|
}()
|
||||||
|
|
||||||
current := clip.Read()
|
current := hid.ReadClipboard()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@ -89,7 +89,7 @@ func (ws *WebSocketHandler) Start() error {
|
|||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
if ws.sessions.HasHost() {
|
if ws.sessions.HasHost() {
|
||||||
text := clip.Read()
|
text := hid.ReadClipboard()
|
||||||
if text != current {
|
if text != current {
|
||||||
session, ok := ws.sessions.GetHost()
|
session, ok := ws.sessions.GetHost()
|
||||||
if ok {
|
if ok {
|
||||||
|
Reference in New Issue
Block a user