|
Packit |
b099d7 |
/* $XConsortium: geoShell.c /main/4 1995/07/15 21:13:36 drk $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define SHELL
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef DEFAULT_WM_TIMEOUT
|
|
Packit |
b099d7 |
#define DEFAULT_WM_TIMEOUT 5000
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "IntrinsicI.h"
|
|
Packit |
b099d7 |
#include "StringDefs.h"
|
|
Packit |
b099d7 |
#include "Shell.h"
|
|
Packit |
b099d7 |
#include "ShellP.h"
|
|
Packit |
b099d7 |
#include "Vendor.h"
|
|
Packit |
b099d7 |
#include "VendorP.h"
|
|
Packit |
b099d7 |
#include <X11/Xatom.h>
|
|
Packit |
b099d7 |
#include <X11/Xlocale.h>
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "geoTattler.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Note: per the Xt spec, the Shell geometry management assumes in
|
|
Packit |
b099d7 |
* several places that there is only one managed child. This is
|
|
Packit |
b099d7 |
* *not* a bug. Any subclass that assumes otherwise is broken.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define WM_CONFIGURE_DENIED(w) (((WMShellWidget) (w))->wm.wm_configure_denied)
|
|
Packit |
b099d7 |
#define WM_MOVED(w) (((WMShellWidget) (w))->wm.wm_moved)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define BIGSIZE ((Dimension)32767)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Default values for resource lists
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef CRAY
|
|
Packit |
b099d7 |
void _XtShellDepth();
|
|
Packit |
b099d7 |
void _XtShellColormap();
|
|
Packit |
b099d7 |
void _XtShellAncestorSensitive();
|
|
Packit |
b099d7 |
void _XtTitleEncoding();
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
static void _XtShellDepth();
|
|
Packit |
b099d7 |
static void _XtShellColormap();
|
|
Packit |
b099d7 |
static void _XtShellAncestorSensitive();
|
|
Packit |
b099d7 |
static void _XtTitleEncoding();
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Shell class record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define Offset(x) (XtOffsetOf(ShellRec, x))
|
|
Packit |
b099d7 |
static XtResource shellResources[]=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{XtNx, XtCPosition, XtRPosition, sizeof(Position),
|
|
Packit |
b099d7 |
Offset(core.x), XtRImmediate, (XtPointer)BIGSIZE},
|
|
Packit |
b099d7 |
{XtNy, XtCPosition, XtRPosition, sizeof(Position),
|
|
Packit |
b099d7 |
Offset(core.y), XtRImmediate, (XtPointer)BIGSIZE},
|
|
Packit |
b099d7 |
{ XtNdepth, XtCDepth, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(core.depth), XtRCallProc, (XtPointer) _XtShellDepth},
|
|
Packit |
b099d7 |
{ XtNcolormap, XtCColormap, XtRColormap, sizeof(Colormap),
|
|
Packit |
b099d7 |
Offset(core.colormap), XtRCallProc, (XtPointer) _XtShellColormap},
|
|
Packit |
b099d7 |
{ XtNancestorSensitive, XtCSensitive, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(core.ancestor_sensitive), XtRCallProc,
|
|
Packit |
b099d7 |
(XtPointer) _XtShellAncestorSensitive},
|
|
Packit |
b099d7 |
{ XtNallowShellResize, XtCAllowShellResize, XtRBoolean,
|
|
Packit |
b099d7 |
sizeof(Boolean), Offset(shell.allow_shell_resize),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer)False},
|
|
Packit |
b099d7 |
{ XtNgeometry, XtCGeometry, XtRString, sizeof(String),
|
|
Packit |
b099d7 |
Offset(shell.geometry), XtRString, (XtPointer)NULL},
|
|
Packit |
b099d7 |
{ XtNcreatePopupChildProc, XtCCreatePopupChildProc, XtRFunction,
|
|
Packit |
b099d7 |
sizeof(XtCreatePopupChildProc), Offset(shell.create_popup_child_proc),
|
|
Packit |
b099d7 |
XtRFunction, NULL},
|
|
Packit |
b099d7 |
{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(shell.save_under), XtRImmediate, (XtPointer)False},
|
|
Packit |
b099d7 |
{ XtNpopupCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
Offset(shell.popup_callback), XtRCallback, (XtPointer) NULL},
|
|
Packit |
b099d7 |
{ XtNpopdownCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
|
|
Packit |
b099d7 |
Offset(shell.popdown_callback), XtRCallback, (XtPointer) NULL},
|
|
Packit |
b099d7 |
{ XtNoverrideRedirect, XtCOverrideRedirect,
|
|
Packit |
b099d7 |
XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer)False},
|
|
Packit |
b099d7 |
{ XtNvisual, XtCVisual, XtRVisual, sizeof(Visual*),
|
|
Packit |
b099d7 |
Offset(shell.visual), XtRImmediate, CopyFromParent}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ClassPartInitialize(), Initialize();
|
|
Packit |
b099d7 |
static void Realize();
|
|
Packit |
b099d7 |
static void Resize();
|
|
Packit |
b099d7 |
static Boolean SetValues();
|
|
Packit |
b099d7 |
static void GetValuesHook();
|
|
Packit |
b099d7 |
static void ChangeManaged(); /* XXX */
|
|
Packit |
b099d7 |
static XtGeometryResult GeometryManager(), RootGeometryManager();
|
|
Packit |
b099d7 |
static void Destroy();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static ShellClassExtensionRec shellClassExtRec = {
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULLQUARK,
|
|
Packit |
b099d7 |
XtShellExtensionVersion,
|
|
Packit |
b099d7 |
sizeof(ShellClassExtensionRec),
|
|
Packit |
b099d7 |
RootGeometryManager
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(shellclassrec) ShellClassRec shellClassRec = {
|
|
Packit |
b099d7 |
{ /* Core */
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &compositeClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "Shell",
|
|
Packit |
b099d7 |
/* size */ sizeof(ShellRec),
|
|
Packit |
b099d7 |
/* Class Initializer */ NULL,
|
|
Packit |
b099d7 |
/* class_part_initialize*/ ClassPartInitialize,
|
|
Packit |
b099d7 |
/* Class init'ed ? */ FALSE,
|
|
Packit |
b099d7 |
/* initialize */ Initialize,
|
|
Packit |
b099d7 |
/* initialize_notify */ NULL,
|
|
Packit |
b099d7 |
/* realize */ Realize,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ shellResources,
|
|
Packit |
b099d7 |
/* resource_count */ XtNumber(shellResources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ FALSE,
|
|
Packit |
b099d7 |
/* compress_exposure */ TRUE,
|
|
Packit |
b099d7 |
/* compress_enterleave*/ FALSE,
|
|
Packit |
b099d7 |
/* visible_interest */ FALSE,
|
|
Packit |
b099d7 |
/* destroy */ Destroy,
|
|
Packit |
b099d7 |
/* resize */ Resize,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ SetValues,
|
|
Packit |
b099d7 |
/* set_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
Packit |
b099d7 |
/* get_values_hook */ GetValuesHook,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* intrinsics version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsets */ NULL,
|
|
Packit |
b099d7 |
/* tm_table */ NULL,
|
|
Packit |
b099d7 |
/* query_geometry */ NULL,
|
|
Packit |
b099d7 |
/* display_accelerator*/ NULL,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{ /* Composite */
|
|
Packit |
b099d7 |
/* geometry_manager */ GeometryManager,
|
|
Packit |
b099d7 |
/* change_managed */ ChangeManaged,
|
|
Packit |
b099d7 |
/* insert_child */ XtInheritInsertChild,
|
|
Packit |
b099d7 |
/* delete_child */ XtInheritDeleteChild,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{ /* Shell */
|
|
Packit |
b099d7 |
/* extension */ (XtPointer)&shellClassExtRec
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(shellwidgetclass) WidgetClass shellWidgetClass = (WidgetClass) (&shellClassRec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* OverrideShell class record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource overrideResources[]=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtNoverrideRedirect, XtCOverrideRedirect,
|
|
Packit |
b099d7 |
XtRBoolean, sizeof(Boolean), Offset(shell.override_redirect),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer)True},
|
|
Packit |
b099d7 |
{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(shell.save_under), XtRImmediate, (XtPointer)True},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(overrideshellclassrec) OverrideShellClassRec overrideShellClassRec = {
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &shellClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "OverrideShell",
|
|
Packit |
b099d7 |
/* size */ sizeof(OverrideShellRec),
|
|
Packit |
b099d7 |
/* Class Initializer */ NULL,
|
|
Packit |
b099d7 |
/* class_part_initialize*/ NULL,
|
|
Packit |
b099d7 |
/* Class init'ed ? */ FALSE,
|
|
Packit |
b099d7 |
/* initialize */ NULL,
|
|
Packit |
b099d7 |
/* initialize_notify */ NULL,
|
|
Packit |
b099d7 |
/* realize */ XtInheritRealize,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ overrideResources,
|
|
Packit |
b099d7 |
/* resource_count */ XtNumber(overrideResources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ FALSE,
|
|
Packit |
b099d7 |
/* compress_exposure */ TRUE,
|
|
Packit |
b099d7 |
/* compress_enterleave*/ FALSE,
|
|
Packit |
b099d7 |
/* visible_interest */ FALSE,
|
|
Packit |
b099d7 |
/* destroy */ NULL,
|
|
Packit |
b099d7 |
/* resize */ XtInheritResize,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ NULL,
|
|
Packit |
b099d7 |
/* set_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
Packit |
b099d7 |
/* get_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* intrinsics version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsets */ NULL,
|
|
Packit |
b099d7 |
/* tm_table */ NULL,
|
|
Packit |
b099d7 |
/* query_geometry */ NULL,
|
|
Packit |
b099d7 |
/* display_accelerator */ NULL,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* geometry_manager */ XtInheritGeometryManager,
|
|
Packit |
b099d7 |
/* change_managed */ XtInheritChangeManaged,
|
|
Packit |
b099d7 |
/* insert_child */ XtInheritInsertChild,
|
|
Packit |
b099d7 |
/* delete_child */ XtInheritDeleteChild,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(overrideshellwidgetclass) WidgetClass overrideShellWidgetClass =
|
|
Packit |
b099d7 |
(WidgetClass) (&overrideShellClassRec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* WMShell class record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef Offset
|
|
Packit |
b099d7 |
#define Offset(x) (XtOffsetOf(WMShellRec, x))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int default_unspecified_shell_int = XtUnspecifiedShellInt;
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Warning, casting XtUnspecifiedShellInt (which is -1) to an (XtPointer)
|
|
Packit |
b099d7 |
* can result is loss of bits on some machines (i.e. crays)
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource wmResources[]=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtNtitle, XtCTitle, XtRString, sizeof(String),
|
|
Packit |
b099d7 |
Offset(wm.title), XtRString, NULL},
|
|
Packit |
b099d7 |
{ XtNtitleEncoding, XtCTitleEncoding, XtRAtom, sizeof(Atom),
|
|
Packit |
b099d7 |
Offset(wm.title_encoding),
|
|
Packit |
b099d7 |
XtRCallProc, (XtPointer) _XtTitleEncoding},
|
|
Packit |
b099d7 |
{ XtNwmTimeout, XtCWmTimeout, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.wm_timeout), XtRImmediate,(XtPointer)DEFAULT_WM_TIMEOUT},
|
|
Packit |
b099d7 |
{ XtNwaitForWm, XtCWaitForWm, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(wm.wait_for_wm), XtRImmediate, (XtPointer)True},
|
|
Packit |
b099d7 |
{ XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(wm.transient), XtRImmediate, (XtPointer)False},
|
|
Packit |
b099d7 |
/* size_hints minus things stored in core */
|
|
Packit |
b099d7 |
{ XtNbaseWidth, XtCBaseWidth, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.base_width),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNbaseHeight, XtCBaseHeight, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.base_height),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNwinGravity, XtCWinGravity, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.win_gravity),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNminWidth, XtCMinWidth, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.min_width),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNminHeight, XtCMinHeight, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.min_height),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNmaxWidth, XtCMaxWidth, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.max_width),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNmaxHeight, XtCMaxHeight, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.max_height),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNwidthInc, XtCWidthInc, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.width_inc),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNheightInc, XtCHeightInc, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.height_inc),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNminAspectX, XtCMinAspectX, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.min_aspect.x),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNminAspectY, XtCMinAspectY, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.min_aspect.y),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNmaxAspectX, XtCMaxAspectX, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.max_aspect.x),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNmaxAspectY, XtCMaxAspectY, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.size_hints.max_aspect.y),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
/* wm_hints */
|
|
Packit |
b099d7 |
{ XtNinput, XtCInput, XtRBool, sizeof(Bool),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.input), XtRImmediate, (XtPointer)False},
|
|
Packit |
b099d7 |
{ XtNinitialState, XtCInitialState, XtRInitialState, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.initial_state),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer)NormalState},
|
|
Packit |
b099d7 |
{ XtNiconPixmap, XtCIconPixmap, XtRBitmap, sizeof(Pixmap),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.icon_pixmap), XtRPixmap, NULL},
|
|
Packit |
b099d7 |
{ XtNiconWindow, XtCIconWindow, XtRWindow, sizeof(Window),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.icon_window), XtRWindow, (XtPointer) NULL},
|
|
Packit |
b099d7 |
{ XtNiconX, XtCIconX, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.icon_x),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNiconY, XtCIconY, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.icon_y),
|
|
Packit |
b099d7 |
XtRInt, (XtPointer) &default_unspecified_shell_int},
|
|
Packit |
b099d7 |
{ XtNiconMask, XtCIconMask, XtRBitmap, sizeof(Pixmap),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.icon_mask), XtRPixmap, NULL},
|
|
Packit |
b099d7 |
{ XtNwindowGroup, XtCWindowGroup, XtRWindow, sizeof(Window),
|
|
Packit |
b099d7 |
Offset(wm.wm_hints.window_group),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer)XtUnspecifiedWindow}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void WMInitialize();
|
|
Packit |
b099d7 |
static void WMInitialize();
|
|
Packit |
b099d7 |
static Boolean WMSetValues();
|
|
Packit |
b099d7 |
static void WMDestroy();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(wmshellclassrec) WMShellClassRec wmShellClassRec = {
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &shellClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "WMShell",
|
|
Packit |
b099d7 |
/* size */ sizeof(WMShellRec),
|
|
Packit |
b099d7 |
/* Class Initializer */ NULL,
|
|
Packit |
b099d7 |
/* class_part_initialize*/ NULL,
|
|
Packit |
b099d7 |
/* Class init'ed ? */ FALSE,
|
|
Packit |
b099d7 |
/* initialize */ WMInitialize,
|
|
Packit |
b099d7 |
/* initialize_notify */ NULL,
|
|
Packit |
b099d7 |
/* realize */ XtInheritRealize,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ wmResources,
|
|
Packit |
b099d7 |
/* resource_count */ XtNumber(wmResources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ FALSE,
|
|
Packit |
b099d7 |
/* compress_exposure */ TRUE,
|
|
Packit |
b099d7 |
/* compress_enterleave*/ FALSE,
|
|
Packit |
b099d7 |
/* visible_interest */ FALSE,
|
|
Packit |
b099d7 |
/* destroy */ WMDestroy,
|
|
Packit |
b099d7 |
/* resize */ XtInheritResize,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ WMSetValues,
|
|
Packit |
b099d7 |
/* set_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
Packit |
b099d7 |
/* get_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* intrinsics version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsets */ NULL,
|
|
Packit |
b099d7 |
/* tm_table */ NULL,
|
|
Packit |
b099d7 |
/* query_geometry */ NULL,
|
|
Packit |
b099d7 |
/* display_accelerator */ NULL,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* geometry_manager */ XtInheritGeometryManager,
|
|
Packit |
b099d7 |
/* change_managed */ XtInheritChangeManaged,
|
|
Packit |
b099d7 |
/* insert_child */ XtInheritInsertChild,
|
|
Packit |
b099d7 |
/* delete_child */ XtInheritDeleteChild,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(wmshellwidgetclass) WidgetClass wmShellWidgetClass = (WidgetClass) (&wmShellClassRec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* TransientShell class record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef Offset
|
|
Packit |
b099d7 |
#define Offset(x) (XtOffsetOf(TransientShellRec, x))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource transientResources[]=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtNtransient, XtCTransient, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(wm.transient), XtRImmediate, (XtPointer)True},
|
|
Packit |
b099d7 |
{ XtNtransientFor, XtCTransientFor, XtRWidget, sizeof(Widget),
|
|
Packit |
b099d7 |
Offset(transient.transient_for), XtRWidget, NULL},
|
|
Packit |
b099d7 |
{ XtNsaveUnder, XtCSaveUnder, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(shell.save_under), XtRImmediate, (XtPointer)True},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void TransientRealize();
|
|
Packit |
b099d7 |
static Boolean TransientSetValues();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(transientshellclassrec) TransientShellClassRec transientShellClassRec = {
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &vendorShellClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "TransientShell",
|
|
Packit |
b099d7 |
/* size */ sizeof(TransientShellRec),
|
|
Packit |
b099d7 |
/* Class Initializer */ NULL,
|
|
Packit |
b099d7 |
/* class_part_initialize*/ NULL,
|
|
Packit |
b099d7 |
/* Class init'ed ? */ FALSE,
|
|
Packit |
b099d7 |
/* initialize */ NULL,
|
|
Packit |
b099d7 |
/* initialize_notify */ NULL,
|
|
Packit |
b099d7 |
/* realize */ TransientRealize,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ transientResources,
|
|
Packit |
b099d7 |
/* resource_count */ XtNumber(transientResources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ FALSE,
|
|
Packit |
b099d7 |
/* compress_exposure */ TRUE,
|
|
Packit |
b099d7 |
/* compress_enterleave*/ FALSE,
|
|
Packit |
b099d7 |
/* visible_interest */ FALSE,
|
|
Packit |
b099d7 |
/* destroy */ NULL,
|
|
Packit |
b099d7 |
/* resize */ XtInheritResize,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ TransientSetValues,
|
|
Packit |
b099d7 |
/* set_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
Packit |
b099d7 |
/* get_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* intrinsics version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsets */ NULL,
|
|
Packit |
b099d7 |
/* tm_table */ XtInheritTranslations,
|
|
Packit |
b099d7 |
/* query_geometry */ NULL,
|
|
Packit |
b099d7 |
/* display_accelerator*/ NULL,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* geometry_manager */ XtInheritGeometryManager,
|
|
Packit |
b099d7 |
/* change_managed */ XtInheritChangeManaged,
|
|
Packit |
b099d7 |
/* insert_child */ XtInheritInsertChild,
|
|
Packit |
b099d7 |
/* delete_child */ XtInheritDeleteChild,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(transientshellwidgetclass) WidgetClass transientShellWidgetClass =
|
|
Packit |
b099d7 |
(WidgetClass) (&transientShellClassRec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* TopLevelShell class record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef Offset
|
|
Packit |
b099d7 |
#define Offset(x) (XtOffsetOf(TopLevelShellRec, x))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource topLevelResources[]=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtNiconName, XtCIconName, XtRString, sizeof(String),
|
|
Packit |
b099d7 |
Offset(topLevel.icon_name), XtRString, (XtPointer) NULL},
|
|
Packit |
b099d7 |
{ XtNiconNameEncoding, XtCIconNameEncoding, XtRAtom, sizeof(Atom),
|
|
Packit |
b099d7 |
Offset(topLevel.icon_name_encoding),
|
|
Packit |
b099d7 |
XtRCallProc, (XtPointer) _XtTitleEncoding},
|
|
Packit |
b099d7 |
{ XtNiconic, XtCIconic, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(topLevel.iconic), XtRImmediate, (XtPointer)False}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void TopLevelInitialize();
|
|
Packit |
b099d7 |
static Boolean TopLevelSetValues();
|
|
Packit |
b099d7 |
static void TopLevelDestroy();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(toplevelshellclassrec) TopLevelShellClassRec topLevelShellClassRec = {
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &vendorShellClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "TopLevelShell",
|
|
Packit |
b099d7 |
/* size */ sizeof(TopLevelShellRec),
|
|
Packit |
b099d7 |
/* Class Initializer */ NULL,
|
|
Packit |
b099d7 |
/* class_part_initialize*/ NULL,
|
|
Packit |
b099d7 |
/* Class init'ed ? */ FALSE,
|
|
Packit |
b099d7 |
/* initialize */ TopLevelInitialize,
|
|
Packit |
b099d7 |
/* initialize_notify */ NULL,
|
|
Packit |
b099d7 |
/* realize */ XtInheritRealize,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ topLevelResources,
|
|
Packit |
b099d7 |
/* resource_count */ XtNumber(topLevelResources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ FALSE,
|
|
Packit |
b099d7 |
/* compress_exposure */ TRUE,
|
|
Packit |
b099d7 |
/* compress_enterleave*/ FALSE,
|
|
Packit |
b099d7 |
/* visible_interest */ FALSE,
|
|
Packit |
b099d7 |
/* destroy */ TopLevelDestroy,
|
|
Packit |
b099d7 |
/* resize */ XtInheritResize,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ TopLevelSetValues,
|
|
Packit |
b099d7 |
/* set_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
Packit |
b099d7 |
/* get_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* intrinsics version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsets */ NULL,
|
|
Packit |
b099d7 |
/* tm_table */ XtInheritTranslations,
|
|
Packit |
b099d7 |
/* query_geometry */ NULL,
|
|
Packit |
b099d7 |
/* display_accelerator */ NULL,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* geometry_manager */ XtInheritGeometryManager,
|
|
Packit |
b099d7 |
/* change_managed */ XtInheritChangeManaged,
|
|
Packit |
b099d7 |
/* insert_child */ XtInheritInsertChild,
|
|
Packit |
b099d7 |
/* delete_child */ XtInheritDeleteChild,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(toplevelshellwidgetclass) WidgetClass topLevelShellWidgetClass =
|
|
Packit |
b099d7 |
(WidgetClass) (&topLevelShellClassRec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ApplicationShell class record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
***************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef Offset
|
|
Packit |
b099d7 |
#define Offset(x) (XtOffsetOf(ApplicationShellRec, x))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource applicationResources[]=
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtNargc, XtCArgc, XtRInt, sizeof(int),
|
|
Packit |
b099d7 |
Offset(application.argc), XtRImmediate, (XtPointer)0},
|
|
Packit |
b099d7 |
{ XtNargv, XtCArgv, XtRStringArray, sizeof(String*),
|
|
Packit |
b099d7 |
Offset(application.argv), XtRPointer, (XtPointer) NULL}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ApplicationInitialize();
|
|
Packit |
b099d7 |
static void ApplicationDestroy();
|
|
Packit |
b099d7 |
static void ApplicationShellInsertChild();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static CompositeClassExtensionRec compositeClassExtension = {
|
|
Packit |
b099d7 |
/* next_extension */ NULL,
|
|
Packit |
b099d7 |
/* record_type */ NULLQUARK,
|
|
Packit |
b099d7 |
/* version */ XtCompositeExtensionVersion,
|
|
Packit |
b099d7 |
/* record_size */ sizeof(CompositeClassExtensionRec),
|
|
Packit |
b099d7 |
/* accepts_objects */ TRUE
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(applicationshellclassrec) ApplicationShellClassRec applicationShellClassRec = {
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &topLevelShellClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "ApplicationShell",
|
|
Packit |
b099d7 |
/* size */ sizeof(ApplicationShellRec),
|
|
Packit |
b099d7 |
/* Class Initializer */ NULL,
|
|
Packit |
b099d7 |
/* class_part_initialize*/ NULL,
|
|
Packit |
b099d7 |
/* Class init'ed ? */ FALSE,
|
|
Packit |
b099d7 |
/* initialize */ ApplicationInitialize,
|
|
Packit |
b099d7 |
/* initialize_notify */ NULL,
|
|
Packit |
b099d7 |
/* realize */ XtInheritRealize,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ applicationResources,
|
|
Packit |
b099d7 |
/* resource_count */ XtNumber(applicationResources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ FALSE,
|
|
Packit |
b099d7 |
/* compress_exposure */ TRUE,
|
|
Packit |
b099d7 |
/* compress_enterleave*/ FALSE,
|
|
Packit |
b099d7 |
/* visible_interest */ FALSE,
|
|
Packit |
b099d7 |
/* destroy */ ApplicationDestroy,
|
|
Packit |
b099d7 |
/* resize */ XtInheritResize,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ NULL,
|
|
Packit |
b099d7 |
/* set_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* set_values_almost */ XtInheritSetValuesAlmost,
|
|
Packit |
b099d7 |
/* get_values_hook */ NULL,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* intrinsics version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsets */ NULL,
|
|
Packit |
b099d7 |
/* tm_table */ XtInheritTranslations,
|
|
Packit |
b099d7 |
/* query_geometry */ NULL,
|
|
Packit |
b099d7 |
/* display_accelerator*/ NULL,
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* geometry_manager */ XtInheritGeometryManager,
|
|
Packit |
b099d7 |
/* change_managed */ XtInheritChangeManaged,
|
|
Packit |
b099d7 |
/* insert_child */ ApplicationShellInsertChild,
|
|
Packit |
b099d7 |
/* delete_child */ XtInheritDeleteChild,
|
|
Packit |
b099d7 |
/* extension */ (XtPointer)&compositeClassExtension
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
},{
|
|
Packit |
b099d7 |
/* extension */ NULL
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(applicationshellwidgetclass) WidgetClass applicationShellWidgetClass =
|
|
Packit |
b099d7 |
(WidgetClass) (&applicationShellClassRec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************************
|
|
Packit |
b099d7 |
* Whew!
|
|
Packit |
b099d7 |
****************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ComputeWMSizeHints(w, hints)
|
|
Packit |
b099d7 |
WMShellWidget w;
|
|
Packit |
b099d7 |
XSizeHints *hints;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register long flags;
|
|
Packit |
b099d7 |
hints->flags = flags = w->wm.size_hints.flags;
|
|
Packit |
b099d7 |
#define copy(field) hints->field = w->wm.size_hints.field
|
|
Packit |
b099d7 |
if (flags & (USPosition | PPosition)) {
|
|
Packit |
b099d7 |
copy(x);
|
|
Packit |
b099d7 |
copy(y);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (flags & (USSize | PSize)) {
|
|
Packit |
b099d7 |
copy(width);
|
|
Packit |
b099d7 |
copy(height);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (flags & PMinSize) {
|
|
Packit |
b099d7 |
copy(min_width);
|
|
Packit |
b099d7 |
copy(min_height);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (flags & PMaxSize) {
|
|
Packit |
b099d7 |
copy(max_width);
|
|
Packit |
b099d7 |
copy(max_height);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (flags & PResizeInc) {
|
|
Packit |
b099d7 |
copy(width_inc);
|
|
Packit |
b099d7 |
copy(height_inc);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (flags & PAspect) {
|
|
Packit |
b099d7 |
copy(min_aspect.x);
|
|
Packit |
b099d7 |
copy(min_aspect.y);
|
|
Packit |
b099d7 |
copy(max_aspect.x);
|
|
Packit |
b099d7 |
copy(max_aspect.y);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#undef copy
|
|
Packit |
b099d7 |
#define copy(field) hints->field = w->wm.field
|
|
Packit |
b099d7 |
if (flags & PBaseSize) {
|
|
Packit |
b099d7 |
copy(base_width);
|
|
Packit |
b099d7 |
copy(base_height);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (flags & PWinGravity)
|
|
Packit |
b099d7 |
copy(win_gravity);
|
|
Packit |
b099d7 |
#undef copy
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void _SetWMSizeHints(w)
|
|
Packit |
b099d7 |
WMShellWidget w;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XSizeHints *size_hints = XAllocSizeHints();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (size_hints == NULL) _XtAllocError("XAllocSizeHints");
|
|
Packit |
b099d7 |
ComputeWMSizeHints(w, size_hints);
|
|
Packit |
b099d7 |
XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints);
|
|
Packit |
b099d7 |
XFree((char*)size_hints);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static ShellClassExtension _FindClassExtension(widget_class)
|
|
Packit |
b099d7 |
WidgetClass widget_class;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellClassExtension ext;
|
|
Packit |
b099d7 |
for (ext = (ShellClassExtension)((ShellWidgetClass)widget_class)
|
|
Packit |
b099d7 |
->shell_class.extension;
|
|
Packit |
b099d7 |
ext != NULL && ext->record_type != NULLQUARK;
|
|
Packit |
b099d7 |
ext = (ShellClassExtension)ext->next_extension);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ext != NULL) {
|
|
Packit |
b099d7 |
if ( ext->version == XtShellExtensionVersion
|
|
Packit |
b099d7 |
&& ext->record_size == sizeof(ShellClassExtensionRec)) {
|
|
Packit |
b099d7 |
/* continue */
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
String params[1];
|
|
Packit |
b099d7 |
Cardinal num_params = 1;
|
|
Packit |
b099d7 |
params[0] = widget_class->core_class.class_name;
|
|
Packit |
b099d7 |
XtErrorMsg( "invalidExtension", "shellClassPartInitialize",
|
|
Packit |
b099d7 |
XtCXtToolkitError,
|
|
Packit |
b099d7 |
"widget class %s has invalid ShellClassExtension record",
|
|
Packit |
b099d7 |
params, &num_params);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return ext;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ClassPartInitialize(widget_class)
|
|
Packit |
b099d7 |
WidgetClass widget_class;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellClassExtension ext = _FindClassExtension(widget_class);
|
|
Packit |
b099d7 |
if (ext != NULL) {
|
|
Packit |
b099d7 |
if (ext->root_geometry_manager == XtInheritRootGeometryManager) {
|
|
Packit |
b099d7 |
ext->root_geometry_manager =
|
|
Packit |
b099d7 |
_FindClassExtension(widget_class->core_class.superclass)
|
|
Packit |
b099d7 |
->root_geometry_manager;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* if not found, spec requires XtInheritRootGeometryManager */
|
|
Packit |
b099d7 |
XtPointer *extP
|
|
Packit |
b099d7 |
= &((ShellWidgetClass)widget_class)->shell_class.extension;
|
|
Packit |
b099d7 |
ext = XtNew(ShellClassExtensionRec);
|
|
Packit |
b099d7 |
bcopy((char*)_FindClassExtension(widget_class->core_class.superclass),
|
|
Packit |
b099d7 |
(char*)ext,
|
|
Packit |
b099d7 |
sizeof(ShellClassExtensionRec));
|
|
Packit |
b099d7 |
ext->next_extension = *extP;
|
|
Packit |
b099d7 |
*extP = (XtPointer)ext;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void EventHandler();
|
|
Packit |
b099d7 |
static void _popup_set_prop();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void XtCopyDefaultDepth(widget, offset, value)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int offset;
|
|
Packit |
b099d7 |
XrmValue *value;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
value->addr = (XPointer)(&DefaultDepthOfScreen(XtScreenOfObject(widget)));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef CRAY
|
|
Packit |
b099d7 |
static
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
void _XtShellDepth(widget,closure,value)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int closure;
|
|
Packit |
b099d7 |
XrmValue *value;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (widget->core.parent == NULL) XtCopyDefaultDepth(widget,closure,value);
|
|
Packit |
b099d7 |
else _XtCopyFromParent (widget,closure,value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void XtCopyDefaultColormap(widget, offset, value)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int offset;
|
|
Packit |
b099d7 |
XrmValue *value;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
value->addr = (XPointer)(&DefaultColormapOfScreen(XtScreenOfObject(widget)));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef CRAY
|
|
Packit |
b099d7 |
static
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
void _XtShellColormap(widget,closure,value)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int closure;
|
|
Packit |
b099d7 |
XrmValue *value;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (widget->core.parent == NULL)
|
|
Packit |
b099d7 |
XtCopyDefaultColormap(widget,closure,value);
|
|
Packit |
b099d7 |
else _XtCopyFromParent (widget,closure,value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef CRAY
|
|
Packit |
b099d7 |
static
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
void _XtShellAncestorSensitive(widget,closure,value)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int closure;
|
|
Packit |
b099d7 |
XrmValue *value;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static Boolean true = True;
|
|
Packit |
b099d7 |
if (widget->core.parent == NULL) value->addr = (XPointer)(&true);
|
|
Packit |
b099d7 |
else _XtCopyFromParent (widget,closure,value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
#ifndef CRAY
|
|
Packit |
b099d7 |
static
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
void _XtTitleEncoding(widget, offset, value)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int offset;
|
|
Packit |
b099d7 |
XrmValue *value;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static Atom atom;
|
|
Packit |
b099d7 |
if (XtWidgetToApplicationContext(widget)->langProcRec.proc) atom = None;
|
|
Packit |
b099d7 |
else atom = XA_STRING;
|
|
Packit |
b099d7 |
value->addr = (XPointer) &ato;;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void Initialize(req, new, args, num_args)
|
|
Packit |
b099d7 |
Widget req, new;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget w = (ShellWidget) new;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
w->shell.popped_up = FALSE;
|
|
Packit |
b099d7 |
w->shell.client_specified =
|
|
Packit |
b099d7 |
_XtShellNotReparented | _XtShellPositionValid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (w->core.x == BIGSIZE) {
|
|
Packit |
b099d7 |
w->core.x = 0;
|
|
Packit |
b099d7 |
if (w->core.y == BIGSIZE) w->core.y = 0;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (w->core.y == BIGSIZE) w->core.y = 0;
|
|
Packit |
b099d7 |
else w->shell.client_specified |= _XtShellPPositionOK;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtAddEventHandler(new, (EventMask) StructureNotifyMask,
|
|
Packit |
b099d7 |
TRUE, EventHandler, (XtPointer) NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void WMInitialize(req, new, args, num_args)
|
|
Packit |
b099d7 |
Widget req,new;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WMShellWidget w = (WMShellWidget) new;
|
|
Packit |
b099d7 |
TopLevelShellWidget tls = (TopLevelShellWidget) new; /* maybe */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(w->wm.title == NULL) {
|
|
Packit |
b099d7 |
if (XtIsTopLevelShell(new) &&
|
|
Packit |
b099d7 |
tls->topLevel.icon_name != NULL &&
|
|
Packit |
b099d7 |
strlen(tls->topLevel.icon_name) != 0) {
|
|
Packit |
b099d7 |
w->wm.title = XtNewString(tls->topLevel.icon_name);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
w->wm.title = XtNewString(w->core.name);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
w->wm.title = XtNewString(w->wm.title);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
w->wm.size_hints.flags = 0;
|
|
Packit |
b099d7 |
w->wm.wm_hints.flags = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Find the values of the atoms, somewhere... */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (new = new->core.parent;
|
|
Packit |
b099d7 |
new != NULL && !XtIsWMShell(new);
|
|
Packit |
b099d7 |
new = new->core.parent) {}
|
|
Packit |
b099d7 |
if (new == NULL) {
|
|
Packit |
b099d7 |
w->wm.wm_configure_denied =
|
|
Packit |
b099d7 |
XInternAtom(XtDisplay(w), "WM_CONFIGURE_DENIED", FALSE);
|
|
Packit |
b099d7 |
w->wm.wm_moved = XInternAtom(XtDisplay(w), "WM_MOVED", FALSE);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
w->wm.wm_configure_denied = WM_CONFIGURE_DENIED(new);
|
|
Packit |
b099d7 |
w->wm.wm_moved = WM_MOVED(new);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void TopLevelInitialize(req, new, args, num_args)
|
|
Packit |
b099d7 |
Widget req, new;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
TopLevelShellWidget w = (TopLevelShellWidget) new;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (w->topLevel.icon_name == NULL) {
|
|
Packit |
b099d7 |
w->topLevel.icon_name = XtNewString(w->core.name);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
w->topLevel.icon_name = XtNewString(w->topLevel.icon_name);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (w->topLevel.iconic)
|
|
Packit |
b099d7 |
w->wm.wm_hints.initial_state = IconicState;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void ApplicationInitialize(req, new, args, num_args)
|
|
Packit |
b099d7 |
Widget req, new;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ApplicationShellWidget w = (ApplicationShellWidget)new;
|
|
Packit |
b099d7 |
/* copy the argv if passed */
|
|
Packit |
b099d7 |
if (w->application.argc > 0) {
|
|
Packit |
b099d7 |
int i = w->application.argc;
|
|
Packit |
b099d7 |
char **argv = (char**)XtMalloc( (unsigned)i*sizeof(char*) );
|
|
Packit |
b099d7 |
char **argp = w->application.argv + i;
|
|
Packit |
b099d7 |
while (--i >= 0) {
|
|
Packit |
b099d7 |
argv[i] = *--argp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
w->application.argv = argv;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void Resize(w)
|
|
Packit |
b099d7 |
Widget w;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register ShellWidget sw = (ShellWidget)w;
|
|
Packit |
b099d7 |
Widget childwid;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
for(i = 0; i < sw->composite.num_children; i++) {
|
|
Packit |
b099d7 |
if (XtIsManaged(sw->composite.children[i])) {
|
|
Packit |
b099d7 |
childwid = sw->composite.children[i];
|
|
Packit |
b099d7 |
XtResizeWidget(childwid, sw->core.width, sw->core.height,
|
|
Packit |
b099d7 |
childwid->core.border_width);
|
|
Packit |
b099d7 |
break; /* can only be one managed child */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void GetGeometry();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void Realize(wid, vmask, attr)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
Mask *vmask;
|
|
Packit |
b099d7 |
XSetWindowAttributes *attr;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget w = (ShellWidget) wid;
|
|
Packit |
b099d7 |
Mask mask = *vmask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (! (w->shell.client_specified & _XtShellGeometryParsed)) {
|
|
Packit |
b099d7 |
/* we'll get here only if there was no child the first
|
|
Packit |
b099d7 |
time we were realized. If the shell was Unrealized
|
|
Packit |
b099d7 |
and then re-Realized, we probably don't want to
|
|
Packit |
b099d7 |
re-evaluate the defaults anyway.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
GetGeometry(wid, (Widget)NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (w->core.background_pixmap == XtUnspecifiedPixmap) {
|
|
Packit |
b099d7 |
/* I attempt to inherit my child's background to avoid screen flash
|
|
Packit |
b099d7 |
* if there is latency between when I get resized and when my child
|
|
Packit |
b099d7 |
* is resized. Background=None is not satisfactory, as I want the
|
|
Packit |
b099d7 |
* user to get immediate feedback on the new dimensions (most
|
|
Packit |
b099d7 |
* particularly in the case of a non-reparenting wm). It is
|
|
Packit |
b099d7 |
* especially important to have the server clear any old cruft
|
|
Packit |
b099d7 |
* from the display when I am resized larger.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
register Widget *childP = w->composite.children;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
for (i = w->composite.num_children; i; i--, childP++) {
|
|
Packit |
b099d7 |
if (XtIsWidget(*childP) && XtIsManaged(*childP)) {
|
|
Packit |
b099d7 |
if ((*childP)->core.background_pixmap
|
|
Packit |
b099d7 |
!= XtUnspecifiedPixmap) {
|
|
Packit |
b099d7 |
mask &= ~(CWBackPixel);
|
|
Packit |
b099d7 |
mask |= CWBackPixmap;
|
|
Packit |
b099d7 |
attr->background_pixmap =
|
|
Packit |
b099d7 |
w->core.background_pixmap =
|
|
Packit |
b099d7 |
(*childP)->core.background_pixmap;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
attr->background_pixel =
|
|
Packit |
b099d7 |
w->core.background_pixel =
|
|
Packit |
b099d7 |
(*childP)->core.background_pixel;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(w->shell.save_under) {
|
|
Packit |
b099d7 |
mask |= CWSaveUnder;
|
|
Packit |
b099d7 |
attr->save_under = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if(w->shell.override_redirect) {
|
|
Packit |
b099d7 |
mask |= CWOverrideRedirect;
|
|
Packit |
b099d7 |
attr->override_redirect = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (wid->core.width == 0 || wid->core.height == 0) {
|
|
Packit |
b099d7 |
Cardinal count = 1;
|
|
Packit |
b099d7 |
XtErrorMsg("invalidDimension", "shellRealize", XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Shell widget %s has zero width and/or height",
|
|
Packit |
b099d7 |
&wid->core.name, &count);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
wid->core.window = XCreateWindow(XtDisplay(wid),
|
|
Packit |
b099d7 |
wid->core.screen->root, (int)wid->core.x, (int)wid->core.y,
|
|
Packit |
b099d7 |
(unsigned int)wid->core.width, (unsigned int)wid->core.height,
|
|
Packit |
b099d7 |
(unsigned int)wid->core.border_width, (int) wid->core.depth,
|
|
Packit |
b099d7 |
(unsigned int) InputOutput, w->shell.visual,
|
|
Packit |
b099d7 |
mask, attr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_popup_set_prop(w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void _SetTransientForHint(w, delete)
|
|
Packit |
b099d7 |
TransientShellWidget w;
|
|
Packit |
b099d7 |
Boolean delete;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Window window_group;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (w->wm.transient) {
|
|
Packit |
b099d7 |
if (w->transient.transient_for != NULL
|
|
Packit |
b099d7 |
&& XtIsRealized(w->transient.transient_for))
|
|
Packit |
b099d7 |
window_group = XtWindow(w->transient.transient_for);
|
|
Packit |
b099d7 |
else if ((window_group = w->wm.wm_hints.window_group)
|
|
Packit |
b099d7 |
== XtUnspecifiedWindowGroup) {
|
|
Packit |
b099d7 |
if (delete)
|
|
Packit |
b099d7 |
XDeleteProperty( XtDisplay((Widget)w),
|
|
Packit |
b099d7 |
XtWindow((Widget)w),
|
|
Packit |
b099d7 |
XA_WM_TRANSIENT_FOR
|
|
Packit |
b099d7 |
);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetTransientForHint( XtDisplay((Widget)w),
|
|
Packit |
b099d7 |
XtWindow((Widget)w),
|
|
Packit |
b099d7 |
window_group
|
|
Packit |
b099d7 |
);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void TransientRealize(w, vmask, attr)
|
|
Packit |
b099d7 |
Widget w;
|
|
Packit |
b099d7 |
Mask *vmask;
|
|
Packit |
b099d7 |
XSetWindowAttributes *attr;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(*transientShellWidgetClass->core_class.superclass->
|
|
Packit |
b099d7 |
core_class.realize) (w, vmask, attr);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_SetTransientForHint((TransientShellWidget)w, False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void EvaluateWMHints(w)
|
|
Packit |
b099d7 |
WMShellWidget w;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XWMHints *hintp = &w->wm.wm_hints;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
hintp->flags = StateHint | InputHint;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (hintp->icon_x == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
hintp->icon_x = -1;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
hintp->flags |= IconPositionHint;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (hintp->icon_y == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
hintp->icon_y = -1;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
hintp->flags |= IconPositionHint;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (hintp->icon_pixmap != None) hintp->flags |= IconPixmapHint;
|
|
Packit |
b099d7 |
if (hintp->icon_mask != None) hintp->flags |= IconMaskHint;
|
|
Packit |
b099d7 |
if (hintp->icon_window != None) hintp->flags |= IconWindowHint;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (hintp->window_group == XtUnspecifiedWindow) {
|
|
Packit |
b099d7 |
if(w->core.parent) {
|
|
Packit |
b099d7 |
Widget p;
|
|
Packit |
b099d7 |
for (p = w->core.parent; p->core.parent; p = p->core.parent);
|
|
Packit |
b099d7 |
if (XtIsRealized(p)) {
|
|
Packit |
b099d7 |
hintp->window_group = XtWindow(p);
|
|
Packit |
b099d7 |
hintp->flags |= WindowGroupHint;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (hintp->window_group != XtUnspecifiedWindowGroup)
|
|
Packit |
b099d7 |
hintp->flags |= WindowGroupHint;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void EvaluateSizeHints(w)
|
|
Packit |
b099d7 |
WMShellWidget w;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
struct _OldXSizeHints *sizep = &w->wm.size_hints;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sizep->x = w->core.x;
|
|
Packit |
b099d7 |
sizep->y = w->core.y;
|
|
Packit |
b099d7 |
sizep->width = w->core.width;
|
|
Packit |
b099d7 |
sizep->height = w->core.height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sizep->flags & USSize) {
|
|
Packit |
b099d7 |
if (sizep->flags & PSize) sizep->flags &= ~PSize;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
sizep->flags |= PSize;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sizep->flags & USPosition) {
|
|
Packit |
b099d7 |
if (sizep->flags & PPosition) sizep->flags &= ~PPosition;
|
|
Packit |
b099d7 |
} else if (w->shell.client_specified & _XtShellPPositionOK)
|
|
Packit |
b099d7 |
sizep->flags |= PPosition;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sizep->min_aspect.x != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| sizep->min_aspect.y != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| sizep->max_aspect.x != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| sizep->max_aspect.y != XtUnspecifiedShellInt) {
|
|
Packit |
b099d7 |
sizep->flags |= PAspect;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if(w->wm.base_width != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| w->wm.base_height != XtUnspecifiedShellInt) {
|
|
Packit |
b099d7 |
sizep->flags |= PBaseSize;
|
|
Packit |
b099d7 |
if (w->wm.base_width == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
w->wm.base_width = 0;
|
|
Packit |
b099d7 |
if (w->wm.base_height == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
w->wm.base_height = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (sizep->width_inc != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| sizep->height_inc != XtUnspecifiedShellInt) {
|
|
Packit |
b099d7 |
if (sizep->width_inc < 1) sizep->width_inc = 1;
|
|
Packit |
b099d7 |
if (sizep->height_inc < 1) sizep->height_inc = 1;
|
|
Packit |
b099d7 |
sizep->flags |= PResizeInc;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (sizep->max_width != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| sizep->max_height != XtUnspecifiedShellInt) {
|
|
Packit |
b099d7 |
sizep->flags |= PMaxSize;
|
|
Packit |
b099d7 |
if (sizep->max_width == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
sizep->max_width = BIGSIZE;
|
|
Packit |
b099d7 |
if (sizep->max_height == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
sizep->max_height = BIGSIZE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if(sizep->min_width != XtUnspecifiedShellInt
|
|
Packit |
b099d7 |
|| sizep->min_height != XtUnspecifiedShellInt) {
|
|
Packit |
b099d7 |
sizep->flags |= PMinSize;
|
|
Packit |
b099d7 |
if (sizep->min_width == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
sizep->min_width = 1;
|
|
Packit |
b099d7 |
if (sizep->min_height == XtUnspecifiedShellInt)
|
|
Packit |
b099d7 |
sizep->min_height = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void _popup_set_prop(w)
|
|
Packit |
b099d7 |
ShellWidget w;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget p;
|
|
Packit |
b099d7 |
WMShellWidget wmshell = (WMShellWidget) w;
|
|
Packit |
b099d7 |
TopLevelShellWidget tlshell = (TopLevelShellWidget) w;
|
|
Packit |
b099d7 |
ApplicationShellWidget appshell = (ApplicationShellWidget) w;
|
|
Packit |
b099d7 |
XTextProperty icon_name;
|
|
Packit |
b099d7 |
XTextProperty window_name;
|
|
Packit |
b099d7 |
char **argv;
|
|
Packit |
b099d7 |
int argc;
|
|
Packit |
b099d7 |
XSizeHints *size_hints;
|
|
Packit |
b099d7 |
Window window_group;
|
|
Packit |
b099d7 |
XClassHint classhint;
|
|
Packit |
b099d7 |
Boolean copied_iname, copied_wname;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsWMShell((Widget)w) || w->shell.override_redirect) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((size_hints = XAllocSizeHints()) == NULL)
|
|
Packit |
b099d7 |
_XtAllocError("XAllocSizeHints");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
copied_iname = copied_wname = False;
|
|
Packit |
b099d7 |
if (wmshell->wm.title_encoding == None &&
|
|
Packit |
b099d7 |
XmbTextListToTextProperty(XtDisplay((Widget)w),
|
|
Packit |
b099d7 |
(char**)&wmshell->wm.title,
|
|
Packit |
b099d7 |
1, XStdICCTextStyle,
|
|
Packit |
b099d7 |
&window_name) >= Success) {
|
|
Packit |
b099d7 |
copied_wname = True;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
window_name.value = (unsigned char*)wmshell->wm.title;
|
|
Packit |
b099d7 |
window_name.encoding = wmshell->wm.title_encoding;
|
|
Packit |
b099d7 |
window_name.format = 8;
|
|
Packit |
b099d7 |
window_name.nitems = strlen((char *)window_name.value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsTopLevelShell((Widget)w)) {
|
|
Packit |
b099d7 |
if (tlshell->topLevel.icon_name_encoding == None &&
|
|
Packit |
b099d7 |
XmbTextListToTextProperty(XtDisplay((Widget)w),
|
|
Packit |
b099d7 |
(char**)&tlshell->topLevel.icon_name,
|
|
Packit |
b099d7 |
1, XStdICCTextStyle,
|
|
Packit |
b099d7 |
&icon_name) >= Success) {
|
|
Packit |
b099d7 |
copied_iname = True;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
icon_name.value = (unsigned char*)tlshell->topLevel.icon_name;
|
|
Packit |
b099d7 |
icon_name.encoding = tlshell->topLevel.icon_name_encoding;
|
|
Packit |
b099d7 |
icon_name.format = 8;
|
|
Packit |
b099d7 |
icon_name.nitems = strlen((char *)icon_name.value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
EvaluateWMHints(wmshell);
|
|
Packit |
b099d7 |
EvaluateSizeHints(wmshell);
|
|
Packit |
b099d7 |
ComputeWMSizeHints(wmshell, size_hints);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (wmshell->wm.transient
|
|
Packit |
b099d7 |
&& !XtIsTransientShell((Widget)w)
|
|
Packit |
b099d7 |
&& (window_group = wmshell->wm.wm_hints.window_group)
|
|
Packit |
b099d7 |
!= XtUnspecifiedWindowGroup) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetTransientForHint(XtDisplay((Widget)w),
|
|
Packit |
b099d7 |
XtWindow((Widget)w),
|
|
Packit |
b099d7 |
window_group
|
|
Packit |
b099d7 |
);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
classhint.res_name = w->core.name;
|
|
Packit |
b099d7 |
/* For the class, look up to the top of the tree */
|
|
Packit |
b099d7 |
for (p = (Widget)w; p->core.parent != NULL; p = p->core.parent);
|
|
Packit |
b099d7 |
if (XtIsApplicationShell(p)) {
|
|
Packit |
b099d7 |
classhint.res_class =
|
|
Packit |
b099d7 |
((ApplicationShellWidget)p)->application.class;
|
|
Packit |
b099d7 |
} else classhint.res_class = XtClass(p)->core_class.class_name;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsApplicationShell((Widget)w)
|
|
Packit |
b099d7 |
&& (argc = appshell->application.argc) != -1)
|
|
Packit |
b099d7 |
argv = (char**)appshell->application.argv;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
argv = NULL;
|
|
Packit |
b099d7 |
argc = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetWMProperties(XtDisplay((Widget)w), XtWindow((Widget)w),
|
|
Packit |
b099d7 |
&window_name,
|
|
Packit |
b099d7 |
(XtIsTopLevelShell((Widget)w)) ? &icon_name : NULL,
|
|
Packit |
b099d7 |
argv, argc,
|
|
Packit |
b099d7 |
size_hints,
|
|
Packit |
b099d7 |
&wmshell->wm.wm_hints,
|
|
Packit |
b099d7 |
&classhint);
|
|
Packit |
b099d7 |
XFree((char*)size_hints);
|
|
Packit |
b099d7 |
if (copied_wname)
|
|
Packit |
b099d7 |
XFree((XPointer)window_name.value);
|
|
Packit |
b099d7 |
if (copied_iname)
|
|
Packit |
b099d7 |
XFree((XPointer)icon_name.value);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtWidgetToApplicationContext((Widget)w)->langProcRec.proc) {
|
|
Packit |
b099d7 |
char *locale = setlocale(LC_CTYPE, (char *)NULL);
|
|
Packit |
b099d7 |
if (locale)
|
|
Packit |
b099d7 |
XChangeProperty(XtDisplay((Widget)w), XtWindow((Widget)w),
|
|
Packit |
b099d7 |
XInternAtom(XtDisplay((Widget)w),
|
|
Packit |
b099d7 |
"WM_LOCALE_NAME", False),
|
|
Packit |
b099d7 |
XA_STRING, 8, PropModeReplace,
|
|
Packit |
b099d7 |
(unsigned char *)locale, strlen(locale));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void EventHandler(wid, closure, event, continue_to_dispatch)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
XtPointer closure; /* unused */
|
|
Packit |
b099d7 |
XEvent *event;
|
|
Packit |
b099d7 |
Boolean *continue_to_dispatch; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register ShellWidget w = (ShellWidget) wid;
|
|
Packit |
b099d7 |
WMShellWidget wmshell = (WMShellWidget) w;
|
|
Packit |
b099d7 |
Boolean sizechanged = FALSE;
|
|
Packit |
b099d7 |
unsigned int width, height, border_width, tmpdepth;
|
|
Packit |
b099d7 |
int tmpx, tmpy, tmp2x, tmp2y;
|
|
Packit |
b099d7 |
Window tmproot, tmpchild;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(w->core.window != event->xany.window) {
|
|
Packit |
b099d7 |
XtAppErrorMsg(XtWidgetToApplicationContext(wid),
|
|
Packit |
b099d7 |
"invalidWindow","eventHandler",XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Event with wrong window",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch(event->type) {
|
|
Packit |
b099d7 |
case ConfigureNotify:
|
|
Packit |
b099d7 |
if (w->core.window != event->xconfigure.window)
|
|
Packit |
b099d7 |
return; /* in case of SubstructureNotify */
|
|
Packit |
b099d7 |
#define NEQ(x) ( w->core.x != event->xconfigure.x )
|
|
Packit |
b099d7 |
if( NEQ(width) || NEQ(height) || NEQ(border_width) ) {
|
|
Packit |
b099d7 |
sizechanged = TRUE;
|
|
Packit |
b099d7 |
#undef NEQ
|
|
Packit |
b099d7 |
w->core.width = event->xconfigure.width;
|
|
Packit |
b099d7 |
w->core.height = event->xconfigure.height;
|
|
Packit |
b099d7 |
w->core.border_width = event->xconfigure.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (event->xany.send_event /* ICCCM compliant synthetic ev */
|
|
Packit |
b099d7 |
/* || w->shell.override_redirect */
|
|
Packit |
b099d7 |
|| w->shell.client_specified & _XtShellNotReparented)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
w->core.x = event->xconfigure.x;
|
|
Packit |
b099d7 |
w->core.y = event->xconfigure.y;
|
|
Packit |
b099d7 |
w->shell.client_specified |= _XtShellPositionValid;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else w->shell.client_specified &= ~_XtShellPositionValid;
|
|
Packit |
b099d7 |
if (XtIsWMShell(wid) && !wmshell->wm.wait_for_wm) {
|
|
Packit |
b099d7 |
/* Consider trusting the wm again */
|
|
Packit |
b099d7 |
register struct _OldXSizeHints *hintp
|
|
Packit |
b099d7 |
= &wmshell->wm.size_hints;
|
|
Packit |
b099d7 |
#define EQ(x) (hintp->x == w->core.x)
|
|
Packit |
b099d7 |
if (EQ(x) && EQ(y) && EQ(width) && EQ(height)) {
|
|
Packit |
b099d7 |
wmshell->wm.wait_for_wm = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#undef EQ
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case ClientMessage:
|
|
Packit |
b099d7 |
if( event->xclient.message_type == WM_CONFIGURE_DENIED(wid)
|
|
Packit |
b099d7 |
&& XtIsWMShell(wid)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* UT Oh! the window manager has come back alive
|
|
Packit |
b099d7 |
* This means either I didn't wait long enough or
|
|
Packit |
b099d7 |
* The WM is sick.
|
|
Packit |
b099d7 |
* Query my real size and position, and adjust my child
|
|
Packit |
b099d7 |
* it needs be.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(wmshell->wm.wait_for_wm) {
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext(wid),
|
|
Packit |
b099d7 |
"communicationError","windowManager",
|
|
Packit |
b099d7 |
XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Window Manager is confused",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
wmshell->wm.wait_for_wm = TRUE;
|
|
Packit |
b099d7 |
(void) XGetGeometry(XtDisplay(w), XtWindow(w), &tmproot,
|
|
Packit |
b099d7 |
&tmpx, &tmpy, &width, &height, &border_width,
|
|
Packit |
b099d7 |
&tmpdepth);
|
|
Packit |
b099d7 |
(void) XTranslateCoordinates(XtDisplay(w), XtWindow(w),
|
|
Packit |
b099d7 |
tmproot, (int) tmpx, (int) tmpy,
|
|
Packit |
b099d7 |
&tmp2x, &tmp2y, &tmpchild);
|
|
Packit |
b099d7 |
w->core.x = tmp2x;
|
|
Packit |
b099d7 |
w->core.y = tmp2y;
|
|
Packit |
b099d7 |
if( width != w->core.width || height != w->core.height
|
|
Packit |
b099d7 |
|| border_width != w->core.border_width ) {
|
|
Packit |
b099d7 |
w->core.width = width;
|
|
Packit |
b099d7 |
w->core.height = height;
|
|
Packit |
b099d7 |
w->core.border_width = border_width;
|
|
Packit |
b099d7 |
sizechanged = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if(event->xclient.message_type == WM_MOVED(wid)) {
|
|
Packit |
b099d7 |
w->core.x = event->xclient.data.s[0];
|
|
Packit |
b099d7 |
w->core.y = event->xclient.data.s[1];
|
|
Packit |
b099d7 |
if (XtIsWMShell((Widget)w)) {
|
|
Packit |
b099d7 |
WMShellWidget wmshell = (WMShellWidget) w;
|
|
Packit |
b099d7 |
/* Any window manager which sends this must be
|
|
Packit |
b099d7 |
good guy. Let's reset our flag. */
|
|
Packit |
b099d7 |
wmshell->wm.wait_for_wm = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case ReparentNotify:
|
|
Packit |
b099d7 |
if (event->xreparent.window == XtWindow(w)) {
|
|
Packit |
b099d7 |
if (event->xreparent.parent != RootWindowOfScreen(XtScreen(w)))
|
|
Packit |
b099d7 |
w->shell.client_specified &= ~_XtShellNotReparented;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
w->shell.client_specified |= _XtShellNotReparented;
|
|
Packit |
b099d7 |
w->shell.client_specified &= ~_XtShellPositionValid;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
case UnmapNotify:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtPerDisplayInput pdi;
|
|
Packit |
b099d7 |
XtDevice device;
|
|
Packit |
b099d7 |
Widget p;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pdi = _XtGetPerDisplayInput(event->xunmap.display);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
device = &pdi->pointer;
|
|
Packit |
b099d7 |
if (device->grabType == XtPassiveServerGrab) {
|
|
Packit |
b099d7 |
p = device->grab.widget;
|
|
Packit |
b099d7 |
while (p && !(XtIsShell(p)))
|
|
Packit |
b099d7 |
p = p->core.parent;
|
|
Packit |
b099d7 |
if (p == wid)
|
|
Packit |
b099d7 |
device->grabType = XtNoServerGrab;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
device = &pdi->keyboard;
|
|
Packit |
b099d7 |
if (IsEitherPassiveGrab(device->grabType)) {
|
|
Packit |
b099d7 |
p = device->grab.widget;
|
|
Packit |
b099d7 |
while (p && !(XtIsShell(p)))
|
|
Packit |
b099d7 |
p = p->core.parent;
|
|
Packit |
b099d7 |
if (p == wid) {
|
|
Packit |
b099d7 |
device->grabType = XtNoServerGrab;
|
|
Packit |
b099d7 |
pdi->activatingKey = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sizechanged &&
|
|
Packit |
b099d7 |
XtClass(wid)->core_class.resize != (XtWidgetProc) NULL) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"Shell \"%s\" is being resized to %d %d.\n", XtName(wid), wid->core.width, wid->core.height );
|
|
Packit |
b099d7 |
(*(XtClass(wid)->core_class.resize))(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void Destroy(wid)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XtIsRealized(wid))
|
|
Packit |
b099d7 |
XDestroyWindow( XtDisplay(wid), XtWindow(wid) );
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void WMDestroy(wid)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WMShellWidget w = (WMShellWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((char *) w->wm.title);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void TopLevelDestroy(wid)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
TopLevelShellWidget w = (TopLevelShellWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((char *) w->topLevel.icon_name);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ApplicationDestroy(wid)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ApplicationShellWidget w = (ApplicationShellWidget) wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(w->application.argv != NULL) XtFree((char *) w->application.argv);
|
|
Packit |
b099d7 |
w->application.argv = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If the Shell has a width and a height which are zero, and as such
|
|
Packit |
b099d7 |
* suspect, and it has not yet been realized then it will grow to
|
|
Packit |
b099d7 |
* match the child before parsing the geometry resource.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
static void GetGeometry(W, child)
|
|
Packit |
b099d7 |
Widget W, child;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register ShellWidget w = (ShellWidget)W;
|
|
Packit |
b099d7 |
Boolean is_wmshell = XtIsWMShell(W);
|
|
Packit |
b099d7 |
int x, y, width, height, win_gravity = -1, flag;
|
|
Packit |
b099d7 |
XSizeHints hints;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (child != NULL) {
|
|
Packit |
b099d7 |
/* we default to our child's size */
|
|
Packit |
b099d7 |
if (is_wmshell && (w->core.width == 0 || w->core.height == 0))
|
|
Packit |
b099d7 |
((WMShellWidget)W)->wm.size_hints.flags |= PSize;
|
|
Packit |
b099d7 |
if (w->core.width == 0) w->core.width = child->core.width;
|
|
Packit |
b099d7 |
if (w->core.height == 0) w->core.height = child->core.height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if(w->shell.geometry != NULL) {
|
|
Packit |
b099d7 |
char def_geom[64];
|
|
Packit |
b099d7 |
x = w->core.x;
|
|
Packit |
b099d7 |
y = w->core.y;
|
|
Packit |
b099d7 |
width = w->core.width;
|
|
Packit |
b099d7 |
height = w->core.height;
|
|
Packit |
b099d7 |
if (is_wmshell) {
|
|
Packit |
b099d7 |
WMShellPart* wm = &((WMShellWidget)w)->wm;
|
|
Packit |
b099d7 |
EvaluateSizeHints((WMShellWidget)w);
|
|
Packit |
b099d7 |
bcopy((char*)&wm->size_hints, (char*)&hints,
|
|
Packit |
b099d7 |
sizeof(struct _OldXSizeHints));
|
|
Packit |
b099d7 |
hints.win_gravity = wm->win_gravity;
|
|
Packit |
b099d7 |
if (wm->size_hints.flags & PBaseSize) {
|
|
Packit |
b099d7 |
width -= wm->base_width;
|
|
Packit |
b099d7 |
height -= wm->base_height;
|
|
Packit |
b099d7 |
hints.base_width = wm->base_width;
|
|
Packit |
b099d7 |
hints.base_height = wm->base_height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (wm->size_hints.flags & PMinSize) {
|
|
Packit |
b099d7 |
width -= wm->size_hints.min_width;
|
|
Packit |
b099d7 |
height -= wm->size_hints.min_height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (wm->size_hints.flags & PResizeInc) {
|
|
Packit |
b099d7 |
width /= wm->size_hints.width_inc;
|
|
Packit |
b099d7 |
height /= wm->size_hints.height_inc;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else hints.flags = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sprintf( def_geom, "%dx%d+%d+%d", width, height, x, y );
|
|
Packit |
b099d7 |
flag = XWMGeometry( XtDisplay(W),
|
|
Packit |
b099d7 |
XScreenNumberOfScreen(XtScreen(W)),
|
|
Packit |
b099d7 |
w->shell.geometry, def_geom,
|
|
Packit |
b099d7 |
(unsigned int)w->core.border_width,
|
|
Packit |
b099d7 |
&hints, &x, &y, &width, &height,
|
|
Packit |
b099d7 |
&win_gravity
|
|
Packit |
b099d7 |
);
|
|
Packit |
b099d7 |
if (flag) {
|
|
Packit |
b099d7 |
if (flag & XValue) w->core.x = (Position)x;
|
|
Packit |
b099d7 |
if (flag & YValue) w->core.y = (Position)y;
|
|
Packit |
b099d7 |
if (flag & WidthValue) w->core.width = (Dimension)width;
|
|
Packit |
b099d7 |
if (flag & HeightValue) w->core.height = (Dimension)height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
String params[2];
|
|
Packit |
b099d7 |
Cardinal num_params = 2;
|
|
Packit |
b099d7 |
params[0] = XtName(W);
|
|
Packit |
b099d7 |
params[1] = w->shell.geometry;
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext(W),
|
|
Packit |
b099d7 |
"badGeometry", "shellRealize", XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Shell widget \"%s\" has an invalid geometry specification: \"%s\"",
|
|
Packit |
b099d7 |
params, &num_params);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
flag = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (is_wmshell) {
|
|
Packit |
b099d7 |
WMShellWidget wmshell = (WMShellWidget) w;
|
|
Packit |
b099d7 |
if (wmshell->wm.win_gravity == XtUnspecifiedShellInt) {
|
|
Packit |
b099d7 |
if (win_gravity != -1)
|
|
Packit |
b099d7 |
wmshell->wm.win_gravity = win_gravity;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
wmshell->wm.win_gravity = NorthWestGravity;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
wmshell->wm.size_hints.flags |= PWinGravity;
|
|
Packit |
b099d7 |
if ((flag & (XValue|YValue)) == (XValue|YValue))
|
|
Packit |
b099d7 |
wmshell->wm.size_hints.flags |= USPosition;
|
|
Packit |
b099d7 |
if ((flag & (WidthValue|HeightValue)) == (WidthValue|HeightValue))
|
|
Packit |
b099d7 |
wmshell->wm.size_hints.flags |= USSize;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
w->shell.client_specified |= _XtShellGeometryParsed;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ChangeManaged(wid)
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget w = (ShellWidget) wid;
|
|
Packit |
b099d7 |
Widget child = NULL;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < w->composite.num_children; i++) {
|
|
Packit |
b099d7 |
if (XtIsManaged(w->composite.children[i])) {
|
|
Packit |
b099d7 |
child = w->composite.children[i];
|
|
Packit |
b099d7 |
break; /* there can only be one of them! */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRealized (wid)) /* then we're about to be realized... */
|
|
Packit |
b099d7 |
GetGeometry(wid, child);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* we're already realized and allowShellResize is True, so
|
|
Packit |
b099d7 |
pay attention to our child preferred size and ask the RGM
|
|
Packit |
b099d7 |
to become this size ------------
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
else if (w->shell.allow_shell_resize && child) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtWidgetGeometry child_reply;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) XtQueryGeometry (child, NULL, &child_reply);
|
|
Packit |
b099d7 |
(void) XtMakeResizeRequest(w, child_reply.width, child_reply.height,
|
|
Packit |
b099d7 |
NULL, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (child != NULL)
|
|
Packit |
b099d7 |
XtConfigureWidget (child, (Position)0, (Position)0,
|
|
Packit |
b099d7 |
w->core.width, w->core.height, (Dimension)0 );
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* This is gross, I can't wait to see if the change happened so I will ask
|
|
Packit |
b099d7 |
* the window manager to change my size and do the appropriate X work.
|
|
Packit |
b099d7 |
* I will then tell the requester that he can. Care must be taken because
|
|
Packit |
b099d7 |
* it is possible that some time in the future the request will be
|
|
Packit |
b099d7 |
* asynchronusly denied and the window reverted to it's old size/shape.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static XtGeometryResult GeometryManager( wid, request, reply )
|
|
Packit |
b099d7 |
Widget wid;
|
|
Packit |
b099d7 |
XtWidgetGeometry *request;
|
|
Packit |
b099d7 |
XtWidgetGeometry *reply;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget shell = (ShellWidget)(wid->core.parent);
|
|
Packit |
b099d7 |
XtWidgetGeometry my_request;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(shell->shell.allow_shell_resize == FALSE && XtIsRealized(wid))
|
|
Packit |
b099d7 |
return(XtGeometryNo);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (request->request_mode & (CWX | CWY))
|
|
Packit |
b099d7 |
return(XtGeometryNo);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* %%% worry about XtCWQueryOnly */
|
|
Packit |
b099d7 |
my_request.request_mode = 0;
|
|
Packit |
b099d7 |
if (request->request_mode & CWWidth) {
|
|
Packit |
b099d7 |
my_request.width = request->width;
|
|
Packit |
b099d7 |
my_request.request_mode |= CWWidth;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (request->request_mode & CWHeight) {
|
|
Packit |
b099d7 |
my_request.height = request->height;
|
|
Packit |
b099d7 |
my_request.request_mode |= CWHeight;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (request->request_mode & CWBorderWidth) {
|
|
Packit |
b099d7 |
my_request.border_width = request->border_width;
|
|
Packit |
b099d7 |
my_request.request_mode |= CWBorderWidth;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (XtMakeGeometryRequest((Widget)shell, &my_request, NULL)
|
|
Packit |
b099d7 |
== XtGeometryYes) {
|
|
Packit |
b099d7 |
/* assert: if (request->request_mode & CWWidth) then
|
|
Packit |
b099d7 |
* shell->core.width == request->width
|
|
Packit |
b099d7 |
* assert: if (request->request_mode & CWHeight) then
|
|
Packit |
b099d7 |
* shell->core.height == request->height
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* so, whatever the WM sized us to (if the Shell requested
|
|
Packit |
b099d7 |
* only one of the two) is now the correct child size
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
wid->core.width = shell->core.width;
|
|
Packit |
b099d7 |
wid->core.height = shell->core.height;
|
|
Packit |
b099d7 |
if (request->request_mode & CWBorderWidth) {
|
|
Packit |
b099d7 |
wid->core.x = wid->core.y = -request->border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
} else return XtGeometryNo;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef struct {
|
|
Packit |
b099d7 |
Widget w;
|
|
Packit |
b099d7 |
unsigned long request_num;
|
|
Packit |
b099d7 |
Boolean done;
|
|
Packit |
b099d7 |
} QueryStruct;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Bool isMine(dpy, event, arg)
|
|
Packit |
b099d7 |
Display *dpy;
|
|
Packit |
b099d7 |
register XEvent *event;
|
|
Packit |
b099d7 |
char *arg;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
QueryStruct *q = (QueryStruct *) arg;
|
|
Packit |
b099d7 |
register Widget w = q->w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ( (dpy != XtDisplay(w)) || (event->xany.window != XtWindow(w)) ) {
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (event->xany.serial >= q->request_num) {
|
|
Packit |
b099d7 |
if (event->type == ConfigureNotify) {
|
|
Packit |
b099d7 |
q->done = TRUE;
|
|
Packit |
b099d7 |
return TRUE;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
/* This is draft-ICCCM stuff; here for compatibility */
|
|
Packit |
b099d7 |
if (event->type == ClientMessage &&
|
|
Packit |
b099d7 |
(event->xclient.message_type == WM_CONFIGURE_DENIED(w) ||
|
|
Packit |
b099d7 |
event->xclient.message_type == WM_MOVED(w))) {
|
|
Packit |
b099d7 |
q->done = TRUE;
|
|
Packit |
b099d7 |
return TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (event->type == ConfigureNotify ||
|
|
Packit |
b099d7 |
(event->type == ClientMessage &&
|
|
Packit |
b099d7 |
(event->xclient.message_type == WM_CONFIGURE_DENIED(w) ||
|
|
Packit |
b099d7 |
event->xclient.message_type == WM_MOVED(w)))) {
|
|
Packit |
b099d7 |
return TRUE; /* flush old events */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (event->type == ReparentNotify
|
|
Packit |
b099d7 |
&& event->xreparent.window == XtWindow(w)) {
|
|
Packit |
b099d7 |
/* we might get ahead of this event, so just in case someone
|
|
Packit |
b099d7 |
* asks for coordinates before this event is dispatched...
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
register ShellWidget s = (ShellWidget)w;
|
|
Packit |
b099d7 |
if (event->xreparent.parent != RootWindowOfScreen(XtScreen(w)))
|
|
Packit |
b099d7 |
s->shell.client_specified &= ~_XtShellNotReparented;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
s->shell.client_specified |= _XtShellNotReparented;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static _wait_for_response(w, event, request_num)
|
|
Packit |
b099d7 |
ShellWidget w;
|
|
Packit |
b099d7 |
XEvent *event;
|
|
Packit |
b099d7 |
unsigned long request_num;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtAppContext app = XtWidgetToApplicationContext((Widget) w);
|
|
Packit |
b099d7 |
QueryStruct q;
|
|
Packit |
b099d7 |
unsigned long timeout;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsWMShell((Widget)w))
|
|
Packit |
b099d7 |
timeout = ((WMShellWidget)w)->wm.wm_timeout;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
timeout = DEFAULT_WM_TIMEOUT;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XFlush(XtDisplay(w));
|
|
Packit |
b099d7 |
q.w = (Widget) w;
|
|
Packit |
b099d7 |
q.request_num = request_num;
|
|
Packit |
b099d7 |
q.done = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for(;;) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* look for match event and discard all prior configures
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (XCheckIfEvent( XtDisplay(w), event, isMine, (char*)&q)) {
|
|
Packit |
b099d7 |
if (q.done)
|
|
Packit |
b099d7 |
return TRUE;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
continue; /* flush old events */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XtwaitForSomething(TRUE, TRUE, FALSE, TRUE, &timeout, app)
|
|
Packit |
b099d7 |
!= -1) continue;
|
|
Packit |
b099d7 |
if (timeout == 0)
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static XtGeometryResult RootGeometryManager(gw, request, reply)
|
|
Packit |
b099d7 |
Widget gw;
|
|
Packit |
b099d7 |
XtWidgetGeometry *request, *reply;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register ShellWidget w = (ShellWidget)gw;
|
|
Packit |
b099d7 |
XWindowChanges values;
|
|
Packit |
b099d7 |
unsigned int mask = request->request_mode;
|
|
Packit |
b099d7 |
XEvent event;
|
|
Packit |
b099d7 |
Boolean wm;
|
|
Packit |
b099d7 |
register struct _OldXSizeHints *hintp;
|
|
Packit |
b099d7 |
int oldx, oldy, oldwidth, oldheight, oldborder_width;
|
|
Packit |
b099d7 |
unsigned long request_num;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_GeoTabTrace();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsWMShell(gw)) {
|
|
Packit |
b099d7 |
wm = True;
|
|
Packit |
b099d7 |
hintp = &((WMShellWidget)w)->wm.size_hints;
|
|
Packit |
b099d7 |
/* for draft-ICCCM wm's, need to make sure hints reflect
|
|
Packit |
b099d7 |
(current) reality so client can move and size separately. */
|
|
Packit |
b099d7 |
hintp->x = w->core.x;
|
|
Packit |
b099d7 |
hintp->y = w->core.y;
|
|
Packit |
b099d7 |
hintp->width = w->core.width;
|
|
Packit |
b099d7 |
hintp->height = w->core.height;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
wm = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
oldx = w->core.x;
|
|
Packit |
b099d7 |
oldy = w->core.y;
|
|
Packit |
b099d7 |
oldwidth = w->core.width;
|
|
Packit |
b099d7 |
oldheight = w->core.height;
|
|
Packit |
b099d7 |
oldborder_width = w->core.border_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define PutBackGeometry() \
|
|
Packit |
b099d7 |
{ w->core.x = oldx; \
|
|
Packit |
b099d7 |
w->core.y = oldy; \
|
|
Packit |
b099d7 |
w->core.width = oldwidth; \
|
|
Packit |
b099d7 |
w->core.height = oldheight; \
|
|
Packit |
b099d7 |
w->core.border_width = oldborder_width; }
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (mask & CWX) {
|
|
Packit |
b099d7 |
if (w->core.x == request->x) mask &= ~CWX;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.x = values.x = request->x;
|
|
Packit |
b099d7 |
if (wm) {
|
|
Packit |
b099d7 |
hintp->flags &= ~USPosition;
|
|
Packit |
b099d7 |
hintp->flags |= PPosition;
|
|
Packit |
b099d7 |
hintp->x = values.x;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (mask & CWY) {
|
|
Packit |
b099d7 |
if (w->core.y == request->y) mask &= ~CWY;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.y = values.y = request->y;
|
|
Packit |
b099d7 |
if (wm) {
|
|
Packit |
b099d7 |
hintp->flags &= ~USPosition;
|
|
Packit |
b099d7 |
hintp->flags |= PPosition;
|
|
Packit |
b099d7 |
hintp->y = values.y;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (mask & CWBorderWidth) {
|
|
Packit |
b099d7 |
if (w->core.border_width == request->border_width) {
|
|
Packit |
b099d7 |
mask &= ~CWBorderWidth;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
w->core.border_width =
|
|
Packit |
b099d7 |
values.border_width =
|
|
Packit |
b099d7 |
request->border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (mask & CWWidth) {
|
|
Packit |
b099d7 |
if (w->core.width == request->width) mask &= ~CWWidth;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.width = values.width = request->width;
|
|
Packit |
b099d7 |
if (wm) {
|
|
Packit |
b099d7 |
hintp->flags &= ~USSize;
|
|
Packit |
b099d7 |
hintp->flags |= PSize;
|
|
Packit |
b099d7 |
hintp->width = values.width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (mask & CWHeight) {
|
|
Packit |
b099d7 |
if (w->core.height == request->height) mask &= ~CWHeight;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.height = values.height = request->height;
|
|
Packit |
b099d7 |
if (wm) {
|
|
Packit |
b099d7 |
hintp->flags &= ~USSize;
|
|
Packit |
b099d7 |
hintp->flags |= PSize;
|
|
Packit |
b099d7 |
hintp->height = values.height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (mask & CWStackMode) {
|
|
Packit |
b099d7 |
values.stack_mode = request->stack_mode;
|
|
Packit |
b099d7 |
if (mask & CWSibling)
|
|
Packit |
b099d7 |
values.sibling = XtWindow(request->sibling);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRealized((Widget)w)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,
|
|
Packit |
b099d7 |
"Shell \"%s\" is not realized, return XtGeometryYes.\n",
|
|
Packit |
b099d7 |
XtName((Widget)w));
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
request_num = NextRequest(XtDisplay(w));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"XConfiguring the Shell X window :\n");
|
|
Packit |
b099d7 |
_GeoTabTrace();
|
|
Packit |
b099d7 |
if (mask & CWX) { _GeoPrintTrace((Widget)w,"x = %d\n",values.x);}
|
|
Packit |
b099d7 |
if (mask & CWY) { _GeoPrintTrace((Widget)w,"y = %d\n",values.y);}
|
|
Packit |
b099d7 |
if (mask & CWWidth) { _GeoPrintTrace((Widget)w,"width = %d\n",values.width);}
|
|
Packit |
b099d7 |
if (mask & CWHeight) { _GeoPrintTrace((Widget)w,"height = %d\n",values.height);}
|
|
Packit |
b099d7 |
if (mask & CWBorderWidth) { _GeoPrintTrace((Widget)w,"border_width = %d\n",values.border_width);}
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XConfigureWindow(XtDisplay((Widget)w), XtWindow((Widget)w), mask,&values);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (wm && !w->shell.override_redirect
|
|
Packit |
b099d7 |
&& mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)) {
|
|
Packit |
b099d7 |
_SetWMSizeHints((WMShellWidget)w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (w->shell.override_redirect) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"Shell \"%s\" is override redirect, return XtGeometryYes.\n", XtName((Widget)w));
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If no non-stacking bits are set, there's no way to tell whether
|
|
Packit |
b099d7 |
or not this worked, so assume it did */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!(mask & ~(CWStackMode | CWSibling))) return XtGeometryYes;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (wm && ((WMShellWidget)w)->wm.wait_for_wm == FALSE) {
|
|
Packit |
b099d7 |
/* the window manager is sick
|
|
Packit |
b099d7 |
* so I will do the work and
|
|
Packit |
b099d7 |
* say no so if a new WM starts up,
|
|
Packit |
b099d7 |
* or the current one recovers
|
|
Packit |
b099d7 |
* my size requests will be visible
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"Shell \"%s\" has wait_for_wm == FALSE, return XtGeometryNo.\n", XtName((Widget)w));
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
PutBackGeometry();
|
|
Packit |
b099d7 |
return XtGeometryNo;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_wait_for_response(w, &event, request_num)) {
|
|
Packit |
b099d7 |
/* got an event */
|
|
Packit |
b099d7 |
if (event.type == ConfigureNotify) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define NEQ(x, msk) ((mask & msk) && (values.x != event.xconfigure.x))
|
|
Packit |
b099d7 |
if (NEQ(x, CWX) ||
|
|
Packit |
b099d7 |
NEQ(y, CWY) ||
|
|
Packit |
b099d7 |
NEQ(width, CWWidth) ||
|
|
Packit |
b099d7 |
NEQ(height, CWHeight) ||
|
|
Packit |
b099d7 |
NEQ(border_width, CWBorderWidth)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (NEQ(x, CWX)) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"received Configure X %d\n",
|
|
Packit |
b099d7 |
event.xconfigure.x);}
|
|
Packit |
b099d7 |
if (NEQ(y, CWY)) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"received Configure Y %d\n",
|
|
Packit |
b099d7 |
event.xconfigure.y);}
|
|
Packit |
b099d7 |
if (NEQ(width, CWWidth)) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"received Configure Width %d\n",
|
|
Packit |
b099d7 |
event.xconfigure.width);}
|
|
Packit |
b099d7 |
if (NEQ(height, CWHeight)) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"received Configure Height %d\n",
|
|
Packit |
b099d7 |
event.xconfigure.height);}
|
|
Packit |
b099d7 |
if (NEQ(border_width, CWBorderWidth)) {
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"received Configure BorderWidth %d\n",
|
|
Packit |
b099d7 |
event.xconfigure.border_width);}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef NEQ
|
|
Packit |
b099d7 |
XPutBackEvent(XtDisplay(w), &event);
|
|
Packit |
b099d7 |
PutBackGeometry();
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* We just potentially re-ordered the event queue
|
|
Packit |
b099d7 |
* w.r.t. ConfigureNotifies with some trepidation.
|
|
Packit |
b099d7 |
* But this is probably a Good Thing because we
|
|
Packit |
b099d7 |
* will know the new true state of the world sooner
|
|
Packit |
b099d7 |
* this way.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"ConfigureNotify failed, return XtGeometryNo.\n");
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XtGeometryNo;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w->core.width = event.xconfigure.width;
|
|
Packit |
b099d7 |
w->core.height = event.xconfigure.height;
|
|
Packit |
b099d7 |
w->core.border_width = event.xconfigure.border_width;
|
|
Packit |
b099d7 |
if (event.xany.send_event || /* ICCCM compliant synth */
|
|
Packit |
b099d7 |
w->shell.client_specified & _XtShellNotReparented) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
w->core.x = event.xconfigure.x;
|
|
Packit |
b099d7 |
w->core.y = event.xconfigure.y;
|
|
Packit |
b099d7 |
w->shell.client_specified |= _XtShellPositionValid;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else w->shell.client_specified &= ~_XtShellPositionValid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"ConfigureNotify succeed, return XtGeometryYes.\n");
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (!wm ||
|
|
Packit |
b099d7 |
(event.type == ClientMessage &&
|
|
Packit |
b099d7 |
event.xclient.message_type == WM_CONFIGURE_DENIED(w))) {
|
|
Packit |
b099d7 |
PutBackGeometry();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"No ConfigureNotify event, return XtGeometryNo.\n");
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XtGeometryNo;
|
|
Packit |
b099d7 |
} else if (event.type == ClientMessage &&
|
|
Packit |
b099d7 |
event.xclient.message_type == WM_MOVED(w)) {
|
|
Packit |
b099d7 |
w->core.x = event.xclient.data.s[0];
|
|
Packit |
b099d7 |
w->core.y = event.xclient.data.s[1];
|
|
Packit |
b099d7 |
w->shell.client_specified |= _XtShellPositionValid;
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"ClientMessage ok, return XtGeometryYes.\n");
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
} else XtAppWarningMsg(XtWidgetToApplicationContext((Widget)w),
|
|
Packit |
b099d7 |
"internalError", "shell", XtCXtToolkitError,
|
|
Packit |
b099d7 |
"Shell's window manager interaction is broken",
|
|
Packit |
b099d7 |
(String *)NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
} else if (wm) { /* no event */
|
|
Packit |
b099d7 |
((WMShellWidget)w)->wm.wait_for_wm = FALSE; /* timed out; must be broken */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
PutBackGeometry();
|
|
Packit |
b099d7 |
#undef PutBackGeometry
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_GeoPrintTrace((Widget)w,"Timeout passed?, return XtGeometryNo.\n");
|
|
Packit |
b099d7 |
_GeoUnTabTrace();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XtGeometryNo;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static Boolean SetValues(old, ref, new, args, num_args)
|
|
Packit |
b099d7 |
Widget old, ref, new;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget nw = (ShellWidget) new;
|
|
Packit |
b099d7 |
ShellWidget ow = (ShellWidget) old;
|
|
Packit |
b099d7 |
Mask mask = 0;
|
|
Packit |
b099d7 |
XSetWindowAttributes attr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ow->shell.save_under != nw->shell.save_under) {
|
|
Packit |
b099d7 |
mask = CWSaveUnder;
|
|
Packit |
b099d7 |
attr.save_under = nw->shell.save_under;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ow->shell.override_redirect != nw->shell.override_redirect) {
|
|
Packit |
b099d7 |
mask |= CWOverrideRedirect;
|
|
Packit |
b099d7 |
attr.override_redirect = nw->shell.override_redirect;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (mask && XtIsRealized(new)) {
|
|
Packit |
b099d7 |
XChangeWindowAttributes(XtDisplay(new),XtWindow(new), mask, &attr);
|
|
Packit |
b099d7 |
if ((mask & CWOverrideRedirect) && !nw->shell.override_redirect)
|
|
Packit |
b099d7 |
_popup_set_prop(nw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static Boolean WMSetValues(old, ref, new, args, num_args)
|
|
Packit |
b099d7 |
Widget old, ref, new;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WMShellWidget nwmshell = (WMShellWidget) new;
|
|
Packit |
b099d7 |
WMShellWidget owmshell = (WMShellWidget) old;
|
|
Packit |
b099d7 |
Boolean set_prop
|
|
Packit |
b099d7 |
= XtIsRealized(new) && !nwmshell->shell.override_redirect;
|
|
Packit |
b099d7 |
Boolean title_changed;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
EvaluateSizeHints(nwmshell);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define NEQ(f) (nwmshell->wm.size_hints.f != owmshell->wm.size_hints.f)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (set_prop
|
|
Packit |
b099d7 |
&& (NEQ(flags) || NEQ(min_width) || NEQ(min_height)
|
|
Packit |
b099d7 |
|| NEQ(max_width) || NEQ(max_height)
|
|
Packit |
b099d7 |
|| NEQ(width_inc) || NEQ(height_inc)
|
|
Packit |
b099d7 |
|| NEQ(min_aspect.x) || NEQ(min_aspect.y)
|
|
Packit |
b099d7 |
|| NEQ(max_aspect.x) || NEQ(max_aspect.y)
|
|
Packit |
b099d7 |
#undef NEQ
|
|
Packit |
b099d7 |
#define NEQ(f) (nwmshell->wm.f != owmshell->wm.f)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|| NEQ(base_width) || NEQ(base_height) || NEQ(win_gravity))) {
|
|
Packit |
b099d7 |
_SetWMSizeHints(nwmshell);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#undef NEQ
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (nwmshell->wm.title != owmshell->wm.title) {
|
|
Packit |
b099d7 |
XtFree(owmshell->wm.title);
|
|
Packit |
b099d7 |
if (! nwmshell->wm.title) nwmshell->wm.title = "";
|
|
Packit |
b099d7 |
nwmshell->wm.title = XtNewString(nwmshell->wm.title);
|
|
Packit |
b099d7 |
title_changed = True;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
title_changed = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (set_prop
|
|
Packit |
b099d7 |
&& (title_changed ||
|
|
Packit |
b099d7 |
nwmshell->wm.title_encoding != owmshell->wm.title_encoding)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XTextProperty title;
|
|
Packit |
b099d7 |
Boolean copied = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (nwmshell->wm.title_encoding == None &&
|
|
Packit |
b099d7 |
XmbTextListToTextProperty(XtDisplay(new),
|
|
Packit |
b099d7 |
(char**)&nwmshell->wm.title,
|
|
Packit |
b099d7 |
1, XStdICCTextStyle,
|
|
Packit |
b099d7 |
&title) >= Success) {
|
|
Packit |
b099d7 |
copied = True;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
title.value = (unsigned char*)nwmshell->wm.title;
|
|
Packit |
b099d7 |
title.encoding = nwmshell->wm.title_encoding;
|
|
Packit |
b099d7 |
title.format = 8;
|
|
Packit |
b099d7 |
title.nitems = strlen(nwmshell->wm.title);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
XSetWMName(XtDisplay(new), XtWindow(new), &title);
|
|
Packit |
b099d7 |
if (copied)
|
|
Packit |
b099d7 |
XFree((XPointer)title.value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
EvaluateWMHints(nwmshell);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define NEQ(f) (nwmshell->wm.wm_hints.f != owmshell->wm.wm_hints.f)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (set_prop
|
|
Packit |
b099d7 |
&& (NEQ(flags) || NEQ(input) || NEQ(initial_state)
|
|
Packit |
b099d7 |
|| NEQ(icon_x) || NEQ(icon_y)
|
|
Packit |
b099d7 |
|| NEQ(icon_pixmap) || NEQ(icon_mask) || NEQ(icon_window)
|
|
Packit |
b099d7 |
|| NEQ(window_group))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetWMHints(XtDisplay(new), XtWindow(new), &nwmshell->wm.wm_hints);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#undef NEQ
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (set_prop && nwmshell->wm.transient != owmshell->wm.transient) {
|
|
Packit |
b099d7 |
if (nwmshell->wm.transient) {
|
|
Packit |
b099d7 |
if (!XtIsTransientShell(new) &&
|
|
Packit |
b099d7 |
nwmshell->wm.wm_hints.window_group !=
|
|
Packit |
b099d7 |
XtUnspecifiedWindowGroup)
|
|
Packit |
b099d7 |
XSetTransientForHint(XtDisplay(new), XtWindow(new),
|
|
Packit |
b099d7 |
nwmshell->wm.wm_hints.window_group);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else XDeleteProperty(XtDisplay(new), XtWindow(new),
|
|
Packit |
b099d7 |
XA_WM_TRANSIENT_FOR);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean TransientSetValues(oldW, refW, newW, args, num_args)
|
|
Packit |
b099d7 |
Widget oldW, refW, newW;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
TransientShellWidget old = (TransientShellWidget)oldW;
|
|
Packit |
b099d7 |
TransientShellWidget new = (TransientShellWidget)newW;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized(newW)
|
|
Packit |
b099d7 |
&& ((new->transient.transient_for != old->transient.transient_for)
|
|
Packit |
b099d7 |
|| (new->transient.transient_for == NULL
|
|
Packit |
b099d7 |
&& (new->wm.wm_hints.window_group
|
|
Packit |
b099d7 |
!= old->wm.wm_hints.window_group)))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_SetTransientForHint(new, True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static Boolean TopLevelSetValues(oldW, refW, newW, args, num_args)
|
|
Packit |
b099d7 |
Widget oldW, refW, newW;
|
|
Packit |
b099d7 |
ArgList args; /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args; /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
TopLevelShellWidget old = (TopLevelShellWidget)oldW;
|
|
Packit |
b099d7 |
TopLevelShellWidget new = (TopLevelShellWidget)newW;
|
|
Packit |
b099d7 |
Boolean name_changed;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (old->topLevel.icon_name != new->topLevel.icon_name) {
|
|
Packit |
b099d7 |
XtFree((XtPointer)old->topLevel.icon_name);
|
|
Packit |
b099d7 |
if (! new->topLevel.icon_name) new->topLevel.icon_name = "";
|
|
Packit |
b099d7 |
new->topLevel.icon_name = XtNewString(new->topLevel.icon_name);
|
|
Packit |
b099d7 |
name_changed = True;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
name_changed = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized(newW)) {
|
|
Packit |
b099d7 |
if (new->topLevel.iconic != old->topLevel.iconic) {
|
|
Packit |
b099d7 |
if (new->topLevel.iconic)
|
|
Packit |
b099d7 |
XIconifyWindow(XtDisplay(newW),
|
|
Packit |
b099d7 |
XtWindow(newW),
|
|
Packit |
b099d7 |
XScreenNumberOfScreen(XtScreen(newW))
|
|
Packit |
b099d7 |
);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
Boolean map = new->shell.popped_up;
|
|
Packit |
b099d7 |
XtPopup(newW, XtGrabNone);
|
|
Packit |
b099d7 |
if (map) XMapWindow(XtDisplay(newW), XtWindow(newW));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!new->shell.override_redirect &&
|
|
Packit |
b099d7 |
(name_changed ||
|
|
Packit |
b099d7 |
(old->topLevel.icon_name_encoding
|
|
Packit |
b099d7 |
!= new->topLevel.icon_name_encoding))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XTextProperty icon_name;
|
|
Packit |
b099d7 |
Boolean copied = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new->topLevel.icon_name_encoding == None &&
|
|
Packit |
b099d7 |
XmbTextListToTextProperty(XtDisplay(newW),
|
|
Packit |
b099d7 |
(char**) &new->topLevel.icon_name,
|
|
Packit |
b099d7 |
1, XStdICCTextStyle,
|
|
Packit |
b099d7 |
&icon_name) >= Success) {
|
|
Packit |
b099d7 |
copied = True;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
icon_name.value = (unsigned char *)new->topLevel.icon_name;
|
|
Packit |
b099d7 |
icon_name.encoding = new->topLevel.icon_name_encoding;
|
|
Packit |
b099d7 |
icon_name.format = 8;
|
|
Packit |
b099d7 |
icon_name.nitems = strlen((char *)icon_name.value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
XSetWMIconName(XtDisplay(newW), XtWindow(newW), &icon_name);
|
|
Packit |
b099d7 |
if (copied)
|
|
Packit |
b099d7 |
XFree((XPointer)icon_name.value);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void _XtShellGetCoordinates( widget, x, y)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
Position* x;
|
|
Packit |
b099d7 |
Position* y;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget w = (ShellWidget)widget;
|
|
Packit |
b099d7 |
if (!(w->shell.client_specified & _XtShellPositionValid)) {
|
|
Packit |
b099d7 |
int tmpx, tmpy;
|
|
Packit |
b099d7 |
Window tmpchild;
|
|
Packit |
b099d7 |
(void) XTranslateCoordinates(XtDisplay(w), XtWindow(w),
|
|
Packit |
b099d7 |
RootWindowOfScreen(XtScreen(w)),
|
|
Packit |
b099d7 |
(int) -w->core.border_width,
|
|
Packit |
b099d7 |
(int) -w->core.border_width,
|
|
Packit |
b099d7 |
&tmpx, &tmpy, &tmpchild);
|
|
Packit |
b099d7 |
w->core.x = tmpx;
|
|
Packit |
b099d7 |
w->core.y = tmpy;
|
|
Packit |
b099d7 |
w->shell.client_specified |= _XtShellPositionValid;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
*x = w->core.x;
|
|
Packit |
b099d7 |
*y = w->core.y;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void GetValuesHook(widget, args, num_args)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
ArgList args;
|
|
Packit |
b099d7 |
Cardinal* num_args;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ShellWidget w = (ShellWidget) widget;
|
|
Packit |
b099d7 |
extern void _XtCopyToArg();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* x and y resource values may be invalid after a shell resize */
|
|
Packit |
b099d7 |
if (! (w->shell.client_specified & _XtShellPositionValid)) {
|
|
Packit |
b099d7 |
Cardinal n;
|
|
Packit |
b099d7 |
Position x, y;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (n = *num_args; n; n--, args++) {
|
|
Packit |
b099d7 |
if (strcmp(XtNx, args->name) == 0) {
|
|
Packit |
b099d7 |
if (! (w->shell.client_specified & _XtShellPositionValid))
|
|
Packit |
b099d7 |
_XtShellGetCoordinates(widget, &x, &y);
|
|
Packit |
b099d7 |
_XtCopyToArg((char *) &x, &args->value, sizeof(Position));
|
|
Packit |
b099d7 |
} else if (strcmp(XtNy, args->name) == 0) {
|
|
Packit |
b099d7 |
if (! (w->shell.client_specified & _XtShellPositionValid))
|
|
Packit |
b099d7 |
_XtShellGetCoordinates(widget, &x, &y);
|
|
Packit |
b099d7 |
_XtCopyToArg((char *) &y, &args->value, sizeof(Position));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ApplicationShellInsertChild(widget)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (! XtIsWidget(widget) && XtIsRectObj(widget)) {
|
|
Packit |
b099d7 |
XtAppWarningMsg(XtWidgetToApplicationContext(widget),
|
|
Packit |
b099d7 |
"invalidClass", "applicationShellInsertChild", XtCXtToolkitError,
|
|
Packit |
b099d7 |
"ApplicationShell does not accept RectObj children; ignored",
|
|
Packit |
b099d7 |
(String*)NULL, (Cardinal*)NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
(*((CompositeWidgetClass)applicationShellClassRec.core_class.
|
|
Packit |
b099d7 |
superclass)->composite_class.insert_child) (widget);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|