mirror of
https://github.com/gnustep/libs-back.git
synced 2025-02-24 04:11:28 +00:00
window and toolbar issues (See Source/win32/RELEASE_NOTES for more info). * Headers/win32/WIN32Server.h: Added ivars and flags and methods. * Headers/winlib/WIN32GState.h: Added method to avoid confliting types with superclass. * Source/win32/GNUmakefile: Add new files. * w32_debug.m, w32_activate.m, w32_create.m, w32_general.m, w32_movesize.m, w32_text_focus.m, w32_windowdisplay.m, GSDisplayServer_details.m: New files. * Source/win32/WIN32Server.m: Large changes. Merged with WIN32ServerEvent. Lots of documentation. * Source/winlib/WIN32GState.m: Variable name changes to avoid shadowing. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@21716 72102866-910b-0410-8b05-ffd578937521
391 lines
11 KiB
Objective-C
391 lines
11 KiB
Objective-C
/* WIN32Server - Implements window handling for MSWindows
|
||
|
||
Copyright (C) 2005 Free Software Foundation, Inc.
|
||
|
||
Written by: Fred Kiefer <FredKiefer@gmx.de>
|
||
Date: March 2002
|
||
Part of this code have been written by:
|
||
Tom MacSween <macsweent@sympatico.ca>
|
||
Date August 2005
|
||
This file is part of the GNU Objective C User Interface Library.
|
||
|
||
This library is free software; you can redistribute it and/or
|
||
modify it under the terms of the GNU Library General Public
|
||
License as published by the Free Software Foundation; either
|
||
version 2 of the License, or (at your option) any later version.
|
||
|
||
This library is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
Library General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Library General Public
|
||
License along with this library; if not, write to the Free
|
||
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA.
|
||
*/
|
||
|
||
|
||
#include "w32_Events.h"
|
||
|
||
@implementation WIN32Server (w32_General)
|
||
/*
|
||
|
||
WM_CLOSE Notification
|
||
|
||
The WM_CLOSE message is sent as a signal that a window or an
|
||
application should terminate.
|
||
|
||
A window receives this message through its WindowProc function.
|
||
|
||
Syntax
|
||
|
||
WM_CLOSE
|
||
|
||
WPARAM wParam
|
||
LPARAM lParam;
|
||
|
||
Parameters
|
||
|
||
wParam
|
||
This parameter is not used.
|
||
lParam
|
||
This parameter is not used.
|
||
|
||
Return Value
|
||
If an application processes this message, it should return zero.
|
||
|
||
Remarks
|
||
|
||
An application can prompt the user for confirmation, prior to
|
||
destroying a window, by processing the WM_CLOSE message and calling
|
||
the DestroyWindow function only if the user confirms the choice.
|
||
|
||
By default, the DefWindowProc function calls the DestroyWindow
|
||
function to destroy the window.
|
||
|
||
*/
|
||
- (void) decodeWM_CLOSEParams:(WPARAM)wParam :(LPARAM)lParam :(HWND)hwnd;
|
||
{
|
||
NSEvent * ev;
|
||
NSPoint eventLocation = NSMakePoint(0,0);
|
||
ev = [NSEvent otherEventWithType: NSAppKitDefined
|
||
location: eventLocation
|
||
modifierFlags: 0
|
||
timestamp: 0
|
||
windowNumber: (int)hwnd
|
||
context: GSCurrentContext()
|
||
subtype: GSAppKitWindowClose
|
||
data1: 0
|
||
data2: 0];
|
||
|
||
// need to send the event... or handle it directly.
|
||
[EVENT_WINDOW(hwnd) sendEvent:ev];
|
||
|
||
ev=nil;
|
||
flags._eventHandled=YES;
|
||
|
||
#ifdef __CLOSE__
|
||
NSDebugLLog(@"NSEvent", @"Got Message %s for %d", "CLOSE", hwnd);
|
||
printf("CLOSING\n");
|
||
printf("%s",[[self WindowDetail:EVENT_WINDOW(hwnd)] cString]);
|
||
printf("sending event %s \n",[[ev eventNameWithSubtype:YES] cString]);
|
||
fflush(stdout);
|
||
#endif
|
||
}
|
||
|
||
/*
|
||
|
||
WM_NCDESTROY Notification
|
||
|
||
The WM_NCDESTROY message informs a window that its nonclient area is
|
||
being destroyed. The DestroyWindow function sends the WM_NCDESTROY
|
||
message to the window following the WM_DESTROY message. WM_DESTROY
|
||
is used to free the allocated memory object associated with the
|
||
window.
|
||
The WM_NCDESTROY message is sent after the child windows have been
|
||
destroyed. In contrast, WM_DESTROY is sent before the child windows
|
||
are destroyed. A window receives this message through its
|
||
WindowProc function.
|
||
|
||
Syntax
|
||
|
||
WM_NCDESTROY
|
||
|
||
WPARAM wParam
|
||
LPARAM lParam;
|
||
|
||
Parameters
|
||
|
||
wParam
|
||
This parameter is not used.
|
||
lParam
|
||
This parameter is not used.
|
||
|
||
Return Value
|
||
|
||
If an application processes this message, it should return zero.
|
||
|
||
Remarks
|
||
|
||
This message frees any memory internally allocated for the window.
|
||
*/
|
||
- (void) decodeWM_NCDESTROYParams: (WPARAM)wParam : (LPARAM)lParam : (HWND)hwnd
|
||
{
|
||
#ifdef __TESTEVENT__
|
||
printf("WM_NCDESTROY\n");
|
||
#endif
|
||
}
|
||
|
||
/*
|
||
|
||
WM_DESTROY Notification
|
||
|
||
The WM_DESTROY message is sent when a window is being destroyed. It
|
||
is sent to the window procedure of the window being destroyed after
|
||
the window is removed from the screen. This message is sent first
|
||
to the window being destroyed and then to the child windows (if any)
|
||
as they are destroyed. During the processing of the message, it can
|
||
be assumed that all child windows still exist. A window receives
|
||
this message through its WindowProc function.
|
||
|
||
Syntax
|
||
|
||
WM_DESTROY
|
||
|
||
WPARAM wParam
|
||
LPARAM lParam;
|
||
|
||
Parameters
|
||
|
||
wParam
|
||
This parameter is not used.
|
||
lParam
|
||
This parameter is not used.
|
||
|
||
Return Value
|
||
If an application processes this message, it should return zero.
|
||
|
||
Remarks
|
||
|
||
If the window being destroyed is part of the clipboard viewer chain
|
||
(set by calling the SetClipboardViewer function), the window must
|
||
remove itself from the chain by processing the ChangeClipboardChain
|
||
function before returning from the WM_DESTROY message.
|
||
*/
|
||
- (void) decodeWM_DESTROYParams: (WPARAM)wParam : (LPARAM)lParam : (HWND)hwnd
|
||
{
|
||
WIN_INTERN *win = (WIN_INTERN *)GetWindowLong(hwnd, GWL_USERDATA);
|
||
|
||
// Clean up window-specific data objects.
|
||
|
||
if (win->useHDC)
|
||
{
|
||
HGDIOBJ old;
|
||
|
||
old = SelectObject(win->hdc, win->old);
|
||
DeleteObject(old);
|
||
DeleteDC(win->hdc);
|
||
}
|
||
objc_free(win);
|
||
flags._eventHandled=YES;
|
||
|
||
#ifdef __DESTROY__
|
||
printf("%s",[[self WindowDetail:EVENT_WINDOW(hwnd)] cString]);
|
||
fflush(stdout);
|
||
#endif
|
||
|
||
}
|
||
|
||
/*
|
||
|
||
WM_QUERYOPEN Notification
|
||
|
||
The WM_QUERYOPEN message is sent to an icon when the user requests
|
||
that the window be restored to its previous size and position. A
|
||
window receives this message through its WindowProc function.
|
||
|
||
Syntax
|
||
|
||
WM_QUERYOPEN
|
||
|
||
WPARAM wParam
|
||
LPARAM lParam;
|
||
|
||
Parameters
|
||
|
||
wParam
|
||
This parameter is not used.
|
||
lParam
|
||
This parameter is not used.
|
||
|
||
Return Value
|
||
|
||
If the icon can be opened, an application that processes this
|
||
message should return TRUE; otherwise, it should return FALSE to
|
||
prevent the icon from being opened.
|
||
|
||
Remarks
|
||
|
||
By default, the DefWindowProc function returns TRUE.
|
||
|
||
While processing this message, the application should not perform
|
||
any action that would cause an activation or focus change (for
|
||
example, creating a dialog box).
|
||
|
||
*/
|
||
|
||
- (void) decodeWM_QUERYOPENParams: (WPARAM)wParam : (LPARAM)lParam : (HWND)hwnd
|
||
{
|
||
#ifdef __TESTEVENT__
|
||
printf("WM_QUERYOPEN\n");
|
||
#endif
|
||
}
|
||
|
||
/*
|
||
|
||
WM_SYSCOMMAND Notification
|
||
|
||
A window receives this message when the user chooses a command from
|
||
the Window menu (formerly known as the system or control menu) or
|
||
when the user chooses the maximize button, minimize button, restore
|
||
button, or close button.
|
||
|
||
Syntax
|
||
|
||
WM_SYSCOMMAND
|
||
|
||
WPARAM wParam
|
||
LPARAM lParam;
|
||
|
||
Parameters
|
||
|
||
wParam
|
||
Specifies the type of system command requested. This parameter can
|
||
be one of the following values. SC_CLOSE Closes the window.
|
||
|
||
SC_CONTEXTHELP
|
||
Changes the cursor to a question mark with a pointer. If the user
|
||
then clicks a control in the dialog box, the control receives a
|
||
WM_HELP message. SC_DEFAULT Selects the default item; the user
|
||
double-clicked the window menu.
|
||
|
||
SC_HOTKEY
|
||
Activates the window associated with the application-specified hot
|
||
key. The lParam parameter identifies the window to
|
||
activate. SC_HSCROLL Scrolls horizontally.
|
||
|
||
SC_KEYMENU
|
||
Retrieves the window menu as a result of a keystroke. For more
|
||
information, see the Remarks section. SC_MAXIMIZE Maximizes the
|
||
window.
|
||
|
||
SC_MINIMIZE
|
||
Minimizes the window.
|
||
|
||
SC_MONITORPOWER
|
||
Sets the state of the display. This command supports devices that
|
||
have power- saving features, such as a battery-powered personal
|
||
computer. The lParam parameter can have the following values:
|
||
|
||
1 - the display is going to low power
|
||
|
||
2 - the display is being shut off
|
||
|
||
SC_MOUSEMENU
|
||
Retrieves the window menu as a result of a mouse click.
|
||
SC_MOVE
|
||
Moves the window.
|
||
SC_NEXTWINDOW
|
||
Moves to the next window.
|
||
SC_PREVWINDOW
|
||
Moves to the previous window.
|
||
SC_RESTORE
|
||
Restores the window to its normal position and size.
|
||
SC_SCREENSAVE
|
||
Executes the screen saver application specified in the [boot]
|
||
section of the System.ini file. SC_SIZE Sizes the window.
|
||
SC_TASKLIST
|
||
Activates the Start menu.
|
||
SC_VSCROLL
|
||
Scrolls vertically.
|
||
lParam
|
||
The low-order word specifies the horizontal position of the cursor,
|
||
in screen coordinates, if a window menu command is chosen with the
|
||
mouse. Otherwise, this parameter is not used. The high-order word
|
||
specifies the vertical position of the cursor, in screen
|
||
coordinates, if a window menu command is chosen with the mouse. This
|
||
parameter is <20>1 if the command is chosen using a system accelerator,
|
||
or zero if using a mnemonic.
|
||
|
||
Return Value
|
||
|
||
An application should return zero if it processes this message.
|
||
|
||
Remarks
|
||
|
||
To obtain the position coordinates in screen coordinates, use the following
|
||
code:
|
||
xPos = GET_X_LPARAM(lParam); // horizontal position
|
||
yPos = GET_Y_LPARAM(lParam); // vertical position
|
||
|
||
|
||
The DefWindowProc function carries out the window menu request for
|
||
the predefined actions specified in the previous table. In
|
||
WM_SYSCOMMAND messages, the four low-order bits of the wParam
|
||
parameter are used internally by the system. To obtain the correct
|
||
result when testing the value of wParam, an application must combine
|
||
the value 0xFFF0 with the wParam value by using the bitwise AND
|
||
operator. The menu items in a window menu can be modified by using
|
||
the GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu,
|
||
InsertMenuItem, and SetMenuItemInfo functions. Applications that
|
||
modify the window menu must process WM_SYSCOMMAND messages. An
|
||
application can carry out any system command at any time by passing
|
||
a WM_SYSCOMMAND message to DefWindowProc. Any WM_SYSCOMMAND messages
|
||
not handled by the application must be passed to DefWindowProc. Any
|
||
command values added by an application must be processed by the
|
||
application and cannot be passed to DefWindowProc. Accelerator keys
|
||
that are defined to choose items from the window menu are translated
|
||
into WM_SYSCOMMAND messages; all other accelerator keystrokes are
|
||
translated into WM_COMMAND messages. If the wParam is SC_KEYMENU,
|
||
lParam contains the character code of the key that is used with the
|
||
ALT key to display the popup menu. For example, pressing ALT+F to
|
||
display the File popup will cause a WM_SYSCOMMAND with wParam equal
|
||
to SC_KEYMENU and lParam equal to 'f'.
|
||
|
||
*/
|
||
|
||
- (void) decodeWM_SYSCOMMANDParams: (WPARAM)wParam : (LPARAM)lParam : (HWND)hwnd
|
||
{
|
||
// stubbed for future development
|
||
#ifdef __TESTEVENT__
|
||
printf("WM_SYSCOMMAND\n");
|
||
#endif
|
||
}
|
||
|
||
// should be moved to the debug catagory
|
||
- (void) handleNotification:(NSNotification*)aNotification
|
||
{
|
||
#ifdef __APPNOTIFICATIONS__
|
||
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
|
||
printf("+++ NEW EVENT +++\n");
|
||
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
|
||
printf("WM_APPNOTIFICATION -1\n %s\nPosted by current application\n",
|
||
[[aNotification name] cString]);
|
||
NSWindow *theWindow=[aNotification object];
|
||
printf("%s",[[self gswindowstate:theWindow] cString]);
|
||
#endif
|
||
}
|
||
|
||
- (void) resetForGSWindowStyle:(HWND)hwnd gsStryle:(int)aStyle
|
||
{
|
||
// to be completed for styles
|
||
LONG result;
|
||
|
||
ShowWindow(hwnd,SW_HIDE);
|
||
SetLastError(0);
|
||
result=SetWindowLong(hwnd,GWL_EXSTYLE,(LONG)WS_EX_RIGHT);
|
||
// should check error here...
|
||
ShowWindow(hwnd,SW_SHOWNORMAL);
|
||
}
|
||
|
||
@end
|