From 34774e7829716b4ef7c0bf54db78193a55f0aa61 Mon Sep 17 00:00:00 2001 From: jacksonmj Date: Sat, 23 Apr 2011 00:20:56 +0100 Subject: Basic clipboard_push_text support for linux diff --git a/Makefile b/Makefile index 6b410a6..5ac4ae5 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ PYCOMMAND := $(PY_BIN) getheader.py CFLAGS := -w -std=c99 -D_POSIX_C_SOURCE=200112L -DLUACONSOLE -Iincludes/ OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations -LFLAGS := -lpthread -lSDL -lm -lbz2 -llua5.1 #-lpython$(PY_VERSION) -L$(PY_LIBPATH) -I$(PY_INCPATH) $(PY_LDFLAGS) +LFLAGS := -lpthread -lSDL -lm -lbz2 -lX11 -llua5.1 #-lpython$(PY_VERSION) -L$(PY_LIBPATH) -I$(PY_INCPATH) $(PY_LDFLAGS) LFLAGS_X := -lm -lbz2 -lSDLmain -I/Library/Frameworks/Python.framework/Versions/$(PY_VERSION)/include/python$(PY_VERSION) MFLAGS_SSE3 := -march=native -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=native -DX86 -DX86_SSE2 -msse2 diff --git a/includes/interface.h b/includes/interface.h index da1f30c..aff63e4 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -1,6 +1,9 @@ #ifndef INTERFACE_H #define INTERFACE_H #include +#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) +#include +#endif #include "graphics.h" struct menu_section @@ -130,6 +133,11 @@ typedef struct ui_richtext ui_richtext; int SLALT; extern SDLMod sdl_mod; extern int sdl_key, sdl_wheel, sdl_caps, sdl_ascii, sdl_zoom_trig; +#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) +extern SDL_SysWMinfo sdl_wminfo; +extern Atom XA_CLIPBOARD, XA_TARGETS; +#endif + extern char *shift_0; extern char *shift_1; extern int svf_messages; diff --git a/includes/misc.h b/includes/misc.h index 51d7b98..5c3a874 100644 --- a/includes/misc.h +++ b/includes/misc.h @@ -64,6 +64,8 @@ void clipboard_push_text(char * text); char * clipboard_pull_text(); +extern char *clipboard_text; + int register_extension(); int cpu_check(void); diff --git a/src/interface.c b/src/interface.c index 4105754..002d4c5 100644 --- a/src/interface.c +++ b/src/interface.c @@ -24,6 +24,10 @@ SDLMod sdl_mod; int sdl_key, sdl_wheel, sdl_caps=0, sdl_ascii, sdl_zoom_trig=0; +#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) +SDL_SysWMinfo sdl_wminfo; +Atom XA_CLIPBOARD, XA_TARGETS; +#endif char *shift_0="`1234567890-=[]\\;',./"; char *shift_1="~!@#$%^&*()_+{}|:\"<>?"; @@ -2255,6 +2259,50 @@ int sdl_poll(void) break; case SDL_QUIT: return 1; + case SDL_SYSWMEVENT: +#if (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) + if (event.syswm.msg->subsystem != SDL_SYSWM_X11) + break; + sdl_wminfo.info.x11.lock_func(); + XEvent xe = event.syswm.msg->event.xevent; + if (xe.type==SelectionClear) + { + if (clipboard_text!=NULL) { + free(clipboard_text); + clipboard_text = NULL; + } + } + else if (xe.type==SelectionRequest) + { + XEvent xr; + xr.xselection.type = SelectionNotify; + xr.xselection.requestor = xe.xselectionrequest.requestor; + xr.xselection.selection = xe.xselectionrequest.selection; + xr.xselection.target = xe.xselectionrequest.target; + xr.xselection.property = xe.xselectionrequest.property; + xr.xselection.time = xe.xselectionrequest.time; + if (xe.xselectionrequest.target==XA_TARGETS) + { + // send list of supported formats + Atom targets[] = {XA_TARGETS, XA_STRING}; + xr.xselection.property = xe.xselectionrequest.property; + XChangeProperty(sdl_wminfo.info.x11.display, xe.xselectionrequest.requestor, xe.xselectionrequest.property, XA_ATOM, 32, PropModeReplace, (unsigned char*)targets, (int)(sizeof(targets)/sizeof(Atom))); + } + // TODO: Supporting more targets would be nice + else if (xe.xselectionrequest.target==XA_STRING && clipboard_text) + { + XChangeProperty(sdl_wminfo.info.x11.display, xe.xselectionrequest.requestor, xe.xselectionrequest.property, xe.xselectionrequest.target, 8, PropModeReplace, clipboard_text, strlen(clipboard_text)+1); + } + else + { + // refuse clipboard request + xr.xselection.property = None; + } + XSendEvent(sdl_wminfo.info.x11.display, xe.xselectionrequest.requestor, 0, 0, &xr); + } + sdl_wminfo.info.x11.unlock_func(); +#endif + continue; } } sdl_mod = SDL_GetModState(); diff --git a/src/misc.c b/src/misc.c index cf0bd7c..ef4b281 100644 --- a/src/misc.c +++ b/src/misc.c @@ -20,6 +20,8 @@ #include #endif +char *clipboard_text = NULL; + //Signum function #if defined(WIN32) && !defined(__GNUC__) _inline int isign(float i) @@ -421,6 +423,16 @@ void clipboard_push_text(char * text) SetClipboardData(CF_TEXT, cbuffer); CloseClipboard(); } +#elif (defined(LIN32) || defined(LIN64)) && defined(SDL_VIDEO_DRIVER_X11) + if (clipboard_text!=NULL) { + free(clipboard_text); + clipboard_text = NULL; + } + clipboard_text = mystrdup(text); + sdl_wminfo.info.x11.lock_func(); + XSetSelectionOwner(sdl_wminfo.info.x11.display, XA_CLIPBOARD, sdl_wminfo.info.x11.window, CurrentTime); + XFlush(sdl_wminfo.info.x11.display); + sdl_wminfo.info.x11.unlock_func(); #else printf("Not implemented: put text on clipboard \"%s\"\n", text); #endif -- cgit v0.9.2-21-gd62e