ui/motif/toolkit.c

changeset 27
77b09bb52ca0
parent 24
06bceda81a03
child 28
794a5c91c479
--- 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;
+}

mercurial