CutPaste.c revision eaef79e5
1eaef79e5Smrg/* $Xorg: CutPaste.c,v 1.4 2001/02/09 02:05:28 xorgcvs Exp $ */
2eaef79e5Smrg/*
3eaef79e5Smrg
4eaef79e5SmrgCopyright 1989, 1998  The Open Group
5eaef79e5Smrg
6eaef79e5SmrgPermission to use, copy, modify, distribute, and sell this software and its
7eaef79e5Smrgdocumentation for any purpose is hereby granted without fee, provided that
8eaef79e5Smrgthe above copyright notice appear in all copies and that both that
9eaef79e5Smrgcopyright notice and this permission notice appear in supporting
10eaef79e5Smrgdocumentation.
11eaef79e5Smrg
12eaef79e5SmrgThe above copyright notice and this permission notice shall be included
13eaef79e5Smrgin all copies or substantial portions of the Software.
14eaef79e5Smrg
15eaef79e5SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16eaef79e5SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17eaef79e5SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18eaef79e5SmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
19eaef79e5SmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20eaef79e5SmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21eaef79e5SmrgOTHER DEALINGS IN THE SOFTWARE.
22eaef79e5Smrg
23eaef79e5SmrgExcept as contained in this notice, the name of The Open Group shall
24eaef79e5Smrgnot be used in advertising or otherwise to promote the sale, use or
25eaef79e5Smrgother dealings in this Software without prior written authorization
26eaef79e5Smrgfrom The Open Group.
27eaef79e5Smrg
28eaef79e5Smrg*/
29eaef79e5Smrg/* $XFree86: CutPaste.c,v 1.4 2001/12/14 20:00:40 dawes Exp $ */
30eaef79e5Smrg
31eaef79e5Smrg/*
32eaef79e5Smrg * Author:  Davor Matic, MIT X Consortium
33eaef79e5Smrg */
34eaef79e5Smrg
35eaef79e5Smrg#include <X11/IntrinsicP.h>
36eaef79e5Smrg#include <X11/StringDefs.h>
37eaef79e5Smrg#include <X11/Xatom.h>
38eaef79e5Smrg#include "BitmapP.h"
39eaef79e5Smrg
40eaef79e5Smrg#include <stdio.h>
41eaef79e5Smrg#include <math.h>
42eaef79e5Smrg
43eaef79e5Smrg#define min(x, y)                     (((x) < (y)) ? (x) : (y))
44eaef79e5Smrg#define max(x, y)                     (((x) > (y)) ? (x) : (y))
45eaef79e5Smrg
46eaef79e5Smrg
47eaef79e5Smrgextern Boolean DEBUG;
48eaef79e5Smrg
49eaef79e5Smrg/*****************************************************************************
50eaef79e5Smrg *                               Cut and Paste                               *
51eaef79e5Smrg *****************************************************************************/
52eaef79e5Smrg
53eaef79e5Smrg/* ARGSUSED */
54eaef79e5Smrgstatic Boolean
55eaef79e5SmrgConvertSelection(Widget w, Atom *selection, Atom *target, Atom *type,
56eaef79e5Smrg		 XtPointer *val_ret, unsigned long *length, int *format)
57eaef79e5Smrg{
58eaef79e5Smrg    XPointer *value = (XPointer *)val_ret;
59eaef79e5Smrg    BitmapWidget BW = (BitmapWidget) w;
60eaef79e5Smrg    Pixmap *pixmap;
61eaef79e5Smrg    char *data;
62eaef79e5Smrg    XImage *image;
63eaef79e5Smrg    Dimension width, height;
64eaef79e5Smrg
65eaef79e5Smrg    switch (*target) {
66eaef79e5Smrg
67eaef79e5Smrg/*  XA_TARGETS undefined ?!?
68eaef79e5Smrg
69eaef79e5Smrg    case XA_TARGETS:
70eaef79e5Smrg	*type = XA_ATOM;
71eaef79e5Smrg	*value = (XPointer) bitmapClassRec.bitmap_class.targets;
72eaef79e5Smrg	*length = bitmapClassRec.bitmap_class.num_targets;
73eaef79e5Smrg	*format = 32;
74eaef79e5Smrg	return True;
75eaef79e5Smrg
76eaef79e5Smrg*/
77eaef79e5Smrg
78eaef79e5Smrg    case XA_BITMAP:
79eaef79e5Smrg    case XA_PIXMAP:
80eaef79e5Smrg	if (BWQueryMarked(w)) {
81eaef79e5Smrg	  width = BW->bitmap.mark.to_x - BW->bitmap.mark.from_x + 1;
82eaef79e5Smrg	  height = BW->bitmap.mark.to_y - BW->bitmap.mark.from_y + 1;
83eaef79e5Smrg	  data = CreateCleanData(Length(width, height));
84eaef79e5Smrg	  image = CreateBitmapImage(BW, data, width, height);
85eaef79e5Smrg	  CopyImageData(BW->bitmap.image, image,
86eaef79e5Smrg			BW->bitmap.mark.from_x, BW->bitmap.mark.from_y,
87eaef79e5Smrg			BW->bitmap.mark.to_x, BW->bitmap.mark.to_y, 0, 0);
88eaef79e5Smrg	  pixmap = (Pixmap *) XtMalloc(sizeof(Pixmap));
89eaef79e5Smrg	  *pixmap = GetPixmap(BW, image);
90eaef79e5Smrg	  DestroyBitmapImage(&image);
91eaef79e5Smrg	}
92eaef79e5Smrg	else if (BWQueryStored(w)) {
93eaef79e5Smrg	  pixmap = (Pixmap *) XtMalloc(sizeof(Pixmap));
94eaef79e5Smrg	  *pixmap = GetPixmap(BW, BW->bitmap.storage);
95eaef79e5Smrg	}
96eaef79e5Smrg	else return False;
97eaef79e5Smrg	*type = XA_PIXMAP;
98eaef79e5Smrg	*value = (XPointer) pixmap;
99eaef79e5Smrg	*length = 1;
100eaef79e5Smrg	*format = 32;
101eaef79e5Smrg	return True;
102eaef79e5Smrg
103eaef79e5Smrg    default:
104eaef79e5Smrg	return False;
105eaef79e5Smrg    }
106eaef79e5Smrg}
107eaef79e5Smrg
108eaef79e5Smrg/* ARGSUSED */
109eaef79e5Smrgstatic void
110eaef79e5SmrgLoseSelection(Widget w, Atom selection)
111eaef79e5Smrg{
112eaef79e5Smrg    BitmapWidget BW = (BitmapWidget) w;
113eaef79e5Smrg
114eaef79e5Smrg    if (DEBUG)
115eaef79e5Smrg	fprintf(stderr, "Lost Selection\n");
116eaef79e5Smrg    BW->bitmap.selection.own = False;
117eaef79e5Smrg
118eaef79e5Smrg    BWUnmark(w);
119eaef79e5Smrg}
120eaef79e5Smrg
121eaef79e5Smrg/* ARGSUSED */
122eaef79e5Smrgstatic void
123eaef79e5SmrgSelectionDone(Widget w, Atom *selection, Atom *target)
124eaef79e5Smrg{
125eaef79e5Smrg/*  Done Automatically ?!?
126eaef79e5Smrg
127eaef79e5Smrg    BitmapWidget BW = (BitmapWidget) w;
128eaef79e5Smrg
129eaef79e5Smrg    if (*target != XA_TARGETS)
130eaef79e5Smrg	XtFree(BW->bitmap.value);
131eaef79e5Smrg
132eaef79e5Smrg*/
133eaef79e5Smrg}
134eaef79e5Smrg
135eaef79e5Smrgvoid
136eaef79e5SmrgBWGrabSelection(Widget w, Time btime)
137eaef79e5Smrg{
138eaef79e5Smrg    BitmapWidget BW = (BitmapWidget) w;
139eaef79e5Smrg
140eaef79e5Smrg    BW->bitmap.selection.own = XtOwnSelection(w, XA_PRIMARY, btime,
141eaef79e5Smrg					      ConvertSelection,
142eaef79e5Smrg					      (XtLoseSelectionProc)LoseSelection,
143eaef79e5Smrg					      SelectionDone);
144eaef79e5Smrg	if (DEBUG && BW->bitmap.selection.own)
145eaef79e5Smrg	    fprintf(stderr, "Own the selection\n");
146eaef79e5Smrg}
147eaef79e5Smrg
148eaef79e5Smrg
149eaef79e5Smrg/* ARGSUSED */
150eaef79e5Smrgstatic void
151eaef79e5SmrgSelectionCallback(Widget w, XtPointer cldat, Atom *selection, Atom *type,
152eaef79e5Smrg		  XtPointer val, unsigned long *length, int *format)
153eaef79e5Smrg{
154eaef79e5Smrg    XPointer value = (XPointer)val;
155eaef79e5Smrg    BitmapWidget BW = (BitmapWidget) w;
156eaef79e5Smrg    Pixmap *pixmap;
157eaef79e5Smrg
158eaef79e5Smrg   switch (*type) {
159eaef79e5Smrg
160eaef79e5Smrg    case XA_BITMAP:
161eaef79e5Smrg    case XA_PIXMAP:
162eaef79e5Smrg	DestroyBitmapImage(&BW->bitmap.storage);
163eaef79e5Smrg	pixmap = (Pixmap *) value;
164eaef79e5Smrg	BW->bitmap.storage = GetImage(BW, *pixmap);
165eaef79e5Smrg	XFree((char *)pixmap);
166eaef79e5Smrg	break;
167eaef79e5Smrg
168eaef79e5Smrg    default:
169eaef79e5Smrg	XtWarning(" selection request failed.  BitmapWidget");
170eaef79e5Smrg	break;
171eaef79e5Smrg    }
172eaef79e5Smrg
173eaef79e5Smrg    BW->bitmap.selection.limbo = FALSE;
174eaef79e5Smrg}
175eaef79e5Smrg
176eaef79e5Smrgvoid
177eaef79e5SmrgBWRequestSelection(Widget w, Time btime, Boolean wait)
178eaef79e5Smrg{
179eaef79e5Smrg  BitmapWidget BW = (BitmapWidget) w;
180eaef79e5Smrg
181eaef79e5Smrg  if (BW->bitmap.selection.own)
182eaef79e5Smrg    BWStore(w);
183eaef79e5Smrg  else {
184eaef79e5Smrg    XtGetSelectionValue(w, XA_PRIMARY, XA_PIXMAP,
185eaef79e5Smrg			SelectionCallback, NULL, btime);
186eaef79e5Smrg
187eaef79e5Smrg    BW->bitmap.selection.limbo = TRUE;
188eaef79e5Smrg
189eaef79e5Smrg    if (wait)
190eaef79e5Smrg      while (BW->bitmap.selection.limbo) {
191eaef79e5Smrg	XEvent event;
192eaef79e5Smrg	XtNextEvent(&event);
193eaef79e5Smrg	XtDispatchEvent(&event);
194eaef79e5Smrg      }
195eaef79e5Smrg  }
196eaef79e5Smrg}
197eaef79e5Smrg
198eaef79e5Smrg/* ARGSUSED */
199eaef79e5Smrg/* Returns true if there is a transferable selection */
200eaef79e5SmrgBoolean
201eaef79e5SmrgBWQuerySelection(Widget w, Time btime)
202eaef79e5Smrg{
203eaef79e5Smrg/* To be written.  XA_TARGETS to be used.  So far undefined ?!? */
204eaef79e5Smrg
205eaef79e5Smrg  return True;
206eaef79e5Smrg}
207eaef79e5Smrg/*****************************************************************************/
208