Blame demos/unsupported/transfer/transfer.c

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