Fix clipboard to work when catch all is set to false

This commit is contained in:
Allen Webster 2020-03-03 22:57:21 -08:00
parent 7933ec6bc9
commit 6749053db0
2 changed files with 60 additions and 51 deletions

View File

@ -1218,6 +1218,32 @@ linux_clipboard_send(XSelectionRequestEvent* req) {
XSendEvent(req->display, req->requestor, True, 0, (XEvent*)&rsp); XSendEvent(req->display, req->requestor, True, 0, (XEvent*)&rsp);
} }
internal String_Const_u8
linux_clipboard_recv(Arena *arena){
Atom type;
int fmt;
unsigned long nitems;
unsigned long bytes_left;
u8 *data;
int result = XGetWindowProperty(linuxvars.dpy,
linuxvars.win,
linuxvars.atom_CLIPBOARD,
0L, 0x20000000L, False,
linuxvars.atom_UTF8_STRING,
&type, &fmt, &nitems,
&bytes_left, &data);
String_Const_u8 clip = {};
if(result == Success && fmt == 8){
clip= push_string_copy(arena, SCu8(data, nitems));
XFree(data);
XDeleteProperty(linuxvars.dpy, linuxvars.win, linuxvars.atom_CLIPBOARD);
}
return(clip);
}
internal void internal void
linux_clipboard_recv(XSelectionEvent* ev) { linux_clipboard_recv(XSelectionEvent* ev) {
@ -1227,31 +1253,42 @@ linux_clipboard_recv(XSelectionEvent* ev) {
return; return;
} }
Atom type; Scratch_Block scratch(&linuxvars.tctx);
int fmt; String_Const_u8 clip = linux_clipboard_recv(scratch);
unsigned long nitems; if (clip.size > 0){
unsigned long bytes_left;
u8 *data;
int result = XGetWindowProperty(
linuxvars.dpy,
linuxvars.win,
linuxvars.atom_CLIPBOARD,
0L, 0x20000000L, False,
linuxvars.atom_UTF8_STRING,
&type, &fmt, &nitems,
&bytes_left, &data);
if(result == Success && fmt == 8){
linalloc_clear(linuxvars.clipboard_arena); linalloc_clear(linuxvars.clipboard_arena);
linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", nitems, data); linuxvars.clipboard_contents = push_string_copy(linuxvars.clipboard_arena, clip);
linuxvars.received_new_clipboard = true; linuxvars.received_new_clipboard = true;
XFree(data);
XDeleteProperty(linuxvars.dpy, linuxvars.win, linuxvars.atom_CLIPBOARD);
linux_schedule_step(); linux_schedule_step();
} }
} }
internal
system_get_clipboard_sig(){
// TODO(inso): index?
return(push_string_copy(arena, linuxvars.clipboard_contents));
}
internal void
system_post_clipboard(String_Const_u8 str, i32 index){
// TODO(inso): index?
//LINUX_FN_DEBUG("%.*s", string_expand(str));
linalloc_clear(linuxvars.clipboard_arena);
linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", str.size, str.str);
XSetSelectionOwner(linuxvars.dpy, linuxvars.atom_CLIPBOARD, linuxvars.win, CurrentTime);
}
internal void
system_set_clipboard_catch_all(b32 enabled){
LINUX_FN_DEBUG("%d", enabled);
linuxvars.clipboard_catch_all = !!enabled;
}
internal b32
system_get_clipboard_catch_all(void){
return linuxvars.clipboard_catch_all;
}
internal String_Const_u8 internal String_Const_u8
linux_filter_text(Arena* arena, u8* buf, int len) { linux_filter_text(Arena* arena, u8* buf, int len) {
u8* const result = push_array(arena, u8, len); u8* const result = push_array(arena, u8, len);
@ -1488,11 +1525,10 @@ linux_handle_x11_events() {
default: { default: {
// clipboard update notification - ask for the new content // clipboard update notification - ask for the new content
if (linuxvars.clipboard_catch_all && event.type == linuxvars.xfixes_selection_event) { if (event.type == linuxvars.xfixes_selection_event) {
XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&event; XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&event;
if (sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.win){ if (sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.win){
XConvertSelection( XConvertSelection(linuxvars.dpy,
linuxvars.dpy,
linuxvars.atom_CLIPBOARD, linuxvars.atom_CLIPBOARD,
linuxvars.atom_UTF8_STRING, linuxvars.atom_UTF8_STRING,
linuxvars.atom_CLIPBOARD, linuxvars.atom_CLIPBOARD,
@ -1768,10 +1804,10 @@ main(int argc, char **argv){
Application_Step_Input input = {}; Application_Step_Input input = {};
if (linuxvars.received_new_clipboard){ if (linuxvars.received_new_clipboard && linuxvars.clipboard_catch_all){
input.clipboard = linuxvars.clipboard_contents; input.clipboard = linuxvars.clipboard_contents;
linuxvars.received_new_clipboard = false;
} }
linuxvars.received_new_clipboard = false;
input.first_step = first_step; input.first_step = first_step;
input.dt = frame_useconds/1000000.f; // variable? input.dt = frame_useconds/1000000.f; // variable?

View File

@ -335,33 +335,6 @@ system_sleep(u64 microseconds){
nanosleep(&requested, &remaining); nanosleep(&requested, &remaining);
} }
internal String_Const_u8
system_get_clipboard(Arena* arena, i32 index){
// TODO(inso): index?
u8* ptr = push_array_write(arena, u8, linuxvars.clipboard_contents.size, linuxvars.clipboard_contents.str);
return SCu8(ptr, linuxvars.clipboard_contents.size);
}
internal void
system_post_clipboard(String_Const_u8 str, i32 index){
// TODO(inso): index?
//LINUX_FN_DEBUG("%.*s", string_expand(str));
linalloc_clear(linuxvars.clipboard_arena);
linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", str.size, str.str);
XSetSelectionOwner(linuxvars.dpy, linuxvars.atom_CLIPBOARD, linuxvars.win, CurrentTime);
}
internal void
system_set_clipboard_catch_all(b32 enabled){
LINUX_FN_DEBUG("%d", enabled);
linuxvars.clipboard_catch_all = !!enabled;
}
internal b32
system_get_clipboard_catch_all(void){
return linuxvars.clipboard_catch_all;
}
internal b32 internal b32
system_cli_call(Arena* scratch, char* path, char* script, CLI_Handles* cli_out){ system_cli_call(Arena* scratch, char* path, char* script, CLI_Handles* cli_out){
LINUX_FN_DEBUG("%s / %s", path, script); LINUX_FN_DEBUG("%s / %s", path, script);