Home | History | Annotate | Line # | Download | only in src
      1 /*
      2 
      3 Copyright 1987, 1988, 1994, 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 in
     12 all copies or substantial portions of the Software.
     13 
     14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     20 
     21 Except as contained in this notice, the name of The Open Group shall not be
     22 used in advertising or otherwise to promote the sale, use or other dealings
     23 in this Software without prior written authorization from The Open Group.
     24 
     25 
     26 Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
     27 
     28                         All Rights Reserved
     29 
     30 Permission to use, copy, modify, and distribute this software and its
     31 documentation for any purpose and without fee is hereby granted,
     32 provided that the above copyright notice appear in all copies and that
     33 both that copyright notice and this permission notice appear in
     34 supporting documentation, and that the name of Digital not be
     35 used in advertising or publicity pertaining to distribution of the
     36 software without specific, written prior permission.
     37 
     38 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
     39 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
     40 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
     41 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
     42 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
     43 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
     44 SOFTWARE.
     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 (at) 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  */
     82 static void XawAsciiInitialize(Widget, Widget, ArgList, Cardinal*);
     83 static void XawAsciiDestroy(Widget);
     84 
     85 /*
     86  * From TextSrc.c
     87  */
     88 void _XawSourceAddText(Widget, Widget);
     89 void _XawSourceRemoveText(Widget, Widget, Bool);
     90 
     91 #define Superclass	(&textClassRec)
     92 AsciiTextClassRec 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 
    146 WidgetClass asciiTextWidgetClass = (WidgetClass)&asciiTextClassRec;
    147 
    148 #ifdef ASCII_STRING
    149 AsciiStringClassRec 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 
    202 WidgetClass asciiStringWidgetClass = (WidgetClass)&asciiStringClassRec;
    203 #endif /* ASCII_STRING */
    204 
    205 #ifdef ASCII_DISK
    206 AsciiDiskClassRec 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 
    259 WidgetClass asciiDiskWidgetClass = (WidgetClass)&asciiDiskClassRec;
    260 #endif /* ASCII_DISK */
    261 
    262 /*
    263  * Implementation
    264  */
    265 static void
    266 XawAsciiInitialize(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 
    344 static void
    345 XawAsciiDestroy(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