Added a XtManageWidget implementation lifted from the XFE code. This fixes problems where the drawing area would

spontaneously resize itself to fit its contents.
This commit is contained in:
kmcclusk%netscape.com 1998-08-10 21:21:34 +00:00
Родитель 0833242c46
Коммит bcab2bd218
7 изменённых файлов: 329 добавлений и 5 удалений

Просмотреть файл

@ -59,7 +59,8 @@ CPPSRCS= \
nsWindow.cpp \ nsWindow.cpp \
nsXtEventHandler.cpp \ nsXtEventHandler.cpp \
nsLookAndFeel.cpp \ nsLookAndFeel.cpp \
nsToolkit.cpp nsToolkit.cpp \
nsXtManageWidget.cpp
CPP_OBJS= \ CPP_OBJS= \
./$(OBJDIR)/nsComboBox.o \ ./$(OBJDIR)/nsComboBox.o \

Просмотреть файл

@ -44,10 +44,15 @@
#include "Xm/RowColumn.h" #include "Xm/RowColumn.h"
#include "Xm/Form.h" #include "Xm/Form.h"
#define DBG 0 #define DBG 0
#define SET_VALUES 1 #define SET_VALUES 1
nsWindow* gMainWindow; //REMOVE Kludge
nsWindow* gChildren[5];
int gChildCount = 0;
//#if defined(LINUX) //#if defined(LINUX)
//#undef SET_VALUES //#undef SET_VALUES
//#endif //#endif
@ -319,6 +324,7 @@ void nsWindow::CreateMainWindow(nsNativeWidget aNativeParent,
nsIToolkit *aToolkit, nsIToolkit *aToolkit,
nsWidgetInitData *aInitData) nsWidgetInitData *aInitData)
{ {
gMainWindow = this;
Widget mainWindow = 0, frame = 0; Widget mainWindow = 0, frame = 0;
mBounds = aRect; mBounds = aRect;
mAppShell = aAppShell; mAppShell = aAppShell;
@ -351,19 +357,23 @@ void nsWindow::CreateMainWindow(nsNativeWidget aNativeParent,
shell, shell,
nsnull); nsnull);
XtVaSetValues(mainWindow, XtVaSetValues(mainWindow,
XmNallowShellResize, 1,
XmNwidth, aRect.width, XmNheight, aRect.height, nsnull); XmNwidth, aRect.width, XmNheight, aRect.height, nsnull);
} }
frame = ::XtVaCreateManagedWidget("frame", frame = ::XtVaCreateManagedWidget("frame",
xmDrawingAreaWidgetClass, // xmDrawingAreaWidgetClass,
newManageClass,
mainWindow, mainWindow,
XmNwidth, aRect.width, XmNwidth, aRect.width,
XmNheight, aRect.height, XmNheight, aRect.height,
XmNmarginHeight, 0, XmNmarginHeight, 0,
XmNmarginWidth, 0, XmNmarginWidth, 0,
XmNrecomputeSize, False, XmNrecomputeSize, False,
XmNuserData, this,
nsnull); nsnull);
printf("main %d\n", frame);
mWidget = frame ; mWidget = frame ;
@ -377,10 +387,12 @@ void nsWindow::CreateMainWindow(nsNativeWidget aNativeParent,
InitCallbacks(); InitCallbacks();
XtAddCallback(mWidget, #if 0
XtAddCallback(mainWindow,
XmNresizeCallback, XmNresizeCallback,
nsXtWidget_Resize_Callback, nsXtWidget_Resize_Callback,
this); this);
#endif
} }
@ -397,6 +409,9 @@ void nsWindow::CreateChildWindow(nsNativeWidget aNativeParent,
{ {
mBounds = aRect; mBounds = aRect;
mAppShell = aAppShell; mAppShell = aAppShell;
gChildren[gChildCount] = this;
gChildCount++;
InitToolkit(aToolkit, aWidgetParent); InitToolkit(aToolkit, aWidgetParent);
@ -406,15 +421,19 @@ void nsWindow::CreateChildWindow(nsNativeWidget aNativeParent,
InitDeviceContext(aContext, (Widget)aNativeParent); InitDeviceContext(aContext, (Widget)aNativeParent);
mWidget = ::XtVaCreateManagedWidget("frame", mWidget = ::XtVaCreateManagedWidget("frame",
xmDrawingAreaWidgetClass, // xmDrawingAreaWidgetClass,
newManageClass,
(Widget)aNativeParent, (Widget)aNativeParent,
XmNwidth, aRect.width, XmNwidth, aRect.width,
XmNheight, aRect.height, XmNheight, aRect.height,
XmNmarginHeight, 0, XmNmarginHeight, 0,
XmNmarginWidth, 0, XmNmarginWidth, 0,
XmNrecomputeSize, False, XmNrecomputeSize, False,
XmNuserData, this,
nsnull); nsnull);
printf("child %d\n", mWidget);
if (aWidgetParent) { if (aWidgetParent) {
aWidgetParent->AddChild(this); aWidgetParent->AddChild(this);
@ -426,10 +445,12 @@ void nsWindow::CreateChildWindow(nsNativeWidget aNativeParent,
InitCallbacks(); InitCallbacks();
#if 0
XtAddCallback(mWidget, XtAddCallback(mWidget,
XmNresizeCallback, XmNresizeCallback,
nsXtWidget_Resize_Callback, nsXtWidget_Resize_Callback,
this); this);
#endif
CreateGC(); CreateGC();
@ -694,6 +715,7 @@ void nsWindow::Move(PRUint32 aX, PRUint32 aY)
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
void nsWindow::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) void nsWindow::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint)
{ {
printf("RESIZE %d w %d h %d\n",this, aWidth, aHeight);
if (DBG) printf("$$$$$$$$$ %s::Resize %d %d Repaint: %s\n", if (DBG) printf("$$$$$$$$$ %s::Resize %d %d Repaint: %s\n",
gInstanceClassName, aWidth, aHeight, (aRepaint?"true":"false")); gInstanceClassName, aWidth, aHeight, (aRepaint?"true":"false"));
mBounds.width = aWidth; mBounds.width = aWidth;
@ -718,6 +740,8 @@ void nsWindow::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint)
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
void nsWindow::Resize(PRUint32 aX, PRUint32 aY, PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) void nsWindow::Resize(PRUint32 aX, PRUint32 aY, PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint)
{ {
printf("RESIZE 2 %d w %d h %d\n",this, aWidth, aHeight);
mBounds.x = aX; mBounds.x = aX;
mBounds.y = aY; mBounds.y = aY;
mBounds.width = aWidth; mBounds.width = aWidth;
@ -725,9 +749,11 @@ void nsWindow::Resize(PRUint32 aX, PRUint32 aY, PRUint32 aWidth, PRUint32 aHeigh
// UpdateVisibilityFlag(); // UpdateVisibilityFlag();
// UpdateDisplay(); // UpdateDisplay();
#ifdef SET_VALUES #ifdef SET_VALUES
printf("SET_VAL\n");
XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY), XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY),
XmNwidth, aWidth, XmNheight, aHeight, nsnull); XmNwidth, aWidth, XmNheight, aHeight, nsnull);
#else #else
printf("CONFIGURE\n");
XtConfigureWidget(mWidget, aX, GetYCoord(aY), aWidth, aHeight, 0); XtConfigureWidget(mWidget, aX, GetYCoord(aY), aWidth, aHeight, 0);
#endif #endif
} }
@ -1377,6 +1403,7 @@ PRBool nsWindow::OnResize(nsSizeEvent &aEvent)
}*/ }*/
if (mEventCallback && !mIgnoreResize) { if (mEventCallback && !mIgnoreResize) {
printf("DISPATCHGIN FOR %d\n", this);
return(DispatchEvent(&aEvent)); return(DispatchEvent(&aEvent));
} }
return FALSE; return FALSE;
@ -1486,3 +1513,35 @@ PRUint32 nsWindow::GetYCoord(PRUint32 aNewY)
return(aNewY); return(aNewY);
} }
extern "C" void ResizeWidget(Widget w)
{
int width = 0;
int height = 0;
nsWindow *win = 0;
XtVaGetValues(w, XmNuserData, &win, XmNwidth, &width, XmNheight, &height, nsnull);
printf("raw width win %d %d height %d\n",win, width, height);
nsRect bounds;
bounds.width = width;
bounds.height = height;
bounds.x = 0;
bounds.y = 0;
win->SetResizeRect(bounds);
extern XtAppContext gAppContext;
if (! win->GetResized()) {
if (win->IsChild()) {
XtAppAddTimeOut(gAppContext, 250, (XtTimerCallbackProc)nsXtWidget_Refresh_Callback, win);
}
else {
nsXtWidget_Refresh_Callback(win);
}
}
win->SetResized(PR_TRUE);
}

