1 /* $Id: test4.c,v 1.5 2000/12/30 22:03:43 amai Exp $ */
2
3 #include <stdlib.h>
4 #include <stdio.h>
5
6 #include <Xm/CutPaste.h>
7 #include <Xm/RowColumn.h>
8 #include <Xm/PushB.h>
9
10
11 Widget toplevel;
12 static void to_clipbd(), from_clipbd();
13
14 int
main(int argc,char ** argv)15 main(int argc, char **argv)
16 {
17 Widget rowcol, button;
18 XtAppContext app;
19
20 XtSetLanguageProc(NULL, NULL, NULL);
21
22 toplevel = XtVaAppInitialize(&app, "Demo", NULL, 0,
23 &argc, argv, NULL, NULL);
24
25 rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass,
26 toplevel, NULL);
27
28 button = XtVaCreateManagedWidget("button1", xmPushButtonWidgetClass,
29 rowcol, XtVaTypedArg, XmNlabelString,
30 XmRString, "Copy To Clipboard", 18,
31 NULL);
32
33 XtAddCallback(button, XmNactivateCallback, to_clipbd, NULL);
34
35 button = XtVaCreateManagedWidget("button2", xmPushButtonWidgetClass,
36 rowcol, XtVaTypedArg, XmNlabelString,
37 XmRString, "Retrieve From Clipboard", 24,
38 NULL);
39
40 XtAddCallback(button, XmNactivateCallback, from_clipbd, NULL);
41
42 XtManageChild(rowcol);
43 XtRealizeWidget(toplevel);
44
45 {
46 static XtWidgetGeometry Expected[] = {
47 CWWidth | CWHeight , 50, 50, 156, 59, 0,0,0, /* rowcol */
48 CWWidth | CWHeight | CWX | CWY, 3, 3, 150, 25, 0,0,0, /* button1 */
49 CWWidth | CWHeight | CWX | CWY, 3, 31, 150, 25, 0,0,0, /* button2 */
50 };
51 PrintDetails( toplevel ,Expected);
52 };
53 LessTifTestMainLoop( toplevel );
54 exit(0);
55 }
56
57 static void
copy_by_name(Widget w,int * data_id,int * private_id,int * reason)58 copy_by_name(Widget w, int *data_id, int *private_id, int *reason)
59 {
60 Display *dpy = XtDisplay(toplevel);
61 Window window = XtWindow(toplevel);
62 static int cnt;
63 int status;
64 char buf[32];
65
66 printf("Copy by name called\n\treason: %s, private_id: %d, data_id: %d\n",
67 *reason == XmCR_CLIPBOARD_DATA_REQUEST ? "request" : "delete",
68 *private_id, *data_id);
69
70 if (*reason == XmCR_CLIPBOARD_DATA_REQUEST) {
71 sprintf(buf, "stuff-%d", cnt++);
72
73 do {
74 status = XmClipboardCopyByName(dpy, window, *data_id,
75 buf, strlen(buf)+1,
76 *private_id = cnt);
77 } while (status != ClipboardSuccess);
78
79 printf("copied: %s to clipboard\n", buf);
80 }
81 }
82
83 static void
to_clipbd(Widget w,XtPointer client_data,XtPointer call_data)84 to_clipbd(Widget w, XtPointer client_data, XtPointer call_data)
85 {
86 long item_id = 0;
87 int status;
88 XmString clip_label;
89 Display *dpy = XtDisplayOfObject(toplevel);
90 Window window = XtWindowOfObject(toplevel);
91
92 clip_label = XmStringCreateLocalized("to_clipbd");
93
94 do {
95 #if XmVERSION >= 2
96 status = XmClipboardStartCopy(dpy, window, clip_label, CurrentTime, w,
97 copy_by_name, &item_id);
98 #else
99 status = XmClipboardBeginCopy(dpy, window, clip_label, w,
100 copy_by_name, &item_id);
101 #endif
102 } while (status == ClipboardLocked);
103
104 do {
105 status = XmClipboardCopy(dpy, window, item_id, "STRING",
106 NULL, 8L, 0, NULL);
107 } while (status == ClipboardLocked);
108
109 XmStringFree(clip_label);
110
111 do {
112 status = XmClipboardEndCopy(dpy, window, item_id);
113 } while (status == ClipboardLocked);
114
115 printf("started copy to clipboard\n");
116 }
117
118 static void
from_clipbd(Widget w,XtPointer client_data,XtPointer call_data)119 from_clipbd(Widget w, XtPointer client_data, XtPointer call_data)
120 {
121 int status;
122 unsigned total_bytes;
123 char *data, buf[32];
124 unsigned long recvd;
125 Display *dpy = XtDisplayOfObject(toplevel);
126 Window window = XtWindowOfObject(toplevel);
127
128 do {
129 status = XmClipboardStartRetrieve(dpy, window, CurrentTime);
130 } while (status == ClipboardLocked);
131
132 data = XtMalloc(1);
133 total_bytes = 1;
134
135 do {
136 buf[0] = 0;
137 status = XmClipboardRetrieve(dpy, window, "STRING",
138 buf, sizeof(buf), &recvd, NULL);
139
140 if (status == ClipboardNoData) {
141 printf("no data on clipboard\n");
142 break;
143 }
144
145 if (!(data = XtRealloc(data, total_bytes + recvd))) {
146 XtError("Can't allocate space for data");
147 break;
148 }
149
150 strncpy(&data[total_bytes-1], buf, recvd);
151 total_bytes += recvd;
152
153 } while (status == ClipboardTruncate);
154
155 data[total_bytes] = 0;
156
157 if (status == ClipboardSuccess)
158 printf("Retrieved '%s' from clipboard.\n", data);
159
160 status = XmClipboardEndRetrieve(dpy, window);
161 }
162
163