diff lib/AdoptedShe.c @ 0:92745d501b9a

initial import from kinput2-v3.1
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 04:44:30 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/AdoptedShe.c	Mon Mar 08 04:44:30 2010 +0900
@@ -0,0 +1,196 @@
+#ifndef lint
+static char *rcsid = "$Id: AdoptedShe.c,v 1.6 1991/09/23 04:03:31 ishisone Rel $";
+#endif
+/*
+ * Copyright (c) 1990  Software Research Associates, Inc.
+ *
+ * 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 name of Software Research Associates not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Software Research
+ * Associates makes no representations about the suitability of this software
+ * for any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Author:  Makoto Ishisone, Software Research Associates, Inc., Japan
+ */
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include "AdoptedShP.h"
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(AdoptedShellWidget, adoptedshell.field)
+    { XtNparentWindow, XtCParentWindow, XtRWindow, sizeof(Window),
+	offset(parent), XtRImmediate, None },
+    { XtNdisableGeometryManagement, XtCDisableGeometryManagement,
+	XtRBoolean, sizeof(Boolean),
+	offset(disable_geometry), XtRString, "False" },
+#undef offset
+};
+
+static void Initialize();
+static void Realize();
+static Boolean SetValues();
+static XtGeometryResult GeometryManager();
+
+static void GetParentInfo();
+
+AdoptedShellClassRec adoptedShellClassRec = {
+  { /* core fields */
+    /* superclass		*/	(WidgetClass) &overrideShellClassRec,
+    /* class_name		*/	"AdoptedShell",
+    /* widget_size		*/	sizeof(AdoptedShellRec),
+    /* class_initialize		*/	NULL,
+    /* class_part_initialize	*/	NULL,
+    /* class_inited		*/	FALSE,
+    /* initialize		*/	Initialize,
+    /* initialize_hook		*/	NULL,
+    /* realize			*/	Realize,
+    /* actions			*/	NULL,
+    /* num_actions		*/	0,
+    /* resources		*/	resources,
+    /* num_resources		*/	XtNumber(resources),
+    /* xrm_class		*/	NULLQUARK,
+    /* compress_motion		*/	TRUE,
+    /* compress_exposure	*/	TRUE,
+    /* compress_enterleave	*/	TRUE,
+    /* visible_interest		*/	FALSE,
+    /* destroy			*/	NULL,
+    /* resize			*/	XtInheritResize,
+    /* expose			*/	XtInheritExpose,
+    /* set_values		*/	SetValues,
+    /* set_values_hook		*/	NULL,
+    /* set_values_almost	*/	XtInheritSetValuesAlmost,
+    /* get_values_hook		*/	NULL,
+    /* accept_focus		*/	NULL,
+    /* version			*/	XtVersion,
+    /* callback_private		*/	NULL,
+    /* tm_table			*/	NULL,
+    /* query_geometry		*/	XtInheritQueryGeometry,
+    /* display_accelerator	*/	XtInheritDisplayAccelerator,
+    /* extension		*/	NULL
+  },
+  { /* Composite */
+    /* geometry_manager		*/	GeometryManager,
+    /* change_managed		*/	XtInheritChangeManaged,
+    /* insert_child		*/	XtInheritInsertChild,
+    /* delete_child		*/	XtInheritDeleteChild,
+    /* extension		*/	NULL
+  },
+  { /* shell fields */
+    /* extension		*/	NULL
+  },
+  { /* overrideShell fields */
+    /* extension		*/	NULL
+  },
+  { /* AdoptedShell fields */
+    /* empty			*/	0
+  }
+};
+
+WidgetClass adoptedShellWidgetClass = (WidgetClass)&adoptedShellClassRec;
+
+/* ARGSUSED */
+static void
+Initialize(req, new, args, num_args)
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)new;
+    Cardinal i;
+
+    asw->adoptedshell.colormap_specified = False;
+    for (i = 0; i < *num_args; i++) {
+	if (!strcmp(args[i].name, XtNcolormap)) {
+	    asw->adoptedshell.colormap_specified = True;
+	    break;
+	}
+    }
+}
+
+static void
+Realize(w, maskp, attr)
+Widget w;
+XtValueMask *maskp;
+XSetWindowAttributes *attr;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)w;
+    Window savedroot;
+
+    if (asw->adoptedshell.parent == None) {
+	asw->adoptedshell.parent = w->core.screen->root;
+    } else {
+	GetParentInfo(asw);
+    }
+    asw->adoptedshell.colormap_specified = False;
+
+    /* cheat the super-class's realize function */
+    savedroot = w->core.screen->root;
+    w->core.screen->root = asw->adoptedshell.parent;
+
+    /* call super class's realize function */
+    (*adoptedShellWidgetClass->core_class.superclass->core_class.realize)(w, maskp, attr);
+
+    /* restore savedroot */
+    w->core.screen->root = savedroot;
+}
+
+/* ARGSUSED */
+static Boolean
+SetValues(cur, req, new, args, num_args)
+Widget cur;
+Widget req;
+Widget new;
+ArgList args;
+Cardinal *num_args;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)new;
+    AdoptedShellWidget old = (AdoptedShellWidget)cur;
+
+    if (asw->adoptedshell.parent != old->adoptedshell.parent) {
+	if (XtIsRealized(new)) {
+	    XtAppError(XtWidgetToApplicationContext(new),
+		       "AdoptedShell: can't change parent window after realization");
+	}
+    }
+    if (asw->core.colormap != old->core.colormap && !XtIsRealized(new)) {
+	asw->adoptedshell.colormap_specified = True;
+    }
+    return False;
+}
+
+static XtGeometryResult
+GeometryManager(w, reqp, repp)
+Widget w;
+XtWidgetGeometry *reqp;
+XtWidgetGeometry *repp;
+{
+    AdoptedShellWidget asw = (AdoptedShellWidget)XtParent(w);
+    ShellWidgetClass super;
+
+    if (asw->adoptedshell.disable_geometry) return XtGeometryYes;
+
+    super = (ShellWidgetClass)(adoptedShellWidgetClass->core_class.superclass);
+    return (*super->composite_class.geometry_manager)(w, reqp, repp);
+}
+
+static void
+GetParentInfo(w)
+AdoptedShellWidget w;
+{
+    Window parent = w->adoptedshell.parent;
+    XWindowAttributes attr;
+
+    (void)XGetWindowAttributes(XtDisplay((Widget)w), parent, &attr);
+    w->core.screen = attr.screen;
+    if (!w->adoptedshell.colormap_specified) w->core.colormap = attr.colormap;
+    /* may be I should honor user-specified visual, etc. */
+    w->core.depth = attr.depth;
+    w->shell.visual = attr.visual;
+}