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