Release 0.7
Thu Jan 13 11:45:13 1994 John Richardson <jrichard@cs.uml.edu>
* [window/win.c]
Added functions EnableWindow, IsWindowEnabled, and helper
WIN_SetSensitive.
* [window/event.c]
Added checks for WS_DISABLED windows in EVENT_key, EVENT_MotionNotify,
EVENT_ButtonPress, EVENT_ButtonRelease, EVENT_ConfigureNotify,
EVENT_FocusIn, EVENT_FocusOut, and EVENT_EnterNotify. Key and
button presses beep for a disabled window.
If anyone finds better places for these checks, please tell me.
Jan 17, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [misc/message.c]
Cleanup on buttons answer value returned.
* [control/combo.c]
Now use OBM_COMBO bitmap dropdown button.
Mon Jan 17 21:56:45 1994 Erik Bos (erik@trashcan.hacktic.nl)
* [misc/comm/c]
A few bugfixes.
Tue Jan 18 06:36:48 1994 julliard@di.epfl.ch (Alexandre Julliard)
* [loader/cursor.c]
Added X cursor for IDC_SIZENS and IDC_SIZEWE.
* [include/options.h] [misc/main.c] (New files)
Rewrote main() function to get rid of Xt application context,
and added command-line option parsing.
* [objects/color.c]
Use of a private map now configurable with command-line option.
* [windows/defwnd.c]
Added WM_SYSCOMMAND handling, and better WM_SETCURSOR handling.
* [windows/event.c]
Removed ConfigureNotify event handler (no longer needed).
* [windows/message.c]
Send WM_SETCURSOR message on mouse events.
* [windows/nonclient.c]
Use OEM bitmaps for the drawing of the non-client area.
Added caption bar buttons handling, and moving and resizing of
the window via the window frame (bypassing the window manager).
* [windows/painting.c]
Bug fix in BeginPaint().
* [windows/win.c]
Set the override_redirect flag for windows (to bypass window
manager).
* [windows/winpos.c]
Implemented WindowFromPoint(), ChildWindowFromPoint(),
BringWindowToTop(), Get/SetInternalWindowPos(),
Get/SetWindowPlacement().
Mon Jan 17 20:48:24 1994 Bob Amstadt (bob@pooh)
* [memory/heap.c]
Added support for multiple local heaps.
diff --git a/ChangeLog b/ChangeLog
index 5c2f747..1aa6162 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,73 @@
+Thu Jan 13 11:45:13 1994 John Richardson <jrichard@cs.uml.edu>
+
+ * [window/win.c]
+ Added functions EnableWindow, IsWindowEnabled, and helper
+ WIN_SetSensitive.
+
+ * [window/event.c]
+ Added checks for WS_DISABLED windows in EVENT_key, EVENT_MotionNotify,
+ EVENT_ButtonPress, EVENT_ButtonRelease, EVENT_ConfigureNotify,
+ EVENT_FocusIn, EVENT_FocusOut, and EVENT_EnterNotify. Key and
+ button presses beep for a disabled window.
+ If anyone finds better places for these checks, please tell me.
+
+Jan 17, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+ * [misc/message.c]
+ Cleanup on buttons answer value returned.
+
+ * [control/combo.c]
+ Now use OBM_COMBO bitmap dropdown button.
+
+Mon Jan 17 21:56:45 1994 Erik Bos (erik@trashcan.hacktic.nl)
+
+ * [misc/comm/c]
+ A few bugfixes.
+
+Tue Jan 18 06:36:48 1994 julliard@di.epfl.ch (Alexandre Julliard)
+
+ * [loader/cursor.c]
+ Added X cursor for IDC_SIZENS and IDC_SIZEWE.
+
+ * [include/options.h] [misc/main.c] (New files)
+ Rewrote main() function to get rid of Xt application context,
+ and added command-line option parsing.
+
+ * [objects/color.c]
+ Use of a private map now configurable with command-line option.
+
+ * [windows/defwnd.c]
+ Added WM_SYSCOMMAND handling, and better WM_SETCURSOR handling.
+
+ * [windows/event.c]
+ Removed ConfigureNotify event handler (no longer needed).
+
+ * [windows/message.c]
+ Send WM_SETCURSOR message on mouse events.
+
+ * [windows/nonclient.c]
+ Use OEM bitmaps for the drawing of the non-client area.
+ Added caption bar buttons handling, and moving and resizing of
+ the window via the window frame (bypassing the window manager).
+
+ * [windows/painting.c]
+ Bug fix in BeginPaint().
+
+ * [windows/win.c]
+ Set the override_redirect flag for windows (to bypass window
+ manager).
+
+ * [windows/winpos.c]
+ Implemented WindowFromPoint(), ChildWindowFromPoint(),
+ BringWindowToTop(), Get/SetInternalWindowPos(),
+ Get/SetWindowPlacement().
+
+Mon Jan 17 20:48:24 1994 Bob Amstadt (bob@pooh)
+
+ * [memory/heap.c]
+ Added support for multiple local heaps.
+
+----------------------------------------------------------------------
Tue Jan 4 13:01:33 1994 David Metcalfe <david@prism.demon.co.uk>
* [window/caret.c]
@@ -84,7 +154,6 @@
Added sending of the WM_NCPAINT message in SetWindowPos().
Removed the Xt code.
-----------------------------------------------------------------------
Sun Jan 2 12:38:53 1994 David Metcalfe <david@prism.demon.co.uk>
* [windows/class.c]
diff --git a/Makefile b/Makefile
index 21c7cab..033a5bf 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@
######################################################################
# These definitions are for the top level
TARGET=wine
-LIBS=-L. -L/usr/X386/lib -lXext -lXaw -lXt -lXmu -lX11 -lm
+LIBS=-L/usr/X386/lib -lX11 -lm
OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
SUBDIRS=if1632 controls loader memory misc objects windows debugger
diff --git a/README b/README
index 52863a7..1b23e05 100644
--- a/README
+++ b/README
@@ -41,6 +41,12 @@
Have a nice game of solitaire, but be careful. Emulation isn't perfect.
So, occassionally it will crash.
+WHAT'S NEW with version 0.7: (see ChangeLog for details)
+ - Eliminated Xt-dependent code. Thanks to Alexandre and Martin.
+ - Other bug fixes.
+ - IsWIndowEnabled() and EnableWindow() now implemented.
+ - New command line options.
+
WHAT'S NEW with version 0.6: (see ChangeLog for details)
- Working towards elimination of Xt-dependent code. Thanks to
Alexandre and Martin.
diff --git a/controls/Makefile b/controls/Makefile
index 520a112..fb915e7 100644
--- a/controls/Makefile
+++ b/controls/Makefile
@@ -1,9 +1,7 @@
CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
OBJS = menu.o caption.o widgets.o button.o \
- scroll.o listbox.o combo.o static.o \
- SmeMenuButto.o WinLabel.o WinCommand.o \
- WinMenuButto.o
+ scroll.o listbox.o combo.o static.o
default: controls.o
diff --git a/controls/SmeMenuButtP.h b/controls/SmeMenuButtP.h
deleted file mode 100644
index 176577d..0000000
--- a/controls/SmeMenuButtP.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * $XConsortium: SmeMenuButtP.h,v 1.6 89/12/11 15:20:15 kit Exp $
- *
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Chris D. Peterson, MIT X Consortium
- *
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Added code to translate ampersand to underlined char
- */
-
-/*
- * SmeP.h - Private definitions for Sme object
- *
- */
-
-#ifndef _XawSmeMenuButtP_h
-#define _XawSmeMenuButtP_h
-
-/***********************************************************************
- *
- * Sme Object Private Data
- *
- ***********************************************************************/
-
-#include <X11/Xaw/SmeP.h>
-#include "SmeMenuButto.h"
-
-/************************************************************
- *
- * New fields for the Sme Object class record.
- *
- ************************************************************/
-
-typedef struct _SmeMenuButtonClassPart {
- XtPointer extension;
-} SmeMenuButtonClassPart;
-
-/* Full class record declaration */
-typedef struct _SmeMenuButtonClassRec {
- RectObjClassPart rect_class;
- SmeClassPart sme_class;
- SmeMenuButtonClassPart sme_bsb_class;
-} SmeMenuButtonClassRec;
-
-extern SmeMenuButtonClassRec smeMenuButtonClassRec;
-
-/* New fields for the Sme Object record */
-typedef struct {
- /* resources */
- String label; /* The entry label. */
- int vert_space; /* extra vert space to leave, as a percentage
- of the font height of the label. */
- Pixmap left_bitmap, right_bitmap; /* bitmaps to show. */
- Dimension left_margin, right_margin; /* left and right margins. */
- Pixel foreground; /* foreground color. */
- XFontStruct * font; /* The font to show label in. */
- XtJustify justify; /* Justification for the label. */
- String menu_name; /* Menu to activate */
- Boolean inactive; /* True if can't be selected */
-
-/* private resources. */
-
- Boolean set_values_area_cleared; /* Remember if we need to unhighlight. */
- GC norm_gc; /* noral color gc. */
- GC rev_gc; /* reverse color gc. */
- GC norm_gray_gc; /* Normal color (grayed out) gc. */
- GC invert_gc; /* gc for flipping colors. */
-
- Dimension left_bitmap_width; /* size of each bitmap. */
- Dimension left_bitmap_height;
- Dimension right_bitmap_width;
- Dimension right_bitmap_height;
-
- int ul_pos; /* Offset in chars of underlined character */
- /* in label */
-} SmeMenuButtonPart;
-
-/****************************************************************
- *
- * Full instance record declaration
- *
- ****************************************************************/
-
-typedef struct _SmeMenuButtonRec {
- ObjectPart object;
- RectObjPart rectangle;
- SmePart sme;
- SmeMenuButtonPart sme_bsb;
-} SmeMenuButtonRec;
-
-/************************************************************
- *
- * Private declarations.
- *
- ************************************************************/
-
-#endif /* _XawSmeMenuButtP_h */
diff --git a/controls/SmeMenuButto.c b/controls/SmeMenuButto.c
deleted file mode 100644
index 5d426fc..0000000
--- a/controls/SmeMenuButto.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/* $XConsortium: SmeMenuButton.c,v 1.16 91/03/15 15:59:41 gildea Exp $ */
-
-/*
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * SmeMenuButton.c - Source code file for BSB Menu Entry object.
- *
- * Date: September 26, 1989
- *
- * By: Chris D. Peterson
- * MIT X Consortium
- * kit@expo.lcs.mit.edu
- *
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Added code to translate ampersand to underlined char
- */
-
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Xos.h>
-
-#include <X11/Xmu/Drawing.h>
-
-#include <X11/Xaw/XawInit.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include "SmeMenuButtP.h"
-#include <X11/Xaw/Cardinals.h>
-
-#include <stdio.h>
-
-#define ONE_HUNDRED 100
-
-#define offset(field) XtOffsetOf(SmeMenuButtonRec, sme_bsb.field)
-
-static XtResource resources[] = {
- {XtNlabel, XtCLabel, XtRString, sizeof(String),
- offset(label), XtRString, NULL},
- {XtNvertSpace, XtCVertSpace, XtRInt, sizeof(int),
- offset(vert_space), XtRImmediate, (XtPointer) 25},
- {XtNleftBitmap, XtCLeftBitmap, XtRBitmap, sizeof(Pixmap),
- offset(left_bitmap), XtRImmediate, (XtPointer)None},
- {XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify),
- offset(justify), XtRImmediate, (XtPointer) XtJustifyLeft},
- {XtNrightBitmap, XtCRightBitmap, XtRBitmap, sizeof(Pixmap),
- offset(right_bitmap), XtRImmediate, (XtPointer)None},
- {XtNleftMargin, XtCHorizontalMargins, XtRDimension, sizeof(Dimension),
- offset(left_margin), XtRImmediate, (XtPointer) 15},
- {XtNrightMargin, XtCHorizontalMargins, XtRDimension, sizeof(Dimension),
- offset(right_margin), XtRImmediate, (XtPointer) 5},
- {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
- offset(foreground), XtRString, XtDefaultForeground},
- {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
- offset(font), XtRString, XtDefaultFont},
- {XtNmenuName, XtCMenuName, XtRString, sizeof(String),
- offset(menu_name), XtRString, (XtPointer) NULL},
- {XtNinactive, XtCInactive, XtRBoolean, sizeof(Boolean),
- offset(inactive), XtRImmediate, (XtPointer) FALSE },
-};
-#undef offset
-
-/*
- * Semi Public function definitions.
- */
-
-static void Redisplay(), Destroy(), Initialize(), FlipColors();
-static void ClassInitialize();
-static void PopupMenu(), Unhighlight();
-static Boolean SetValues();
-static XtGeometryResult QueryGeometry();
-
-/*
- * Private Function Definitions.
- */
-
-static void GetDefaultSize(), DrawBitmaps(), GetBitmapInfo();
-static void CreateGCs(), DestroyGCs();
-static void RemoveAmpersand();
-
-#define superclass (&smeClassRec)
-SmeMenuButtonClassRec smeMenuButtonClassRec = {
- {
- /* superclass */ (WidgetClass) superclass,
- /* class_name */ "SmeMenuButton",
- /* size */ sizeof(SmeMenuButtonRec),
- /* class_initializer */ ClassInitialize,
- /* class_part_initialize*/ NULL,
- /* Class init'ed */ FALSE,
- /* initialize */ Initialize,
- /* initialize_hook */ NULL,
- /* realize */ NULL,
- /* actions */ NULL,
- /* num_actions */ ZERO,
- /* resources */ resources,
- /* resource_count */ XtNumber(resources),
- /* xrm_class */ NULLQUARK,
- /* compress_motion */ FALSE,
- /* compress_exposure */ FALSE,
- /* compress_enterleave*/ FALSE,
- /* visible_interest */ FALSE,
- /* destroy */ Destroy,
- /* resize */ NULL,
- /* expose */ Redisplay,
- /* set_values */ SetValues,
- /* set_values_hook */ NULL,
- /* set_values_almost */ XtInheritSetValuesAlmost,
- /* get_values_hook */ NULL,
- /* accept_focus */ NULL,
- /* intrinsics version */ XtVersion,
- /* callback offsets */ NULL,
- /* tm_table */ NULL,
- /* query_geometry */ QueryGeometry,
- /* display_accelerator*/ NULL,
- /* extension */ NULL
- },{
- /* Menu Entry Fields */
-
- /* highlight */ FlipColors,
- /* unhighlight */ Unhighlight,
- /* notify */ XtInheritNotify,
- /* extension */ NULL
- }, {
- /* BSB Menu entry Fields */
-
- /* extension */ NULL
- }
-};
-
-WidgetClass smeMenuButtonObjectClass = (WidgetClass) &smeMenuButtonClassRec;
-
-/************************************************************
- *
- * Semi-Public Functions.
- *
- ************************************************************/
-
-/* Function Name: ClassInitialize
- * Description: Initializes the SmeMenuButtonObject.
- * Arguments: none.
- * Returns: none.
- */
-
-static void
-ClassInitialize()
-{
- XawInitializeWidgetSet();
- XtAddConverter( XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0 );
-}
-
-/* Function Name: Initialize
- * Description: Initializes the simple menu widget
- * Arguments: request - the widget requested by the argument list.
- * new - the new widget with both resource and non
- * resource values.
- * Returns: none.
- */
-
-/* ARGSUSED */
-static void
-Initialize(request, new)
-Widget request, new;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) new;
-
- if (entry->sme_bsb.label == NULL)
- entry->sme_bsb.label = XtName(new);
- else
- entry->sme_bsb.label = XtNewString( entry->sme_bsb.label );
-
- RemoveAmpersand(new);
-
- GetDefaultSize(new, &(entry->rectangle.width), &(entry->rectangle.height));
- CreateGCs(new);
-
- entry->sme_bsb.left_bitmap_width = entry->sme_bsb.left_bitmap_height = 0;
- entry->sme_bsb.right_bitmap_width = entry->sme_bsb.right_bitmap_height = 0;
-
- GetBitmapInfo(new, TRUE); /* Left Bitmap Info */
- GetBitmapInfo(new, FALSE); /* Right Bitmap Info */
-}
-
-/* Function Name: Destroy
- * Description: Called at destroy time, cleans up.
- * Arguments: w - the simple menu widget.
- * Returns: none.
- */
-
-static void
-Destroy(w)
-Widget w;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
- DestroyGCs(w);
- if (entry->sme_bsb.label != XtName(w))
- XtFree(entry->sme_bsb.label);
-}
-
-/* Function Name: Redisplay
- * Description: Redisplays the contents of the widget.
- * Arguments: w - the simple menu widget.
- * event - the X event that caused this redisplay.
- * region - the region the needs to be repainted.
- * Returns: none.
- */
-
-/* ARGSUSED */
-static void
-Redisplay(w, event, region)
-Widget w;
-XEvent * event;
-Region region;
-{
- GC gc;
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
- int font_ascent, font_descent, y_loc;
- int ul_x_loc, ul_y_loc, ul_width;
-
- entry->sme_bsb.set_values_area_cleared = FALSE;
- font_ascent = entry->sme_bsb.font->max_bounds.ascent;
- font_descent = entry->sme_bsb.font->max_bounds.descent;
-
- y_loc = entry->rectangle.y;
-
- if (XtIsSensitive(w) && XtIsSensitive( XtParent(w) ) ) {
- if ( w == XawSimpleMenuGetActiveEntry(XtParent(w)) ) {
- XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
- entry->sme_bsb.norm_gc, 0, y_loc,
- (unsigned int) entry->rectangle.width,
- (unsigned int) entry->rectangle.height);
- gc = entry->sme_bsb.rev_gc;
- }
- else
- gc = entry->sme_bsb.norm_gc;
- }
- else
- gc = entry->sme_bsb.norm_gray_gc;
-
- if (entry->sme_bsb.label != NULL) {
- int x_loc = entry->sme_bsb.left_margin;
- int len = strlen(entry->sme_bsb.label);
- char * label = entry->sme_bsb.label;
-
- switch(entry->sme_bsb.justify) {
- int width, t_width;
-
- case XtJustifyCenter:
- t_width = XTextWidth(entry->sme_bsb.font, label, len);
- width = entry->rectangle.width - (entry->sme_bsb.left_margin +
- entry->sme_bsb.right_margin);
- x_loc += (width - t_width)/2;
- break;
- case XtJustifyRight:
- t_width = XTextWidth(entry->sme_bsb.font, label, len);
- x_loc = entry->rectangle.width - (entry->sme_bsb.right_margin +
- t_width);
- break;
- case XtJustifyLeft:
- default:
- break;
- }
-
- y_loc += ((int)entry->rectangle.height -
- (font_ascent + font_descent)) / 2 + font_ascent;
-
- XDrawString(XtDisplayOfObject(w), XtWindowOfObject(w), gc,
- x_loc, y_loc, label, len);
-
- if (entry->sme_bsb.ul_pos != -1)
- {
- ul_x_loc = x_loc + XTextWidth(entry->sme_bsb.font,
- entry->sme_bsb.label, entry->sme_bsb.ul_pos);
- ul_y_loc = entry->rectangle.y + (entry->rectangle.height +
- font_ascent + font_descent) / 2;
- ul_width = XTextWidth(entry->sme_bsb.font,
- entry->sme_bsb.label + entry->sme_bsb.ul_pos, 1);
-
- XDrawLine(XtDisplayOfObject(w), XtWindowOfObject(w), gc,
- ul_x_loc, ul_y_loc, ul_x_loc + ul_width - 1, ul_y_loc);
- }
- }
-
- DrawBitmaps(w, gc);
-}
-
-
-/* Function Name: SetValues
- * Description: Relayout the menu when one of the resources is changed.
- * Arguments: current - current state of the widget.
- * request - what was requested.
- * new - what the widget will become.
- * Returns: none
- */
-
-/* ARGSUSED */
-static Boolean
-SetValues(current, request, new)
-Widget current, request, new;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) new;
- SmeMenuButtonObject old_entry = (SmeMenuButtonObject) current;
- Boolean ret_val = FALSE;
-
- if (old_entry->sme_bsb.label != entry->sme_bsb.label) {
- if (old_entry->sme_bsb.label != XtName( new ) )
- XtFree( (char *) old_entry->sme_bsb.label );
-
- if (entry->sme_bsb.label != XtName(new) )
- entry->sme_bsb.label = XtNewString( entry->sme_bsb.label );
-
- RemoveAmpersand(new);
- ret_val = True;
- }
-
- if (entry->rectangle.sensitive != old_entry->rectangle.sensitive )
- ret_val = TRUE;
-
- if (entry->sme_bsb.left_bitmap != old_entry->sme_bsb.left_bitmap) {
- GetBitmapInfo(new, TRUE);
- ret_val = TRUE;
- }
-
- if (entry->sme_bsb.right_bitmap != old_entry->sme_bsb.right_bitmap) {
- GetBitmapInfo(new, FALSE);
- ret_val = TRUE;
- }
-
- if ( (old_entry->sme_bsb.font != entry->sme_bsb.font) ||
- (old_entry->sme_bsb.foreground != entry->sme_bsb.foreground) ) {
- DestroyGCs(current);
- CreateGCs(new);
- ret_val = TRUE;
- }
-
- if (ret_val) {
- GetDefaultSize(new,
- &(entry->rectangle.width), &(entry->rectangle.height));
- entry->sme_bsb.set_values_area_cleared = TRUE;
- }
- return(ret_val);
-}
-
-/* Function Name: QueryGeometry.
- * Description: Returns the preferred geometry for this widget.
- * Arguments: w - the menu entry object.
- * itended, return_val - the intended and return geometry info.
- * Returns: A Geometry Result.
- *
- * See the Intrinsics manual for details on what this function is for.
- *
- * I just return the height and width of the label plus the margins.
- */
-
-static XtGeometryResult
-QueryGeometry(w, intended, return_val)
-Widget w;
-XtWidgetGeometry *intended, *return_val;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
- Dimension width, height;
- XtGeometryResult ret_val = XtGeometryYes;
- XtGeometryMask mode = intended->request_mode;
-
- GetDefaultSize(w, &width, &height );
-
- if ( ((mode & CWWidth) && (intended->width != width)) ||
- !(mode & CWWidth) ) {
- return_val->request_mode |= CWWidth;
- return_val->width = width;
- ret_val = XtGeometryAlmost;
- }
-
- if ( ((mode & CWHeight) && (intended->height != height)) ||
- !(mode & CWHeight) ) {
- return_val->request_mode |= CWHeight;
- return_val->height = height;
- ret_val = XtGeometryAlmost;
- }
-
- if (ret_val == XtGeometryAlmost) {
- mode = return_val->request_mode;
-
- if ( ((mode & CWWidth) && (width == entry->rectangle.width)) &&
- ((mode & CWHeight) && (height == entry->rectangle.height)) )
- return(XtGeometryNo);
- }
-
- return(ret_val);
-}
-
-/* Function Name: FlipColors
- * Description: Invert the colors of the current entry.
- * Arguments: w - the bsb menu entry widget.
- * Returns: none.
- */
-
-static void
-FlipColors(w)
-Widget w;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
- if (entry->sme_bsb.set_values_area_cleared || entry->sme_bsb.inactive)
- return;
-
- XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
- entry->sme_bsb.invert_gc, 0, (int) entry->rectangle.y,
- (unsigned int) entry->rectangle.width,
- (unsigned int) entry->rectangle.height);
-}
-
-/************************************************************
- *
- * Private Functions.
- *
- ************************************************************/
-
-/* Function Name: GetDefaultSize
- * Description: Calculates the Default (preferred) size of
- * this menu entry.
- * Arguments: w - the menu entry widget.
- * width, height - default sizes (RETURNED).
- * Returns: none.
- */
-
-static void
-GetDefaultSize(w, width, height)
-Widget w;
-Dimension * width, * height;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
- if (entry->sme_bsb.label == NULL)
- *width = 0;
- else
- *width = XTextWidth(entry->sme_bsb.font, entry->sme_bsb.label,
- strlen(entry->sme_bsb.label));
-
- *width += entry->sme_bsb.left_margin + entry->sme_bsb.right_margin;
-
- *height = (entry->sme_bsb.font->max_bounds.ascent +
- entry->sme_bsb.font->max_bounds.descent);
-
- *height = ((int)*height * ( ONE_HUNDRED +
- entry->sme_bsb.vert_space )) / ONE_HUNDRED;
-}
-
-/* Function Name: DrawBitmaps
- * Description: Draws left and right bitmaps.
- * Arguments: w - the simple menu widget.
- * gc - graphics context to use for drawing.
- * Returns: none
- */
-
-static void
-DrawBitmaps(w, gc)
-Widget w;
-GC gc;
-{
- int x_loc, y_loc;
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
- if ( (entry->sme_bsb.left_bitmap == None) &&
- (entry->sme_bsb.right_bitmap == None) ) return;
-
-/*
- * Draw Left Bitmap.
- */
-
- if (entry->sme_bsb.left_bitmap != None) {
- x_loc = (int)(entry->sme_bsb.left_margin -
- entry->sme_bsb.left_bitmap_width) / 2;
-
- y_loc = entry->rectangle.y + (int)(entry->rectangle.height -
- entry->sme_bsb.left_bitmap_height) / 2;
-
- XCopyPlane(XtDisplayOfObject(w), entry->sme_bsb.left_bitmap,
- XtWindowOfObject(w), gc, 0, 0,
- entry->sme_bsb.left_bitmap_width,
- entry->sme_bsb.left_bitmap_height, x_loc, y_loc, 1);
- }
-
-/*
- * Draw Right Bitmap.
- */
-
-
- if (entry->sme_bsb.right_bitmap != None) {
- x_loc = entry->rectangle.width -
- (int)(entry->sme_bsb.right_margin +
- entry->sme_bsb.right_bitmap_width) / 2;
-
- y_loc = entry->rectangle.y + (int)(entry->rectangle.height -
- entry->sme_bsb.right_bitmap_height) / 2;
-
- XCopyPlane(XtDisplayOfObject(w), entry->sme_bsb.right_bitmap,
- XtWindowOfObject(w), gc, 0, 0,
- entry->sme_bsb.right_bitmap_width,
- entry->sme_bsb.right_bitmap_height, x_loc, y_loc, 1);
- }
-}
-
-/* Function Name: GetBitmapInfo
- * Description: Gets the bitmap information from either of the bitmaps.
- * Arguments: w - the bsb menu entry widget.
- * is_left - TRUE if we are testing left bitmap,
- * FALSE if we are testing the right bitmap.
- * Returns: none
- */
-
-static void
-GetBitmapInfo(w, is_left)
-Widget w;
-Boolean is_left;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
- unsigned int depth, bw;
- Window root;
- int x, y;
- unsigned int width, height;
- char buf[BUFSIZ];
-
- if (is_left) {
- if (entry->sme_bsb.left_bitmap != None) {
- if (!XGetGeometry(XtDisplayOfObject(w),
- entry->sme_bsb.left_bitmap, &root,
- &x, &y, &width, &height, &bw, &depth)) {
- sprintf(buf, "SmeMenuButton Object: %s %s \"%s\".", "Could not",
- "get Left Bitmap geometry information for menu entry ",
- XtName(w));
- XtAppError(XtWidgetToApplicationContext(w), buf);
- }
- if (depth != 1) {
- sprintf(buf, "SmeMenuButton Object: %s \"%s\"%s.",
- "Left Bitmap of entry ",
- XtName(w), " is not one bit deep.");
- XtAppError(XtWidgetToApplicationContext(w), buf);
- }
- entry->sme_bsb.left_bitmap_width = (Dimension) width;
- entry->sme_bsb.left_bitmap_height = (Dimension) height;
- }
- }
- else if (entry->sme_bsb.right_bitmap != None) {
- if (!XGetGeometry(XtDisplayOfObject(w),
- entry->sme_bsb.right_bitmap, &root,
- &x, &y, &width, &height, &bw, &depth)) {
- sprintf(buf, "SmeMenuButton Object: %s %s \"%s\".", "Could not",
- "get Right Bitmap geometry information for menu entry ",
- XtName(w));
- XtAppError(XtWidgetToApplicationContext(w), buf);
- }
- if (depth != 1) {
- sprintf(buf, "SmeMenuButton Object: %s \"%s\"%s.",
- "Right Bitmap of entry ", XtName(w),
- " is not one bit deep.");
- XtAppError(XtWidgetToApplicationContext(w), buf);
- }
- entry->sme_bsb.right_bitmap_width = (Dimension) width;
- entry->sme_bsb.right_bitmap_height = (Dimension) height;
- }
-}
-
-/* Function Name: CreateGCs
- * Description: Creates all gc's for the simple menu widget.
- * Arguments: w - the simple menu widget.
- * Returns: none.
- */
-
-static void
-CreateGCs(w)
-Widget w;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
- XGCValues values;
- XtGCMask mask;
-
- values.foreground = XtParent(w)->core.background_pixel;
- values.background = entry->sme_bsb.foreground;
- values.font = entry->sme_bsb.font->fid;
- values.graphics_exposures = FALSE;
- mask = GCForeground | GCBackground | GCFont | GCGraphicsExposures;
- entry->sme_bsb.rev_gc = XtGetGC(w, mask, &values);
-
- values.foreground = entry->sme_bsb.foreground;
- values.background = XtParent(w)->core.background_pixel;
- entry->sme_bsb.norm_gc = XtGetGC(w, mask, &values);
-
- values.fill_style = FillTiled;
- values.tile = XmuCreateStippledPixmap(XtScreenOfObject(w),
- entry->sme_bsb.foreground,
- XtParent(w)->core.background_pixel,
- XtParent(w)->core.depth);
- values.graphics_exposures = FALSE;
- mask |= GCTile | GCFillStyle;
- entry->sme_bsb.norm_gray_gc = XtGetGC(w, mask, &values);
-
- values.foreground ^= values.background;
- values.background = 0;
- values.function = GXxor;
- mask = GCForeground | GCBackground | GCGraphicsExposures | GCFunction;
- entry->sme_bsb.invert_gc = XtGetGC(w, mask, &values);
-}
-
-/* Function Name: DestroyGCs
- * Description: Removes all gc's for the simple menu widget.
- * Arguments: w - the simple menu widget.
- * Returns: none.
- */
-
-static void
-DestroyGCs(w)
-Widget w;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
- XtReleaseGC(w, entry->sme_bsb.norm_gc);
- XtReleaseGC(w, entry->sme_bsb.norm_gray_gc);
- XtReleaseGC(w, entry->sme_bsb.rev_gc);
- XtReleaseGC(w, entry->sme_bsb.invert_gc);
-}
-
-static void
-PopupMenu(w)
-Widget w;
-{
- SmeMenuButtonObject mbw = (SmeMenuButtonObject) w;
- Widget menu, temp;
- Arg arglist[2];
- Cardinal num_args;
- int menu_x, menu_y, menu_width, menu_height, button_width;
- Position button_x, button_y;
-
- if (mbw->sme_bsb.menu_name == NULL || strlen(mbw->sme_bsb.menu_name) == 0)
- return;
-
- temp = w;
- while(temp != NULL) {
- menu = XtNameToWidget(temp, mbw->sme_bsb.menu_name);
- if (menu == NULL)
- temp = XtParent(temp);
- else
- break;
- }
-
- if (menu == NULL) {
- char error_buf[BUFSIZ];
- sprintf(error_buf, "MenuButton: %s %s.",
- "Could not find menu widget named", mbw->sme_bsb.menu_name);
- XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
- return;
- }
- if (!XtIsRealized(menu))
- XtRealizeWidget(menu);
-
- menu_width = menu->core.width + 2 * menu->core.border_width;
- button_width = mbw->rectangle.width + 2 * mbw->rectangle.border_width;
- menu_height = menu->core.height + 2 * menu->core.border_width;
-
- XtTranslateCoords(w, 0, 0, &button_x, &button_y);
- menu_x = button_x + button_width;
- menu_y = button_y;
-
- if (menu_x >= 0) {
- int scr_width = WidthOfScreen(XtScreen(menu));
- if (menu_x + menu_width > scr_width)
- menu_x = scr_width - menu_width;
- }
- if (menu_x < 0)
- menu_x = 0;
-
- if (menu_y >= 0) {
- int scr_height = HeightOfScreen(XtScreen(menu));
- if (menu_y + menu_height > scr_height)
- menu_y = scr_height - menu_height;
- }
- if (menu_y < 0)
- menu_y = 0;
-
- num_args = 0;
- XtSetArg(arglist[num_args], XtNx, menu_x); num_args++;
- XtSetArg(arglist[num_args], XtNy, menu_y); num_args++;
- XtSetValues(menu, arglist, num_args);
-
- XtPopupSpringLoaded(menu);
-}
-
-static void
-Unhighlight(w)
-Widget w;
-{
- SmeMenuButtonObject mbw = (SmeMenuButtonObject) w;
- Display *display;
- Screen *screen;
- Window win, rootwin;
- int rootwin_x, rootwin_y;
- int win_x, win_y;
- unsigned int mask;
- Position left, right, top, bottom;
-
- if (mbw->sme_bsb.inactive)
- return;
-
- display = XtDisplayOfObject(w);
- screen = XtScreenOfObject(w);
- XQueryPointer(display, RootWindowOfScreen(screen),
- &rootwin, &win, &rootwin_x, &rootwin_y,
- &win_x, &win_y, &mask);
-
- XtTranslateCoords(w, 0, 0, &left, &top);
- XtTranslateCoords(w, mbw->rectangle.width, mbw->rectangle.height,
- &right, &bottom);
-
- if (rootwin_x >= right && rootwin_y >= top && rootwin_y < bottom)
- {
- PopupMenu(w);
- }
-
- FlipColors(w);
-}
-
-static void
-RemoveAmpersand(w)
-Widget w;
-{
- SmeMenuButtonObject entry = (SmeMenuButtonObject) w;
-
- entry->sme_bsb.ul_pos = strcspn(entry->sme_bsb.label, "&");
- if (entry->sme_bsb.ul_pos == strlen(entry->sme_bsb.label))
- {
- entry->sme_bsb.ul_pos = -1;
- return;
- }
-
- /* Remove ampersand from label */
- strcpy(entry->sme_bsb.label + entry->sme_bsb.ul_pos,
- entry->sme_bsb.label + entry->sme_bsb.ul_pos + 1);
-}
-
diff --git a/controls/SmeMenuButto.h b/controls/SmeMenuButto.h
deleted file mode 100644
index 72c9a51..0000000
--- a/controls/SmeMenuButto.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * $XConsortium: SmeMenuButton.h,v 1.5 89/12/11 15:20:14 kit Exp $
- *
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * SmeMenuButton.h - Public Header file for SmeMenuButton object.
- *
- * This is the public header file for the Athena BSB Sme object.
- * It is intended to be used with the simple menu widget. This object
- * provides bitmap - string - bitmap style entries.
- *
- * Date: April 3, 1989
- *
- * By: Chris D. Peterson
- * MIT X Consortium
- * kit@expo.lcs.mit.edu
- *
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Added code to translate ampersand to underlined char
- */
-
-#ifndef _SmeMenuButto_h
-#define _SmeMenuButto_h
-
-#include <X11/Xmu/Converters.h>
-
-#include <X11/Xaw/Sme.h>
-
-/****************************************************************
- *
- * SmeMenuButton object
- *
- ****************************************************************/
-
-/* BSB Menu Entry Resources:
-
- Name Class RepType Default Value
- ---- ----- ------- -------------
- callback Callback Callback NULL
- destroyCallback Callback Pointer NULL
- font Font XFontStruct * XtDefaultFont
- foreground Foreground Pixel XtDefaultForeground
- height Height Dimension 0
- label Label String Name of entry
- leftBitmap LeftBitmap Pixmap None
- leftMargin HorizontalMargins Dimension 4
- rightBitmap RightBitmap Pixmap None
- rightMargin HorizontalMargins Dimension 4
- sensitive Sensitive Boolean True
- vertSpace VertSpace int 25
- width Width Dimension 0
- x Position Position 0n
- y Position Position 0
- menuName MenuName String "menu"
- inactive Inactive Boolean False
-
-*/
-
-typedef struct _SmeMenuButtonClassRec *SmeMenuButtonObjectClass;
-typedef struct _SmeMenuButtonRec *SmeMenuButtonObject;
-
-extern WidgetClass smeMenuButtonObjectClass;
-
-#define XtNleftBitmap "leftBitmap"
-#define XtNleftMargin "leftMargin"
-#define XtNrightBitmap "rightBitmap"
-#define XtNrightMargin "rightMargin"
-#define XtNvertSpace "vertSpace"
-#define XtNmenuName "menuName"
-#define XtNinactive "inactive"
-
-#define XtCLeftBitmap "LeftBitmap"
-#define XtCHorizontalMargins "HorizontalMargins"
-#define XtCRightBitmap "RightBitmap"
-#define XtCVertSpace "VertSpace"
-#define XtCMenuName "MenuName"
-#define XtCInactive "Inactive"
-
-#endif /* _SmeMenuButto_h */
diff --git a/controls/WinCommand.c b/controls/WinCommand.c
deleted file mode 100644
index e05da8e..0000000
--- a/controls/WinCommand.c
+++ /dev/null
@@ -1,567 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinCommand
- */
-
-/*
- * WinCommand.c - WinCommand button widget
- */
-
-#include <stdio.h>
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Xmu/Misc.h>
-#include <X11/Xaw/XawInit.h>
-#include "WinCommandP.h"
-#include <X11/Xmu/Converters.h>
-
-#define DEFAULT_HIGHLIGHT_THICKNESS 2
-#define DEFAULT_SHAPE_HIGHLIGHT 32767
-
-/****************************************************************
- *
- * Full class record constant
- *
- ****************************************************************/
-
-/* Private Data */
-
-static char defaultTranslations[] =
- "<EnterWindow>: highlight() \n\
- <LeaveWindow>: reset() \n\
- <Btn1Down>: set() \n\
- <Btn1Up>: notify() unset() ";
-
-#define offset(field) XtOffsetOf(WinCommandRec, field)
-static XtResource resources[] = {
- {XtNcallback, XtCCallback, XtRCallback, sizeof(XtPointer),
- offset(wincommand.callbacks), XtRCallback, (XtPointer)NULL},
- {XtNhighlightThickness, XtCThickness, XtRDimension, sizeof(Dimension),
- offset(wincommand.highlight_thickness), XtRImmediate,
- (XtPointer) DEFAULT_SHAPE_HIGHLIGHT},
- {XtNshapeStyle, XtCShapeStyle, XtRShapeStyle, sizeof(int),
- offset(wincommand.shape_style), XtRImmediate,
- (XtPointer)XawShapeRectangle},
- {XtNcornerRoundPercent, XtCCornerRoundPercent,
- XtRDimension, sizeof(Dimension),
- offset(wincommand.corner_round), XtRImmediate, (XtPointer) 25},
-};
-#undef offset
-
-static Boolean SetValues();
-static void Initialize(), Redisplay(), Set(), Reset(), Notify(), Unset();
-static void Highlight(), Unhighlight(), Destroy(), PaintWinCommandWidget();
-static void ClassInitialize();
-static Boolean ShapeButton();
-static void Realize(), Resize();
-
-static XtActionsRec actionsList[] = {
- {"set", Set},
- {"notify", Notify},
- {"highlight", Highlight},
- {"reset", Reset},
- {"unset", Unset},
- {"unhighlight", Unhighlight}
-};
-
-#define SuperClass ((WinLabelWidgetClass)&winLabelClassRec)
-
-WinCommandClassRec winCommandClassRec = {
- {
- (WidgetClass) SuperClass, /* superclass */
- "WinCommand", /* class_name */
- sizeof(WinCommandRec), /* size */
- ClassInitialize, /* class_initialize */
- NULL, /* class_part_initialize */
- FALSE, /* class_inited */
- Initialize, /* initialize */
- NULL, /* initialize_hook */
- Realize, /* realize */
- actionsList, /* actions */
- XtNumber(actionsList), /* num_actions */
- resources, /* resources */
- XtNumber(resources), /* resource_count */
- NULLQUARK, /* xrm_class */
- FALSE, /* compress_motion */
- TRUE, /* compress_exposure */
- TRUE, /* compress_enterleave */
- FALSE, /* visible_interest */
- Destroy, /* destroy */
- Resize, /* resize */
- Redisplay, /* expose */
- SetValues, /* set_values */
- NULL, /* set_values_hook */
- XtInheritSetValuesAlmost, /* set_values_almost */
- NULL, /* get_values_hook */
- NULL, /* accept_focus */
- XtVersion, /* version */
- NULL, /* callback_private */
- defaultTranslations, /* tm_table */
- XtInheritQueryGeometry, /* query_geometry */
- XtInheritDisplayAccelerator, /* display_accelerator */
- NULL /* extension */
- }, /* CoreClass fields initialization */
- {
- XtInheritChangeSensitive /* change_sensitive */
- }, /* SimpleClass fields initialization */
- {
- 0, /* field not used */
- }, /* WinLabelClass fields initialization */
- {
- 0, /* field not used */
- }, /* WinCommandClass fields initialization */
-};
-
- /* for public consumption */
-WidgetClass winCommandWidgetClass = (WidgetClass) &winCommandClassRec;
-
-/****************************************************************
- *
- * Private Procedures
- *
- ****************************************************************/
-
-static GC
-Get_GC(cbw, fg, bg)
-WinCommandWidget cbw;
-Pixel fg, bg;
-{
- XGCValues values;
-
- values.foreground = fg;
- values.background = bg;
- values.font = cbw->winlabel.font->fid;
- values.cap_style = CapProjecting;
-
- if (cbw->wincommand.highlight_thickness > 1 )
- values.line_width = cbw->wincommand.highlight_thickness;
- else
- values.line_width = 0;
-
- return XtGetGC((Widget)cbw,
- (GCForeground|GCBackground|GCFont|GCLineWidth|GCCapStyle),
- &values);
-}
-
-
-/* ARGSUSED */
-static void
-Initialize(request, new, args, num_args)
-Widget request, new;
-ArgList args; /* unused */
-Cardinal *num_args; /* unused */
-{
- WinCommandWidget cbw = (WinCommandWidget) new;
- int shape_event_base, shape_error_base;
-
- if (cbw->wincommand.shape_style != XawShapeRectangle
- && !XShapeQueryExtension(XtDisplay(new), &shape_event_base,
- &shape_error_base))
- cbw->wincommand.shape_style = XawShapeRectangle;
- if (cbw->wincommand.highlight_thickness == DEFAULT_SHAPE_HIGHLIGHT) {
- if (cbw->wincommand.shape_style != XawShapeRectangle)
- cbw->wincommand.highlight_thickness = 0;
- else
- cbw->wincommand.highlight_thickness = DEFAULT_HIGHLIGHT_THICKNESS;
- }
-
- cbw->wincommand.normal_GC = Get_GC(cbw, cbw->winlabel.foreground,
- cbw->core.background_pixel);
- cbw->wincommand.inverse_GC = Get_GC(cbw, cbw->core.background_pixel,
- cbw->winlabel.foreground);
- XtReleaseGC(new, cbw->winlabel.normal_GC);
- cbw->winlabel.normal_GC = cbw->wincommand.normal_GC;
-
- cbw->wincommand.set = FALSE;
- cbw->wincommand.highlighted = HighlightNone;
-}
-
-static Region
-HighlightRegion(cbw)
-WinCommandWidget cbw;
-{
- static Region outerRegion = NULL, innerRegion, emptyRegion;
- XRectangle rect;
-
- if (cbw->wincommand.highlight_thickness == 0 ||
- cbw->wincommand.highlight_thickness >
- (Dimension) ((Dimension) Min(cbw->core.width, cbw->core.height)/2))
- return(NULL);
-
- if (outerRegion == NULL) {
- /* save time by allocating scratch regions only once. */
- outerRegion = XCreateRegion();
- innerRegion = XCreateRegion();
- emptyRegion = XCreateRegion();
- }
-
- rect.x = rect.y = 0;
- rect.width = cbw->core.width;
- rect.height = cbw->core.height;
- XUnionRectWithRegion( &rect, emptyRegion, outerRegion );
- rect.x = rect.y = cbw->wincommand.highlight_thickness;
- rect.width -= cbw->wincommand.highlight_thickness * 2;
- rect.height -= cbw->wincommand.highlight_thickness * 2;
- XUnionRectWithRegion( &rect, emptyRegion, innerRegion );
- XSubtractRegion( outerRegion, innerRegion, outerRegion );
- return outerRegion;
-}
-
-/***************************
-*
-* Action Procedures
-*
-***************************/
-
-/* ARGSUSED */
-static void
-Set(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params; /* unused */
-Cardinal *num_params; /* unused */
-{
- WinCommandWidget cbw = (WinCommandWidget)w;
-
- if (cbw->wincommand.set)
- return;
-
- cbw->wincommand.set= TRUE;
- if (XtIsRealized(w))
- PaintWinCommandWidget(w, (Region) NULL, TRUE);
-}
-
-/* ARGSUSED */
-static void
-Unset(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params; /* unused */
-Cardinal *num_params;
-{
- WinCommandWidget cbw = (WinCommandWidget)w;
-
- if (!cbw->wincommand.set)
- return;
-
- cbw->wincommand.set = FALSE;
- if (XtIsRealized(w)) {
- XClearWindow(XtDisplay(w), XtWindow(w));
- PaintWinCommandWidget(w, (Region) NULL, TRUE);
- }
-}
-
-/* ARGSUSED */
-static void
-Reset(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params; /* unused */
-Cardinal *num_params; /* unused */
-{
- WinCommandWidget cbw = (WinCommandWidget)w;
-
- if (cbw->wincommand.set) {
- cbw->wincommand.highlighted = HighlightNone;
- Unset(w, event, params, num_params);
- }
- else
- Unhighlight(w, event, params, num_params);
-}
-
-/* ARGSUSED */
-static void
-Highlight(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params;
-Cardinal *num_params;
-{
- WinCommandWidget cbw = (WinCommandWidget)w;
-
- if ( *num_params == (Cardinal) 0)
- cbw->wincommand.highlighted = HighlightWhenUnset;
- else {
- if ( *num_params != (Cardinal) 1)
- XtWarning("Too many parameters passed to highlight action table.");
- switch (params[0][0]) {
- case 'A':
- case 'a':
- cbw->wincommand.highlighted = HighlightAlways;
- break;
- default:
- cbw->wincommand.highlighted = HighlightWhenUnset;
- break;
- }
- }
-
- if (XtIsRealized(w))
- PaintWinCommandWidget(w, HighlightRegion(cbw), TRUE);
-}
-
-/* ARGSUSED */
-static void
-Unhighlight(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params; /* unused */
-Cardinal *num_params; /* unused */
-{
- WinCommandWidget cbw = (WinCommandWidget)w;
-
- cbw->wincommand.highlighted = HighlightNone;
- if (XtIsRealized(w))
- PaintWinCommandWidget(w, HighlightRegion(cbw), TRUE);
-}
-
-/* ARGSUSED */
-static void
-Notify(w,event,params,num_params)
-Widget w;
-XEvent *event;
-String *params; /* unused */
-Cardinal *num_params; /* unused */
-{
- WinCommandWidget cbw = (WinCommandWidget)w;
-
- /* check to be sure state is still Set so that user can cancel
- the action (e.g. by moving outside the window, in the default
- bindings.
- */
- if (cbw->wincommand.set)
- XtCallCallbackList(w, cbw->wincommand.callbacks, NULL);
-}
-
-/*
- * Repaint the widget window
- */
-
-/************************
-*
-* REDISPLAY (DRAW)
-*
-************************/
-
-/* ARGSUSED */
-static void
-Redisplay(w, event, region)
-Widget w;
-XEvent *event;
-Region region;
-{
- PaintWinCommandWidget(w, region, FALSE);
-}
-
-/* Function Name: PaintWinCommandWidget
- * Description: Paints the wincommand widget.
- * Arguments: w - the wincommand widget.
- * region - region to paint (passed to the superclass).
- * change - did it change either set or highlight state?
- * Returns: none
- */
-
-static void
-PaintWinCommandWidget(w, region, change)
-Widget w;
-Region region;
-Boolean change;
-{
- WinCommandWidget cbw = (WinCommandWidget) w;
- Boolean very_thick;
- GC norm_gc, rev_gc;
-
- very_thick = cbw->wincommand.highlight_thickness >
- (Dimension)((Dimension) Min(cbw->core.width,
- cbw->core.height)/2);
-
- if (cbw->wincommand.set) {
- cbw->winlabel.normal_GC = cbw->wincommand.inverse_GC;
- XFillRectangle(XtDisplay(w), XtWindow(w), cbw->wincommand.normal_GC,
- 0, 0, cbw->core.width, cbw->core.height);
- region = NULL; /* Force label to repaint text. */
- }
- else
- cbw->winlabel.normal_GC = cbw->wincommand.normal_GC;
-
- if (cbw->wincommand.highlight_thickness <= 0)
- {
- (*SuperClass->core_class.expose) (w, (XEvent *) NULL, region);
- return;
- }
-
-/*
- * If we are set then use the same colors as if we are not highlighted.
- */
-
- if (cbw->wincommand.set == (cbw->wincommand.highlighted == HighlightNone)) {
- norm_gc = cbw->wincommand.inverse_GC;
- rev_gc = cbw->wincommand.normal_GC;
- }
- else {
- norm_gc = cbw->wincommand.normal_GC;
- rev_gc = cbw->wincommand.inverse_GC;
- }
-
- if ( !( (!change && (cbw->wincommand.highlighted == HighlightNone)) ||
- ((cbw->wincommand.highlighted == HighlightWhenUnset) &&
- (cbw->wincommand.set))) ) {
- if (very_thick) {
- cbw->winlabel.normal_GC = norm_gc; /* Give the label the right GC. */
- XFillRectangle(XtDisplay(w),XtWindow(w), rev_gc,
- 0, 0, cbw->core.width, cbw->core.height);
- }
- else {
- /* wide lines are centered on the path, so indent it */
- int offset = cbw->wincommand.highlight_thickness/2;
- XDrawRectangle(XtDisplay(w),XtWindow(w), rev_gc, offset, offset,
- cbw->core.width - cbw->wincommand.highlight_thickness,
- cbw->core.height - cbw->wincommand.highlight_thickness);
- }
- }
- (*SuperClass->core_class.expose) (w, (XEvent *) NULL, region);
-}
-
-static void
-Destroy(w)
-Widget w;
-{
- WinCommandWidget cbw = (WinCommandWidget) w;
-
- /* so WinLabel can release it */
- if (cbw->winlabel.normal_GC == cbw->wincommand.normal_GC)
- XtReleaseGC( w, cbw->wincommand.inverse_GC );
- else
- XtReleaseGC( w, cbw->wincommand.normal_GC );
-}
-
-/*
- * Set specified arguments into widget
- */
-
-/* ARGSUSED */
-static Boolean
-SetValues (current, request, new)
-Widget current, request, new;
-{
- WinCommandWidget oldcbw = (WinCommandWidget) current;
- WinCommandWidget cbw = (WinCommandWidget) new;
- Boolean redisplay = False;
-
- if ( oldcbw->core.sensitive != cbw->core.sensitive && !cbw->core.sensitive) {
- /* about to become insensitive */
- cbw->wincommand.set = FALSE;
- cbw->wincommand.highlighted = HighlightNone;
- redisplay = TRUE;
- }
-
- if ( (oldcbw->winlabel.foreground != cbw->winlabel.foreground) ||
- (oldcbw->core.background_pixel != cbw->core.background_pixel) ||
- (oldcbw->wincommand.highlight_thickness !=
- cbw->wincommand.highlight_thickness) ||
- (oldcbw->winlabel.font != cbw->winlabel.font) )
- {
- if (oldcbw->winlabel.normal_GC == oldcbw->wincommand.normal_GC)
- /* WinLabel has release one of these */
- XtReleaseGC(new, cbw->wincommand.inverse_GC);
- else
- XtReleaseGC(new, cbw->wincommand.normal_GC);
-
- cbw->wincommand.normal_GC = Get_GC(cbw, cbw->winlabel.foreground,
- cbw->core.background_pixel);
- cbw->wincommand.inverse_GC = Get_GC(cbw, cbw->core.background_pixel,
- cbw->winlabel.foreground);
- XtReleaseGC(new, cbw->winlabel.normal_GC);
- cbw->winlabel.normal_GC = (cbw->wincommand.set
- ? cbw->wincommand.inverse_GC
- : cbw->wincommand.normal_GC);
-
- redisplay = True;
- }
-
- if ( XtIsRealized(new)
- && oldcbw->wincommand.shape_style != cbw->wincommand.shape_style
- && !ShapeButton(cbw, TRUE))
- {
- cbw->wincommand.shape_style = oldcbw->wincommand.shape_style;
- }
-
- return (redisplay);
-}
-
-static void ClassInitialize()
-{
- XawInitializeWidgetSet();
- XtSetTypeConverter( XtRString, XtRShapeStyle, XmuCvtStringToShapeStyle,
- NULL, 0, XtCacheNone, NULL );
-}
-
-
-static Boolean
-ShapeButton(cbw, checkRectangular)
-WinCommandWidget cbw;
-Boolean checkRectangular;
-{
- Dimension corner_size;
-
- if ( (cbw->wincommand.shape_style == XawShapeRoundedRectangle) ) {
- corner_size = (cbw->core.width < cbw->core.height) ? cbw->core.width
- : cbw->core.height;
- corner_size = (int) (corner_size * cbw->wincommand.corner_round) / 100;
- }
-
- if (checkRectangular || cbw->wincommand.shape_style != XawShapeRectangle) {
- if (!XmuReshapeWidget((Widget) cbw, cbw->wincommand.shape_style,
- corner_size, corner_size)) {
- cbw->wincommand.shape_style = XawShapeRectangle;
- return(False);
- }
- }
- return(TRUE);
-}
-
-static void Realize(w, valueMask, attributes)
- Widget w;
- Mask *valueMask;
- XSetWindowAttributes *attributes;
-{
- (*winCommandWidgetClass->core_class.superclass->core_class.realize)
- (w, valueMask, attributes);
-
- ShapeButton( (WinCommandWidget) w, FALSE);
-}
-
-static void Resize(w)
- Widget w;
-{
- if (XtIsRealized(w))
- ShapeButton( (WinCommandWidget) w, FALSE);
-
- (*winCommandWidgetClass->core_class.superclass->core_class.resize)(w);
-}
-
diff --git a/controls/WinCommand.h b/controls/WinCommand.h
deleted file mode 100644
index 0b69e06..0000000
--- a/controls/WinCommand.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinCommand
- */
-
-#ifndef _WinCommand_h
-#define _WinCommand_h
-
-#include "WinLabel.h"
-
-/* Command widget resources:
-
- Name Class RepType Default Value
- ---- ----- ------- -------------
- accelerators Accelerators AcceleratorTable NULL
- ancestorSensitive AncestorSensitive Boolean True
- background Background Pixel XtDefaultBackground
- backgroundPixmap Pixmap Pixmap XtUnspecifiedPixmap
- bitmap Pixmap Pixmap None
- borderColor BorderColor Pixel XtDefaultForeground
- borderPixmap Pixmap Pixmap XtUnspecifiedPixmap
- borderWidth BorderWidth Dimension 1
- callback Callback XtCallbackList NULL
- colormap Colormap Colormap parent's colormap
- cornerRoundPercent CornerRoundPercent Dimension 25
- cursor Cursor Cursor None
- cursorName Cursor String NULL
- depth Depth int parent's depth
- destroyCallback Callback XtCallbackList NULL
- encoding Encoding UnsignedChar XawTextEncoding8bit
- font Font XFontStruct* XtDefaultFont
- foreground Foreground Pixel XtDefaultForeground
- height Height Dimension text height
- highlightThickness Thickness Dimension 0 if shaped, else 2
- insensitiveBorder Insensitive Pixmap Gray
- internalHeight Height Dimension 2
- internalWidth Width Dimension 4
- justify Justify XtJustify XtJustifyCenter
- label Label String NULL
- leftBitmap LeftBitmap Pixmap None
- mappedWhenManaged MappedWhenManaged Boolean True
- pointerColor Foreground Pixel XtDefaultForeground
- pointerColorBackground Background Pixel XtDefaultBackground
- resize Resize Boolean True
- screen Screen Screen parent's Screen
- sensitive Sensitive Boolean True
- shapeStyle ShapeStyle ShapeStyle Rectangle
- translations Translations TranslationTable see doc or source
- width Width Dimension text width
- x Position Position 0
- y Position Position 0
-
-*/
-
-#define XtNhighlightThickness "highlightThickness"
-
-#define XtNshapeStyle "shapeStyle"
-#define XtCShapeStyle "ShapeStyle"
-#define XtRShapeStyle "ShapeStyle"
-#define XtNcornerRoundPercent "cornerRoundPercent"
-#define XtCCornerRoundPercent "CornerRoundPercent"
-
-#define XawShapeRectangle XmuShapeRectangle
-#define XawShapeOval XmuShapeOval
-#define XawShapeEllipse XmuShapeEllipse
-#define XawShapeRoundedRectangle XmuShapeRoundedRectangle
-
-extern WidgetClass winCommandWidgetClass;
-
-typedef struct _WinCommandClassRec *WinCommandWidgetClass;
-typedef struct _WinCommandRec *WinCommandWidget;
-
-#endif /* _WinCommand_h */
-/* DON'T ADD STUFF AFTER THIS */
diff --git a/controls/WinCommandP.h b/controls/WinCommandP.h
deleted file mode 100644
index 5f79931..0000000
--- a/controls/WinCommandP.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Convrted to WinCommand
- */
-
-/*
- * WinCommandP.h - Private definitions for WinCommand widget
- *
- */
-
-#ifndef _WinCommandP_h
-#define _WinCommandP_h
-
-#include "WinCommand.h"
-#include "WinLabelP.h"
-
-/***********************************************************************
- *
- * WinCommand Widget Private Data
- *
- ***********************************************************************/
-
-typedef enum {
- HighlightNone, /* Do not highlight. */
- HighlightWhenUnset, /* Highlight only when unset, this is
- to preserve current command widget
- functionality. */
- HighlightAlways /* Always highlight, lets the toggle widget
- and other subclasses do the right thing. */
-} XtCommandHighlight;
-
-/************************************
- *
- * Class structure
- *
- ***********************************/
-
-
- /* New fields for the WinCommand widget class record */
-typedef struct _WinCommandClass
- {
- int makes_compiler_happy; /* not used */
- } WinCommandClassPart;
-
- /* Full class record declaration */
-typedef struct _WinCommandClassRec {
- CoreClassPart core_class;
- SimpleClassPart simple_class;
- WinLabelClassPart winlabel_class;
- WinCommandClassPart wincommand_class;
-} WinCommandClassRec;
-
-extern WinCommandClassRec winCommandClassRec;
-
-/***************************************
- *
- * Instance (widget) structure
- *
- **************************************/
-
- /* New fields for the WinCommand widget record */
-typedef struct {
- /* resources */
- Dimension highlight_thickness;
- XtCallbackList callbacks;
-
- /* private state */
- Pixmap gray_pixmap;
- GC normal_GC;
- GC inverse_GC;
- Boolean set;
- XtCommandHighlight highlighted;
- /* more resources */
- int shape_style;
- Dimension corner_round;
-} WinCommandPart;
-
-
-/* XtEventsPtr eventTable;*/
-
-
- /* Full widget declaration */
-typedef struct _WinCommandRec {
- CorePart core;
- SimplePart simple;
- WinLabelPart winlabel;
- WinCommandPart wincommand;
-} WinCommandRec;
-
-#endif /* _WinCommandP_h */
-
-
diff --git a/controls/WinLabel.c b/controls/WinLabel.c
deleted file mode 100644
index f079ed7..0000000
--- a/controls/WinLabel.c
+++ /dev/null
@@ -1,691 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Added code to translate ampersand to underlined char
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinLabel
- */
-
-/*
- * WinLabel.c - WinLabel widget
- *
- */
-
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-#include <X11/Xos.h>
-#include <X11/Xaw/XawInit.h>
-#include "WinLabelP.h"
-#include <X11/Xmu/Converters.h>
-#include <X11/Xmu/Drawing.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#define streq(a,b) (strcmp( (a), (b) ) == 0)
-
-#define MULTI_LINE_LABEL 32767
-
-#ifdef CRAY
-#define WORD64
-#endif
-
-/****************************************************************
- *
- * Full class record constant
- *
- ****************************************************************/
-
-/* Private Data */
-
-#define offset(field) XtOffsetOf(WinLabelRec, field)
-static XtResource resources[] = {
- {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
- offset(winlabel.foreground), XtRString, XtDefaultForeground},
- {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
- offset(winlabel.font),XtRString, XtDefaultFont},
- {XtNlabel, XtCLabel, XtRString, sizeof(String),
- offset(winlabel.label), XtRString, NULL},
- {XtNencoding, XtCEncoding, XtRUnsignedChar, sizeof(unsigned char),
- offset(winlabel.encoding), XtRImmediate,
- (XtPointer)XawTextEncoding8bit},
- {XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify),
- offset(winlabel.justify), XtRImmediate, (XtPointer)XtJustifyCenter},
- {XtNinternalWidth, XtCWidth, XtRDimension, sizeof(Dimension),
- offset(winlabel.internal_width), XtRImmediate, (XtPointer)4},
- {XtNinternalHeight, XtCHeight, XtRDimension, sizeof(Dimension),
- offset(winlabel.internal_height), XtRImmediate, (XtPointer)4},
- {XtNleftBitmap, XtCLeftBitmap, XtRBitmap, sizeof(Pixmap),
- offset(winlabel.left_bitmap), XtRImmediate, (XtPointer) None},
- {XtNbitmap, XtCPixmap, XtRBitmap, sizeof(Pixmap),
- offset(winlabel.pixmap), XtRImmediate, (XtPointer)None},
- {XtNresize, XtCResize, XtRBoolean, sizeof(Boolean),
- offset(winlabel.resize), XtRImmediate, (XtPointer)True},
-};
-#undef offset
-
-static void Initialize();
-static void Resize();
-static void Redisplay();
-static Boolean SetValues();
-static void ClassInitialize();
-static void Destroy();
-static XtGeometryResult QueryGeometry();
-
-WinLabelClassRec winLabelClassRec = {
- {
-/* core_class fields */
-#define superclass (&simpleClassRec)
- /* superclass */ (WidgetClass) superclass,
- /* class_name */ "WinLabel",
- /* widget_size */ sizeof(WinLabelRec),
- /* class_initialize */ ClassInitialize,
- /* class_part_initialize */ NULL,
- /* class_inited */ FALSE,
- /* initialize */ Initialize,
- /* initialize_hook */ NULL,
- /* realize */ XtInheritRealize,
- /* actions */ NULL,
- /* num_actions */ 0,
- /* resources */ resources,
- /* num_resources */ XtNumber(resources),
- /* xrm_class */ NULLQUARK,
- /* compress_motion */ TRUE,
- /* compress_exposure */ TRUE,
- /* compress_enterleave */ TRUE,
- /* visible_interest */ FALSE,
- /* destroy */ Destroy,
- /* resize */ Resize,
- /* expose */ Redisplay,
- /* set_values */ SetValues,
- /* set_values_hook */ NULL,
- /* set_values_almost */ XtInheritSetValuesAlmost,
- /* get_values_hook */ NULL,
- /* accept_focus */ NULL,
- /* version */ XtVersion,
- /* callback_private */ NULL,
- /* tm_table */ NULL,
- /* query_geometry */ QueryGeometry,
- /* display_accelerator */ XtInheritDisplayAccelerator,
- /* extension */ NULL
- },
-/* Simple class fields initialization */
- {
- /* change_sensitive */ XtInheritChangeSensitive
- }
-};
-WidgetClass winLabelWidgetClass = (WidgetClass)&winLabelClassRec;
-/****************************************************************
- *
- * Private Procedures
- *
- ****************************************************************/
-
-static void ClassInitialize()
-{
- XawInitializeWidgetSet();
- XtAddConverter( XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0 );
-}
-
-#ifndef WORD64
-
-#define TXT16 XChar2b
-
-#else
-
-#define TXT16 char
-
-static XChar2b *buf2b;
-static int buf2blen = 0;
-
-_WinLabelWidth16(fs, str, n)
- XFontStruct *fs;
- char *str;
- int n;
-{
- int i;
- XChar2b *ptr;
-
- if (n > buf2blen) {
- buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
- buf2blen = n;
- }
- for (ptr = buf2b, i = n; --i >= 0; ptr++) {
- ptr->byte1 = *str++;
- ptr->byte2 = *str++;
- }
- return XTextWidth16(fs, buf2b, n);
-}
-
-_WinLabelDraw16(dpy, d, gc, x, y, str, n)
- Display *dpy;
- Drawable d;
- GC gc;
- int x, y;
- char *str;
- int n;
-{
- int i;
- XChar2b *ptr;
-
- if (n > buf2blen) {
- buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
- buf2blen = n;
- }
- for (ptr = buf2b, i = n; --i >= 0; ptr++) {
- ptr->byte1 = *str++;
- ptr->byte2 = *str++;
- }
- XDrawString16(dpy, d, gc, x, y, buf2b, n);
-}
-
-#define XTextWidth16 _WinLabelWidth16
-#define XDrawString16 _WinLabelDraw16
-
-#endif /* WORD64 */
-
-/*
- * Calculate width and height of displayed text in pixels
- */
-
-static void SetTextWidthAndHeight(lw)
- WinLabelWidget lw;
-{
- register XFontStruct *fs = lw->winlabel.font;
- char *nl;
-
- if (lw->winlabel.pixmap != None) {
- Window root;
- int x, y;
- unsigned int width, height, bw, depth;
- if (XGetGeometry(XtDisplay(lw), lw->winlabel.pixmap, &root, &x, &y,
- &width, &height, &bw, &depth)) {
- lw->winlabel.label_height = height;
- lw->winlabel.label_width = width;
- lw->winlabel.label_len = depth;
- return;
- }
- }
-
- lw->winlabel.label_height = fs->max_bounds.ascent + fs->max_bounds.descent;
- if (lw->winlabel.label == NULL) {
- lw->winlabel.label_len = 0;
- lw->winlabel.label_width = 0;
- }
- else if ((nl = index(lw->winlabel.label, '\n')) != NULL) {
- char *label;
- lw->winlabel.label_len = MULTI_LINE_LABEL;
- lw->winlabel.label_width = 0;
- for (label = lw->winlabel.label; nl != NULL; nl = index(label, '\n')) {
- int width;
-
- if (lw->winlabel.encoding)
- width = XTextWidth16(fs, (TXT16*)label, (int)(nl - label)/2);
- else
- width = XTextWidth(fs, label, (int)(nl - label));
- if (width > (int)lw->winlabel.label_width)
- lw->winlabel.label_width = width;
- label = nl + 1;
- if (*label)
- lw->winlabel.label_height +=
- fs->max_bounds.ascent + fs->max_bounds.descent;
- }
- if (*label) {
- int width = XTextWidth(fs, label, strlen(label));
-
- if (lw->winlabel.encoding)
- width = XTextWidth16(fs, (TXT16*)label, (int)strlen(label)/2);
- else
- width = XTextWidth(fs, label, strlen(label));
- if (width > (int) lw->winlabel.label_width)
- lw->winlabel.label_width = width;
- }
- } else {
- lw->winlabel.label_len = strlen(lw->winlabel.label);
- if (lw->winlabel.encoding)
- lw->winlabel.label_width =
- XTextWidth16(fs, (TXT16*)lw->winlabel.label,
- (int) lw->winlabel.label_len/2);
- else
- lw->winlabel.label_width =
- XTextWidth(fs, lw->winlabel.label,
- (int) lw->winlabel.label_len);
- }
-}
-
-static void GetnormalGC(lw)
- WinLabelWidget lw;
-{
- XGCValues values;
-
- values.foreground = lw->winlabel.foreground;
- values.background = lw->core.background_pixel;
- values.font = lw->winlabel.font->fid;
- values.graphics_exposures = False;
-
- lw->winlabel.normal_GC = XtGetGC(
- (Widget)lw,
- (unsigned) GCForeground | GCBackground | GCFont | GCGraphicsExposures,
- &values);
-}
-
-static void GetgrayGC(lw)
- WinLabelWidget lw;
-{
- XGCValues values;
-
- values.foreground = lw->winlabel.foreground;
- values.background = lw->core.background_pixel;
- values.font = lw->winlabel.font->fid;
- values.fill_style = FillTiled;
- values.tile = XmuCreateStippledPixmap(XtScreen((Widget)lw),
- lw->winlabel.foreground,
- lw->core.background_pixel,
- lw->core.depth);
- values.graphics_exposures = False;
-
- lw->winlabel.stipple = values.tile;
- lw->winlabel.gray_GC = XtGetGC((Widget)lw,
- (unsigned) GCForeground | GCBackground |
- GCFont | GCTile | GCFillStyle |
- GCGraphicsExposures,
- &values);
-}
-
-static void compute_bitmap_offsets (lw)
- WinLabelWidget lw;
-{
- /*
- * label will be displayed at (internal_width, internal_height + lbm_y)
- */
- if (lw->winlabel.lbm_height != 0) {
- lw->winlabel.lbm_y = (((int) lw->core.height) -
- ((int) lw->winlabel.internal_height * 2) -
- ((int) lw->winlabel.lbm_height)) / 2;
- } else {
- lw->winlabel.lbm_y = 0;
- }
-}
-
-
-static void set_bitmap_info (lw)
- WinLabelWidget lw;
-{
- Window root;
- int x, y;
- unsigned int bw, depth;
-
- if (!(lw->winlabel.left_bitmap &&
- XGetGeometry (XtDisplay(lw), lw->winlabel.left_bitmap, &root, &x, &y,
- &lw->winlabel.lbm_width, &lw->winlabel.lbm_height,
- &bw, &depth))) {
- lw->winlabel.lbm_width = lw->winlabel.lbm_height = 0;
- }
- compute_bitmap_offsets (lw);
-}
-
-static void
-RemoveAmpersand(w)
-Widget w;
-{
- WinLabelWidget lw = (WinLabelWidget) w;
-
- lw->winlabel.ul_pos = strcspn(lw->winlabel.label, "&");
- if (lw->winlabel.ul_pos == strlen(lw->winlabel.label))
- {
- lw->winlabel.ul_pos = -1;
- return;
- }
-
- /* Remove ampersand from label */
- strcpy(lw->winlabel.label + lw->winlabel.ul_pos,
- lw->winlabel.label + lw->winlabel.ul_pos + 1);
-}
-
-
-
-/* ARGSUSED */
-static void Initialize(request, new)
- Widget request, new;
-{
- WinLabelWidget lw = (WinLabelWidget) new;
-
- if (lw->winlabel.label == NULL)
- lw->winlabel.label = XtNewString(lw->core.name);
- else {
- lw->winlabel.label = XtNewString(lw->winlabel.label);
- }
-
- RemoveAmpersand(new);
-
- GetnormalGC(lw);
- GetgrayGC(lw);
-
- SetTextWidthAndHeight(lw);
-
- if (lw->core.height == 0)
- lw->core.height = lw->winlabel.label_height +
- 2*lw->winlabel.internal_height;
-
- set_bitmap_info (lw); /* need core.height */
-
- if (lw->core.width == 0) /* need winlabel.lbm_width */
- lw->core.width = (lw->winlabel.label_width +
- 2 * lw->winlabel.internal_width
- + LEFT_OFFSET(lw));
-
- lw->winlabel.label_x = lw->winlabel.label_y = 0;
- (*XtClass(new)->core_class.resize) ((Widget)lw);
-
-} /* Initialize */
-
-/*
- * Repaint the widget window
- */
-
-/* ARGSUSED */
-static void Redisplay(w, event, region)
- Widget w;
- XEvent *event;
- Region region;
-{
- WinLabelWidget lw = (WinLabelWidget) w;
- GC gc;
- int ul_x_loc, ul_y_loc, ul_width;
-
- if (region != NULL) {
- int x = lw->winlabel.label_x;
- unsigned int width = lw->winlabel.label_width;
- if (lw->winlabel.lbm_width) {
- if (lw->winlabel.label_x > (x = lw->winlabel.internal_width))
- width += lw->winlabel.label_x - x;
- }
- if (XRectInRegion(region, x, lw->winlabel.label_y,
- width, lw->winlabel.label_height) == RectangleOut)
- return;
- }
-
- gc = XtIsSensitive((Widget)lw) ? lw->winlabel.normal_GC
- : lw->winlabel.gray_GC;
-#ifdef notdef
- if (region != NULL) XSetRegion(XtDisplay(w), gc, region);
-#endif /*notdef*/
- if (lw->winlabel.pixmap == None) {
- int len = lw->winlabel.label_len;
- char *label = lw->winlabel.label;
- Position y = lw->winlabel.label_y +
- lw->winlabel.font->max_bounds.ascent;
-
- /* display left bitmap */
- if (lw->winlabel.left_bitmap && lw->winlabel.lbm_width != 0) {
- XCopyPlane (XtDisplay(w), lw->winlabel.left_bitmap, XtWindow(w), gc,
- 0, 0, lw->winlabel.lbm_width, lw->winlabel.lbm_height,
- (int) lw->winlabel.internal_width,
- (int) lw->winlabel.internal_height +
- lw->winlabel.lbm_y,
- (unsigned long) 1L);
- }
-
- if (len == MULTI_LINE_LABEL) {
- char *nl;
- while ((nl = index(label, '\n')) != NULL) {
- if (lw->winlabel.encoding)
- XDrawString16(XtDisplay(w), XtWindow(w), gc,
- lw->winlabel.label_x, y,
- (TXT16*)label, (int)(nl - label)/2);
- else
- XDrawString(XtDisplay(w), XtWindow(w), gc,
- lw->winlabel.label_x, y, label,
- (int)(nl - label));
- y += lw->winlabel.font->max_bounds.ascent +
- lw->winlabel.font->max_bounds.descent;
- label = nl + 1;
- }
- len = strlen(label);
- }
- if (len) {
- if (lw->winlabel.encoding)
- XDrawString16(XtDisplay(w), XtWindow(w), gc,
- lw->winlabel.label_x, y, (TXT16*)label, len/2);
- else
- XDrawString(XtDisplay(w), XtWindow(w), gc,
- lw->winlabel.label_x, y, label, len);
-
- if (lw->winlabel.ul_pos != -1)
- {
- /* Don't bother with two byte chars at present */
- if (!lw->winlabel.encoding)
- {
- ul_x_loc = lw->winlabel.label_x +
- XTextWidth(lw->winlabel.font,
- lw->winlabel.label, lw->winlabel.ul_pos);
- ul_y_loc = lw->winlabel.label_height +
- lw->winlabel.internal_height + 1;
- ul_width = XTextWidth(lw->winlabel.font,
- lw->winlabel.label + lw->winlabel.ul_pos, 1);
-
- XDrawLine(XtDisplayOfObject(w), XtWindowOfObject(w), gc,
- ul_x_loc, ul_y_loc, ul_x_loc + ul_width - 1, ul_y_loc);
- }
- }
- }
- } else if (lw->winlabel.label_len == 1) { /* depth */
- XCopyPlane(XtDisplay(w), lw->winlabel.pixmap, XtWindow(w), gc,
- 0, 0, lw->winlabel.label_width, lw->winlabel.label_height,
- lw->winlabel.label_x, lw->winlabel.label_y, 1L);
- } else {
- XCopyArea(XtDisplay(w), lw->winlabel.pixmap, XtWindow(w), gc,
- 0, 0, lw->winlabel.label_width, lw->winlabel.label_height,
- lw->winlabel.label_x, lw->winlabel.label_y);
- }
-#ifdef notdef
- if (region != NULL) XSetClipMask(XtDisplay(w), gc, (Pixmap)None);
-#endif /* notdef */
-}
-
-static void _Reposition(lw, width, height, dx, dy)
- register WinLabelWidget lw;
- Dimension width, height;
- Position *dx, *dy;
-{
- Position newPos;
- Position leftedge = lw->winlabel.internal_width + LEFT_OFFSET(lw);
-
- switch (lw->winlabel.justify) {
-
- case XtJustifyLeft :
- newPos = leftedge;
- break;
-
- case XtJustifyRight :
- newPos = width -
- (lw->winlabel.label_width + lw->winlabel.internal_width);
- break;
-
- case XtJustifyCenter :
- default:
- newPos = (int)(width - lw->winlabel.label_width) / 2;
- break;
- }
- if (newPos < (Position)leftedge)
- newPos = leftedge;
- *dx = newPos - lw->winlabel.label_x;
- lw->winlabel.label_x = newPos;
- *dy = (newPos = (int)(height - lw->winlabel.label_height) / 2)
- - lw->winlabel.label_y;
- lw->winlabel.label_y = newPos;
- return;
-}
-
-static void Resize(w)
- Widget w;
-{
- WinLabelWidget lw = (WinLabelWidget)w;
- Position dx, dy;
- _Reposition(lw, w->core.width, w->core.height, &dx, &dy);
- compute_bitmap_offsets (lw);
-}
-
-/*
- * Set specified arguments into widget
- */
-
-#define PIXMAP 0
-#define WIDTH 1
-#define HEIGHT 2
-#define NUM_CHECKS 3
-
-static Boolean SetValues(current, request, new, args, num_args)
- Widget current, request, new;
- ArgList args;
- Cardinal *num_args;
-{
- WinLabelWidget curlw = (WinLabelWidget) current;
- WinLabelWidget reqlw = (WinLabelWidget) request;
- WinLabelWidget newlw = (WinLabelWidget) new;
- int i;
- Boolean was_resized = False, redisplay = False, checks[NUM_CHECKS];
-
- for (i = 0; i < NUM_CHECKS; i++)
- checks[i] = FALSE;
-
- for (i = 0; i < *num_args; i++) {
- if (streq(XtNbitmap, args[i].name))
- checks[PIXMAP] = TRUE;
- if (streq(XtNwidth, args[i].name))
- checks[WIDTH] = TRUE;
- if (streq(XtNheight, args[i].name))
- checks[HEIGHT] = TRUE;
- }
-
- if (newlw->winlabel.label == NULL) {
- newlw->winlabel.label = newlw->core.name;
- }
-
- /*
- * resize on bitmap change
- */
- if (curlw->winlabel.left_bitmap != newlw->winlabel.left_bitmap) {
- was_resized = True;
- }
-
- if (curlw->winlabel.encoding != newlw->winlabel.encoding)
- was_resized = True;
-
- if (curlw->winlabel.label != newlw->winlabel.label) {
- if (curlw->winlabel.label != curlw->core.name)
- XtFree( (char *)curlw->winlabel.label );
-
- if (newlw->winlabel.label != newlw->core.name) {
- newlw->winlabel.label = XtNewString( newlw->winlabel.label );
- }
- RemoveAmpersand(new);
- was_resized = True;
- }
-
- if (was_resized || (curlw->winlabel.font != newlw->winlabel.font) ||
- (curlw->winlabel.justify != newlw->winlabel.justify)
- || checks[PIXMAP]) {
-
- SetTextWidthAndHeight(newlw);
- was_resized = True;
- }
-
- /* recalculate the window size if something has changed. */
- if (newlw->winlabel.resize && was_resized) {
- if ((curlw->core.height == reqlw->core.height) && !checks[HEIGHT])
- newlw->core.height = (newlw->winlabel.label_height +
- 2 * newlw->winlabel.internal_height);
-
- set_bitmap_info (newlw);
-
- if ((curlw->core.width == reqlw->core.width) && !checks[WIDTH])
- newlw->core.width = (newlw->winlabel.label_width +
- LEFT_OFFSET(newlw) +
- 2 * newlw->winlabel.internal_width);
- }
-
- if (curlw->winlabel.foreground != newlw->winlabel.foreground
- || curlw->core.background_pixel != newlw->core.background_pixel
- || curlw->winlabel.font->fid != newlw->winlabel.font->fid) {
-
- XtReleaseGC(new, curlw->winlabel.normal_GC);
- XtReleaseGC(new, curlw->winlabel.gray_GC);
- XmuReleaseStippledPixmap( XtScreen(current), curlw->winlabel.stipple );
- GetnormalGC(newlw);
- GetgrayGC(newlw);
- redisplay = True;
- }
-
- if ((curlw->winlabel.internal_width != newlw->winlabel.internal_width)
- || (curlw->winlabel.internal_height != newlw->winlabel.internal_height)
- || was_resized) {
- /* Resize() will be called if geometry changes succeed */
- Position dx, dy;
- _Reposition(newlw, curlw->core.width, curlw->core.height, &dx, &dy);
- }
-
- return was_resized || redisplay ||
- XtIsSensitive(current) != XtIsSensitive(new);
-}
-
-static void Destroy(w)
- Widget w;
-{
- WinLabelWidget lw = (WinLabelWidget)w;
-
- XtFree( lw->winlabel.label );
- XtReleaseGC( w, lw->winlabel.normal_GC );
- XtReleaseGC( w, lw->winlabel.gray_GC);
- XmuReleaseStippledPixmap( XtScreen(w), lw->winlabel.stipple );
-}
-
-
-static XtGeometryResult QueryGeometry(w, intended, preferred)
- Widget w;
- XtWidgetGeometry *intended, *preferred;
-{
- register WinLabelWidget lw = (WinLabelWidget)w;
-
- preferred->request_mode = CWWidth | CWHeight;
- preferred->width = (lw->winlabel.label_width +
- 2 * lw->winlabel.internal_width +
- LEFT_OFFSET(lw));
- preferred->height = lw->winlabel.label_height +
- 2*lw->winlabel.internal_height;
- if ( ((intended->request_mode & (CWWidth | CWHeight))
- == (CWWidth | CWHeight)) &&
- intended->width == preferred->width &&
- intended->height == preferred->height)
- return XtGeometryYes;
- else if (preferred->width == w->core.width &&
- preferred->height == w->core.height)
- return XtGeometryNo;
- else
- return XtGeometryAlmost;
-}
diff --git a/controls/WinLabel.h b/controls/WinLabel.h
deleted file mode 100644
index de285da..0000000
--- a/controls/WinLabel.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Added code to translate ampersand to underlined char
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinLabel
- */
-
-#ifndef _WinLabel_h
-#define _WinLabel_h
-
-/***********************************************************************
- *
- * WinLabel Widget
- *
- ***********************************************************************/
-
-#include <X11/Xaw/Simple.h>
-
-/* Resources:
-
- Name Class RepType Default Value
- ---- ----- ------- -------------
- background Background Pixel XtDefaultBackground
- bitmap Pixmap Pixmap None
- border BorderColor Pixel XtDefaultForeground
- borderWidth BorderWidth Dimension 1
- cursor Cursor Cursor None
- cursorName Cursor String NULL
- destroyCallback Callback XtCallbackList NULL
- encoding Encoding unsigned char XawTextEncoding8bit
- font Font XFontStruct* XtDefaultFont
- foreground Foreground Pixel XtDefaultForeground
- height Height Dimension text height
- insensitiveBorder Insensitive Pixmap Gray
- internalHeight Height Dimension 2
- internalWidth Width Dimension 4
- justify Justify XtJustify XtJustifyCenter
- label Label String NULL
- leftBitmap LeftBitmap Pixmap None
- mappedWhenManaged MappedWhenManaged Boolean True
- pointerColor Foreground Pixel XtDefaultForeground
- pointerColorBackground Background Pixel XtDefaultBackground
- resize Resize Boolean True
- sensitive Sensitive Boolean True
- width Width Dimension text width
- x Position Position 0
- y Position Position 0
-
-*/
-
-#define XawTextEncoding8bit 0
-#define XawTextEncodingChar2b 1
-
-#define XtNleftBitmap "leftBitmap"
-#define XtCLeftBitmap "LeftBitmap"
-#define XtNencoding "encoding"
-#define XtCEncoding "Encoding"
-
-#ifndef _XtStringDefs_h_
-#define XtNbitmap "bitmap"
-#define XtNforeground "foreground"
-#define XtNlabel "label"
-#define XtNfont "font"
-#define XtNinternalWidth "internalWidth"
-#define XtNinternalHeight "internalHeight"
-#define XtNresize "resize"
-#define XtCResize "Resize"
-#define XtCBitmap "Bitmap"
-#endif
-
-/* Class record constants */
-
-extern WidgetClass winLabelWidgetClass;
-
-typedef struct _WinLabelClassRec *WinLabelWidgetClass;
-typedef struct _WinLabelRec *WinLabelWidget;
-
-#endif /* _WinLabel_h */
-/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/controls/WinLabelP.h b/controls/WinLabelP.h
deleted file mode 100644
index f84c2b7..0000000
--- a/controls/WinLabelP.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/***********************************************************
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Added code to translate ampersand to underlined char
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinLabel
- */
-
-/*
- * WinLabelP.h - Private definitions for WinLabel widget
- *
- */
-
-#ifndef _WinLabelP_h
-#define _WinLabelP_h
-
-/***********************************************************************
- *
- * WinLabel Widget Private Data
- *
- ***********************************************************************/
-
-#include "WinLabel.h"
-#include <X11/Xaw/SimpleP.h>
-
-/* New fields for the WinLabel widget class record */
-
-typedef struct {int foo;} WinLabelClassPart;
-
-/* Full class record declaration */
-typedef struct _WinLabelClassRec {
- CoreClassPart core_class;
- SimpleClassPart simple_class;
- WinLabelClassPart winlabel_class;
-} WinLabelClassRec;
-
-extern WinLabelClassRec winLabelClassRec;
-
-/* New fields for the WinLabel widget record */
-typedef struct {
- /* resources */
- Pixel foreground;
- XFontStruct *font;
- char *label;
- XtJustify justify;
- Dimension internal_width;
- Dimension internal_height;
- Pixmap pixmap;
- Boolean resize;
- unsigned char encoding;
- Pixmap left_bitmap;
-
- /* private state */
- GC normal_GC;
- GC gray_GC;
- Pixmap stipple;
- Position label_x;
- Position label_y;
- Dimension label_width;
- Dimension label_height;
- Dimension label_len;
- int lbm_y; /* where in label */
- unsigned int lbm_width, lbm_height; /* size of pixmap */
-
- int ul_pos; /* Offset in chars of underlined character */
- /* in label */
-} WinLabelPart;
-
-
-/****************************************************************
- *
- * Full instance record declaration
- *
- ****************************************************************/
-
-typedef struct _WinLabelRec {
- CorePart core;
- SimplePart simple;
- WinLabelPart winlabel;
-} WinLabelRec;
-
-#define LEFT_OFFSET(lw) ((lw)->winlabel.left_bitmap \
- ? (lw)->winlabel.lbm_width + \
- (lw)->winlabel.internal_width \
- : 0)
-
-#endif /* _WinLabelP_h */
-
diff --git a/controls/WinMenuButtP.h b/controls/WinMenuButtP.h
deleted file mode 100644
index e5d45b1..0000000
--- a/controls/WinMenuButtP.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Modifications for Wine
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinMenuButton
- */
-
-/***********************************************************************
- *
- * WinMenuButton Widget
- *
- ***********************************************************************/
-
-/*
- * WinMenuButtP.h - Private Header file for WinMenuButton widget.
- *
- * This is the private header file for the WinMenuButton widget.
- * It is intended to provide an easy method of activating pulldown menus.
- *
- * Date: May 2, 1989
- *
- * By: Chris D. Peterson
- * MIT X Consortium
- * kit@expo.lcs.mit.edu
- */
-
-#ifndef _WinMenuButtonP_h
-#define _WinMenuButtonP_h
-
-#include "WinMenuButto.h"
-#include "WinCommandP.h"
-
-/************************************
- *
- * Class structure
- *
- ***********************************/
-
-
- /* New fields for the WinMenuButton widget class record */
-typedef struct _WinMenuButtonClass
-{
- int makes_compiler_happy; /* not used */
-} WinMenuButtonClassPart;
-
- /* Full class record declaration */
-typedef struct _WinMenuButtonClassRec {
- CoreClassPart core_class;
- SimpleClassPart simple_class;
- WinLabelClassPart winLabel_class;
- WinCommandClassPart winCommand_class;
- WinMenuButtonClassPart winMenuButton_class;
-} WinMenuButtonClassRec;
-
-extern WinMenuButtonClassRec winMenuButtonClassRec;
-
-/***************************************
- *
- * Instance (widget) structure
- *
- **************************************/
-
- /* New fields for the WinMenuButton widget record */
-typedef struct {
- /* resources */
- String menu_name;
-
-} WinMenuButtonPart;
-
- /* Full widget declaration */
-typedef struct _WinMenuButtonRec {
- CorePart core;
- SimplePart simple;
- WinLabelPart winlabel;
- WinCommandPart wincommand;
- WinMenuButtonPart winmenu_button;
-} WinMenuButtonRec;
-
-#endif /* _WinMenuButtonP_h */
-
-
diff --git a/controls/WinMenuButto.c b/controls/WinMenuButto.c
deleted file mode 100644
index 71508e0..0000000
--- a/controls/WinMenuButto.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-/*
- * Modifications for Wine
- *
- * 8/27/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinMenuButton
- */
-
-/***********************************************************************
- *
- * WinMenuButton Widget
- *
- ***********************************************************************/
-
-/*
- * WinMenuButto.c - Source code for WinMenuButton widget.
- *
- * This is the source code for the WinMenuButton widget.
- * It is intended to provide an easy method of activating pulldown menus.
- *
- * Date: May 2, 1989
- *
- * By: Chris D. Peterson
- * MIT X Consortium
- * kit@expo.lcs.mit.edu
- */
-
-#include <stdio.h>
-#include <X11/IntrinsicP.h>
-#include <X11/StringDefs.h>
-
-#include <X11/Xaw/XawInit.h>
-#include "WinMenuButtP.h"
-
-static void ClassInitialize();
-static void PopupMenu();
-
-#define superclass ((WinCommandWidgetClass)&winCommandClassRec)
-
-static char defaultTranslations[] =
- "<EnterWindow>: highlight() \n\
- <LeaveWindow>: reset() \n\
- <BtnDown>: reset() PopupMenu() ";
-
-/****************************************************************
- *
- * Full class record constant
- *
- ****************************************************************/
-
-/* Private Data */
-
-#define offset(field) XtOffsetOf(WinMenuButtonRec, field)
-static XtResource resources[] = {
- {
- XtNmenuName, XtCMenuName, XtRString, sizeof(String),
- offset(winmenu_button.menu_name), XtRString, (XtPointer)"menu"},
-};
-#undef offset
-
-static XtActionsRec actionsList[] =
-{
- {"PopupMenu", PopupMenu}
-};
-
-WinMenuButtonClassRec winMenuButtonClassRec = {
- {
- (WidgetClass) superclass, /* superclass */
- "WinMenuButton", /* class_name */
- sizeof(WinMenuButtonRec), /* size */
- ClassInitialize, /* class_initialize */
- NULL, /* class_part_initialize */
- FALSE, /* class_inited */
- NULL, /* initialize */
- NULL, /* initialize_hook */
- XtInheritRealize, /* realize */
- actionsList, /* actions */
- XtNumber(actionsList), /* num_actions */
- resources, /* resources */
- XtNumber(resources), /* resource_count */
- NULLQUARK, /* xrm_class */
- FALSE, /* compress_motion */
- TRUE, /* compress_exposure */
- TRUE, /* compress_enterleave */
- FALSE, /* visible_interest */
- NULL, /* destroy */
- XtInheritResize, /* resize */
- XtInheritExpose, /* expose */
- NULL, /* set_values */
- NULL, /* set_values_hook */
- XtInheritSetValuesAlmost, /* set_values_almost */
- NULL, /* get_values_hook */
- NULL, /* accept_focus */
- XtVersion, /* version */
- NULL, /* callback_private */
- defaultTranslations, /* tm_table */
- XtInheritQueryGeometry, /* query_geometry */
- XtInheritDisplayAccelerator, /* display_accelerator */
- NULL /* extension */
- }, /* CoreClass fields initialization */
- {
- XtInheritChangeSensitive /* change_sensitive */
- }, /* SimpleClass fields initialization */
- {
- 0, /* field not used */
- }, /* WinLabelClass fields initialization */
- {
- 0, /* field not used */
- }, /* WinCommandClass fields initialization */
- {
- 0, /* field not used */
- }, /* WinMenuButtonClass fields initialization */
-};
-
- /* for public consumption */
-WidgetClass winMenuButtonWidgetClass = (WidgetClass) &winMenuButtonClassRec;
-
-/****************************************************************
- *
- * Private Procedures
- *
- ****************************************************************/
-
-static void ClassInitialize()
-{
- XawInitializeWidgetSet();
- XtRegisterGrabAction(PopupMenu, True, ButtonPressMask | ButtonReleaseMask,
- GrabModeAsync, GrabModeAsync);
-}
-
-/* ARGSUSED */
-static void
-PopupMenu(w, event, params, num_params)
-Widget w;
-XEvent * event;
-String * params;
-Cardinal * num_params;
-{
- WinMenuButtonWidget mbw = (WinMenuButtonWidget) w;
- Widget menu, temp;
- Arg arglist[2];
- Cardinal num_args;
- int menu_x, menu_y, menu_width, menu_height, button_height;
- Position button_x, button_y;
-
- temp = w;
- while(temp != NULL) {
- menu = XtNameToWidget(temp, mbw->winmenu_button.menu_name);
- if (menu == NULL)
- temp = XtParent(temp);
- else
- break;
- }
-
- if (menu == NULL) {
- char error_buf[BUFSIZ];
- sprintf(error_buf, "MenuButton: %s %s.",
- "Could not find menu widget named", mbw->winmenu_button.menu_name);
- XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
- return;
- }
- if (!XtIsRealized(menu))
- XtRealizeWidget(menu);
-
- menu_width = menu->core.width + 2 * menu->core.border_width;
- button_height = w->core.height + 2 * w->core.border_width;
- menu_height = menu->core.height + 2 * menu->core.border_width;
-
- XtTranslateCoords(w, 0, 0, &button_x, &button_y);
- menu_x = button_x;
- menu_y = button_y + button_height;
-
- if (menu_x >= 0) {
- int scr_width = WidthOfScreen(XtScreen(menu));
- if (menu_x + menu_width > scr_width)
- menu_x = scr_width - menu_width;
- }
- if (menu_x < 0)
- menu_x = 0;
-
- if (menu_y >= 0) {
- int scr_height = HeightOfScreen(XtScreen(menu));
- if (menu_y + menu_height > scr_height)
- menu_y = scr_height - menu_height;
- }
- if (menu_y < 0)
- menu_y = 0;
-
- num_args = 0;
- XtSetArg(arglist[num_args], XtNx, menu_x); num_args++;
- XtSetArg(arglist[num_args], XtNy, menu_y); num_args++;
- XtSetValues(menu, arglist, num_args);
-
- XtPopupSpringLoaded(menu);
-}
-
diff --git a/controls/WinMenuButto.h b/controls/WinMenuButto.h
deleted file mode 100644
index 3dcb3f3..0000000
--- a/controls/WinMenuButto.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 1989 Massachusetts Institute of Technology
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Modifications for Wine
- *
- * 8/23/93 David Metcalfe (david@prism.demon.co.uk)
- * Converted to WinMenuButton
- */
-
-/***********************************************************************
- *
- * WinMenuButton Widget
- *
- ***********************************************************************/
-
-/*
- * WinMenuButton.h - Public Header file for WinMenuButton widget.
- *
- * This is the public header file for the WinMenuButton widget.
- * It is intended to provide an easy method of activating pulldown menus.
- *
- * Date: May 2, 1989
- *
- * By: Chris D. Peterson
- * MIT X Consortium
- * kit@expo.lcs.mit.edu
- */
-
-#ifndef _WinMenuButton_h
-#define _WinMenuButton_h
-
-#include "WinCommand.h"
-
-/* Resources:
-
- Name Class RepType Default Value
- ---- ----- ------- -------------
- background Background Pixel XtDefaultBackground
- bitmap Pixmap Pixmap None
- border BorderColor Pixel XtDefaultForeground
- borderWidth BorderWidth Dimension 1
- callback Callback Pointer NULL
- cursor Cursor Cursor None
- destroyCallback Callback Pointer NULL
- font Font XFontStruct* XtDefaultFont
- foreground Foreground Pixel XtDefaultForeground
- height Height Dimension text height
- highlightThickness Thickness Dimension 2
- insensitiveBorder Insensitive Pixmap Gray
- internalHeight Height Dimension 2
- internalWidth Width Dimension 4
- justify Justify XtJustify XtJustifyCenter
- label Label String NULL
- mappedWhenManaged MappedWhenManaged Boolean True
- menuName MenuName String "menu"
- resize Resize Boolean True
- sensitive Sensitive Boolean True
- width Width Dimension text width
- x Position Position 0
- y Position Position 0
-
-*/
-
-#define XtNmenuName "menuName"
-#define XtCMenuName "MenuName"
-
-extern WidgetClass winMenuButtonWidgetClass;
-
-typedef struct _WinMenuButtonClassRec *WinMenuButtonWidgetClass;
-typedef struct _WinMenuButtonRec *WinMenuButtonWidget;
-
-#endif /* _WinMenuButton_h -- DON'T ADD STUFF AFTER THIS */
diff --git a/controls/combo.c b/controls/combo.c
index c8e32b9..f4af8dc 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -21,6 +21,8 @@
#include <dirent.h>
#include <sys/stat.h>
+HBITMAP hComboBit = 0;
+
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
int CreateComboStruct(HWND hwnd);
@@ -37,12 +39,21 @@
int AltState;
WND *wndPtr;
LPHEADCOMBO lphc;
+ LPDRAWITEMSTRUCT lpdis;
+ HDC hMemDC;
+ BITMAP bm;
char str[128];
PAINTSTRUCT paintstruct;
static RECT rectsel;
switch(message)
{
case WM_CREATE:
+ ShowScrollBar(hwnd, SB_BOTH, FALSE);
+ GetClientRect(hwnd, &rect);
+ width = rect.right - rect.left;
+ height = rect.bottom - rect.top;
+/* SetWindowPos(hwnd, 0, 0, 0, width, 16,
+ SWP_NOMOVE | SWP_NOZORDER); */
CreateComboStruct(hwnd);
wndPtr = WIN_FindWndPtr(hwnd);
lphc = ComboGetStorageHeader(hwnd);
@@ -50,10 +61,10 @@
#ifdef DEBUG_COMBO
printf("Combo WM_CREATE %lX !\n", lphc);
#endif
- width = wndPtr->rectClient.right - wndPtr->rectClient.left;
- height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
+ if (hComboBit == (HBITMAP)NULL)
+ hComboBit = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_COMBO));
lphc->hWndDrop = CreateWindow("BUTTON", "",
- WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_OWNERDRAW,
width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
lphc->hWndEdit = CreateWindow("STATIC", "",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
@@ -189,6 +200,24 @@
break;
case WM_CTLCOLOR:
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
+ case WM_DRAWITEM:
+#ifdef DEBUG_SCROLL
+ printf("ComboBox WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
+#endif
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+ if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_DRAWENTIRE) {
+ hMemDC = CreateCompatibleDC(lpdis->hDC);
+ GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+ SelectObject(hMemDC, hComboBit);
+ BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_SELECT) {
+ CopyRect(&rect, &lpdis->rcItem);
+ InflateRect(&rect, -1, -1);
+ DrawReliefRect(lpdis->hDC, rect, 1, 1);
+ }
+ break;
case WM_PAINT:
BeginPaint( hwnd, &paintstruct );
EndPaint( hwnd, &paintstruct );
diff --git a/controls/menu.c b/controls/menu.c
index 4a01b2f..8c43e6f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -9,11 +9,6 @@
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
-#include <X11/Xaw/SmeBSB.h>
-#include <X11/Xaw/SmeLine.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include "WinMenuButto.h"
-#include "SmeMenuButto.h"
#include "windows.h"
#include "menu.h"
#include "heap.h"
diff --git a/controls/scroll.c b/controls/scroll.c
index 439be8d..47da5bf 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -205,7 +205,9 @@
if (lpdis->CtlID == 1) {
GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
SelectObject(hMemDC, hUpArrow);
- BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+/* BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); */
+ StretchBlt(lpdis->hDC, 0, 0, lpdis->rcItem.right, lpdis->rcItem.right,
+ hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
if (lpdis->CtlID == 2) {
GetObject(hDnArrow, sizeof(BITMAP), (LPSTR)&bm);
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index f2e2baa..16a5548 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -43,9 +43,8 @@
33 pascal TextOut(word s_word s_word ptr word) TextOut(1 2 3 4 5)
34 pascal BitBlt( word s_word s_word s_word s_word word s_word s_word long)
BitBlt(1 2 3 4 5 6 7 8 9)
-35 pascal StrechBlt( word s_word s_word s_word s_word word s_word s_word s_word s_word long)
- StrechBlt(1 2 3 4 5 6 7 8 9 10 11)
-
+35 pascal StretchBlt( word s_word s_word s_word s_word word s_word s_word s_word s_word long)
+ StretchBlt(1 2 3 4 5 6 7 8 9 10 11)
36 pascal Polygon (word ptr word) Polygon (1 2 3)
37 pascal Polyline (word ptr word) Polyline (1 2 3)
39 pascal RestoreDC(word s_word) RestoreDC(1 2)
diff --git a/if1632/user.spec b/if1632/user.spec
index 24c3e24..ebd04ea 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -23,9 +23,12 @@
23 pascal GetFocus() GetFocus()
28 pascal ClientToScreen(word ptr) ClientToScreen(1 2)
29 pascal ScreenToClient(word ptr) ScreenToClient(1 2)
+30 pascal WindowFromPoint(long) WindowFromPoint(1)
31 pascal IsIconic(word) IsIconic(1)
32 pascal GetWindowRect(word ptr) GetWindowRect(1 2)
33 pascal GetClientRect(word ptr) GetClientRect(1 2)
+34 pascal EnableWindow(word word) EnableWindow(1 2)
+35 pascal IsWindowEnabled(word) IsWindowEnabled(1)
36 pascal GetWindowText(word ptr word) GetWindowText(1 2 3)
37 pascal SetWindowText(word ptr) SetWindowText(1 2)
38 pascal GetWindowTextLength(word) GetWindowTextLength(1)
@@ -36,6 +39,7 @@
42 pascal ShowWindow(word word) ShowWindow(1 2)
43 pascal CloseWindow(word) CloseWindow(1)
44 pascal OpenIcon(word) OpenIcon(1)
+45 pascal BringWindowToTop(word) BringWindowToTop(1)
46 pascal GetParent(word) GetParent(1)
47 pascal IsWindow(word) IsWindow(1)
48 pascal IsChild(word word) IsChild(1 2)
@@ -140,6 +144,7 @@
182 pascal KillSystemTimer(word word) KillSystemTimer(1 2)
183 pascal GetCaretPos(ptr) GetCaretPos(1)
190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
+191 pascal ChildWindowFromPoint(word long) ChildWindowFromPoint(1 2)
200 pascal OpenComm(ptr word word) OpenComm(1 2 3)
201 pascal SetCommState(ptr) SetCommState(1)
202 pascal GetCommState(word ptr) GetCommState(1 2)
@@ -194,6 +199,8 @@
334 pascal GetQueueStatus(word) GetQueueStatus(1)
335 pascal GetInputState() GetInputState()
359 pascal GetDCEx(word word long) GetDCEx(1 2 3)
+370 pascal GetWindowPlacement(word ptr) GetWindowPlacement(1 2)
+371 pascal SetWindowPlacement(word ptr) SetWindowPlacement(1 2)
373 pascal SubtractRect(ptr ptr ptr) SubtractRect(1 2 3)
403 pascal UnregisterClass(ptr word) UnregisterClass(1 2)
404 pascal GetClassInfo(word ptr ptr) GetClassInfo(1 2 3)
@@ -226,6 +233,9 @@
454 pascal AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx(1 2 3 4)
457 pascal DestroyIcon(word) DestroyIcon(1)
458 pascal DestroyCursor(word) DestroyCursor(1)
+460 pascal GetInternalWindowPos(word ptr ptr) GetInternalWindowPos(1 2 3)
+461 pascal SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos(1 2 3 4)
+466 pascal DrawFocusRect(word ptr) DrawFocusRect(1 2)
471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
472 pascal AnsiNext(ptr) AnsiNext(1 )
473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
diff --git a/include/options.h b/include/options.h
new file mode 100644
index 0000000..a783b32
--- /dev/null
+++ b/include/options.h
@@ -0,0 +1,20 @@
+/*
+ * Command-line options.
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+#ifndef OPTIONS_H
+#define OPTIONS_H
+
+struct options
+{
+ char * spyFilename;
+ int usePrivateMap;
+ int synchronous;
+ short cmdShow;
+};
+
+extern struct options Options;
+
+#endif
diff --git a/include/segmem.h b/include/segmem.h
index 437dfd9..d4f6fd8 100644
--- a/include/segmem.h
+++ b/include/segmem.h
@@ -69,4 +69,10 @@
return ((int) address >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
}
+extern SEGDESC Segments[];
+
#endif /* SEGMEM_H */
+
+
+
+
diff --git a/include/win.h b/include/win.h
index 8bb8d57..12800c7 100644
--- a/include/win.h
+++ b/include/win.h
@@ -26,6 +26,9 @@
HANDLE hInstance; /* Window hInstance (from CreateWindow) */
RECT rectClient; /* Client area rel. to parent client area */
RECT rectWindow; /* Whole window rel. to parent client area */
+ RECT rectNormal; /* Window rect. when in normal state */
+ POINT ptIconPos; /* Icon position */
+ POINT ptMaxPos; /* Maximized window position */
HANDLE hmemTaskQ; /* Task queue global memory handle */
HRGN hrgnUpdate; /* Update region */
HWND hwndLastActive; /* Last active popup hwnd */
@@ -54,6 +57,10 @@
#define WIN_OWN_DC 0x08 /* Win class has style CS_OWNDC */
#define WIN_CLASS_DC 0x10 /* Win class has style CS_CLASSDC */
#define WIN_DOUBLE_CLICKS 0x20 /* Win class has style CS_DBLCLKS */
+#define WIN_RESTORE_MAX 0x40 /* Maximize when restoring */
+
+ /* First top-level window */
+extern HWND firstWindow;
/* Window functions */
WND *WIN_FindWndPtr( HWND hwnd );
diff --git a/include/windows.h b/include/windows.h
index 7cfecdc..a4064c3 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -111,6 +111,19 @@
#endif
*/
+typedef struct { short x, y; } POINT;
+typedef POINT *PPOINT;
+typedef POINT *NPPOINT;
+typedef POINT *LPPOINT;
+
+typedef struct
+{
+ short cx;
+ short cy;
+} SIZE, *LPSIZE;
+
+#define MAKEPOINT(l) (*((POINT *)&(l)))
+
#define MAKELPARAM(low, high) ((LONG)(((WORD)(low)) | \
(((DWORD)((WORD)(high))) << 16)))
@@ -221,6 +234,21 @@
UINT flags;
} WINDOWPOS;
+ /* SetWindowPlacement() struct */
+typedef struct
+{
+ UINT length;
+ UINT flags;
+ UINT showCmd;
+ POINT ptMinPosition __attribute__ ((packed));
+ POINT ptMaxPosition __attribute__ ((packed));
+ RECT rcNormalPosition __attribute__ ((packed));
+} WINDOWPLACEMENT, *LPWINDOWPLACEMENT;
+
+ /* WINDOWPLACEMENT flags */
+#define WPF_SETMINPOSITION 0x0001
+#define WPF_RESTORETOMAXIMIZED 0x0002
+
/* WM_NCCALCSIZE parameter structure */
typedef struct
{
@@ -324,19 +352,6 @@
#define IDNO 7
-typedef struct { short x, y; } POINT;
-typedef POINT *PPOINT;
-typedef POINT *NPPOINT;
-typedef POINT *LPPOINT;
-
-typedef struct
-{
- short cx;
- short cy;
-} SIZE, *LPSIZE;
-
-#define MAKEPOINT(l) (*((POINT *)&(l)))
-
typedef struct tagMSG
{
HWND hwnd;
@@ -2002,6 +2017,7 @@
Fa(ATOM,GlobalAddAtom,LPCSTR,a)
Fa(ATOM,GlobalDeleteAtom,ATOM,a)
Fa(ATOM,GlobalFindAtom,LPCSTR,a)
+Fa(BOOL,BringWindowToTop,HWND,a)
Fa(BOOL,DeleteDC,HDC,a)
Fa(BOOL,DeleteMetaFile,HANDLE,a)
Fa(BOOL,DeleteObject,HANDLE,a)
@@ -2156,7 +2172,6 @@
Fa(int,UpdateColors,HDC,a)
Fa(int,WaitSoundState,int,a)
Fa(short,GetTextCharacterExtra,HDC,a)
-Fa(void,BringWindowToTop,HWND,a)
Fa(void,ClipCursor,LPRECT,a)
Fa(void,CloseWindow,HWND,a)
Fa(void,DrawMenuBar,HWND,a)
@@ -2179,6 +2194,8 @@
Fa(void,SwapRecording,WORD,a)
Fb(BOOL,ExitWindows,DWORD,dwReserved,WORD,wReturnCode)
Fb(BOOL,GetBitmapDimensionEx,HBITMAP,a,LPSIZE,b)
+Fb(BOOL,GetWindowPlacement,HWND,a,LPWINDOWPLACEMENT,b)
+Fb(BOOL,SetWindowPlacement,HWND,a,LPWINDOWPLACEMENT,b)
Fb(BOOL,ShowWindow,HWND,a,int,b)
Fb(HDC,BeginPaint,HWND,a,LPPAINTSTRUCT,b)
Fb(LPSTR,lstrcat,LPSTR,a,LPCSTR,b )
@@ -2270,6 +2287,12 @@
Fb(WORD,LocalShrink,HANDLE,a,WORD,b)
Fb(WORD,MapVirtualKey,WORD,a,WORD,b)
Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
+Fb(WORD,SetBkMode,HDC,a,WORD,b)
+Fb(WORD,SetMapMode,HDC,a,WORD,b)
+Fb(WORD,SetPolyFillMode,HDC,a,WORD,b)
+Fb(WORD,SetRelAbs,HDC,a,WORD,b)
+Fb(WORD,SetROP2,HDC,a,WORD,b)
+Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
Fb(WORD,SetTaskQueue,HANDLE,a,HANDLE,b)
Fb(WORD,SetTextAlign,HDC,a,WORD,b)
Fb(WORD,SizeofResource,HANDLE,a,HANDLE,b)
@@ -2317,6 +2340,7 @@
Fb(void,ValidateRect,HWND,a,LPRECT,b)
Fb(void,ValidateRgn,HWND,a,HRGN,b)
Fc(BOOL,LineTo,HDC,a,short,b,short,c)
+Fc(WORD,GetInternalWindowPos,HWND,a,LPRECT,b,LPPOINT,c)
Fc(LONG,_llseek,int,a,long,b,int,c)
Fc(WORD,_lread,int,a,LPSTR,b,int,c)
Fc(WORD,_lwrite,int,a,LPSTR,b,int,c)
@@ -2378,12 +2402,6 @@
Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,short,c)
Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c)
Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
-Fb(WORD,SetBkMode,HDC,a,WORD,b)
-Fb(WORD,SetMapMode,HDC,a,WORD,b)
-Fb(WORD,SetPolyFillMode,HDC,a,WORD,b)
-Fb(WORD,SetRelAbs,HDC,a,WORD,b)
-Fb(WORD,SetROP2,HDC,a,WORD,b)
-Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
Fc(int,FrameRect,HDC,a,LPRECT,b,HBRUSH,c)
Fc(int,GetClassName,HWND,a,LPSTR,b,short,c)
Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,int,c)
@@ -2479,6 +2497,7 @@
Fd(void,GetScrollRange,HWND,a,int,b,LPINT,c,LPINT,d)
Fd(void,MapWindowPoints,HWND,a,HWND,b,LPPOINT,c,WORD,d)
Fd(void,PlayMetaFileRecord,HDC,a,LPHANDLETABLE,b,LPMETARECORD,c,WORD,d)
+Fd(void,SetInternalWindowPos,HWND,a,WORD,b,LPRECT,c,LPPOINT,d)
Fd(void,SetDlgItemInt,HWND,a,WORD,b,WORD,c,BOOL,d)
Fe(BOOL,Rectangle,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom)
Fe(int,DrawText,HDC,a,LPSTR,str,int,c,LPRECT,d,WORD,flag)
diff --git a/loader/cursor.c b/loader/cursor.c
index 039c1c3..3bf7577 100644
--- a/loader/cursor.c
+++ b/loader/cursor.c
@@ -77,6 +77,14 @@
lpcur->xcursor = XCreateFontCursor(XT_display, XC_watch);
GlobalUnlock(hCursor);
return hCursor;
+ case IDC_SIZENS:
+ lpcur->xcursor = XCreateFontCursor(XT_display, XC_sb_v_double_arrow);
+ GlobalUnlock(hCursor);
+ return hCursor;
+ case IDC_SIZEWE:
+ lpcur->xcursor = XCreateFontCursor(XT_display, XC_sb_h_double_arrow);
+ GlobalUnlock(hCursor);
+ return hCursor;
default:
break;
}
diff --git a/loader/selector.c b/loader/selector.c
index 5edee7fa..38ad26f 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -62,6 +62,35 @@
* FindUnusedSelector
*/
int
+FindUnusedSelectors(int n_selectors)
+{
+ int i;
+ int n_found;
+
+ n_found = 0;
+ for (i = LastUsedSelector + 1; i != LastUsedSelector; i++)
+ {
+ if (i >= MAX_SELECTORS)
+ {
+ n_found = 0;
+ i = FIRST_SELECTOR;
+ }
+
+ if (!SelectorMap[i] && ++n_found == n_selectors)
+ break;
+ }
+
+ if (i == LastUsedSelector)
+ return 0;
+
+ LastUsedSelector = i;
+ return i - n_selectors + 1;
+}
+
+/**********************************************************************
+ * FindUnusedSelector
+ */
+int
FindUnusedSelector(void)
{
int i;
@@ -728,6 +757,7 @@
int i;
int status;
int old_length, file_image_length;
+ int saved_old_length;
/*
* Allocate memory for the table to keep track of all selectors.
@@ -828,14 +858,18 @@
if (i + 1 == ne_header->auto_data_seg)
{
auto_data_sel = s->selector;
- HEAP_LocalInit(s->base_addr + old_length,
- ne_header->local_heap_length);
+ saved_old_length = old_length;
}
}
s = selectors;
for (i = 0; i < ne_header->n_segment_tab; i++, s++)
+ {
Segments[s->selector >> 3].owner = auto_data_sel;
+ if (s->selector == auto_data_sel)
+ HEAP_LocalInit(auto_data_sel, s->base_addr + saved_old_length,
+ ne_header->local_heap_length);
+ }
if(!EnvironmentSelector) {
EnvironmentSelector = CreateEnvironment();
diff --git a/memory/heap.c b/memory/heap.c
index e97ce84..252f5fb 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -6,8 +6,16 @@
#include "prototypes.h"
#include "segmem.h"
#include "heap.h"
+#include "regfunc.h"
-MDESC *LOCAL_FreeList;
+typedef struct heap_local_heap_s
+{
+ struct heap_local_heap_s *next;
+ MDESC *free_list;
+ unsigned short selector;
+} LHEAP;
+
+LHEAP *LocalHeaps = NULL;
/**********************************************************************
* HEAP_Init
@@ -274,12 +282,49 @@
}
/**********************************************************************
+ * HEAP_LocalFindHeap
+ */
+MDESC **
+HEAP_LocalFindHeap(unsigned short owner)
+{
+ LHEAP *lh;
+
+#ifdef DEBUG_HEAP
+ printf("HEAP_LocalFindHeap: owner %04x\n", owner);
+#endif
+
+ for (lh = LocalHeaps; lh != NULL; lh = lh->next)
+ {
+ if (lh->selector == owner)
+ return &lh->free_list;
+ }
+
+ return NULL;
+}
+
+#define LOCALHEAP() HEAP_LocalFindHeap(Segments[Stack16Frame[11] >> 3].owner)
+
+/**********************************************************************
* HEAP_LocalInit
*/
void
-HEAP_LocalInit(void *start, int length)
+HEAP_LocalInit(unsigned short owner, void *start, int length)
{
- HEAP_Init(&LOCAL_FreeList, start, length);
+ LHEAP *lh;
+
+#ifdef DEBUG_HEAP
+ printf("HEAP_LocalInit: owner %04x, start %08x, length %04x\n",
+ owner, start, length);
+#endif
+
+ lh = (LHEAP *) malloc(sizeof(*lh));
+ if (lh == NULL)
+ return;
+
+ lh->selector = owner;
+ lh->next = LocalHeaps;
+ HEAP_Init(&lh->free_list, start, length);
+ LocalHeaps = lh;
}
/**********************************************************************
@@ -292,9 +337,10 @@
#ifdef DEBUG_HEAP
printf("LocalAlloc: flags %x, bytes %d\n", flags, bytes);
+ printf(" called from segment %04x\n", Stack16Frame[11]);
#endif
- m = HEAP_Alloc(&LOCAL_FreeList, flags, bytes);
+ m = HEAP_Alloc(LOCALHEAP(), flags, bytes);
#ifdef DEBUG_HEAP
printf("LocalAlloc: returning %x\n", (int) m);
@@ -312,7 +358,7 @@
int max_block;
max_block = 0;
- for (m = LOCAL_FreeList; m != NULL; m = m->next)
+ for (m = *LOCALHEAP(); m != NULL; m = m->next)
if (m->length > max_block)
max_block = m->length;
@@ -327,7 +373,7 @@
{
MDESC *m;
- m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) |
+ m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) |
(handle & 0xffff)) - 1;
if (m->next != m || m->prev != m)
return 0;
@@ -343,8 +389,8 @@
{
unsigned int addr;
- addr = ((int) LOCAL_FreeList & 0xffff0000) | (handle & 0xffff);
- if (HEAP_Free(&LOCAL_FreeList, (void *) addr) < 0)
+ addr = ((int) *LOCALHEAP() & 0xffff0000) | (handle & 0xffff);
+ if (HEAP_Free(LOCALHEAP(), (void *) addr) < 0)
return handle;
else
return 0;
@@ -356,7 +402,7 @@
unsigned int
LocalInit(unsigned int segment, unsigned int start, unsigned int end)
{
- HEAP_Init(&LOCAL_FreeList,
+ HEAP_Init(LOCALHEAP(),
(void *) ((segment << 16) | start), end - start + 1);
return segment;
@@ -370,7 +416,7 @@
{
MDESC *m;
- m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) |
+ m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) |
(handle & 0xffff)) - 1;
if (m->next != m || m->prev != m)
return 0;
@@ -387,8 +433,8 @@
{
void *m;
- m = HEAP_ReAlloc(&LOCAL_FreeList, (void *)
- (((int) LOCAL_FreeList & 0xffff0000) | (handle & 0xffff)),
+ m = HEAP_ReAlloc(LOCALHEAP(), (void *)
+ (((int) *LOCALHEAP() & 0xffff0000) | (handle & 0xffff)),
bytes, flags);
return m;
@@ -402,7 +448,7 @@
{
MDESC *m;
- m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) |
+ m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) |
(handle & 0xffff)) - 1;
if (m->next != m || m->prev != m)
return 0;
@@ -418,7 +464,7 @@
{
MDESC *m;
- m = (MDESC *) (((int) LOCAL_FreeList & 0xffff0000) |
+ m = (MDESC *) (((int) *LOCALHEAP() & 0xffff0000) |
(handle & 0xffff)) - 1;
if (m->next != m || m->prev != m)
return 1;
diff --git a/misc/Makefile b/misc/Makefile
index 6fa5c19..f72ab80 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -1,6 +1,6 @@
CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
-OBJS=kernel.o user.o xt.o rect.o file.o sound.o emulate.o \
+OBJS=main.o kernel.o user.o rect.o file.o sound.o emulate.o \
keyboard.o profile.o lstr.o exec.o message.o int1a.o int21.o \
dos_fs.o comm.o spy.o
diff --git a/misc/comm.c b/misc/comm.c
index c0db9d5..ca65c0d 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -25,6 +25,8 @@
char *devicename; /* /dev/cua1 */
int fd;
int suspended;
+ int unget;
+ int unget_byte;
};
struct DosDeviceStruct COM[MAX_PORTS];
@@ -83,15 +85,6 @@
}
atexit(Comm_DeInit);
-
-#ifdef DEBUG_COMM
- for (x=0; x!=MAX_PORTS; x++) {
- if (COM[x].devicename)
- fprintf(stderr, "comm: COM%d = %s\n", x, COM[x].devicename);
- if (LPT[x].devicename)
- fprintf(stderr, "comm: LPT%d = %s\n", x, LPT[x].devicename);
- }
-#endif
}
void Comm_DeInit(void)
@@ -103,13 +96,11 @@
if (COM[x].devicename) {
if (COM[x].fd)
close(COM[x].fd);
- fprintf(stderr, "comm: COM%d = %s\n",x,COM[x].devicename);
free(COM[x].devicename);
}
if (LPT[x].devicename) {
if (LPT[x].fd)
close(LPT[x].fd);
- fprintf(stderr, "comm: LPT%d = %s\n",x,LPT[x].devicename);
free(LPT[x].devicename);
}
}
@@ -799,7 +790,6 @@
#ifdef DEBUG_COMM
fprintf(stderr,"UngetCommChar: fd %d (char %d)\n", fd, chUnget);
#endif
- fprintf(stderr,"NOT implemented!\n");
if ((ptr = GetDeviceStruct(fd)) == NULL) {
commerror = IE_BADID;
@@ -811,16 +801,22 @@
return -1;
}
+ ptr->unget = 1;
+ ptr->unget_byte = chUnget;
+
commerror = 0;
return 0;
}
int ReadComm(int fd, LPSTR lpvBuf, int cbRead)
{
+ int status, length;
struct DosDeviceStruct *ptr;
+
#ifdef DEBUG_COMM
fprintf(stderr,"ReadComm: fd %d, ptr %d, length %d\n", fd, lpvBuf, cbRead);
#endif
+
if ((ptr = GetDeviceStruct(fd)) == NULL) {
commerror = IE_BADID;
return -1;
@@ -831,18 +827,29 @@
return -1;
}
- if (read(fd, (void *) lpvBuf, cbRead) == -1) {
+ if (ptr->unget) {
+ *lpvBuf = ptr->unget_byte;
+ lpvBuf++;
+ ptr->unget = 0;
+
+ length = 1;
+ } else
+ length = 0;
+
+ status = read(fd, (void *) lpvBuf, cbRead);
+
+ if (status == -1) {
commerror = WinError();
- return -1;
+ return -1 - length;
} else {
commerror = 0;
- return 0;
+ return length + status;
}
}
int WriteComm(int fd, LPSTR lpvBuf, int cbWrite)
{
- int x;
+ int x, length;
struct DosDeviceStruct *ptr;
#ifdef DEBUG_COMM
@@ -859,14 +866,18 @@
return -1;
}
+#ifdef DEBUG_COMM
for (x=0; x != cbWrite ; x++)
fprintf(stderr,"%c", *(lpvBuf + x) );
+#endif
- if (write(fd, (void *) lpvBuf, cbWrite) == -1) {
+ length = write(fd, (void *) lpvBuf, cbWrite);
+
+ if (length == -1) {
commerror = WinError();
return -1;
} else {
commerror = 0;
- return 0;
+ return length;
}
}
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 57aed8d..b8f052e 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -338,8 +338,9 @@
{
/* a:\windows\system.ini => /dos/windows/system.ini */
+ static char temp[256];
int drive;
- char x, temp[256];
+ char x;
if (dosfilename[1] == ':')
{
diff --git a/misc/exec.c b/misc/exec.c
index 8bbace7..e20e53a 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -73,7 +73,7 @@
case 0:
printf("New process started !\n");
ArgV[0] = "wine";
- ArgV[1] = "/C:/windows/winhelp.exe";
+ ArgV[1] = "winhelp.exe";
ArgV[2] = lpHelpFile;
switch (wCommand) {
case HELP_CONTEXT:
@@ -99,5 +99,3 @@
}
return(TRUE);
}
-
-
diff --git a/misc/kernel.c b/misc/kernel.c
index ea3c3c0..3cdd950 100644
--- a/misc/kernel.c
+++ b/misc/kernel.c
@@ -5,6 +5,7 @@
#include <stdlib.h>
#include "prototypes.h"
#include "regfunc.h"
+#include "options.h"
extern unsigned short WIN_StackSize;
@@ -48,7 +49,7 @@
_BX = 0x81;
_AX = 1;
_CX = WIN_StackSize;
- _DX = 1;
+ _DX = Options.cmdShow;
_SI = 0;
ReturnFromRegisterFunc();
/* Function does not return */
diff --git a/misc/main.c b/misc/main.c
new file mode 100644
index 0000000..c371d01
--- /dev/null
+++ b/misc/main.c
@@ -0,0 +1,120 @@
+/*
+ * Main function.
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright Alexandre Julliard, 1994";
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+
+#include "windows.h"
+#include "options.h"
+
+
+Display * XT_display; /* To be removed */
+Screen * XT_screen; /* To be removed */
+
+Display * display;
+Screen * screen;
+
+
+struct options Options =
+{ /* default options */
+ NULL, /* spyFilename */
+ FALSE, /* usePrivateMap */
+ FALSE, /* synchronous */
+ SW_SHOWNORMAL /* cmdShow */
+};
+
+
+static XrmOptionDescRec optionsTable[] =
+{
+ { "-display", ".display", XrmoptionSepArg, (caddr_t)NULL },
+ { "-iconic", ".iconic", XrmoptionNoArg, (caddr_t)"on" },
+ { "-privatemap", ".privatemap", XrmoptionNoArg, (caddr_t)"on" },
+ { "-synchronous", ".synchronous", XrmoptionNoArg, (caddr_t)"on" },
+ { "-spy", ".spy", XrmoptionSepArg, (caddr_t)NULL }
+};
+
+#define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0]))
+
+
+/***********************************************************************
+ * MAIN_Usage
+ */
+static void MAIN_Usage( char *name )
+{
+ fprintf( stderr,"Usage: %s [-display name] [-iconic] [-privatemap]\n"
+ " [-synchronous] [-spy file] program [arguments]\n",
+ name );
+ exit(1);
+}
+
+
+/***********************************************************************
+ * MAIN_ParseOptions
+ *
+ * Parse command line options and open display.
+ */
+static void MAIN_ParseOptions( int *argc, char *argv[] )
+{
+ char *dummy, *display_name;
+ XrmValue value;
+ XrmDatabase db = NULL;
+
+ XrmParseCommand( &db, optionsTable, NB_OPTIONS, "wine", argc, argv );
+ if (*argc < 2) MAIN_Usage( argv[0] );
+
+ if (XrmGetResource( db, "wine.display", "Wine.display", &dummy, &value ))
+ display_name = value.addr;
+ else display_name = NULL;
+
+ if (!(display = XOpenDisplay( display_name )))
+ {
+ fprintf( stderr, "%s: Can't open display: %s\n",
+ argv[0], display_name ? display_name : "" );
+ exit(1);
+ }
+
+ if (XrmGetResource(db,"wine.iconic","Wine.iconic",&dummy,&value))
+ Options.cmdShow = SW_SHOWMINIMIZED;
+ if (XrmGetResource(db,"wine.privatemap","Wine.privatemap",&dummy,&value))
+ Options.usePrivateMap = TRUE;
+ if (XrmGetResource(db,"wine.synchronous","Wine.synchronous",&dummy,&value))
+ Options.synchronous = TRUE;
+ if (XrmGetResource(db,"wine.spy","Wine.spy",&dummy,&value))
+ Options.spyFilename = value.addr;
+}
+
+
+/***********************************************************************
+ * main
+ */
+int main( int argc, char *argv[] )
+{
+
+ XrmInitialize();
+
+ MAIN_ParseOptions( &argc, argv );
+
+ screen = DefaultScreenOfDisplay( display );
+ XT_display = display;
+ XT_screen = screen;
+ if (Options.synchronous) XSynchronize( display, True );
+
+ DOS_InitFS();
+ Comm_Init();
+ return _WinMain( argc, argv );
+}
+
+
+/***********************************************************************
+ * MessageBeep (USER.104)
+ */
+void MessageBeep( WORD i )
+{
+ XBell( display, 100 );
+}
diff --git a/misc/message.c b/misc/message.c
index cde5164..f6fb52f 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -108,6 +108,9 @@
int x;
switch(message) {
case WM_CREATE:
+#ifdef DEBUG_MSGBOX
+ printf("MessageBox WM_CREATE !\n");
+#endif
wndPtr = WIN_FindWndPtr(hWnd);
createStruct = (CREATESTRUCT *)lParam;
lpmbInit = (LPMSGBOX)createStruct->lpCreateParams;
@@ -122,55 +125,55 @@
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 30, rect.bottom - 25,
- 60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDOK, wndPtr->hInstance, 0L);
break;
case MB_OKCANCEL :
lpmb->hWndYes = CreateWindow("BUTTON", "&Ok",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 65, rect.bottom - 25,
- 60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDOK, wndPtr->hInstance, 0L);
lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 5, rect.bottom - 25,
- 60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDCANCEL, wndPtr->hInstance, 0L);
break;
case MB_ABORTRETRYIGNORE :
lpmb->hWndYes = CreateWindow("BUTTON", "&Retry",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 100, rect.bottom - 25,
- 60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDRETRY, wndPtr->hInstance, 0L);
lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 30, rect.bottom - 25,
- 60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDIGNORE, wndPtr->hInstance, 0L);
lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 40, rect.bottom - 25,
- 60, 18, hWnd, 3, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDABORT, wndPtr->hInstance, 0L);
break;
case MB_YESNO :
lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 65, rect.bottom - 25,
- 60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDYES, wndPtr->hInstance, 0L);
lpmb->hWndNo = CreateWindow("BUTTON", "&No",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 5, rect.bottom - 25,
- 60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDNO, wndPtr->hInstance, 0L);
break;
case MB_YESNOCANCEL :
lpmb->hWndYes = CreateWindow("BUTTON", "&Yes",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 100, rect.bottom - 25,
- 60, 18, hWnd, 1, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDYES, wndPtr->hInstance, 0L);
lpmb->hWndNo = CreateWindow("BUTTON", "&No",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 - 30, rect.bottom - 25,
- 60, 18, hWnd, 2, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDNO, wndPtr->hInstance, 0L);
lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel",
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON,
rect.right / 2 + 40, rect.bottom - 25,
- 60, 18, hWnd, 3, wndPtr->hInstance, 0L);
+ 60, 18, hWnd, IDCANCEL, wndPtr->hInstance, 0L);
break;
}
switch(lpmb->wType & MB_ICONMASK) {
@@ -199,6 +202,9 @@
}
break;
case WM_PAINT:
+#ifdef DEBUG_MSGBOX
+ printf("MessageBox WM_PAINT !\n");
+#endif
lpmb = MsgBoxGetStorageHeader(hWnd);
CopyRect(&rect, &lpmb->rectStr);
hDC = BeginPaint(hWnd, &ps);
@@ -224,65 +230,12 @@
break;
case WM_COMMAND:
lpmb = MsgBoxGetStorageHeader(hWnd);
- switch(wParam) {
- case 1:
- lpmb->wRetVal = IDOK;
- break;
- case 2:
- wndPtr = WIN_FindWndPtr(hWnd);
- hDC = GetDC(hWnd);
-/*
- for (x = 1; x < 50; x++) {
- hBitMap = LoadBitmap(wndPtr->hInstance, MAKEINTRESOURCE(x));
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
- printf(" bm.bmWidth=%d bm.bmHeight=%d\n",
- bm.bmWidth, bm.bmHeight);
- BitBlt(hDC, x * 20, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
-*/
- hBitMap = LoadBitmap((HINSTANCE)NULL, "WINELOGO");
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- printf("bm.bmWidth=%d bm.bmHeight=%d\n",
- bm.bmWidth, bm.bmHeight);
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
- BitBlt(hDC, 100, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- ReleaseDC(hWnd, hDC);
- lpmb->wRetVal = IDCANCEL;
-/*
- SetWindowPos(lpmb->hWndNo, (HWND)NULL, 20, 20, 0, 0,
- SWP_NOSIZE | SWP_NOZORDER);
-*/
- return 0;
- break;
- case 3:
- hDC = GetDC(hWnd);
- hInst2 = LoadImage("ev3lite.exe");
- printf("hInst2=%04X\n", hInst2);
- hIcon = LoadIcon(hInst2, "EV3LITE");
- DrawIcon(hDC, 20, 20, hIcon);
- DestroyIcon(hIcon);
- hInst2 = LoadImage("moricons.dll");
- printf("hInst2=%04X\n", hInst2);
- hIcon = LoadIcon(hInst2, MAKEINTRESOURCE(1));
-/* hIcon = LoadIcon(hInst2, "WINEICON"); */
- DrawIcon(hDC, 60, 20, hIcon);
- DestroyIcon(hIcon);
- hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION);
- DrawIcon(hDC, 1000, 20, hIcon);
- DestroyIcon(hIcon);
- ReleaseDC(hWnd, hDC);
- lpmb->wRetVal = IDIGNORE;
- return(0);
- break;
- default:
- return(0);
- }
- CloseWindow(hWnd);
+ if (wParam < IDOK || wParam > IDNO) return(0);
+ lpmb->wRetVal = wParam;
+#ifdef DEBUG_MSGBOX
+ printf("MessageBox sending WM_CLOSE !\n");
+#endif
+ PostMessage(hWnd, WM_CLOSE, 0, 0L);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam );
@@ -292,3 +245,52 @@
+/*************************************************************************
+ * "About Wine..." Dialog Box
+ */
+BOOL FAR PASCAL AboutWine_Proc(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
+{
+ HDC hDC;
+ HDC hMemDC;
+ PAINTSTRUCT ps;
+ int OldBackMode;
+ HFONT hOldFont;
+ RECT rect;
+ BITMAP bm;
+ char C[80];
+ int X;
+ static HBITMAP hBitMap;
+ switch (msg) {
+ case WM_INITDIALOG:
+ strcpy(C, "WINELOGO");
+ hBitMap = LoadBitmap((HINSTANCE)NULL, (LPSTR)C);
+ return TRUE;
+ case WM_PAINT:
+ hDC = BeginPaint(hDlg, &ps);
+ GetClientRect(hDlg, &rect);
+ FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
+ InflateRect(&rect, -3, -3);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+ InflateRect(&rect, -10, -10);
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hBitMap);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect.left, rect.top, bm.bmWidth, bm.bmHeight,
+ hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ EndPaint(hDlg, &ps);
+ return TRUE;
+ case WM_COMMAND:
+ switch (wParam)
+ {
+ case IDOK:
+CloseDLG: EndDialog(hDlg, TRUE);
+ return TRUE;
+ default:
+ return TRUE;
+ }
+ }
+return FALSE;
+}
+
+
diff --git a/misc/spy.c b/misc/spy.c
index d45ebb2..86e5791 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -5,9 +5,12 @@
#include <stdlib.h>
#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
#include "wineopts.h"
#include "windows.h"
#include "wine.h"
+#include "options.h"
#ifndef NOSPY
@@ -244,9 +247,14 @@
if (SpyFp == NULL)
return;
-
- GetPrivateProfileString("spy", "file", "", filename, sizeof(filename),
- WINE_INI);
+
+ if (Options.spyFilename == NULL)
+ {
+ GetPrivateProfileString("spy", "file", "", filename, sizeof(filename),
+ WINE_INI);
+ }
+ else
+ strncpy(filename, Options.spyFilename, 100);
if (strcasecmp(filename, "CON") == 0)
SpyFp = stdout;
diff --git a/misc/xt.c b/misc/xt.c
deleted file mode 100644
index 4458521..0000000
--- a/misc/xt.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * X toolkit functions
- *
- * Copyright 1993 Alexandre Julliard
- */
-
-static char Copyright[] = "Copyright Alexandre Julliard, 1993";
-
-#include <sys/param.h>
-#include <sys/times.h>
-
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Core.h>
-#include <X11/Shell.h>
-
-#include "windows.h"
-
-#ifdef __NetBSD__
-#define HZ 100
-#endif
-
-Display * XT_display;
-Screen * XT_screen;
-Display * display;
-Screen * screen;
-XtAppContext XT_app_context;
-
-static Widget topLevelWidget;
-
-
-/***********************************************************************
- * main
- */
-void main(int argc, char **argv)
-{
- topLevelWidget = XtVaAppInitialize(&XT_app_context,
- "XWine", /* Application class */
- NULL, 0, /* Option list */
- &argc, argv, /* Command line args */
- NULL, /* Fallback resources */
- NULL );
- XT_display = XtDisplay( topLevelWidget );
- XT_screen = XtScreen( topLevelWidget );
- display = XtDisplay( topLevelWidget );
- screen = XtScreen( topLevelWidget );
-
- DOS_InitFS();
- Comm_Init();
- _WinMain( argc, argv );
-}
-
-
-
-/********************************************************************
- *
- * Miscellaneous partially implemented functions.
- *
- */
-
-
-void MessageBeep( WORD i )
-{
- XBell(XT_display, 100);
-}
-
-/***********************************************************************
- * GetTickCount (USER.13)
- */
-DWORD GetTickCount()
-{
- struct tms dummy;
- return (times(&dummy) * 1000) / HZ;
-}
diff --git a/objects/bitblt.c b/objects/bitblt.c
index c4ed6bc..7b0d4ae 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -113,9 +113,9 @@
/***********************************************************************
- * StrechBlt (GDI.35)
+ * StretchBlt (GDI.35)
*/
-BOOL StrechBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short heightDest,
+BOOL StretchBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short heightDest,
HDC hdcSrc, short xSrc, short ySrc, short widthSrc, short heightSrc, DWORD rop )
{
int xs1, xs2, ys1, ys2;
@@ -124,7 +124,7 @@
/*#ifdef DEBUG_GDI */
- printf( "StrechBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
+ printf( "StretchBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
hdcDest, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc,
ySrc, widthSrc, heightSrc, rop );
/*#endif */
diff --git a/objects/color.c b/objects/color.c
index 19065ea..8eb9c2e 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -10,17 +10,12 @@
#include <X11/Xlib.h>
#include "windows.h"
+#include "options.h"
-extern Display * XT_display;
-extern Screen * XT_screen;
+extern Display * display;
+extern Screen * screen;
-/*
- * We try to use a private color map if possible, because Windows programs
- * assume that palette(0) == Black and palette(max-1) == White.
- */
-#undef USE_PRIVATE_MAP
-
Colormap COLOR_WinColormap = 0;
@@ -55,10 +50,10 @@
for (i = 0; i < NB_SYS_COLORS; i++)
{
- if (XParseColor( XT_display, DefaultColormapOfScreen( XT_screen ),
+ if (XParseColor( display, DefaultColormapOfScreen( screen ),
SysColors[i], &color ))
{
- if (XAllocColor( XT_display, DefaultColormapOfScreen( XT_screen ),
+ if (XAllocColor( display, DefaultColormapOfScreen( screen ),
&color ))
total++;
}
@@ -72,8 +67,6 @@
*
* Fill the private colormap.
*/
-#ifdef USE_PRIVATE_MAP
-
static BOOL COLOR_BuildMap( Colormap map, int depth, int size )
{
XColor color;
@@ -99,7 +92,7 @@
color.red = r;
color.green = g;
color.blue = b;
- XStoreColor( XT_display, map, &color );
+ XStoreColor( display, map, &color );
}
}
@@ -107,46 +100,47 @@
for (i = 0; i < NB_SYS_COLORS; i++)
{
- if (!XParseColor( XT_display, map, SysColors[i], &color ))
+ if (!XParseColor( display, map, SysColors[i], &color ))
color.red = color.green = color.blue = color.flags = 0;
if (i < NB_SYS_COLORS/2) color.pixel = i;
else color.pixel = (1 << depth) - NB_SYS_COLORS + i;
- if (color.pixel < size) XStoreColor( XT_display, map, &color );
+ if (color.pixel < size) XStoreColor( display, map, &color );
}
return TRUE;
}
-#endif /* USE_PRIVATE_MAP */
+
/***********************************************************************
* COLOR_Init
*/
BOOL COLOR_Init()
{
- Visual * visual = DefaultVisual( XT_display, DefaultScreen(XT_display) );
+ Visual * visual = DefaultVisual( display, DefaultScreen(display) );
switch(visual->class)
{
- case GrayScale:
- case PseudoColor:
- case DirectColor:
-
-#ifdef USE_PRIVATE_MAP
- COLOR_WinColormap = XCreateColormap( XT_display,
- DefaultRootWindow(XT_display),
- visual, AllocAll );
- if (COLOR_WinColormap)
- COLOR_BuildMap(COLOR_WinColormap,
- DefaultDepth(XT_display, DefaultScreen(XT_display)),
- visual->map_entries );
- else COLOR_FillDefaultMap();
- break;
-#endif /* USE_PRIVATE_MAP */
-
- case StaticGray:
- case StaticColor:
- case TrueColor:
+ case GrayScale:
+ case PseudoColor:
+ case DirectColor:
+ if (Options.usePrivateMap)
+ {
+ COLOR_WinColormap = XCreateColormap( display,
+ DefaultRootWindow(display),
+ visual, AllocAll );
+ if (COLOR_WinColormap)
+ {
+ COLOR_BuildMap(COLOR_WinColormap,
+ DefaultDepth(display, DefaultScreen(display)),
+ visual->map_entries );
+ break;
+ }
+ }
+ /* Fall through */
+ case StaticGray:
+ case StaticColor:
+ case TrueColor:
COLOR_FillDefaultMap();
- COLOR_WinColormap = DefaultColormapOfScreen( XT_screen );
+ COLOR_WinColormap = DefaultColormapOfScreen( screen );
break;
}
return TRUE;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index dc75bc1..95bb0f0 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -12,12 +12,15 @@
#include "class.h"
#include "user.h"
-extern Display * display;
-
extern LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn );
extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
extern LONG NC_HandleNCHitTest( HWND hwnd, POINT pt );
-extern LONG NC_HandleNCMouseMsg(HWND hwnd, WORD msg, WORD wParam, LONG lParam);
+extern LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCLButtonUp( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCMouseMove( HWND hwnd, WORD wParam, POINT pt );
+extern LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt );
+extern LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam );
/***********************************************************************
@@ -28,7 +31,6 @@
CLASS * classPtr;
LPSTR textPtr;
int len;
- int tempwidth, tempheight;
WND * wndPtr = WIN_FindWndPtr( hwnd );
#ifdef DEBUG_MESSAGE
@@ -63,10 +65,16 @@
return NC_HandleNCHitTest( hwnd, MAKEPOINT(lParam) );
case WM_NCLBUTTONDOWN:
+ return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
+
case WM_NCLBUTTONUP:
+ return NC_HandleNCLButtonUp( hwnd, wParam, lParam );
+
case WM_NCLBUTTONDBLCLK:
+ return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
+
case WM_NCMOUSEMOVE:
- return NC_HandleNCMouseMsg( hwnd, msg, wParam, lParam );
+ return NC_HandleNCMouseMove( hwnd, wParam, MAKEPOINT(lParam) );
case WM_NCDESTROY:
{
@@ -170,32 +178,18 @@
strlen((LPSTR)lParam) + 1);
textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
strcpy(textPtr, (LPSTR)lParam);
- XStoreName( display, wndPtr->window, textPtr );
return (0L);
}
+
case WM_SETCURSOR:
- if (wndPtr->hCursor != (HCURSOR)NULL)
- SetCursor(wndPtr->hCursor);
- return 0L;
+ if (wndPtr->dwStyle & WS_CHILD)
+ if (SendMessage(wndPtr->hwndParent, WM_SETCURSOR, wParam, lParam))
+ return TRUE;
+ return NC_HandleSetCursor( hwnd, wParam, lParam );
+
case WM_SYSCOMMAND:
- switch (wParam)
- {
- case SC_CLOSE:
- ShowWindow(hwnd, SW_MINIMIZE);
- printf("defdwndproc WM_SYSCOMMAND SC_CLOSE !\n");
- return SendMessage( hwnd, WM_CLOSE, 0, 0 );
- case SC_RESTORE:
- ShowWindow(hwnd, SW_RESTORE);
- break;
- case SC_MINIMIZE:
- ShowWindow(hwnd, SW_MINIMIZE);
- printf("defdwndproc WM_SYSCOMMAND SC_MINIMIZE !\n");
- break;
- case SC_MAXIMIZE:
- ShowWindow(hwnd, SW_MAXIMIZE);
- break;
- }
- break;
+ return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) );
+
case WM_SYSKEYDOWN:
if (wParam == VK_MENU) {
printf("VK_MENU Pressed // hMenu=%04X !\n", GetMenu(hwnd));
diff --git a/windows/event.c b/windows/event.c
index b2de49f..ba1c0a3 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -117,7 +117,6 @@
static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event );
static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event );
static void EVENT_Expose( HWND hwnd, XExposeEvent *event );
-static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event );
/***********************************************************************
@@ -172,10 +171,6 @@
EVENT_Expose( hwnd, (XExposeEvent*)event );
break;
- case ConfigureNotify:
- EVENT_ConfigureNotify( hwnd, (XConfigureEvent*)event );
- break;
-
#ifdef DEBUG_EVENT
default:
printf( "Unprocessed event %s for hwnd %d\n",
@@ -257,6 +252,12 @@
keysym, count, Str[0], Str);
#endif
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ if (event->type == KeyPress) XBell(display, 0);
+ return;
+ }
+
+
xkey = LOWORD(keysym);
key_type = HIBYTE(xkey);
key = LOBYTE(xkey);
@@ -358,6 +359,14 @@
*/
static void EVENT_MotionNotify( HWND hwnd, XMotionEvent *event )
{
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) return;
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ return;
+ }
+
+
hardware_event( hwnd, WM_MOUSEMOVE,
EVENT_XStateToKeyState( event->state ), 0L,
event->x_root & 0xffff, event->y_root & 0xffff,
@@ -373,6 +382,18 @@
static WORD messages[NB_BUTTONS] =
{ WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN };
int buttonNum = event->button - 1;
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) {
+ printf("couldn't find window\n");
+ return;
+ }
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ XBell(display, 0);
+ return;
+ }
+
+
if (buttonNum >= NB_BUTTONS) return;
winHasCursor = event->window;
@@ -391,6 +412,13 @@
static const WORD messages[NB_BUTTONS] =
{ WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP };
int buttonNum = event->button - 1;
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) return;
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ return;
+ }
+
if (buttonNum >= NB_BUTTONS) return;
winHasCursor = event->window;
@@ -401,42 +429,20 @@
}
-/***********************************************************************
- * EVENT_ConfigureNotify
- */
-static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
-{
- HANDLE handle;
- NCCALCSIZE_PARAMS *params;
- WND * wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr) return;
- wndPtr->rectWindow.left = event->x;
- wndPtr->rectWindow.top = event->y;
- wndPtr->rectWindow.right = event->x + event->width;
- wndPtr->rectWindow.bottom = event->y + event->height;
-
- /* Send WM_NCCALCSIZE message */
- handle = GlobalAlloc( GMEM_MOVEABLE, sizeof(*params) );
- params = (NCCALCSIZE_PARAMS *)GlobalLock( handle );
- params->rgrc[0] = wndPtr->rectWindow;
- params->lppos = NULL; /* Should be WINDOWPOS struct */
- SendMessage( hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)params );
- wndPtr->rectClient = params->rgrc[0];
- PostMessage( hwnd, WM_MOVE, 0,
- MAKELONG( wndPtr->rectClient.left, wndPtr->rectClient.top ));
- PostMessage( hwnd, WM_SIZE, SIZE_RESTORED,
- MAKELONG( wndPtr->rectClient.right-wndPtr->rectClient.left,
- wndPtr->rectClient.bottom-wndPtr->rectClient.top) );
- GlobalUnlock( handle );
- GlobalFree( handle );
-}
-
-
/**********************************************************************
* EVENT_FocusIn
*/
static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event )
{
+
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) return;
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ return;
+ }
+
+
PostMessage( hwnd, WM_SETFOCUS, hwnd, 0 );
hWndFocus = hwnd;
}
@@ -447,6 +453,14 @@
*/
static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event )
{
+
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) return;
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ return;
+ }
+
if (hWndFocus)
{
PostMessage( hwnd, WM_KILLFOCUS, hwnd, 0 );
@@ -460,9 +474,20 @@
*/
static void EVENT_EnterNotify( HWND hwnd, XCrossingEvent *event )
{
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ if (!wndPtr) return;
+ if (wndPtr->dwStyle & WS_DISABLED) {
+ return;
+ }
+
if (captureWnd != 0) return;
winHasCursor = event->window;
- PostMessage( hwnd, WM_SETCURSOR, hwnd, 0 );
+ /* Simulate a mouse motion to set the correct cursor */
+ hardware_event( hwnd, WM_MOUSEMOVE,
+ EVENT_XStateToKeyState( event->state ), 0L,
+ event->x_root & 0xffff, event->y_root & 0xffff,
+ event->time, 0 );
}
diff --git a/windows/graphics.c b/windows/graphics.c
index c5e41b5..1160d3f 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -382,7 +382,7 @@
/***********************************************************************
- * DrawFocusRect (GDI.466)
+ * DrawFocusRect (USER.466)
*/
void DrawFocusRect( HDC hdc, LPRECT rc )
{
diff --git a/windows/message.c b/windows/message.c
index 3782a27..b41dbf8 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -196,10 +196,11 @@
*
* Translate an mouse hardware event into a real mouse message.
* Actions performed:
- * - Translate button down messages in double-clicks.
+ * - Translate button-down messages in double-clicks.
* - Send the WM_NCHITTEST message to find where the cursor is.
* - Translate the message into a non-client message, or translate
* the coordinates to client coordinates.
+ * - Send the WM_SETCURSOR message.
*/
static void MSG_TranslateMouseMsg( MSG *msg )
{
@@ -209,6 +210,8 @@
LONG hittest_result = SendMessage( msg->hwnd, WM_NCHITTEST, 0,
MAKELONG( msg->pt.x, msg->pt.y ) );
+ SendMessage( msg->hwnd, WM_SETCURSOR, msg->hwnd,
+ MAKELONG( hittest_result, msg->message ));
if ((msg->message == WM_LBUTTONDOWN) ||
(msg->message == WM_RBUTTONDOWN) ||
@@ -697,3 +700,13 @@
return GlobalAddAtom( str );
}
+
+/***********************************************************************
+ * GetTickCount (USER.13)
+ */
+DWORD GetTickCount()
+{
+ struct timeval t;
+ gettimeofday( &t, NULL );
+ return (t.tv_sec * 1000) + (t.tv_usec / 1000);
+}
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 79f5893..d326ab9 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -10,6 +10,35 @@
#include "sysmetrics.h"
+static HBITMAP hbitmapClose = 0;
+static HBITMAP hbitmapMinimize = 0;
+static HBITMAP hbitmapMinimizeD = 0;
+static HBITMAP hbitmapMaximize = 0;
+static HBITMAP hbitmapMaximizeD = 0;
+static HBITMAP hbitmapRestore = 0;
+static HBITMAP hbitmapRestoreD = 0;
+
+ /* Hit test code returned when the mouse is captured. */
+ /* Used to direct NC mouse messages to the correct part of the window. */
+static WORD captureHitTest = HTCLIENT;
+
+ /* Point where the current capture started. Used for SC_SIZE and SC_MOVE. */
+static POINT capturePoint;
+
+ /* Current window rectangle when a move or resize is in progress. */
+static RECT sizingRect;
+
+ /* Some useful macros */
+#define HAS_DLGFRAME(style,exStyle) \
+ (((style) & WS_DLGFRAME) && \
+ (((exStyle) & WS_EX_DLGMODALFRAME) || !((style) & WS_BORDER)))
+
+#define HAS_THICKFRAME(style) \
+ (((style) & WS_THICKFRAME) && \
+ !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
+
+#define HAS_MENU(w) (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0))
+
/***********************************************************************
* NC_AdjustRect
*
@@ -18,14 +47,15 @@
*/
static void NC_AdjustRect( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
{
- if ((style & WS_DLGFRAME) &&
- ((exStyle & WS_EX_DLGMODALFRAME) || !(style & WS_BORDER)))
+ if (HAS_DLGFRAME( style, exStyle ))
InflateRect( rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME );
- else if (style & WS_THICKFRAME)
- InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME );
-
- if (style & WS_BORDER)
- InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER );
+ else
+ {
+ if (HAS_THICKFRAME(style))
+ InflateRect( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME );
+ if (style & WS_BORDER)
+ InflateRect( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER );
+ }
if ((style & WS_CAPTION) == WS_CAPTION)
rect->top -= SYSMETRICS_CYCAPTION - 1;
@@ -74,14 +104,12 @@
LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params )
{
RECT tmpRect = { 0, 0, 0, 0 };
- BOOL hasMenu;
- WND *wndPtr = WIN_FindWndPtr( hwnd );
-
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+
if (!wndPtr) return 0;
- hasMenu = (!(wndPtr->dwStyle & WS_CHILD)) && (wndPtr->wIDmenu != 0);
-
- NC_AdjustRect( &tmpRect, wndPtr->dwStyle, hasMenu, wndPtr->dwExStyle );
+ NC_AdjustRect( &tmpRect, wndPtr->dwStyle,
+ HAS_MENU(wndPtr), wndPtr->dwExStyle );
params->rgrc[0].left -= tmpRect.left;
params->rgrc[0].top -= tmpRect.top;
@@ -92,21 +120,45 @@
/***********************************************************************
- * NC_HandleNCHitTest
+ * NC_GetInsideRect
*
- * Handle a WM_NCHITTEST message. Called from DefWindowProc().
+ * Get the 'inside' rectangle of a window, i.e. the whole window rectangle
+ * but without the borders (if any).
+ * The rectangle is in window coordinates (for drawing with GetWindowDC()).
*/
-LONG NC_HandleNCHitTest( HWND hwnd, POINT pt )
+static void NC_GetInsideRect( HWND hwnd, RECT *rect )
+{
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+ rect->top = rect->left = 0;
+ rect->right = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
+ rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
+
+ /* Remove frame from rectangle */
+ if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+ InflateRect( rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME);
+ else
+ {
+ if (HAS_THICKFRAME( wndPtr->dwStyle ))
+ InflateRect( rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME );
+ if (wndPtr->dwStyle & WS_BORDER)
+ InflateRect( rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER );
+ }
+}
+
+
+/***********************************************************************
+ * NC_InternalNCHitTest
+ *
+ * Perform the hit test calculation, but whithout testing the capture
+ * window.
+ */
+static LONG NC_InternalNCHitTest( HWND hwnd, POINT pt )
{
RECT rect;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return HTERROR;
-#ifdef DEBUG_NONCLIENT
- printf( "NC_HandleNCHitTest: hwnd=%x pt=%d,%d\n", hwnd, pt.x, pt.y );
-#endif
-
- if (hwnd == GetCapture()) return HTCLIENT;
GetWindowRect( hwnd, &rect );
if (!PtInRect( &rect, pt )) return HTNOWHERE;
ScreenToClient( hwnd, &pt );
@@ -135,7 +187,7 @@
}
/* Check menu */
- if ((!(wndPtr->dwStyle & WS_CHILD)) && (wndPtr->wIDmenu != 0))
+ if (HAS_MENU(wndPtr))
{
rect.top -= SYSMETRICS_CYMENU + 1;
if (PtInRect( &rect, pt )) return HTMENU;
@@ -163,9 +215,7 @@
}
/* Check non-sizing border */
- if (!(wndPtr->dwStyle & WS_THICKFRAME) ||
- ((wndPtr->dwStyle & (WS_DLGFRAME | WS_BORDER)) == WS_DLGFRAME))
- return HTBORDER;
+ if (!HAS_THICKFRAME( wndPtr->dwStyle )) return HTBORDER;
/* Check top sizing border */
if (pt.y < rect.top)
@@ -205,6 +255,86 @@
/***********************************************************************
+ * NC_HandleNCHitTest
+ *
+ * Handle a WM_NCHITTEST message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCHitTest( HWND hwnd, POINT pt )
+{
+#ifdef DEBUG_NONCLIENT
+ printf( "NC_HandleNCHitTest: hwnd=%x pt=%d,%d\n", hwnd, pt.x, pt.y );
+#endif
+ if (hwnd == GetCapture()) return captureHitTest;
+ return NC_InternalNCHitTest( hwnd, pt );
+}
+
+
+/***********************************************************************
+ * NC_DrawSysButton
+ */
+static void NC_DrawSysButton( HWND hwnd, HDC hdc )
+{
+ RECT rect;
+ BOOL down;
+ HDC hdcMem = CreateCompatibleDC( hdc );
+ if (hdcMem)
+ {
+ NC_GetInsideRect( hwnd, &rect );
+ down = ((GetCapture() == hwnd) && (captureHitTest == HTSYSMENU));
+ SelectObject( hdcMem, hbitmapClose );
+ BitBlt( hdc, rect.left-1, rect.top-1, SYSMETRICS_CXSIZE+1,
+ SYSMETRICS_CYSIZE+1, hdcMem, 0, 0, down ? NOTSRCCOPY : SRCCOPY);
+ DeleteDC( hdcMem );
+ }
+}
+
+
+/***********************************************************************
+ * NC_DrawMaxButton
+ */
+static void NC_DrawMaxButton( HWND hwnd, HDC hdc )
+{
+ RECT rect;
+ BOOL down;
+ HDC hdcMem = CreateCompatibleDC( hdc );
+ if (hdcMem)
+ {
+ NC_GetInsideRect( hwnd, &rect );
+ down = ((GetCapture() == hwnd) && (captureHitTest == HTMAXBUTTON));
+ if (IsZoomed(hwnd))
+ SelectObject( hdcMem, down ? hbitmapRestoreD : hbitmapRestore );
+ else SelectObject( hdcMem, down ? hbitmapMaximizeD : hbitmapMaximize );
+ BitBlt( hdc, rect.right - SYSMETRICS_CXSIZE - 1, rect.top - 1,
+ SYSMETRICS_CXSIZE+2, SYSMETRICS_CYSIZE+2, hdcMem, 0, 0, SRCCOPY);
+ DeleteDC( hdcMem );
+ }
+}
+
+
+/***********************************************************************
+ * NC_DrawMinButton
+ */
+static void NC_DrawMinButton( HWND hwnd, HDC hdc )
+{
+ RECT rect;
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ HDC hdcMem = CreateCompatibleDC( hdc );
+ if (hdcMem)
+ {
+ NC_GetInsideRect( hwnd, &rect );
+ if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
+ rect.right -= SYSMETRICS_CXSIZE + 1;
+ if ((GetCapture() == hwnd) && (captureHitTest == HTMINBUTTON))
+ SelectObject( hdcMem, hbitmapMinimizeD );
+ else SelectObject( hdcMem, hbitmapMinimize );
+ BitBlt( hdc, rect.right - SYSMETRICS_CXSIZE - 1, rect.top - 1,
+ SYSMETRICS_CXSIZE+2, SYSMETRICS_CYSIZE+2, hdcMem, 0, 0, SRCCOPY);
+ DeleteDC( hdcMem );
+ }
+}
+
+
+/***********************************************************************
* NC_DrawFrame
*
* Draw a window frame inside the given rectangle, and update the rectangle.
@@ -278,6 +408,36 @@
/***********************************************************************
+ * NC_DrawMovingFrame
+ *
+ * Draw the frame used when moving or resizing window.
+ */
+static void NC_DrawMovingFrame( HWND hwnd, RECT *rect )
+{
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ HDC hdc = GetDC( 0 );
+
+ if (HAS_THICKFRAME( wndPtr->dwStyle ))
+ {
+ SelectObject( hdc, GetStockObject( GRAY_BRUSH ) );
+ PatBlt( hdc, rect->left, rect->top,
+ rect->right - rect->left - SYSMETRICS_CXFRAME,
+ SYSMETRICS_CYFRAME, PATINVERT );
+ PatBlt( hdc, rect->left, rect->top + SYSMETRICS_CYFRAME,
+ SYSMETRICS_CXFRAME,
+ rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
+ PatBlt( hdc, rect->left + SYSMETRICS_CXFRAME, rect->bottom,
+ rect->right - rect->left - SYSMETRICS_CXFRAME,
+ -SYSMETRICS_CYFRAME, PATINVERT );
+ PatBlt( hdc, rect->right, rect->top, -SYSMETRICS_CXFRAME,
+ rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
+ }
+ else DrawFocusRect( hdc, rect );
+ ReleaseDC( 0, hdc );
+}
+
+
+/***********************************************************************
* NC_DrawCaption
*
* Draw the window caption.
@@ -285,58 +445,55 @@
*/
static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, DWORD style )
{
- RECT r;
- HBRUSH hbrushCaption, hbrushButtons;
+ RECT r = *rect;
+ HBRUSH hbrushCaption;
char buffer[256];
- hbrushButtons = CreateSolidBrush( GetSysColor( COLOR_BTNFACE ) );
+ if (!hbitmapClose)
+ {
+ if (!(hbitmapClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
+ return;
+ hbitmapMinimize = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCE) );
+ hbitmapMinimizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCED) );
+ hbitmapMaximize = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOM) );
+ hbitmapMaximizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOMD) );
+ hbitmapRestore = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORE) );
+ hbitmapRestoreD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORED) );
+ }
+
hbrushCaption = CreateSolidBrush( GetSysColor( COLOR_ACTIVECAPTION ) );
- MoveTo( hdc, rect->left, rect->bottom );
- LineTo( hdc, rect->right-1, rect->bottom );
+ MoveTo( hdc, r.left, r.bottom );
+ LineTo( hdc, r.right-1, r.bottom );
- /* We should probably use OEM bitmaps (OBM_*) here */
if (style & WS_SYSMENU)
{
- r = *rect;
- r.right = r.left + SYSMETRICS_CYSIZE;
- FillRect( hdc, &r, hbrushButtons );
- MoveTo( hdc, r.right, r.top );
- LineTo( hdc, r.right, r.bottom );
- rect->left += SYSMETRICS_CXSIZE + 1;
+ NC_DrawSysButton( hwnd, hdc );
+ r.left += SYSMETRICS_CXSIZE + 1;
+ MoveTo( hdc, r.left - 1, r.top );
+ LineTo( hdc, r.left - 1, r.bottom );
}
if (style & WS_MAXIMIZEBOX)
{
- r = *rect;
- r.left = r.right - SYSMETRICS_CXSIZE;
- FillRect( hdc, &r, hbrushButtons );
- MoveTo( hdc, r.left-1, r.top );
- LineTo( hdc, r.left-1, r.bottom );
- DrawReliefRect( hdc, r, 2, 0 );
- rect->right -= SYSMETRICS_CXSIZE + 1;
+ NC_DrawMaxButton( hwnd, hdc );
+ r.right -= SYSMETRICS_CXSIZE + 1;
}
if (style & WS_MINIMIZEBOX)
{
- r = *rect;
- r.left = r.right - SYSMETRICS_CXSIZE;
- FillRect( hdc, &r, hbrushButtons );
- MoveTo( hdc, r.left-1, r.top );
- LineTo( hdc, r.left-1, r.bottom );
- DrawReliefRect( hdc, r, 2, 0 );
- rect->right -= SYSMETRICS_CXSIZE + 1;
+ NC_DrawMinButton( hwnd, hdc );
+ r.right -= SYSMETRICS_CXSIZE + 1;
}
- FillRect( hdc, rect, hbrushCaption );
+ FillRect( hdc, &r, hbrushCaption );
if (GetWindowText( hwnd, buffer, 256 ))
{
SetTextColor( hdc, GetSysColor( COLOR_CAPTIONTEXT ) );
SetBkMode( hdc, TRANSPARENT );
- DrawText( hdc, buffer, -1, rect,
+ DrawText( hdc, buffer, -1, &r,
DT_SINGLELINE | DT_CENTER | DT_VCENTER );
}
- DeleteObject( hbrushButtons );
DeleteObject( hbrushCaption );
}
@@ -443,19 +600,359 @@
/***********************************************************************
- * NC_HandleNCMouseMsg
+ * NC_HandleNCLButtonDown
*
- * Handle a non-client mouse message. Called from DefWindowProc().
+ * Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc().
*/
-LONG NC_HandleNCMouseMsg( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
{
- switch(wParam) /* Hit test code */
+ HDC hdc = GetWindowDC( hwnd );
+
+ switch(wParam) /* Hit test */
{
+ case HTCAPTION:
+ if (GetCapture() != hwnd)
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_MOVE, lParam );
+ break;
+
case HTSYSMENU:
- if (msg == WM_NCLBUTTONDBLCLK)
- return SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
+ captureHitTest = wParam;
+ SetCapture( hwnd );
+ NC_DrawSysButton( hwnd, hdc );
+ break;
+
+ case HTMENU:
+ break;
+
+ case HTHSCROLL:
+ if (GetCapture() != hwnd)
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_HSCROLL, lParam );
+ break;
+
+ case HTVSCROLL:
+ if (GetCapture() != hwnd)
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_VSCROLL, lParam );
+ break;
+
+ case HTMINBUTTON:
+ captureHitTest = wParam;
+ SetCapture( hwnd );
+ NC_DrawMinButton( hwnd, hdc );
+ break;
+
+ case HTMAXBUTTON:
+ captureHitTest = wParam;
+ SetCapture( hwnd );
+ NC_DrawMaxButton( hwnd, hdc );
+ break;
+
+ case HTLEFT:
+ case HTRIGHT:
+ case HTTOP:
+ case HTTOPLEFT:
+ case HTTOPRIGHT:
+ case HTBOTTOM:
+ case HTBOTTOMLEFT:
+ case HTBOTTOMRIGHT:
+ if (GetCapture() != hwnd)
+ SendMessage( hwnd, WM_SYSCOMMAND,
+ SC_SIZE + wParam - HTLEFT + 1, lParam );
+ break;
+
+ case HTBORDER:
+ break;
+ }
+
+ ReleaseDC( hwnd, hdc );
+ return 0;
+}
+
+
+/***********************************************************************
+ * NC_HandleNCLButtonUp
+ *
+ * Handle a WM_NCLBUTTONUP message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCLButtonUp( HWND hwnd, WORD wParam, LONG lParam )
+{
+ HDC hdc;
+ WORD hittest;
+
+ if (hwnd != GetCapture()) return 0;
+
+ ReleaseCapture();
+ captureHitTest = HTCLIENT;
+ hdc = GetWindowDC( hwnd );
+ hittest = NC_InternalNCHitTest( hwnd, MAKEPOINT(lParam) );
+
+ switch(wParam) /* Hit test */
+ {
+ case HTCAPTION: /* End of window moving */
+ NC_DrawMovingFrame( hwnd, &sizingRect );
+ SetWindowPos( hwnd, 0, sizingRect.left, sizingRect.top, 0, 0,
+ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER );
+ break;
+
+ case HTSYSMENU:
+ NC_DrawSysButton( hwnd, hdc );
+ break;
+
+ case HTMENU:
+ case HTHSCROLL:
+ case HTVSCROLL:
+ break;
+
+ case HTMINBUTTON:
+ NC_DrawMinButton( hwnd, hdc );
+ if (hittest == HTMINBUTTON)
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_MINIMIZE, lParam );
+ break;
+
+ case HTMAXBUTTON:
+ NC_DrawMaxButton( hwnd, hdc );
+ if (hittest == HTMAXBUTTON)
+ {
+ if (IsZoomed(hwnd))
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_RESTORE, lParam );
+ else SendMessage( hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, lParam );
+ }
+ break;
+
+ case HTLEFT:
+ case HTRIGHT:
+ case HTTOP:
+ case HTTOPLEFT:
+ case HTTOPRIGHT:
+ case HTBOTTOM:
+ case HTBOTTOMLEFT:
+ case HTBOTTOMRIGHT: /* End of window resizing */
+ NC_DrawMovingFrame( hwnd, &sizingRect );
+ SetWindowPos( hwnd, 0, sizingRect.left, sizingRect.top,
+ sizingRect.right - sizingRect.left,
+ sizingRect.bottom - sizingRect.top,
+ SWP_NOACTIVATE | SWP_NOZORDER );
+ break;
+
+ case HTBORDER:
+ break;
+ }
+ ReleaseDC( hwnd, hdc );
+ return 0;
+}
+
+
+/***********************************************************************
+ * NC_HandleNCLButtonDblClk
+ *
+ * Handle a WM_NCLBUTTONDBLCLK message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam )
+{
+ switch(wParam) /* Hit test */
+ {
+ case HTCAPTION:
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, lParam );
+ break;
+
+ case HTSYSMENU:
+ SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
break;
}
return 0;
}
+
+/***********************************************************************
+ * NC_HandleNCMouseMove
+ *
+ * Handle a WM_NCMOUSEMOVE message. Called from DefWindowProc().
+ */
+LONG NC_HandleNCMouseMove( HWND hwnd, WORD wParam, POINT pt )
+{
+ RECT newRect;
+
+ if (hwnd != GetCapture()) return 0;
+ newRect = sizingRect;
+
+ switch(wParam) /* Hit test */
+ {
+ case HTCAPTION:
+ OffsetRect( &newRect, pt.x - capturePoint.x, pt.y - capturePoint.y);
+ break;
+
+ case HTLEFT:
+ newRect.left += pt.x - capturePoint.x;
+ break;
+
+ case HTRIGHT:
+ newRect.right += pt.x - capturePoint.x;
+ break;
+
+ case HTTOP:
+ newRect.top += pt.y - capturePoint.y;
+ break;
+
+ case HTTOPLEFT:
+ newRect.left += pt.x - capturePoint.x;
+ newRect.top += pt.y - capturePoint.y;
+ break;
+
+ case HTTOPRIGHT:
+ newRect.right += pt.x - capturePoint.x;
+ newRect.top += pt.y - capturePoint.y;
+ break;
+
+ case HTBOTTOM:
+ newRect.bottom += pt.y - capturePoint.y;
+ break;
+
+ case HTBOTTOMLEFT:
+ newRect.left += pt.x - capturePoint.x;
+ newRect.bottom += pt.y - capturePoint.y;
+ break;
+
+ case HTBOTTOMRIGHT:
+ newRect.right += pt.x - capturePoint.x;
+ newRect.bottom += pt.y - capturePoint.y;
+ break;
+
+ default:
+ return 0; /* Nothing to do */
+ }
+
+ NC_DrawMovingFrame( hwnd, &sizingRect );
+ NC_DrawMovingFrame( hwnd, &newRect );
+ capturePoint = pt;
+ sizingRect = newRect;
+
+ return 0;
+}
+
+
+/***********************************************************************
+ * NC_HandleSysCommand
+ *
+ * Handle a WM_SYSCOMMAND message. Called from DefWindowProc().
+ */
+LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt )
+{
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+#ifdef DEBUG_NONCLIENT
+ printf( "Handling WM_SYSCOMMAND %x %d,%d\n", wParam, pt.x, pt.y );
+#endif
+
+ switch (wParam & 0xfff0)
+ {
+ case SC_SIZE:
+ if (!HAS_THICKFRAME(wndPtr->dwStyle)) break;
+ if (IsZoomed(hwnd) || IsIconic(hwnd)) break;
+ if (wParam & 0x0f) captureHitTest = (wParam & 0x0f) + HTLEFT - 1;
+ else captureHitTest = HTBORDER;
+ capturePoint = pt;
+ SetCapture( hwnd );
+ GetWindowRect( hwnd, &sizingRect );
+ NC_DrawMovingFrame( hwnd, &sizingRect );
+ break;
+
+ case SC_MOVE:
+ if (!(wndPtr->dwStyle & WS_CAPTION)) break;
+ if (IsZoomed(hwnd) || IsIconic(hwnd)) break;
+ captureHitTest = HTCAPTION;
+ capturePoint = pt;
+ SetCapture( hwnd );
+ GetWindowRect( hwnd, &sizingRect );
+ NC_DrawMovingFrame( hwnd, &sizingRect );
+ break;
+
+ case SC_MINIMIZE:
+ ShowWindow( hwnd, SW_MINIMIZE );
+ break;
+
+ case SC_MAXIMIZE:
+ ShowWindow( hwnd, SW_MAXIMIZE );
+ break;
+
+ case SC_RESTORE:
+ ShowWindow( hwnd, SW_RESTORE );
+ break;
+
+ case SC_NEXTWINDOW:
+ case SC_PREVWINDOW:
+ break;
+
+ case SC_CLOSE:
+ return SendMessage( hwnd, WM_CLOSE, 0, 0 );
+
+ case SC_VSCROLL:
+ case SC_HSCROLL:
+ case SC_MOUSEMENU:
+ case SC_KEYMENU:
+ case SC_ARRANGE:
+ break;
+
+ case SC_TASKLIST:
+ case SC_SCREENSAVE:
+ case SC_HOTKEY:
+ break;
+ }
+ return 0;
+}
+
+
+/***********************************************************************
+ * NC_HandleSetCursor
+ *
+ * Handle a WM_SETCURSOR message. Called from DefWindowProc().
+ */
+LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
+{
+ if (hwnd != wParam) return 0; /* Don't set the cursor for child windows */
+
+ switch(LOWORD(lParam))
+ {
+ case HTERROR:
+ {
+ WORD msg = HIWORD( lParam );
+ if ((msg == WM_LBUTTONDOWN) || (msg == WM_MBUTTONDOWN) ||
+ (msg == WM_RBUTTONDOWN))
+ MessageBeep(0);
+ }
+ break;
+
+ case HTCLIENT:
+ {
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ if (wndPtr && wndPtr->hCursor)
+ {
+ SetCursor( wndPtr->hCursor );
+ return TRUE;
+ }
+ }
+ break;
+
+ case HTLEFT:
+ case HTRIGHT:
+ SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
+ return TRUE;
+
+ case HTTOP:
+ case HTBOTTOM:
+ SetCursor( LoadCursor( 0, IDC_SIZENS ) );
+ return TRUE;
+
+ case HTTOPLEFT:
+ case HTBOTTOMRIGHT:
+ SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
+ return TRUE;
+
+ case HTTOPRIGHT:
+ case HTBOTTOMLEFT:
+ SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
+ return TRUE;
+ }
+
+ /* Default cursor: arrow */
+ SetCursor( LoadCursor( 0, IDC_ARROW ) );
+ return TRUE;
+}
diff --git a/windows/painting.c b/windows/painting.c
index 2aeaba2..c218e23 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -33,13 +33,14 @@
if (wndPtr->hrgnUpdate)
{
- DeleteObject( wndPtr->hrgnUpdate );
wndPtr->hrgnUpdate = 0;
MSG_DecPaintCount( wndPtr->hmemTaskQ );
}
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
SendMessage( hwnd, WM_NCPAINT, hrgnUpdate, 0 );
+ if (hrgnUpdate) DeleteObject( hrgnUpdate );
+
if (!(wndPtr->flags & WIN_ERASE_UPDATERGN)) lps->fErase = TRUE;
else lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
diff --git a/windows/win.c b/windows/win.c
index 810503c..95730dd 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -22,7 +22,7 @@
extern void EVENT_RegisterWindow( Window w, HWND hwnd ); /* event.c */
-static HWND firstWindow = 0;
+HWND firstWindow = 0;
/***********************************************************************
* WIN_FindWndPtr
@@ -240,6 +240,11 @@
wndPtr->rectWindow.right = x + width;
wndPtr->rectWindow.bottom = y + height;
wndPtr->rectClient = wndPtr->rectWindow;
+ wndPtr->rectNormal = wndPtr->rectWindow;
+ wndPtr->ptIconPos.x = -1;
+ wndPtr->ptIconPos.y = -1;
+ wndPtr->ptMaxPos.x = -1;
+ wndPtr->ptMaxPos.y = -1;
wndPtr->hmemTaskQ = GetTaskQueue(0);
wndPtr->hrgnUpdate = 0;
wndPtr->hwndLastActive = 0;
@@ -281,10 +286,9 @@
/* Create the X window */
win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
- PointerMotionMask | ButtonPressMask |
- ButtonReleaseMask | StructureNotifyMask |
- FocusChangeMask | EnterWindowMask;
- win_attr.override_redirect = /*True*/ False;
+ PointerMotionMask | ButtonPressMask |
+ ButtonReleaseMask | FocusChangeMask | EnterWindowMask;
+ win_attr.override_redirect = True;
win_attr.colormap = COLOR_WinColormap;
if (style & WS_CHILD)
{
@@ -360,12 +364,14 @@
/* Create scrollbars */
+#if 0
if (windowName != NULL) SetWindowText(hwnd, windowName);
if ((style & WS_CAPTION) == WS_CAPTION) {
wndPtr->hWndCaption = CreateWindow("CAPTION", "",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, -20, width, 20, hwnd, 1, instance, 0L);
}
+#endif
if (((style & WS_CHILD) != WS_CHILD) && (wndPtr->wIDmenu != 0)) {
lpbar = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
if (lpbar != NULL) {
@@ -434,6 +440,7 @@
/* Destroy the window */
+ wndPtr->dwMagic = 0; /* Mark it as invalid */
XDestroyWindow( display, wndPtr->window );
if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce );
classPtr->cWindows--;
@@ -555,6 +562,86 @@
}
+
+/*******************************************************************
+ * WIN_SetSensitive
+ *
+ * sets hWnd and all children to the same sensitivity
+ *
+ * sets hWnd sensitive and then calls SetSensitive on hWnd's child
+ * and all of hWnd's child's Next windows
+ */
+static BOOL WIN_SetSensitive(HWND hWnd, BOOL fEnable)
+{
+ WND *wndPtr;
+ HWND hwnd;
+
+ printf("in SetSenitive\n");
+
+ if (!hWnd) return 0;
+ if (!(wndPtr = WIN_FindWndPtr(hWnd))) return 0;
+
+
+ if (fEnable) {
+ wndPtr->dwStyle &= ~WS_DISABLED;
+ } else {
+ wndPtr->dwStyle |= WS_DISABLED;
+ }
+
+ hwnd=wndPtr->hwndChild;
+ while (hwnd) { /* mk next child sens */
+ WIN_SetSensitive(hwnd, fEnable);
+ if ( !(wndPtr=WIN_FindWndPtr(hwnd)) ) return 0;
+ hwnd=wndPtr->hwndNext;
+ }
+ return 1;
+
+}
+
+/*******************************************************************
+ * EnableWindow (USER.34)
+ *
+ *
+ */
+
+BOOL EnableWindow(HWND hWnd, BOOL fEnable)
+{
+ WND *wndPtr;
+ int eprev;
+
+ if (hWnd == 0) return 0;
+
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == 0) return 0;
+
+ eprev = ! (wndPtr->dwStyle & WS_DISABLED);
+
+ if (fEnable != eprev) { /* change req */
+ printf("changing window\n");
+ WIN_SetSensitive(hWnd, fEnable);
+ SendMessage(hWnd, WM_ENABLE, (WORD)fEnable, 0);
+ }
+ return !eprev;
+}
+
+/***********************************************************************
+ * IsWindowEnabled (USER.35)
+ */
+
+BOOL IsWindowEnabled(HWND hWnd)
+{
+ WND * wndPtr;
+
+ if (hWnd == 0) return 0;
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == 0) return 0;
+
+ return !(wndPtr->dwStyle & WS_DISABLED);
+}
+
+
+
+
/**********************************************************************
* GetWindowLong (USER.135)
*/
diff --git a/windows/winpos.c b/windows/winpos.c
index 884f411..ad23161 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -60,6 +60,44 @@
/*******************************************************************
+ * WindowFromPoint (USER.30)
+ */
+HWND WindowFromPoint( POINT pt )
+{
+ RECT rect;
+ HWND hwnd = firstWindow;
+ while (hwnd)
+ {
+ GetWindowRect( hwnd, &rect );
+ if (PtInRect( &rect, pt )) return hwnd;
+ hwnd = GetWindow( hwnd, GW_HWNDNEXT );
+ }
+ return 0;
+}
+
+
+/*******************************************************************
+ * ChildWindowFromPoint (USER.191)
+ */
+HWND ChildWindowFromPoint( HWND hwndParent, POINT pt )
+{
+ RECT rect;
+ HWND hwnd;
+
+ GetWindowRect( hwndParent, &rect );
+ if (!PtInRect( &rect, pt )) return 0;
+ hwnd = GetTopWindow( hwndParent );
+ while (hwnd)
+ {
+ GetWindowRect( hwnd, &rect );
+ if (PtInRect( &rect, pt )) return hwnd;
+ hwnd = GetWindow( hwnd, GW_HWNDNEXT );
+ }
+ return 0;
+}
+
+
+/*******************************************************************
* MapWindowPoints (USER.258)
*/
void MapWindowPoints( HWND hwndFrom, HWND hwndTo, LPPOINT lppt, WORD count )
@@ -119,6 +157,15 @@
/***********************************************************************
+ * BringWindowToTop (USER.45)
+ */
+BOOL BringWindowToTop( HWND hwnd )
+{
+ return SetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
+}
+
+
+/***********************************************************************
* MoveWindow (USER.56)
*/
BOOL MoveWindow( HWND hwnd, short x, short y, short cx, short cy, BOOL repaint)
@@ -196,6 +243,75 @@
/***********************************************************************
+ * GetInternalWindowPos (USER.460)
+ */
+WORD GetInternalWindowPos( HWND hwnd, LPRECT rectWnd, LPPOINT ptIcon )
+{
+ WINDOWPLACEMENT wndpl;
+ if (!GetWindowPlacement( hwnd, &wndpl )) return 0;
+ if (rectWnd) *rectWnd = wndpl.rcNormalPosition;
+ if (ptIcon) *ptIcon = wndpl.ptMinPosition;
+ return wndpl.showCmd;
+}
+
+
+/***********************************************************************
+ * SetInternalWindowPos (USER.461)
+ */
+void SetInternalWindowPos( HWND hwnd, WORD showCmd, LPRECT rect, LPPOINT pt )
+{
+ WINDOWPLACEMENT wndpl;
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+ wndpl.length = sizeof(wndpl);
+ wndpl.flags = (pt != NULL) ? WPF_SETMINPOSITION : 0;
+ wndpl.showCmd = showCmd;
+ if (pt) wndpl.ptMinPosition = *pt;
+ wndpl.rcNormalPosition = (rect != NULL) ? *rect : wndPtr->rectNormal;
+ wndpl.ptMaxPosition = wndPtr->ptMaxPos;
+ SetWindowPlacement( hwnd, &wndpl );
+}
+
+
+/***********************************************************************
+ * GetWindowPlacement (USER.370)
+ */
+BOOL GetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
+{
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ if (!wndPtr) return FALSE;
+
+ wndpl->length = sizeof(*wndpl);
+ wndpl->flags = 0;
+ wndpl->showCmd = IsZoomed(hwnd) ? SW_SHOWMAXIMIZED :
+ (IsIconic(hwnd) ? SW_SHOWMINIMIZED : SW_SHOWNORMAL);
+ wndpl->ptMinPosition = wndPtr->ptIconPos;
+ wndpl->ptMaxPosition = wndPtr->ptMaxPos;
+ wndpl->rcNormalPosition = wndPtr->rectNormal;
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * SetWindowPlacement (USER.371)
+ */
+BOOL SetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
+{
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ if (!wndPtr) return FALSE;
+
+ if (wndpl->flags & WPF_SETMINPOSITION)
+ wndPtr->ptIconPos = wndpl->ptMinPosition;
+ if ((wndpl->flags & WPF_RESTORETOMAXIMIZED) &&
+ (wndpl->showCmd == SW_SHOWMINIMIZED)) wndPtr->flags |= WIN_RESTORE_MAX;
+ wndPtr->ptMaxPos = wndpl->ptMaxPosition;
+ wndPtr->rectNormal = wndpl->rcNormalPosition;
+ ShowWindow( hwnd, wndpl->showCmd );
+ return TRUE;
+}
+
+
+/***********************************************************************
* SetWindowPos (USER.232)
*/
/* Unimplemented flags: SWP_NOREDRAW, SWP_NOACTIVATE