Просмотреть файл

@ -32,6 +32,8 @@
#include "Xm/Xm.h" #include "Xm/Xm.h"
#include "nsXtManageWidget.h"
#define NSRGB_2_COLOREF(color) \ #define NSRGB_2_COLOREF(color) \
RGB(NS_GET_R(color),NS_GET_G(color),NS_GET_B(color)) RGB(NS_GET_R(color),NS_GET_G(color),NS_GET_B(color))
@ -46,6 +48,7 @@ class nsWindow : public nsIWidget
public: public:
nsWindow(nsISupports *aOuter); nsWindow(nsISupports *aOuter);
virtual ~nsWindow(); virtual ~nsWindow();
virtual PRBool IsChild() { return(PR_FALSE); };
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
@ -233,8 +236,9 @@ private:
class ChildWindow : public nsWindow { class ChildWindow : public nsWindow {
public: public:
ChildWindow(nsISupports *aOuter) : nsWindow(aOuter) {} ChildWindow(nsISupports *aOuter) : nsWindow(aOuter) {};
virtual PRBool IsChild() { return(PR_TRUE); };
}; };
#define AGGREGATE_METHOD_DEF \ #define AGGREGATE_METHOD_DEF \

Просмотреть файл

@ -635,6 +635,7 @@ printf("After %d %d %d %d\n", rect.x, rect.y, rect.width, rect.height);
//============================================================== //==============================================================
void nsXtWidget_Resize_Callback(Widget w, XtPointer p, XtPointer call_data) void nsXtWidget_Resize_Callback(Widget w, XtPointer p, XtPointer call_data)
{ {
printf("XXXXXXX RESIZE CALLBACK\n");
//if (DBG) //if (DBG)
//fprintf(stderr, "In nsXtWidget_Resize_Callback 0x%x", p); //fprintf(stderr, "In nsXtWidget_Resize_Callback 0x%x", p);
@ -858,6 +859,7 @@ void nsXtWidget_Refresh_Callback(XtPointer call_data)
event.windowSize = &bounds; event.windowSize = &bounds;
widgetWindow->SetBounds(bounds); widgetWindow->SetBounds(bounds);
printf("this %d REFRESH w %d h %d\n",widgetWindow,bounds.width, bounds.height);
widgetWindow->OnResize(event); widgetWindow->OnResize(event);
// widgetWindow->SetResized(PR_FALSE); // widgetWindow->SetResized(PR_FALSE);

Просмотреть файл

@ -0,0 +1,163 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
new_manage.c --- defines a subclass of XmManager
Created: Eric Bina <ebina@netscape.com>, 17-Aug-94.
Excerts from the X Toolkit Intrinsics Programming Manual - O'Reilly:
"Writing a general-purpose composite widget is not a trivial task
and should only be done when other options fail."
"A truly general-purpose composite widget is a large, complex piece
of software. You should leave this programming to the widget writers
who write commercial widget sets, and concentrate on things that are
more important in your application."
*/
#include <stdio.h>
#include <stdlib.h>
/*#include "mozilla.h"*/
#include "nsXtManageWidget.h"
#include "nsXtManageWidgetP.h"
static XtGeometryResult
GeometryManager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply);
static void
ChangeManaged(Widget w);
extern void ResizeWidget(Widget w);
NewManageClassRec newManageClassRec =
{
{
/* core_class fields */
/* superclass */ (WidgetClass) &xmManagerClassRec,
/* class_name */ "NewManage",
/* widget_size */ sizeof(NewManageRec),
/* class_initialize */ NULL,
/* class_partinit */ NULL /* ClassPartInitialize */,
/* class_inited */ FALSE,
/* initialize */ NULL /* Initialize */,
/* Init hook */ NULL,
/* realize */ XtInheritRealize /* Realize */,
/* actions */ NULL,
/* num_actions */ 0,
/* resources */ NULL /* resources */,
/* num_resources */ 0 /* XtNumber(resources) */,
/* xrm_class */ NULLQUARK,
/* compress_motion */ TRUE,
/* compress_exposure */ TRUE,
/* compress_enterleave*/ TRUE,
/* visible_interest */ FALSE,
/* destroy */ NULL,
/* resize */ ResizeWidget,
/* expose */ XtInheritExpose /* (XtExposeProc) Redisplay */,
/* set_values */ NULL /* (XtSetValuesFunc )SetValues */,
/* set values hook */ NULL,
/* set values almost */ XtInheritSetValuesAlmost,
/* get values hook */ NULL,
/* accept_focus */ NULL,
/* Version */ XtVersion,
/* PRIVATE cb list */ NULL,
/* tm_table */ XtInheritTranslations,
/* query_geometry */ NULL /* QueryProc */,
/* display_accelerator*/ NULL,
/* extension */ NULL,
},
{
/* composite_class fields */
/* geometry_manager */ GeometryManager /*(XtGeometryHandler )GeometryManager*/,
/* change_managed */ ChangeManaged /*(XtWidgetProc) ChangeManaged*/,
/* insert_child */ XtInheritInsertChild /*(XtArgsProc) InsertChild*/,
/* delete_child */ XtInheritDeleteChild,
/* Extension */ NULL,
},{
/* Constraint class Init */
NULL,
0,
0,
NULL,
NULL,
NULL,
NULL
},
/* Manager Class */
{
XmInheritTranslations/*ScrolledWindowXlations*/, /* translations */
NULL /*get_resources*/, /* get resources */
0 /*XtNumber(get_resources)*/, /* num get_resources */
NULL, /* get_cont_resources */
0, /* num_get_cont_resources */
XmInheritParentProcess, /* parent_process */
NULL, /* extension */
},
{
/* NewManage class - none */
/* mumble */ 0
}
};
WidgetClass newManageClass = (WidgetClass)&newManageClassRec;
static XtGeometryResult
GeometryManager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply)
{
if (request->request_mode & XtCWQueryOnly)
{
return(XtGeometryYes);
}
if (request->request_mode & CWX)
{
XtX(w) = request->x;
}
if (request->request_mode & CWY)
{
XtY(w) = request->y;
}
if (request->request_mode & CWWidth)
{
XtWidth(w) = request->width;
}
if (request->request_mode & CWHeight)
{
XtHeight(w) = request->height;
}
if (request->request_mode & CWBorderWidth)
{
XtBorderWidth(w) = request->border_width;
}
return(XtGeometryYes);
}
static void
ChangeManaged(Widget w)
{
return;
}

