Blame tests/UTM/UTMtransfer.c

Packit b099d7
/* $TOG: UTMtransfer.c /main/6 1999/11/17 12:49:22 jff $ */
Packit b099d7
/*
Packit b099d7
 *  @OSF_COPRIGHT@
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <testlib.h>
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Xm/XmP.h>           /* Motif Toolkit */
Packit b099d7
#include "UTMtransfer.h"
Packit b099d7
Packit b099d7
/* Internal functions */
Packit b099d7
static void SetModeCB(Widget widget, XtPointer client_data, 
Packit b099d7
		      XtPointer call_data);
Packit b099d7
static void CutCB(Widget widget, XtPointer client_data, XtPointer call_data);
Packit b099d7
static void CopyCB(Widget widget, XtPointer client_data, XtPointer call_data);
Packit b099d7
static void PasteCB(Widget widget, XtPointer client_data,XtPointer call_data); 
Packit b099d7
static void PasteMoveCB(Widget widget, XtPointer client_data, 
Packit b099d7
			XtPointer call_data);
Packit b099d7
static void InputCB(Widget w, XtPointer client_data, XtPointer call_data);
Packit b099d7
static int ErrorHandler(Display *display, XErrorEvent *event);
Packit b099d7
Packit b099d7
/* String to use for Clipboard tagging */
Packit b099d7
XmString generic_label;
Packit b099d7
Packit b099d7
/* This tracks which transfer selection we're using.  Drag and drop isn't
Packit b099d7
   listed since it is dynamic,  we don't take ownership of DnD */
Packit b099d7
TransferMode Tmode = Mprimary;
Packit b099d7
Packit b099d7
char *TargetType[12] = { "ATOM", "DRAWABLE", "WINDOW", "COLORMAP", "INTEGER",
Packit b099d7
			 "PIXEL", "COMPOUND_TEXT", "STRING", "SPAN", "",
Packit b099d7
			 "_MOTIF_COMPOUND_STRING", "NONE" };
Packit b099d7
Packit b099d7
/*************************************************************************
Packit b099d7
 * A list of widgets we need to be able to find outside the main
Packit b099d7
 * program.
Packit b099d7
 *
Packit b099d7
 * MainW        is the child of the toplevel Shell1,  an XmMainWindow
Packit b099d7
 * target       is the drawing area used for drag and drop
Packit b099d7
 * list         is the list of targets displayed
Packit b099d7
 * labelV       contains the value of the selected target
Packit b099d7
 * labelN       contains the name of the selected or new target
Packit b099d7
 * typeOM       is the option menu which displays type information for the
Packit b099d7
 *              selected or new target
Packit b099d7
 * OwnPrimLG    is the label displayed when the drawing area owns the
Packit b099d7
 *              primary selection
Packit b099d7
 * OwnSecLG     is the label displayed when the drawing area owns the
Packit b099d7
 *              secondary selection
Packit b099d7
 *************************************************************************/
Packit b099d7
Packit b099d7
Widget MainW, list, target, labelV, labelN, typeOM, OwnPrimLG, OwnSecLG;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Main program
Packit b099d7
 */
Packit b099d7
void
Packit b099d7
main(int argc, char **argv)
Packit b099d7
{
Packit b099d7
    Arg args[15];
Packit b099d7
    int n;
Packit b099d7
    Widget menubar, pulldown, menu_btn;
Packit b099d7
    Widget CutPB, CopyPB, SeparatorG, PastePB, PasteMovePB;
Packit b099d7
    Widget form, optionMenu, SelectionMenu;
Packit b099d7
    Widget PrimaryPB, SecondaryPB, ClipboardPB;
Packit b099d7
    Widget frame, SelOwnLG;
Packit b099d7
    Widget frame1, frameLabel, workArea, field1, label1, field2, label2;
Packit b099d7
    Widget buttons, TypeMenu;
Packit b099d7
    Widget ATOMbutton, DRAWABLEbutton, WINDOWbutton, COLORMAPbutton;
Packit b099d7
    Widget INTEGERbutton, PIXELbutton, COMPOUND_TEXTbutton, STRINGbutton;
Packit b099d7
    Widget SPANbutton, LOCALE_TEXTbutton, _MOTIF_COMPOUND_STRINGbutton;
Packit b099d7
    Widget unknownbutton;
Packit b099d7
    XmString Label;
Packit b099d7
 
Packit b099d7
    CommonTestInit(argc, argv);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNborderWidth, 2); n++;
