|
Packit |
b099d7 |
/*
|
|
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 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$XConsortium: transfer.c /main/6 1995/07/14 09:47:23 drk $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
#include <Xm/Xm.h> /* Motif Toolkit */
|
|
Packit |
b099d7 |
#include "transfer.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void quitCB(Widget widget, char *tag, XmAnyCallbackStruct *callback_data);
|
|
Packit |
b099d7 |
void setMode(Widget widget, int param, XmAnyCallbackStruct *callback_data);
|
|
Packit |
b099d7 |
void cut(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data);
|
|
Packit |
b099d7 |
void copy(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data);
|
|
Packit |
b099d7 |
void paste(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data);
|
|
Packit |
b099d7 |
void pasteMove(Widget widget, char *ignore,
|
|
Packit |
b099d7 |
XmAnyCallbackStruct *callback_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void NOP(Widget widget, XEvent *event,
|
|
Packit |
b099d7 |
String *params, Cardinal *num_params);
|
|
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 |
Display *display;
|
|
Packit |
b099d7 |
XtAppContext app_context;
|
|
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 |
/* We need a NOP action */
|
|
Packit |
b099d7 |
static XtActionsRec actions[] = {
|
|
Packit |
b099d7 |
{ "NOP", NOP},
|
|
Packit |
b099d7 |
};
|
|
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 |
* toplevel is the ApplicationShell
|
|
Packit |
b099d7 |
* mainw is the child of toplevel, 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 |
* text1 contains the value of the selected target
|
|
Packit |
b099d7 |
* text2 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 |
* format_om Format option menu
|
|
Packit |
b099d7 |
* format_s String format button
|
|
Packit |
b099d7 |
* format_l Locale format button
|
|
Packit |
b099d7 |
* format_t CompoundText format button
|
|
Packit |
b099d7 |
* format_cs CompoundString format button
|
|
Packit |
b099d7 |
* format_id Integer format button (decimal)
|
|
Packit |
b099d7 |
* format_hd Integer format button (hex)
|
|
Packit |
b099d7 |
*************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget toplevel, mainW, editBox;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Main program
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
main(int argc, String *argv)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Arg args[10];
|
|
Packit |
b099d7 |
int n;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
toplevel = XtVaAppInitialize(&app_context, "XmdTransfer", NULL, 0,
|
|
Packit |
b099d7 |
&argc, argv, NULL, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Add the NOP actions */
|
|
Packit |
b099d7 |
XtAppAddActions(app_context, actions, XtNumber(actions));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Create edit dialog */
|
|
Packit |
b099d7 |
editBox = create_editbox_widget("edit_box", toplevel);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Initialize the interface */
|
|
Packit |
b099d7 |
mainW = create_mainWindow_widget("main", toplevel);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Create a default label string for the clipboard */
|
|
Packit |
b099d7 |
generic_label = XmStringCreateLocalized("Generic Label");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Register the drawing area as a drop site */
|
|
Packit |
b099d7 |
XmeDropSink(target, NULL, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtManageChild(mainW);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install our special error handler */
|
|
Packit |
b099d7 |
XSetErrorHandler((XErrorHandler) ErrorHandler);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Add the UTM callbacks on the drawing area */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtAddCallback(target, XmNdestinationCallback,
|
|
Packit |
b099d7 |
(XtCallbackProc) targetDestinationCallback, NULL);
|
|
Packit |
b099d7 |
XtAddCallback(target, XmNconvertCallback,
|
|
Packit |
b099d7 |
(XtCallbackProc) targetConvertCallback, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Add other callbacks on the drawing area */
|
|
Packit |
b099d7 |
XtAddCallback(target, XmNinputCallback,
|
|
Packit |
b099d7 |
(XtCallbackProc) inputCallback, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtRealizeWidget(toplevel);
|
|
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 |
void
|
|
Packit |
b099d7 |
setMode(Widget widget, int param, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Tmode = param;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
quitCB(Widget widget, char *tag, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
exit(0);
|
|
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 |
void
|
|
Packit |
b099d7 |
cut(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (Tmode == Mprimary) {
|
|
Packit |
b099d7 |
XmePrimarySource(target, 0);
|
|
Packit |
b099d7 |
XmToggleButtonSetState(op, True, False);
|
|
Packit |
b099d7 |
} else if (Tmode == Mnamed) {
|
|
Packit |
b099d7 |
XmeNamedSource(target, XInternAtom(XtDisplay(target), _NAMED, False), 0);
|
|
Packit |
b099d7 |
XmToggleButtonSetState(onamed, True, False);
|
|
Packit |
b099d7 |
} else if (Tmode == Msecondary) {
|
|
Packit |
b099d7 |
XmeSecondarySource(target, 0);
|
|
Packit |
b099d7 |
XmeSecondaryTransfer(target,
|
|
Packit |
b099d7 |
XInternAtom(XtDisplay(target),
|
|
Packit |
b099d7 |
"COMPOUND_TEXT", False),
|
|
Packit |
b099d7 |
XmMOVE, 0);
|
|
Packit |
b099d7 |
} else if (Tmode == Mclipboard)
|
|
Packit |
b099d7 |
XmeClipboardSource(target, XmMOVE, 0, generic_label);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
copy(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (Tmode == Mprimary) {
|
|
Packit |
b099d7 |
XmePrimarySource(target, 0);
|
|
Packit |
b099d7 |
XmToggleButtonSetState(op, True, False);
|
|
Packit |
b099d7 |
} else if (Tmode == Mnamed) {
|
|
Packit |
b099d7 |
XmeNamedSource(target, XInternAtom(XtDisplay(target), _NAMED, False), 0);
|
|
Packit |
b099d7 |
XmToggleButtonSetState(onamed, True, False);
|
|
Packit |
b099d7 |
} else if (Tmode == Msecondary) {
|
|
Packit |
b099d7 |
XmeSecondarySource(target, 0);
|
|
Packit |
b099d7 |
XmeSecondaryTransfer(target,
|
|
Packit |
b099d7 |
XInternAtom(XtDisplay(target),
|
|
Packit |
b099d7 |
"COMPOUND_TEXT", False),
|
|
Packit |
b099d7 |
XmCOPY, 0);
|
|
Packit |
b099d7 |
} else if (Tmode == Mclipboard)
|
|
Packit |
b099d7 |
XmeClipboardSource(target, XmCOPY, 0, generic_label);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
paste(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (Tmode == Mprimary) {
|
|
Packit |
b099d7 |
XmePrimarySink(target, XmCOPY, NULL, 0);
|
|
Packit |
b099d7 |
} else if (Tmode == Mnamed) {
|
|
Packit |
b099d7 |
XmeNamedSink(target, XInternAtom(XtDisplay(target), _NAMED, False),
|
|
Packit |
b099d7 |
XmCOPY, NULL, 0);
|
|
Packit |
b099d7 |
} else if (Tmode == Msecondary) {
|
|
Packit |
b099d7 |
XmeSecondarySink(target, 0);
|
|
Packit |
b099d7 |
XmToggleButtonSetState(omd, True, False);
|
|
Packit |
b099d7 |
} else if (Tmode == Mclipboard)
|
|
Packit |
b099d7 |
XmeClipboardSink(target, XmCOPY, 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
pasteMove(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (Tmode == Mprimary) {
|
|
Packit |
b099d7 |
XmePrimarySink(target, XmMOVE, 0, 0);
|
|
Packit |
b099d7 |
} else if (Tmode == Mnamed) {
|
|
Packit |
b099d7 |
XmeNamedSink(target, XInternAtom(XtDisplay(target), _NAMED, False),
|
|
Packit |
b099d7 |
XmMOVE, NULL, 0);
|
|
Packit |
b099d7 |
} else if (Tmode == Msecondary) {
|
|
Packit |
b099d7 |
XmeSecondarySink(target, 0);
|
|
Packit |
b099d7 |
XmToggleButtonSetState(omd, True, False);
|
|
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 text1,2 */
|
|
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 |
|
|
Packit |
b099d7 |
XGetErrorText(display, event -> error_code, errortext, 100);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized(errortext);
|
|
Packit |
b099d7 |
XmCSTextSetString(text2, tmp);
|
|
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 -> request_code,
|
|
Packit |
b099d7 |
event -> minor_code);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tmp = XmStringCreateLocalized(buffer);
|
|
Packit |
b099d7 |
XmCSTextSetString(text1, tmp);
|
|
Packit |
b099d7 |
XmStringFree(tmp);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
inputCallback(Widget w, XtPointer ignore, XmDrawingAreaCallbackStruct *cbstruct)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XEvent *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 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
NOP(Widget widget, XEvent *event, String *params, Cardinal *num_params)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* We do nothing in the action. */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|