Просмотреть файл

@ -0,0 +1,33 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
nsXtManageWidget.h --- defines a subclass of XmManager
Lifted from xfe code 9/10/98. Modified to support resize.
*/
#ifndef _FE_NEWMANAGE_H_
#define _FE_NEWMANAGE_H_
#include <Xm/Xm.h>
extern WidgetClass newManageClass;
typedef struct _NewManageClassRec *NewManageClass;
typedef struct _NewManageRec *NewManage;
#endif /* _FE_NEWMANAGE_H_ */

Просмотреть файл

@ -0,0 +1,62 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
nsXtManageWidgetP.h --- defines a subclass of XmScrolledWindow
*/
#ifndef _nsXtManageWidth_H_
#define _nsXtManageWidth_H_
#include "nsXtManageWidget.h"
#include <Xm/ManagerP.h>
typedef struct
{
int frogs;
} NewManageClassPart;
typedef struct _NewManageClassRec
{
CoreClassPart core_class;
CompositeClassPart composite_class;
ConstraintClassPart constraint_class;
XmManagerClassPart manager_class;
NewManageClassPart newManage_class;
} NewManageClassRec;
extern NewManageClassRec newManageClassRec;
typedef struct
{
void *why;
XtCallbackList input_callback;
} NewManagePart;
typedef struct _NewManageRec
{
CorePart core;
CompositePart composite;
ConstraintPart constraint;
XmManagerPart manager;
NewManagePart newManage;
} NewManageRec;
#endif