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