Packit b099d7
    XtSetArg(args[n], XmNwidth, 400); n++;
Packit b099d7
    XtSetArg(args[n], XmNheight, 550); n++;
Packit b099d7
    MainW = XmCreateMainWindow(Shell1, "MainW", args, n);
Packit b099d7
    XtManageChild(MainW);
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * Create a menu bar
Packit b099d7
     */
Packit b099d7
    n = 0;
Packit b099d7
    menubar = XmCreateMenuBar(MainW, "menubar", args, n);
Packit b099d7
    XtManageChild(menubar);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    pulldown = XmCreatePulldownMenu(menubar, "pulldown", args, n);
Packit b099d7
    
Packit b099d7
    Label = XmStringCreate("Edit", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNsubMenuId, pulldown);  n++;
Packit b099d7
    menu_btn = XmCreateCascadeButton(menubar, "menu_btn", args, n);
Packit b099d7
    XtManageChild(menu_btn);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Cut", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING);  n++;
Packit b099d7
    CutPB = XmCreatePushButtonGadget(pulldown, "CutPB", args, n);
Packit b099d7
    XtManageChild(CutPB);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
    XtAddCallback(CutPB, XmNactivateCallback, CutCB, NULL);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Copy", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING);  n++;
Packit b099d7
    CopyPB = XmCreatePushButtonGadget(pulldown, "CopyPB", args, n);
Packit b099d7
    XtManageChild(CopyPB);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
    XtAddCallback(CopyPB, XmNactivateCallback, CopyCB, NULL);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    SeparatorG = XmCreateSeparatorGadget(pulldown, "SeparatorG", args, n);
Packit b099d7
    XtManageChild(SeparatorG);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Paste (copy)", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING);  n++;
Packit b099d7
    PastePB = XmCreatePushButtonGadget(pulldown, "PastePB", args, n);
Packit b099d7
    XtManageChild(PastePB);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
    XtAddCallback(PastePB, XmNactivateCallback, PasteCB, NULL);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Paste (move)", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING);  n++;
Packit b099d7
    PasteMovePB = XmCreatePushButtonGadget(pulldown, "PasteMovePB", args, n);
Packit b099d7
    XtManageChild(PasteMovePB);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
    XtAddCallback(PasteMovePB, XmNactivateCallback, PasteMoveCB, NULL);
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * Create a form which contains:
Packit b099d7
     * - an option menu for choosing the type of selection,
Packit b099d7
     * - a drawing area for dragging the target,
Packit b099d7
     * - a label displaying the selection ownership value,
Packit b099d7
     * - the value of the selected target,
Packit b099d7
     * - the name of the selected target,
Packit b099d7
     * - an option menu with the possible target types,
Packit b099d7
     * - a list of targets.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    form = XmCreateForm(MainW, "form", args, n);
Packit b099d7
    XtManageChild(form);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    SelectionMenu = XmCreatePulldownMenu(form, "SelectionMenu", args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Primary", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    PrimaryPB = XmCreatePushButtonGadget(SelectionMenu, "PrimaryPB", args, n);
Packit b099d7
    XtManageChild(PrimaryPB);
Packit b099d7
    XtAddCallback(PrimaryPB, XmNactivateCallback, SetModeCB, 
Packit b099d7
		  (XtPointer) Mprimary);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Secondary", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    SecondaryPB = XmCreatePushButtonGadget(SelectionMenu, "SecondaryPB", 
Packit b099d7
					   args, n);
Packit b099d7
    XtManageChild(SecondaryPB);
Packit b099d7
    XtAddCallback(SecondaryPB, XmNactivateCallback, SetModeCB, 
Packit b099d7
		  (XtPointer) Msecondary);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Clipboard", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    ClipboardPB = XmCreatePushButtonGadget(SelectionMenu, "ClipboardPB", 
Packit b099d7
					   args, n);
