diff --git a/ChangeLog b/ChangeLog index 5c2f74716ec..1aa6162638a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,73 @@ +Thu Jan 13 11:45:13 1994 John Richardson + + * [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 * [window/caret.c] @@ -84,7 +154,6 @@ Tue Jan 11 05:27:45 1994 julliard@di.epfl.ch (Alexandre Julliard Added sending of the WM_NCPAINT message in SetWindowPos(). Removed the Xt code. ----------------------------------------------------------------------- Sun Jan 2 12:38:53 1994 David Metcalfe * [windows/class.c] diff --git a/Makefile b/Makefile index 21c7cab4a09..033a5bf9c88 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ LDFLAGS= ###################################################################### # 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 52863a7bf14..1b23e0588b4 100644 --- a/README +++ b/README @@ -41,6 +41,12 @@ For example: to run Windows' solitaire: 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 520a1120766..fb915e7b0ad 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 176577d7234..00000000000 --- 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 -#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 5d426fc6f69..00000000000 --- 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 -#include -#include - -#include - -#include -#include -#include "SmeMenuButtP.h" -#include - -#include - -#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 72c9a514fbd..00000000000 --- 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 - -#include - -/**************************************************************** - * - * 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 e05da8eeff6..00000000000 --- 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 -#include -#include -#include -#include -#include "WinCommandP.h" -#include - -#define DEFAULT_HIGHLIGHT_THICKNESS 2 -#define DEFAULT_SHAPE_HIGHLIGHT 32767 - -/**************************************************************** - * - * Full class record constant - * - ****************************************************************/ - -/* Private Data */ - -static char defaultTranslations[] = - ": highlight() \n\ - : reset() \n\ - : set() \n\ - : 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 0b69e06e53b..00000000000 --- 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 5f799311386..00000000000 --- 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 f079ed7ceea..00000000000 --- 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 -#include -#include -#include -#include "WinLabelP.h" -#include -#include -#include -#include - -#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 de285da3bb8..00000000000 --- 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 - -/* 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 f84c2b75a86..00000000000 --- 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 - -/* 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 e5d45b1cd96..00000000000 --- 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 71508e0efa1..00000000000 --- 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 -#include -#include - -#include -#include "WinMenuButtP.h" - -static void ClassInitialize(); -static void PopupMenu(); - -#define superclass ((WinCommandWidgetClass)&winCommandClassRec) - -static char defaultTranslations[] = - ": highlight() \n\ - : reset() \n\ - : 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 3dcb3f3d91f..00000000000 --- 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 c8e32b9794a..f4af8dca75b 100644 --- a/controls/combo.c +++ b/controls/combo.c @@ -21,6 +21,8 @@ static char Copyright[] = "Copyright Martin Ayotte, 1993"; #include #include +HBITMAP hComboBit = 0; + LPHEADCOMBO ComboGetStorageHeader(HWND hwnd); int CreateComboStruct(HWND hwnd); @@ -37,12 +39,21 @@ LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) 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 @@ LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) #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 @@ LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) 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 4a01b2fff4e..8c43e6fd423 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -9,11 +9,6 @@ static char Copyright2[] = "Copyright Martin Ayotte, 1993"; #include #include -#include -#include -#include -#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 439be8dc7ee..47da5bfee9f 100644 --- a/controls/scroll.c +++ b/controls/scroll.c @@ -205,7 +205,9 @@ LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) 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 f2e2baae437..16a55487b05 100644 --- a/if1632/gdi.spec +++ b/if1632/gdi.spec @@ -43,9 +43,8 @@ length 490 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 24c3e249734..ebd04eaa250 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -23,9 +23,12 @@ length 540 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 @@ length 540 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 @@ length 540 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 @@ length 540 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 @@ length 540 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 00000000000..a783b3216b7 --- /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 437dfd98c38..d4f6fd87b1d 100644 --- a/include/segmem.h +++ b/include/segmem.h @@ -69,4 +69,10 @@ static __inline__ int Is16bitAddress(void *address) 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 8bb8d5756f4..12800c76304 100644 --- a/include/win.h +++ b/include/win.h @@ -26,6 +26,9 @@ typedef struct tagWND 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 @@ typedef struct tagWND #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 7cfecdc2e66..a4064c3be81 100644 --- a/include/windows.h +++ b/include/windows.h @@ -111,6 +111,19 @@ typedef int *LPCATCHBUF; #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 @@ typedef struct 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 @@ typedef struct #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,FindAtom,LPCSTR,a) 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,ShowCursor,BOOL,a) 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,ShowCaret,HWND,a) 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,IsDlgButtonChecked,HWND,a,WORD,b) 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,Throw,LPCATCHBUF,a,int,b) 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,GetProfileInt,LPSTR,a,LPSTR,b,int,c) 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,FillWindow,HWND,a,HWND,b,HDC,c,HBRUSH,d) 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 039c1c35bf9..3bf757730f3 100644 --- a/loader/cursor.c +++ b/loader/cursor.c @@ -77,6 +77,14 @@ HCURSOR LoadCursor(HANDLE instance, LPSTR cursor_name) 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 5edee7fa4d7..38ad26fee30 100644 --- a/loader/selector.c +++ b/loader/selector.c @@ -62,6 +62,35 @@ extern int Argc; * 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 @@ CreateSelectors(struct w_files * wpnt) 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 @@ CreateSelectors(struct w_files * wpnt) 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 e97ce84d2e0..252f5fb90bf 100644 --- a/memory/heap.c +++ b/memory/heap.c @@ -6,8 +6,16 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #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 @@ -273,13 +281,50 @@ HEAP_Free(MDESC **free_list, void *block) return 0; } +/********************************************************************** + * 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 @@ LocalAlloc(int flags, int bytes) #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 @@ LocalCompact(int min_free) 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 @@ LocalFlags(unsigned int handle) { 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 @@ LocalFree(unsigned int handle) { 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 @@ LocalFree(unsigned int handle) 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 @@ LocalLock(unsigned int handle) { 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 @@ LocalReAlloc(unsigned int handle, int flags, int bytes) { 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 @@ LocalSize(unsigned int handle) { 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 @@ LocalUnlock(unsigned int handle) { 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 6fa5c19a167..f72ab80c637 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 c0db9d590ff..ca65c0d5ede 100644 --- a/misc/comm.c +++ b/misc/comm.c @@ -25,6 +25,8 @@ struct DosDeviceStruct { char *devicename; /* /dev/cua1 */ int fd; int suspended; + int unget; + int unget_byte; }; struct DosDeviceStruct COM[MAX_PORTS]; @@ -83,15 +85,6 @@ void Comm_Init(void) } 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 @@ void Comm_DeInit(void) 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 @@ int UngetCommChar(int fd, char chUnget) #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 @@ fprintf(stderr,"UngetCommChar: fd %d (char %d)\n", fd, chUnget); 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 @@ fprintf(stderr,"ReadComm: fd %d, ptr %d, length %d\n", fd, lpvBuf, cbRead); 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 @@ fprintf(stderr,"WriteComm: fd %d, ptr %d, length %d\n", fd, lpvBuf, cbWrite); 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 57aed8d6ebd..b8f052e77a4 100644 --- a/misc/dos_fs.c +++ b/misc/dos_fs.c @@ -338,8 +338,9 @@ char *GetDirectUnixFileName(char *dosfilename) { /* 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 8bbace75dfa..e20e53a3c09 100644 --- a/misc/exec.c +++ b/misc/exec.c @@ -73,7 +73,7 @@ BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData) 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 @@ BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData) } return(TRUE); } - - diff --git a/misc/kernel.c b/misc/kernel.c index ea3c3c0e149..3cdd9504158 100644 --- a/misc/kernel.c +++ b/misc/kernel.c @@ -5,6 +5,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #include #include "prototypes.h" #include "regfunc.h" +#include "options.h" extern unsigned short WIN_StackSize; @@ -48,7 +49,7 @@ KERNEL_InitTask() _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 00000000000..c371d01cd90 --- /dev/null +++ b/misc/main.c @@ -0,0 +1,120 @@ +/* + * Main function. + * + * Copyright 1994 Alexandre Julliard + */ + +static char Copyright[] = "Copyright Alexandre Julliard, 1994"; + +#include +#include +#include + +#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 cde516415a0..f6fb52f3e4e 100644 --- a/misc/message.c +++ b/misc/message.c @@ -108,6 +108,9 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) 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 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) 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 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) } 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 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) 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 @@ return(0); +/************************************************************************* + * "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 d45ebb2a2f3..86e5791844f 100644 --- a/misc/spy.c +++ b/misc/spy.c @@ -5,9 +5,12 @@ #include #include +#include +#include #include "wineopts.h" #include "windows.h" #include "wine.h" +#include "options.h" #ifndef NOSPY @@ -244,9 +247,14 @@ void SpyInit(void) 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 44585210255..00000000000 --- 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 -#include - -#include -#include -#include -#include - -#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 c4ed6bc516c..7b0d4ae366f 100644 --- a/objects/bitblt.c +++ b/objects/bitblt.c @@ -113,9 +113,9 @@ BOOL BitBlt( HDC hdcDest, short xDest, short yDest, short width, short height, /*********************************************************************** - * 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 @@ BOOL StrechBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short he /*#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 19065ea81d8..8eb9c2e5b91 100644 --- a/objects/color.c +++ b/objects/color.c @@ -10,17 +10,12 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #include #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 @@ static int COLOR_FillDefaultMap() 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 @@ static int COLOR_FillDefaultMap() * * Fill the private colormap. */ -#ifdef USE_PRIVATE_MAP - static BOOL COLOR_BuildMap( Colormap map, int depth, int size ) { XColor color; @@ -99,7 +92,7 @@ static BOOL COLOR_BuildMap( Colormap map, int depth, int size ) color.red = r; color.green = g; color.blue = b; - XStoreColor( XT_display, map, &color ); + XStoreColor( display, map, &color ); } } @@ -107,46 +100,47 @@ static BOOL COLOR_BuildMap( Colormap map, int depth, int size ) 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 dc75bc1bcca..95bb0f0fc85 100644 --- a/windows/defwnd.c +++ b/windows/defwnd.c @@ -12,12 +12,15 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #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 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam ) CLASS * classPtr; LPSTR textPtr; int len; - int tempwidth, tempheight; WND * wndPtr = WIN_FindWndPtr( hwnd ); #ifdef DEBUG_MESSAGE @@ -63,10 +65,16 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam ) 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 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam ) 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 b2de49f5500..ba1c0a363d2 100644 --- a/windows/event.c +++ b/windows/event.c @@ -117,7 +117,6 @@ static void EVENT_EnterNotify( HWND hwnd, XCrossingEvent *event ); 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 @@ void EVENT_ProcessEvent( XEvent *event ) 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 @@ static void EVENT_key( HWND hwnd, XKeyEvent *event ) 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_key( HWND hwnd, XKeyEvent *event ) */ 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 void EVENT_ButtonPress( HWND hwnd, XButtonEvent *event ) 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 void EVENT_ButtonRelease( HWND hwnd, XButtonEvent *event ) 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 @@ static void EVENT_ButtonRelease( HWND hwnd, XButtonEvent *event ) } -/*********************************************************************** - * 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_FocusIn( HWND hwnd, XFocusChangeEvent *event ) */ 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_FocusOut( HWND hwnd, XFocusChangeEvent *event ) */ 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 c5e41b5a3d5..1160d3fec87 100644 --- a/windows/graphics.c +++ b/windows/graphics.c @@ -382,7 +382,7 @@ BOOL FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush ) /*********************************************************************** - * DrawFocusRect (GDI.466) + * DrawFocusRect (USER.466) */ void DrawFocusRect( HDC hdc, LPRECT rc ) { diff --git a/windows/message.c b/windows/message.c index 3782a279e04..b41dbf88b5c 100644 --- a/windows/message.c +++ b/windows/message.c @@ -196,10 +196,11 @@ static void MSG_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos ) * * 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 @@ static void MSG_TranslateMouseMsg( MSG *msg ) 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 @@ WORD RegisterWindowMessage( LPCSTR str ) 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 79f58937518..d326ab91528 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -10,6 +10,35 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1994"; #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 char Copyright[] = "Copyright Alexandre Julliard, 1994"; */ 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 @@ void AdjustWindowRectEx( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle ) 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 @@ LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params ) /*********************************************************************** - * 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 @@ LONG NC_HandleNCHitTest( HWND hwnd, POINT pt ) } /* 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 @@ LONG NC_HandleNCHitTest( HWND hwnd, POINT pt ) } /* 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) @@ -204,6 +254,86 @@ LONG NC_HandleNCHitTest( HWND hwnd, POINT pt ) } +/*********************************************************************** + * 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 * @@ -277,6 +407,36 @@ static void NC_DrawFrame( HDC hdc, RECT *rect, BOOL dlgFrame ) } +/*********************************************************************** + * 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 * @@ -285,58 +445,55 @@ static void NC_DrawFrame( HDC hdc, RECT *rect, BOOL dlgFrame ) */ 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 @@ LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn ) /*********************************************************************** - * 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 2aeaba2f223..c218e237546 100644 --- a/windows/painting.c +++ b/windows/painting.c @@ -33,13 +33,14 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps ) 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 810503cadb7..95730dd6601 100644 --- a/windows/win.c +++ b/windows/win.c @@ -22,7 +22,7 @@ extern Colormap COLOR_WinColormap; extern void EVENT_RegisterWindow( Window w, HWND hwnd ); /* event.c */ -static HWND firstWindow = 0; +HWND firstWindow = 0; /*********************************************************************** * WIN_FindWndPtr @@ -240,6 +240,11 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, 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 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, /* 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 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, /* 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 @@ BOOL DestroyWindow( HWND hwnd ) /* 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 @@ WORD SetWindowWord( HWND hwnd, short offset, WORD newval ) } + +/******************************************************************* + * 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 884f411abfc..ad231611564 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -59,6 +59,44 @@ void ScreenToClient( HWND hwnd, LPPOINT lppnt ) } +/******************************************************************* + * 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) */ @@ -118,6 +156,15 @@ BOOL IsZoomed(HWND hWnd) } +/*********************************************************************** + * BringWindowToTop (USER.45) + */ +BOOL BringWindowToTop( HWND hwnd ) +{ + return SetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); +} + + /*********************************************************************** * MoveWindow (USER.56) */ @@ -195,6 +242,75 @@ BOOL ShowWindow( HWND hwnd, int cmd ) } +/*********************************************************************** + * 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) */