diff -r a137277f9173 -r 77b09bb52ca0 ui/motif/toolkit.c --- a/ui/motif/toolkit.c Sat Apr 05 15:53:41 2014 +0200 +++ b/ui/motif/toolkit.c Sat Apr 05 18:41:30 2014 +0200 @@ -34,9 +34,11 @@ #include "stock.h" #include "../common/document.h" #include "../common/properties.h" +#include "../../ucx/buffer.h" static XtAppContext app; static Display *display; +static Widget active_window; static char *application_name; static ui_callback appclose_fnc; @@ -50,7 +52,7 @@ }; void ui_init(char *appname, int argc, char **argv) { - char *name = application_name ? application_name : "application"; + application_name = appname; XtToolkitInitialize(); XtSetLanguageProc(NULL, NULL, NULL); @@ -65,6 +67,10 @@ uic_load_app_properties(); } +char* ui_appname() { + return application_name; +} + Display* ui_get_display() { return display; } @@ -90,3 +96,70 @@ void ui_set_enabled(UIWIDGET widget, int enabled) { XtSetSensitive(widget, enabled); } + +void ui_clipboard_set(char *str) { + printf("copy: {%s}\n", str); + int length = strlen(str) + 1; + + Display *dp = XtDisplayOfObject(active_window); + Window window = XtWindowOfObject(active_window); + + XmString label = XmStringCreateLocalized("toolkit_clipboard"); + long id = 0; + + while(XmClipboardStartCopy( + dp, + window, + label, + CurrentTime, + NULL, + NULL, + &id) == ClipboardLocked); + XmStringFree(label); + + while(XmClipboardCopy( + dp, + window, + id, + "STRING", + str, + length, + 1, + NULL) == ClipboardLocked); + + while(XmClipboardEndCopy(dp, window, id) == ClipboardLocked); +} + +char* ui_clipboard_get() { + Display *dp = XtDisplayOfObject(active_window); + Window window = XtWindowOfObject(active_window); + + long id; + size_t size = 128; + char *buf = malloc(size); + + int r; + for(;;) { + r = XmClipboardRetrieve(dp, window, "STRING", buf, size, NULL, &id); + if(r == ClipboardSuccess) { + break; + } else if(r == ClipboardTruncate) { + size *= 2; + buf = realloc(buf, size); + } else if(r == ClipboardNoData) { + free(buf); + buf = NULL; + break; + } + } + + return buf; +} + +void ui_set_active_window(Widget w) { + active_window = w; +} + +Widget ui_get_active_window() { + return active_window; +}