diff options
Diffstat (limited to 'src/Core.c')
-rw-r--r-- | src/Core.c | 397 |
1 files changed, 397 insertions, 0 deletions
diff --git a/src/Core.c b/src/Core.c new file mode 100644 index 0000000..343204b --- /dev/null +++ b/src/Core.c @@ -0,0 +1,397 @@ +/* $Xorg: Core.c,v 1.4 2001/02/09 02:03:54 xorgcvs Exp $ */ + +/*********************************************************** +Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, +Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or Sun not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* + +Copyright 1987, 1988, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ + +#define _XT_CORE_C + +#include "IntrinsicP.h" +#include "EventI.h" +#include "ConvertI.h" +#include "TranslateI.h" +#include "ResourceI.h" +#include "RectObj.h" +#include "RectObjP.h" +#include "ThreadsI.h" +#include "StringDefs.h" + +/****************************************************************** + * + * CoreWidget Resources + * + ******************************************************************/ + +externaldef(xtinherittranslations) int _XtInheritTranslations = 0; +extern String XtCXtToolkitError; /* from IntrinsicI.h */ +static void XtCopyScreen(); + +static XtResource resources[] = { + {XtNscreen, XtCScreen, XtRScreen, sizeof(Screen*), + XtOffsetOf(CoreRec,core.screen), XtRCallProc, (XtPointer)XtCopyScreen}, +/*_XtCopyFromParent does not work for screen because the Display +parameter is not passed through to the XtRCallProc routines */ + {XtNdepth, XtCDepth, XtRInt,sizeof(int), + XtOffsetOf(CoreRec,core.depth), + XtRCallProc, (XtPointer)_XtCopyFromParent}, + {XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap), + XtOffsetOf(CoreRec,core.colormap), + XtRCallProc,(XtPointer)_XtCopyFromParent}, + {XtNbackground, XtCBackground, XtRPixel,sizeof(Pixel), + XtOffsetOf(CoreRec,core.background_pixel), + XtRString, (XtPointer)"XtDefaultBackground"}, + {XtNbackgroundPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap), + XtOffsetOf(CoreRec,core.background_pixmap), + XtRImmediate, (XtPointer)XtUnspecifiedPixmap}, + {XtNborderColor, XtCBorderColor, XtRPixel,sizeof(Pixel), + XtOffsetOf(CoreRec,core.border_pixel), + XtRString,(XtPointer)"XtDefaultForeground"}, + {XtNborderPixmap, XtCPixmap, XtRPixmap, sizeof(Pixmap), + XtOffsetOf(CoreRec,core.border_pixmap), + XtRImmediate, (XtPointer)XtUnspecifiedPixmap}, + {XtNmappedWhenManaged, XtCMappedWhenManaged, XtRBoolean, sizeof(Boolean), + XtOffsetOf(CoreRec,core.mapped_when_managed), + XtRImmediate, (XtPointer)True}, + {XtNtranslations, XtCTranslations, XtRTranslationTable, + sizeof(XtTranslations), XtOffsetOf(CoreRec,core.tm.translations), + XtRTranslationTable, (XtPointer)NULL}, + {XtNaccelerators, XtCAccelerators, XtRAcceleratorTable, + sizeof(XtTranslations), XtOffsetOf(CoreRec,core.accelerators), + XtRTranslationTable, (XtPointer)NULL} + }; + +static void CoreInitialize(); +static void CoreClassPartInitialize(); +static void CoreDestroy(); +static void CoreRealize(); +static Boolean CoreSetValues(); +static void CoreSetValuesAlmost(); + +static RectObjClassRec unNamedObjClassRec = { + { + /* superclass */ (WidgetClass)&rectObjClassRec, + /* class_name */ "UnNamedObj", + /* widget_size */ 0, + /* class_initialize */ NULL, + /* class_part_initialize*/ NULL, + /* class_inited */ FALSE, + /* initialize */ NULL, + /* initialize_hook */ NULL, + /* realize */ (XtProc)XtInheritRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ NULL, + /* num_resources */ 0, + /* xrm_class */ NULLQUARK, + /* compress_motion */ FALSE, + /* compress_exposure */ FALSE, + /* compress_enterleave*/ FALSE, + /* visible_interest */ FALSE, + /* destroy */ NULL, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ XtInheritSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_offsets */ NULL, + /* tm_table */ NULL, + /* query_geometry */ NULL, + /* display_accelerator */ NULL, + /* extension */ NULL + } +}; + + +externaldef(widgetclassrec) WidgetClassRec widgetClassRec = { +{ + /* superclass */ (WidgetClass)&unNamedObjClassRec, + /* class_name */ "Core", + /* widget_size */ sizeof(WidgetRec), + /* class_initialize */ NULL, + /* class_part_initialize*/ CoreClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ CoreInitialize, + /* initialize_hook */ NULL, + /* realize */ CoreRealize, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ FALSE, + /* compress_exposure */ TRUE, + /* compress_enterleave*/ FALSE, + /* visible_interest */ FALSE, + /* destroy */ CoreDestroy, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ CoreSetValues, + /* set_values_hook */ NULL, + /* set_values_almost */ CoreSetValuesAlmost, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_offsets */ NULL, + /* tm_table */ NULL, + /* query_geometry */ NULL, + /* display_accelerator */ NULL, + /* extension */ NULL + } +}; +externaldef (WidgetClass) WidgetClass widgetClass = &widgetClassRec; + +externaldef (WidgetClass) WidgetClass coreWidgetClass = &widgetClassRec; + + +/*ARGSUSED*/ +static void XtCopyScreen(widget, offset, value) + Widget widget; + int offset; + XrmValue *value; +{ + value->addr = (XPointer)(&widget->core.screen); +} + +/* + * Start of Core methods + */ + +static void CoreClassPartInitialize(wc) + register WidgetClass wc; +{ + /* We don't need to check for null super since we'll get to object + eventually, and it had better define them! */ + + register WidgetClass super = wc->core_class.superclass; + + LOCK_PROCESS; + if (wc->core_class.realize == XtInheritRealize) { + wc->core_class.realize = super->core_class.realize; + } + + if (wc->core_class.accept_focus == XtInheritAcceptFocus) { + wc->core_class.accept_focus = super->core_class.accept_focus; + } + + if (wc->core_class.display_accelerator == XtInheritDisplayAccelerator) { + wc->core_class.display_accelerator = + super->core_class.display_accelerator; + } + + if (wc->core_class.tm_table == (char *) XtInheritTranslations) { + wc->core_class.tm_table = + wc->core_class.superclass->core_class.tm_table; + } else if (wc->core_class.tm_table != NULL) { + wc->core_class.tm_table = + (String)XtParseTranslationTable(wc->core_class.tm_table); + } + + if (wc->core_class.actions != NULL) { + Boolean inPlace; + + if (wc->core_class.version == XtVersionDontCheck) + inPlace = True; + else + inPlace = (wc->core_class.version < XtVersion) ? False : True; + + /* Compile the action table into a more efficient form */ + wc->core_class.actions = (XtActionList) _XtInitializeActionData( + wc->core_class.actions, wc->core_class.num_actions, inPlace); + } + UNLOCK_PROCESS; +} +/* ARGSUSED */ +static void CoreInitialize(requested_widget, new_widget, args, num_args) + Widget requested_widget; + register Widget new_widget; + ArgList args; + Cardinal *num_args; +{ + XtTranslations save1, save2; + new_widget->core.event_table = NULL; + new_widget->core.tm.proc_table = NULL; + new_widget->core.tm.lastEventTime = 0; + /* magic semi-resource fetched by GetResources */ + save1 = (XtTranslations)new_widget->core.tm.current_state; + new_widget->core.tm.current_state = NULL; + save2 = new_widget->core.tm.translations; + LOCK_PROCESS; + new_widget->core.tm.translations = + (XtTranslations)new_widget->core.widget_class->core_class.tm_table; + UNLOCK_PROCESS; + if (save1) + _XtMergeTranslations(new_widget, save1, save1->operation); + if (save2) + _XtMergeTranslations(new_widget, save2, save2->operation); +} + +static void CoreRealize(widget, value_mask, attributes) + Widget widget; + XtValueMask *value_mask; + XSetWindowAttributes *attributes; +{ + XtCreateWindow(widget, (unsigned int) InputOutput, + (Visual *) CopyFromParent, *value_mask, attributes); +} /* CoreRealize */ + +static void CoreDestroy (widget) + Widget widget; +{ + _XtFreeEventTable(&widget->core.event_table); + _XtDestroyTMData(widget); + XtUnregisterDrawable(XtDisplay(widget), widget->core.window); + + if (widget->core.popup_list != NULL) + XtFree((char *)widget->core.popup_list); + +} /* CoreDestroy */ + +/* ARGSUSED */ +static Boolean CoreSetValues(old, reference, new, args, num_args) + Widget old, reference, new; + ArgList args; + Cardinal *num_args; +{ + Boolean redisplay; + Mask window_mask; + XSetWindowAttributes attributes; + XtTranslations save; + + redisplay = FALSE; + if (old->core.tm.translations != new->core.tm.translations) { + save = new->core.tm.translations; + new->core.tm.translations = old->core.tm.translations; + _XtMergeTranslations(new, save, XtTableReplace); + } + + /* Check everything that depends upon window being realized */ + if (XtIsRealized(old)) { + window_mask = 0; + /* Check window attributes */ + if (old->core.background_pixel != new->core.background_pixel + && new->core.background_pixmap == XtUnspecifiedPixmap) { + attributes.background_pixel = new->core.background_pixel; + window_mask |= CWBackPixel; + redisplay = TRUE; + } + if (old->core.background_pixmap != new->core.background_pixmap) { + if (new->core.background_pixmap == XtUnspecifiedPixmap) { + window_mask |= CWBackPixel; + attributes.background_pixel = new->core.background_pixel; + } + else { + attributes.background_pixmap = new->core.background_pixmap; + window_mask &= ~CWBackPixel; + window_mask |= CWBackPixmap; + } + redisplay = TRUE; + } + if (old->core.border_pixel != new->core.border_pixel + && new->core.border_pixmap == XtUnspecifiedPixmap) { + attributes.border_pixel = new->core.border_pixel; + window_mask |= CWBorderPixel; + } + if (old->core.border_pixmap != new->core.border_pixmap) { + if (new->core.border_pixmap == XtUnspecifiedPixmap) { + window_mask |= CWBorderPixel; + attributes.border_pixel = new->core.border_pixel; + } + else { + attributes.border_pixmap = new->core.border_pixmap; + window_mask &= ~CWBorderPixel; + window_mask |= CWBorderPixmap; + } + } + if (old->core.depth != new->core.depth) { + XtAppWarningMsg(XtWidgetToApplicationContext(old), + "invalidDepth","setValues",XtCXtToolkitError, + "Can't change widget depth", (String *)NULL, (Cardinal *)NULL); + new->core.depth = old->core.depth; + } + if (old->core.colormap != new->core.colormap) { + window_mask |= CWColormap; + attributes.colormap = new->core.colormap; + } + if (window_mask != 0) { + /* Actually change X window attributes */ + XChangeWindowAttributes( + XtDisplay(new), XtWindow(new), window_mask, &attributes); + } + + if (old->core.mapped_when_managed != new->core.mapped_when_managed) { + Boolean mapped_when_managed = new->core.mapped_when_managed; + new->core.mapped_when_managed = !mapped_when_managed; + XtSetMappedWhenManaged(new, mapped_when_managed); + } + } /* if realized */ + + return redisplay; +} /* CoreSetValues */ + +/*ARGSUSED*/ +static void CoreSetValuesAlmost(old, new, request, reply) + Widget old; + Widget new; + XtWidgetGeometry *request; + XtWidgetGeometry *reply; +{ + *request = *reply; +} |