Packit b099d7
    XtManageChild(ClipboardPB);
Packit b099d7
    XtAddCallback(ClipboardPB, XmNactivateCallback, SetModeCB, 
Packit b099d7
		  (XtPointer) Mclipboard);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Selection", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNsubMenuId, SelectionMenu); n++;
Packit b099d7
    optionMenu = XmCreateOptionMenu(form, "optionMenu", args, n);
Packit b099d7
    XtManageChild(optionMenu);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, optionMenu); n++;
Packit b099d7
    frame = XmCreateFrame(form, "frame", args, n);
Packit b099d7
    XtManageChild(frame);
Packit b099d7
Packit b099d7
    n =0;
Packit b099d7
    XtSetArg(args[n], XmNwidth, 70); n++;
Packit b099d7
    XtSetArg(args[n], XmNheight, 70); n++;
Packit b099d7
    XtSetArg(args[n], XmNbackground, CommonGetColor ("red")); n++;
Packit b099d7
    target = XmCreateDrawingArea(frame, "target", args, n);
Packit b099d7
    XtManageChild(target);
Packit b099d7
Packit b099d7
    /* Add the UTM callbacks on the drawing area */
Packit b099d7
Packit b099d7
    XtAddCallback(target, XmNdestinationCallback, TargetDestinationCB, NULL);
Packit b099d7
    XtAddCallback(target, XmNconvertCallback, TargetConvertCB, NULL);
Packit b099d7
Packit b099d7
    /* Add other callbacks on the drawing area */
Packit b099d7
    XtAddCallback(target, XmNinputCallback, InputCB, NULL);
Packit b099d7
    
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Selection Ownership: ", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, frame); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    SelOwnLG = XmCreateLabelGadget(form, "SelOwnLG", args, n);
Packit b099d7
    XtManageChild(SelOwnLG);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Primary", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopWidget, SelOwnLG);
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 30); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, frame); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    OwnPrimLG = XmCreateLabelGadget(form, "OwnPrimLG", args, n);
Packit b099d7
    XtManageChild(OwnPrimLG);
Packit b099d7
    XtUnmanageChild(OwnPrimLG);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Secondary", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopWidget, SelOwnLG);
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 50); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, frame); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    OwnSecLG = XmCreateLabelGadget(form, "OwnSecLG", args, n);
Packit b099d7
    XtManageChild(OwnSecLG);
Packit b099d7
    XtUnmanageChild(OwnSecLG);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopWidget, frame); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 6); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    frame1 = XmCreateFrame(form, "frame1", args, n);
Packit b099d7
    XtManageChild(frame1);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Target Values", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNframeChildType, XmFRAME_TITLE_CHILD); n++;
Packit b099d7
    frameLabel = XmCreateLabelGadget(frame1, "frameLabel", args, n);
Packit b099d7
    XtManageChild(frameLabel);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    workArea = XmCreateWorkArea(frame1, "workArea", args, n);
Packit b099d7
    XtManageChild(workArea);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNrubberPositioning, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); n++;
Packit b099d7
    field2 = XmCreateForm(workArea, "field2", args, n);
Packit b099d7
    XtManageChild(field2);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Target", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNwidth, 72); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, False); n++;
Packit b099d7
    label2 = XmCreateLabelGadget(field2, "label2", args, n);
Packit b099d7
    XtManageChild(label2);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, label2); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 5); n++;
Packit b099d7
    labelN = XmCreateLabel(field2, "labelN", args, n);
Packit b099d7
    XtManageChild(labelN);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNrubberPositioning, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); n++;
Packit b099d7
    field1 = XmCreateForm(workArea, "field1", args, n);
Packit b099d7
    XtManageChild(field1);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Target Value", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 10); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, False); n++;
Packit b099d7
    label1 = XmCreateLabelGadget(field1, "label1", args, n);
Packit b099d7
    XtManageChild(label1);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
    
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, True); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, label1); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 5); n++;
Packit b099d7
    labelV = XmCreateLabel(field1, "labelV", args, n);
