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