/* 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. */ /* inquire.c -- inquire about the data format of the data on the * clipboard. */ #include <Xm/Xm.h> #include <Xm/CutPaste.h> #include <Xm/RowColumn.h> #include <Xm/PushB.h> static void check_fmts(), add_fmt(); main(argc, argv) int argc; char *argv[]; { Widget toplevel, rowcol, button; XtAppContext app; XtSetLanguageProc (NULL, NULL, NULL); /* Initialize toolkit, application context and toplevel shell */ toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); /* manage two buttons in a RowColumn widget */ rowcol = XtVaCreateWidget ("rowcol", xmRowColumnWidgetClass, toplevel, NULL); /* button1 copies to the clipboard */ button = XtVaCreateManagedWidget ("button1", xmPushButtonWidgetClass, rowcol, XtVaTypedArg, XmNlabelString, XmRString, "Add Format", sizeof (char *), NULL); XtAddCallback (button, XmNactivateCallback, add_fmt, NULL); /* button2 checks the formats known */ button = XtVaCreateManagedWidget ("button2", xmPushButtonWidgetClass, rowcol, XtVaTypedArg, XmNlabelString, XmRString, "Check Known Formats", sizeof (char *), NULL); XtAddCallback (button, XmNactivateCallback, check_fmts, NULL); /* manage RowColumn, realize toplevel shell and start main loop */ XtManageChild (rowcol); XtRealizeWidget (toplevel); XtAppMainLoop (app); } static void add_fmt(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { unsigned long item_id, data_id; Display *dpy = XtDisplay (widget); Window window = XtWindow (widget); XmString label = XmStringCreateLocalized ("integer"); int status, ten = 10; /* register "INTEGER" with clipboard. */ if (XmClipboardRegisterFormat (dpy, "INTEGER", 32) == ClipboardFail) { XtWarning ("Can't register INTEGER"); return; } do status = XmClipboardStartCopy (dpy, window, label, CurrentTime, NULL, NULL, &item_id); while (status == ClipboardLocked); XmStringFree (label); do status = XmClipboardCopy (dpy, window, item_id, "INTEGER", (char *) &ten, sizeof (int), NULL, &data_id); while (status == ClipboardLocked); do status = XmClipboardEndCopy (dpy, window, item_id); while (status == ClipboardLocked); } static void check_fmts(widget, client_data, call_data) Widget widget; XtPointer client_data; XtPointer call_data; { Display *dpy = XtDisplay (widget); Window window = XtWindow (widget); char *fmt_str; int status, len = 1, i, count, maxlen; do status = XmClipboardInquireCount (dpy, window, &count, &maxlen); while (status == ClipboardLocked); printf ("#-formats: %d, strlen of longest format name: %d\n", count, maxlen); if (count == 0 || status != ClipboardSuccess || !(fmt_str = XtMalloc (maxlen+1))) { XtWarning ("Can't get clipboard formats"); return; } for (i = 1; i <= count; i++) { do status = XmClipboardInquireFormat (dpy, window, i, fmt_str, maxlen, &len); while (status == ClipboardLocked); fmt_str[len] = 0; printf ("Format %d: %s\n", i, fmt_str); } XtFree (fmt_str); }