Packit b099d7
    XtManageChild(labelV);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    TypeMenu = XmCreatePulldownMenu(workArea, "TypeMenu", args, n);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("ATOM", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    ATOMbutton = XmCreatePushButtonGadget(TypeMenu, "ATOMbutton", args, n);
Packit b099d7
    XtManageChild(ATOMbutton);
Packit b099d7
    XtAddCallback(ATOMbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[0]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("DRAWABLE", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    DRAWABLEbutton = XmCreatePushButtonGadget(TypeMenu, "DRAWABLEbutton", 
Packit b099d7
					      args, n);
Packit b099d7
    XtManageChild(DRAWABLEbutton);
Packit b099d7
    XtAddCallback(DRAWABLEbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[1]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("WINDOW", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    WINDOWbutton = XmCreatePushButtonGadget(TypeMenu, "WINDOWbutton", args, n);
Packit b099d7
    XtManageChild(WINDOWbutton);
Packit b099d7
    XtAddCallback(WINDOWbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[2]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("COLORMAP", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    COLORMAPbutton = XmCreatePushButtonGadget(TypeMenu, "COLORMAPbutton", 
Packit b099d7
					      args, n);
Packit b099d7
    XtManageChild(COLORMAPbutton);
Packit b099d7
    XtAddCallback(COLORMAPbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[3]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("INTEGER", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    INTEGERbutton = XmCreatePushButtonGadget(TypeMenu, "INTEGERbutton", 
Packit b099d7
					      args, n);
Packit b099d7
    XtManageChild(INTEGERbutton);
Packit b099d7
    XtAddCallback(INTEGERbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[4]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("PIXEL", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    PIXELbutton = XmCreatePushButtonGadget(TypeMenu, "PIXELbutton", args, n);
Packit b099d7
    XtManageChild(PIXELbutton);
Packit b099d7
    XtAddCallback(PIXELbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[5]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("COMPOUND_TEXT", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    COMPOUND_TEXTbutton = XmCreatePushButtonGadget(TypeMenu, 
Packit b099d7
						   "COMPOUND_TEXTbutton", 
Packit b099d7
						   args, n);
Packit b099d7
    XtManageChild(COMPOUND_TEXTbutton);
Packit b099d7
    XtAddCallback(COMPOUND_TEXTbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[6]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("STRING", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    STRINGbutton = XmCreatePushButtonGadget(TypeMenu, "STRINGbutton", args, n);
Packit b099d7
    XtManageChild(STRINGbutton);
Packit b099d7
    XtAddCallback(STRINGbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[7]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("SPAN", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    SPANbutton = XmCreatePushButtonGadget(TypeMenu, "SPANbutton", args, n);
Packit b099d7
    XtManageChild(SPANbutton);
Packit b099d7
    XtAddCallback(SPANbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[8]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("LOCALE_TEXT", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    LOCALE_TEXTbutton = XmCreatePushButtonGadget(TypeMenu, 
Packit b099d7
						 "LOCALE_TEXTbutton",
Packit b099d7
						 args, n);
Packit b099d7
    XtManageChild(LOCALE_TEXTbutton);
Packit b099d7
    XtAddCallback(LOCALE_TEXTbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[9]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("MOTIF COMPOUND STRING", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    _MOTIF_COMPOUND_STRINGbutton = XmCreatePushButtonGadget(TypeMenu, 
Packit b099d7
			"_MOTIF_COMPOUND_STRINGbutton", args, n);
Packit b099d7
    XtManageChild(_MOTIF_COMPOUND_STRINGbutton);
Packit b099d7
    XtAddCallback(_MOTIF_COMPOUND_STRINGbutton, XmNactivateCallback, 
Packit b099d7
		  SetTypeCB, &TargetType[10]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("unknown", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    unknownbutton = XmCreatePushButtonGadget(TypeMenu, "unknownbutton", args, 
Packit b099d7
					     n);
Packit b099d7
    XtManageChild(unknownbutton);
Packit b099d7
    XtAddCallback(unknownbutton, XmNactivateCallback, SetTypeCB, 
Packit b099d7
		  &TargetType[11]);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    Label = XmStringCreate("Type", XmSTRING_DEFAULT_CHARSET);
Packit b099d7
    XtSetArg(args[n], XmNlabelString, Label);  n++;
Packit b099d7
    XtSetArg(args[n], XmNsubMenuId, TypeMenu); n++;
Packit b099d7
    typeOM = XmCreateOptionMenu(workArea, "typeOM", args, n);
Packit b099d7
    XtManageChild(typeOM);
Packit b099d7
    XmStringFree(Label);
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNwidth, 250); n++;
Packit b099d7
    XtSetArg(args[n], XmNheight, 240); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopWidget, frame1); n++;
Packit b099d7
    XtSetArg(args[n], XmNtopOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
Packit b099d7
    XtSetArg(args[n], XmNbottomOffset, 5); n++;
Packit b099d7
    XtSetArg(args[n], XmNresizable, False); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftWidget, frame1); n++;
Packit b099d7
    XtSetArg(args[n], XmNleftOffset, 0); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightWidget, frame1); n++;
Packit b099d7
    XtSetArg(args[n], XmNrightOffset, 0); n++;
Packit b099d7
    XtSetArg(args[n], XmNselectionPolicy, XmSINGLE_SELECT); n++;
Packit b099d7
    list = XmCreateScrolledList(form, "list", args, n);
Packit b099d7
    XtManageChild(list);
Packit b099d7
    XtAddCallback(list, XmNsingleSelectionCallback, ListSelectItemCB, NULL);
Packit b099d7
Packit b099d7
    XmMainWindowSetAreas(MainW, menubar, NULL, NULL, NULL, form);
Packit b099d7
Packit b099d7
   /* Create a default label string for the clipboard */
Packit b099d7
Packit b099d7
    generic_label = XmStringCreateLocalized("Generic Label");
Packit b099d7
Packit b099d7
    /* Register the drawing area as a drop site */
Packit b099d7
Packit b099d7
    XmeDropSink(target, NULL, 0);
Packit b099d7
Packit b099d7
    /* Install our special error handler */
Packit b099d7
    XSetErrorHandler((XErrorHandler) ErrorHandler);
Packit b099d7
Packit b099d7
    XtRealizeWidget(Shell1);
Packit b099d7
    
Packit b099d7
    for (n = 0; n < 17; n++)
Packit b099d7
      CommonPause();
Packit b099d7
Packit b099d7
    XtAppMainLoop(app_context);
Packit b099d7
}
Packit b099d7
Packit b099d7
/***************************************************
Packit b099d7
 * function setMode                               
Packit b099d7
 * Set the mode to PRIMARY, SECONDARY or CLIPBOARD
Packit b099d7
 ***************************************************/
Packit b099d7
static void 
Packit b099d7
SetModeCB(Widget widget, XtPointer client_data, XtPointer call_data)
Packit b099d7
{
Packit b099d7
  Tmode = (int) client_data;
Packit b099d7
}
Packit b099d7
Packit b099d7
/******************************************************************
Packit b099d7
 * cut, copy and paste perform the apropriate actions
Packit b099d7
 * depending on which mode we're in.  They use the widget writer's
Packit b099d7
 * API for this.  Normally application developers won't need to
Packit b099d7
 * call these,  but this is a pseudo widget writing case as we're
Packit b099d7
 * adding interchange behavior to drawing area.  This is an example
Packit b099d7
 * of where the widget writing API should be used by app. developers
Packit b099d7
 ******************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CutCB(Widget widget, XtPointer client_data, XtPointer call_data)
Packit b099d7
{
Packit b099d7
  if (Tmode == Mprimary) {
Packit b099d7
    XmePrimarySource(target, 0);
Packit b099d7
    XtManageChild(OwnPrimLG);
Packit b099d7
  } else if (Tmode == Msecondary) {
Packit b099d7
    XmeSecondarySource(target, 0);
Packit b099d7
    XmeSecondaryTransfer(target, 
Packit b099d7
                         XInternAtom(XtDisplay(widget), 
Packit b099d7
                                     XmSCOMPOUND_TEXT, False),
Packit b099d7
                         XmMOVE, 0);
Packit b099d7
  } else if (Tmode == Mclipboard)
Packit b099d7
    XmeClipboardSource(target, XmMOVE, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CopyCB(Widget widget, XtPointer client_data, XtPointer call_data)
Packit b099d7
{
Packit b099d7
  if (Tmode == Mprimary) {
Packit b099d7
    XmePrimarySource(target, 0);
Packit b099d7
    XtManageChild(OwnPrimLG);
Packit b099d7
  } else if (Tmode == Msecondary) {
Packit b099d7
    XmeSecondarySource(target, 0);
Packit b099d7
    XmeSecondaryTransfer(target, 
Packit b099d7
                         XInternAtom(XtDisplay(widget), 
Packit b099d7
                                     XmSCOMPOUND_TEXT, False),
Packit b099d7
                         XmCOPY, 0);
Packit b099d7
  } else if (Tmode == Mclipboard)
Packit b099d7
    XmeClipboardSource(target, XmCOPY, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
PasteCB(Widget widget, XtPointer client_data, XtPointer call_data)
Packit b099d7
{
Packit b099d7
  if (Tmode == Mprimary)
Packit b099d7
    XmePrimarySink(target, XmCOPY, 0, 0);
Packit b099d7
  else if (Tmode == Msecondary) {
Packit b099d7
    XmeSecondarySink(target, 0);
Packit b099d7
    XtManageChild(OwnSecLG);
Packit b099d7
  }
Packit b099d7
  else if (Tmode == Mclipboard)
Packit b099d7
    XmeClipboardSink(target, XmCOPY, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
PasteMoveCB(Widget widget, XtPointer client_data, XtPointer call_data)
Packit b099d7
{
Packit b099d7
  if (Tmode == Mprimary)
Packit b099d7
    XmePrimarySink(target, XmMOVE, 0, 0);
Packit b099d7
  else if (Tmode == Msecondary) {
Packit b099d7
    XmeSecondarySink(target, 0);
Packit b099d7
    XtManageChild(OwnSecLG);
Packit b099d7
  }
Packit b099d7
  else if (Tmode == Mclipboard)
Packit b099d7
    XmeClipboardSink(target, XmMOVE, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* Error handler for X protocol errors.  Display error text in labelN,V */
Packit b099d7
Packit b099d7
static int 
Packit b099d7
ErrorHandler(Display *display, XErrorEvent *event)
Packit b099d7
{
Packit b099d7
  char buffer[80];
Packit b099d7
  char errortext[100];
Packit b099d7
  XmString tmp;
Packit b099d7
  int n;
Packit b099d7
  Arg args[2];
Packit b099d7
Packit b099d7
  XGetErrorText(display, event -> error_code, (char *) errortext, 100);
Packit b099d7
Packit b099d7
  tmp = XmStringCreateLocalized(errortext);
Packit b099d7
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNlabelString, tmp); n++;
Packit b099d7
  XtSetValues(labelN, args, n);
Packit b099d7
Packit b099d7
  XmStringFree(tmp);
Packit b099d7
Packit b099d7
  sprintf(buffer, "XID %d serial %d major %d minor %d",
Packit b099d7
          event -> resourceid,
Packit b099d7
	  event -> serial,
Packit b099d7
          event -> request_code,
Packit b099d7
          event -> minor_code);
Packit b099d7
Packit b099d7
  tmp = XmStringCreateLocalized(buffer);
Packit b099d7
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNlabelString, tmp); n++;
Packit b099d7
  XtSetValues(labelV, args, n);
Packit b099d7
Packit b099d7
  XmStringFree(tmp);
Packit b099d7
Packit b099d7
  return 0;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
InputCB(Widget w, XtPointer client_data, XtPointer call_data)
Packit b099d7
{
Packit b099d7
  XmDrawingAreaCallbackStruct *cbstruct;
Packit b099d7
  XEvent *event;
Packit b099d7
Packit b099d7
  cbstruct = (XmDrawingAreaCallbackStruct *) call_data;
Packit b099d7
  event = cbstruct -> event;
Packit b099d7
Packit b099d7
  if (event -> type == ButtonPress &&
Packit b099d7
      event -> xbutton.button == 2) {
Packit b099d7
    XmeDragSource(w, NULL, event, NULL, 0);
Packit b099d7
  }
Packit b099d7
}
Packit b099d7