/* Written by Dan Heller and Paula Ferguson.
* Copyright 1994, O'Reilly & Associates, Inc.
* Permission to use, copy, and modify this program without
* restriction is hereby granted, as long as this copyright
* notice appears in each copy of the program source code.
* This program is freely distributable without licensing fees and
* is provided without guarantee or warrantee expressed or implied.
* This program is -not- in the public domain.
*/
/* undo.c -- demonstrate undoing a clipboard copy */
#include <Xm/Xm.h>
#include <Xm/CutPaste.h>
#include <Xm/RowColumn.h>
#include <Xm/PushBG.h>
void
cut_to_clipboard(widget, client_data, call_data)
Widget widget;
XtPointer client_data;
XtPointer call_data;
{
unsigned long item_id = 0; /* clipboard item id */
int data_id = 0; /* clipboard data id */
int status = 0; /* clipboard status */
XmString clip_label;
char buf[32];
static int cnt;
Display *dpy = XtDisplayOfObject (widget);
Window window = XtWindowOfObject (widget);
char *data = (char *) client_data;
sprintf (buf, "%s %d", data, ++cnt);
printf ("Putting \"%s\" on clipboard\n", buf);
clip_label = XmStringCreateLocalized ("cut_to_clipboard");
/*
* start copy to clipboard, and continue till a sucessful start copy
* is made
*/
do
status = XmClipboardStartCopy (dpy, window,
clip_label, CurrentTime, NULL, NULL, &item_id);
while (status != ClipboardSuccess);
/*
* move the data to the clipboard, and continue till a sucessful copy
* is made
*/
do
status = XmClipboardCopy (dpy, window,
item_id, "STRING", buf, (long) strlen (buf) + 1, 0, &data_id);
while (status != ClipboardSuccess);
/*
* end the copy to the clipboard and continue till a sucessful end
* copy is made
*/
do
status = XmClipboardEndCopy (dpy, window, item_id);
while (status != ClipboardSuccess);
}
void
undo(widget, client_data, call_data)
Widget widget;
XtPointer client_data;
XtPointer call_data;
{
XmClipboardUndoCopy (XtDisplayOfObject (widget),
XtWindowOfObject (widget));
}
void
retrieve_from_clipboard(widget, client_data, call_data)
Widget widget;
XtPointer client_data;
XtPointer call_data;
{
int status;
char buf[32];
Display *dpy = XtDisplayOfObject (widget);
Window window = XtWindowOfObject (widget);
XmClipboardStartRetrieve (dpy, window, CurrentTime);
do {
status = XmClipboardRetrieve (dpy, window,
"STRING", buf, sizeof(buf), NULL, NULL);
printf ("Status = %s\n",
(status == ClipboardSuccess)? "success" :
(status == ClipboardLocked)? "locked" :
(status == ClipboardNoData)? "no data" :
(status == ClipboardTruncate)? "data truncated" :
(status == ClipboardFail)? "Failed" : "Bad Format");
if (status == ClipboardSuccess)
puts (buf);
} while (status != ClipboardSuccess);
XmClipboardEndRetrieve (dpy, window);
}
int main(argc, argv)
int argc;
char *argv[];
{
Widget toplevel, rowcol, button;
XtAppContext app;
XtSetLanguageProc (NULL, NULL, NULL);
toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0,
&argc, argv, NULL, NULL);
rowcol = XtVaCreateManagedWidget("rowcol",
xmRowColumnWidgetClass, toplevel,
NULL);
button = XtVaCreateManagedWidget("button1",
xmPushButtonGadgetClass, rowcol,
XtVaTypedArg, XmNlabelString, XmRString,
"Cut To Clipboard", sizeof (char *),
NULL);
XtAddCallback(button, XmNactivateCallback, cut_to_clipboard, "data");
button = XtVaCreateManagedWidget("button2",
xmPushButtonGadgetClass, rowcol,
XtVaTypedArg, XmNlabelString, XmRString,
"Undo Cut", sizeof (char *),
NULL);
XtAddCallback(button, XmNactivateCallback, undo, NULL);
button = XtVaCreateManagedWidget("retrieve",
xmPushButtonGadgetClass, rowcol,
XtVaTypedArg, XmNlabelString, XmRString,
"Retrieve From Clipboard", sizeof (char *),
NULL);
XtAddCallback(button, XmNactivateCallback, retrieve_from_clipboard, NULL);
XtRealizeWidget(toplevel);
XtAppMainLoop(app);
}