1/* 2 3Copyright 1987, 1988, 1994, 1998 The Open Group 4 5Permission to use, copy, modify, distribute, and sell this software and its 6documentation for any purpose is hereby granted without fee, provided that 7the above copyright notice appear in all copies and that both that 8copyright notice and this permission notice appear in supporting 9documentation. 10 11The above copyright notice and this permission notice shall be included in 12all copies or substantial portions of the Software. 13 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21Except as contained in this notice, the name of The Open Group shall not be 22used in advertising or otherwise to promote the sale, use or other dealings 23in this Software without prior written authorization from The Open Group. 24 25 26Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. 27 28 All Rights Reserved 29 30Permission to use, copy, modify, and distribute this software and its 31documentation for any purpose and without fee is hereby granted, 32provided that the above copyright notice appear in all copies and that 33both that copyright notice and this permission notice appear in 34supporting documentation, and that the name of Digital not be 35used in advertising or publicity pertaining to distribution of the 36software without specific, written prior permission. 37 38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 44SOFTWARE. 45 46*/ 47 48/* 49 * AsciiText.c - Source code for AsciiText Widget 50 * 51 * This Widget is intended to be used as a simple front end to the 52 * text widget with an ascii source and ascii sink attached to it 53 * 54 * Date: June 29, 1989 55 * 56 * By: Chris D. Peterson 57 * MIT X Consortium 58 * kit@expo.lcs.mit.edu 59 */ 60 61#ifdef HAVE_CONFIG_H 62#include <config.h> 63#endif 64#include <stdio.h> 65#include <X11/IntrinsicP.h> 66#include <X11/StringDefs.h> 67#include <X11/Xaw/AsciiTextP.h> 68#include <X11/Xaw/AsciiSrcP.h> 69#include <X11/Xaw/AsciiSink.h> 70#include <X11/Xaw/Cardinals.h> 71#include <X11/Xaw/MultiSinkP.h> 72#include <X11/Xaw/MultiSrc.h> 73#include <X11/Xaw/XawImP.h> 74#include <X11/Xaw/XawInit.h> 75#include "Private.h" 76 77#define TAB_COUNT 32 78 79/* 80 * Class Methods 81 */ 82static void XawAsciiInitialize(Widget, Widget, ArgList, Cardinal*); 83static void XawAsciiDestroy(Widget); 84 85/* 86 * From TextSrc.c 87 */ 88void _XawSourceAddText(Widget, Widget); 89void _XawSourceRemoveText(Widget, Widget, Bool); 90 91#define Superclass (&textClassRec) 92AsciiTextClassRec asciiTextClassRec = { 93 /* core */ 94 { 95 (WidgetClass)Superclass, /* superclass */ 96 "Text", /* class_name */ 97 sizeof(AsciiRec), /* widget_size */ 98 XawInitializeWidgetSet, /* class_initialize */ 99 NULL, /* class_part_init */ 100 False, /* class_inited */ 101 XawAsciiInitialize, /* initialize */ 102 NULL, /* initialize_hook */ 103 XtInheritRealize, /* realize */ 104 NULL, /* actions */ 105 0, /* num_actions */ 106 NULL, /* resources */ 107 0, /* num_resource */ 108 NULLQUARK, /* xrm_class */ 109 True, /* compress_motion */ 110 XtExposeGraphicsExpose | /* compress_exposure */ 111 XtExposeNoExpose, 112 True, /* compress_enterleave */ 113 False, /* visible_interest */ 114 XawAsciiDestroy, /* destroy */ 115 XtInheritResize, /* resize */ 116 XtInheritExpose, /* expose */ 117 NULL, /* set_values */ 118 NULL, /* set_values_hook */ 119 XtInheritSetValuesAlmost, /* set_values_almost */ 120 NULL, /* get_values_hook */ 121 XtInheritAcceptFocus, /* accept_focus */ 122 XtVersion, /* version */ 123 NULL, /* callback_private */ 124 XtInheritTranslations, /* tm_table */ 125 XtInheritQueryGeometry, /* query_geometry */ 126 NULL, /* display_accelerator */ 127 NULL, /* extension */ 128 }, 129 /* simple */ 130 { 131 XtInheritChangeSensitive, /* change_sensitive */ 132#ifndef OLDXAW 133 NULL, 134#endif 135 }, 136 /* text */ 137 { 138 NULL, /* extension */ 139 }, 140 /* ascii */ 141 { 142 NULL, /* extension */ 143 }, 144}; 145 146WidgetClass asciiTextWidgetClass = (WidgetClass)&asciiTextClassRec; 147 148#ifdef ASCII_STRING 149AsciiStringClassRec asciiStringClassRec = { 150 /* core */ 151 { 152 (WidgetClass)&asciiTextClassRec, /* superclass */ 153 "Text", /* class_name */ 154 sizeof(AsciiStringRec), /* widget_size */ 155 NULL, /* class_initialize */ 156 NULL, /* class_part_init */ 157 False, /* class_inited */ 158 NULL, /* initialize */ 159 NULL, /* initialize_hook */ 160 XtInheritRealize, /* realize */ 161 NULL, /* actions */ 162 0, /* num_actions */ 163 NULL, /* resources */ 164 0, /* num_resource */ 165 NULLQUARK, /* xrm_class */ 166 True, /* compress_motion */ 167 XtExposeGraphicsExpose | /* compress_exposure */ 168 XtExposeNoExpose, 169 True, /* compress_enterleave */ 170 False, /* visible_interest */ 171 NULL, /* destroy */ 172 XtInheritResize, /* resize */ 173 XtInheritExpose, /* expose */ 174 NULL, /* set_values */ 175 NULL, /* set_values_hook */ 176 XtInheritSetValuesAlmost, /* set_values_almost */ 177 NULL, /* get_values_hook */ 178 XtInheritAcceptFocus, /* accept_focus */ 179 XtVersion, /* version */ 180 NULL, /* callback_private */ 181 XtInheritTranslations, /* tm_table */ 182 XtInheritQueryGeometry, /* query_geometry */ 183 }, 184 /* simple */ 185 { 186 XtInheritChangeSensitive, /* change_sensitive */ 187 }, 188 /* text */ 189 { 190 NULL, /* extension */ 191 }, 192 /* ascii */ 193 { 194 NULL, /* extension */ 195 }, 196 /* string */ 197 { 198 NULL, /* extension */ 199 }, 200}; 201 202WidgetClass asciiStringWidgetClass = (WidgetClass)&asciiStringClassRec; 203#endif /* ASCII_STRING */ 204 205#ifdef ASCII_DISK 206AsciiDiskClassRec asciiDiskClassRec = { 207 /* core */ 208 { 209 (WidgetClass)&asciiTextClassRec, /* superclass */ 210 "Text", /* class_name */ 211 sizeof(AsciiDiskRec), /* widget_size */ 212 NULL, /* class_initialize */ 213 NULL, /* class_part_init */ 214 False, /* class_inited */ 215 NULL, /* initialize */ 216 NULL, /* initialize_hook */ 217 XtInheritRealize, /* realize */ 218 NULL, /* actions */ 219 0, /* num_actions */ 220 NULL, /* resources */ 221 0, /* num_resource */ 222 NULLQUARK, /* xrm_class */ 223 True, /* compress_motion */ 224 True, /* compress_exposure */ 225 XtExposeGraphicsExpose | /* compress_enterleave */ 226 XtExposeNoExpose, 227 False, /* visible_interest */ 228 NULL, /* destroy */ 229 XtInheritResize, /* resize */ 230 XtInheritExpose, /* expose */ 231 NULL, /* set_values */ 232 NULL, /* set_values_hook */ 233 XtInheritSetValuesAlmost, /* set_values_almost */ 234 NULL, /* get_values_hook */ 235 XtInheritAcceptFocus, /* accept_focus */ 236 XtVersion, /* version */ 237 NULL, /* callback_private */ 238 XtInheritTranslations, /* tm_table */ 239 XtInheritQueryGeometry, /* query_geometry */ 240 }, 241 /* simple */ 242 { 243 XtInheritChangeSensitive, /* change_sensitive */ 244 }, 245 /* text */ 246 { 247 NULL, /* extension */ 248 }, 249 /* ascii */ 250 { 251 NULL, /* extension */ 252 }, 253 /* disk */ 254 { 255 NULL, /* extension */ 256 }, 257}; 258 259WidgetClass asciiDiskWidgetClass = (WidgetClass)&asciiDiskClassRec; 260#endif /* ASCII_DISK */ 261 262/* 263 * Implementation 264 */ 265static void 266XawAsciiInitialize(Widget request, Widget cnew, 267 ArgList args, Cardinal *num_args) 268{ 269 AsciiWidget w = (AsciiWidget)cnew; 270 int i; 271 int tabs[TAB_COUNT], tab; 272 273 MultiSinkObject sink; 274 275 /* superclass Initialize can't set the following, 276 * as it didn't know the source or sink when it was called 277 */ 278 if (XtHeight(request) == DEFAULT_TEXT_HEIGHT) 279 XtHeight(cnew) = DEFAULT_TEXT_HEIGHT; 280 281 /* This is the main change for internationalization */ 282 if (w->simple.international == True) { /* The multi* are international */ 283 if (w->text.sink == NULL) 284 w->text.sink = XtCreateWidget("textSink", multiSinkObjectClass, 285 cnew, args, *num_args); 286 else if (!XtIsSubclass(w->text.sink, multiSinkObjectClass)) 287 XtError("Sink object is not a subclass of multiSink"); 288 289 if (w->text.source == NULL) 290 w->text.source = XtCreateWidget("textSource", multiSrcObjectClass, 291 cnew, args, *num_args); 292 else if (!XtIsSubclass(w->text.source, multiSrcObjectClass)) 293 XtError("Source object is not a subclass of multiSrc"); 294#ifndef OLDXAW 295 else 296 _XawSourceAddText(w->text.source, cnew); 297#endif 298 } 299 else { 300 if (w->text.sink == NULL) 301 w->text.sink = XtCreateWidget("textSink", asciiSinkObjectClass, 302 cnew, args, *num_args); 303 else if (!XtIsSubclass(w->text.source, asciiSinkObjectClass)) 304 XtError("Sink object is not a subclass of asciiSink"); 305 306 if (w->text.source == NULL) 307 w->text.source = XtCreateWidget("textSource", asciiSrcObjectClass, 308 cnew, args, *num_args); 309 else if (!XtIsSubclass(w->text.source, asciiSrcObjectClass)) 310 XtError("Source object is not a subclass of asciiSrc"); 311#ifndef OLDXAW 312 else 313 _XawSourceAddText(w->text.source, cnew); 314#endif 315 } 316 317 if (XtHeight(w) == DEFAULT_TEXT_HEIGHT) 318 XtHeight(w) = (Dimension)(VMargins(w) + XawTextSinkMaxHeight(w->text.sink, 1)); 319 320 for (i = 0, tab = 0; i < TAB_COUNT; i++) 321 tabs[i] = (tab += 8); 322 323 XawTextSinkSetTabs(w->text.sink, TAB_COUNT, tabs); 324 325 XawTextDisableRedisplay(cnew); 326 XawTextEnableRedisplay(cnew); 327 328 _XawImRegister(cnew); 329 330 /* If we are using a MultiSink we need to tell the input method stuff */ 331 if (w->simple.international == True) { 332 Arg list[4]; 333 Cardinal ac = 0; 334 335 sink = (MultiSinkObject)w->text.sink; 336 XtSetArg(list[ac], XtNfontSet, sink->multi_sink.fontset); ac++; 337 XtSetArg(list[ac], XtNinsertPosition, w->text.insertPos); ac++; 338 XtSetArg(list[ac], XtNforeground, sink->text_sink.foreground); ac++; 339 XtSetArg(list[ac], XtNbackground, sink->text_sink.background); ac++; 340 _XawImSetValues(cnew, list, ac); 341 } 342} 343 344static void 345XawAsciiDestroy(Widget w) 346{ 347 AsciiWidget ascii = (AsciiWidget)w; 348 349 _XawImUnregister(w); 350 351 if (w == XtParent(ascii->text.sink)) 352 XtDestroyWidget(ascii->text.sink); 353 354#ifdef OLDXAW 355 if (w == XtParent(ascii->text.source)) 356 XtDestroyWidget(ascii->text.source); 357#else 358 _XawSourceRemoveText(ascii->text.source, w, 359 ascii->text.source && 360 w == XtParent(ascii->text.source)); 361#endif 362} 363