1 | /* $Id: winnonclient.cpp,v 1.1 1999-09-15 23:19:03 sandervl Exp $ */
|
---|
2 | /*
|
---|
3 | * Win32 menu API functions for OS/2
|
---|
4 | *
|
---|
5 | * Copyright 1998 Sander van Leeuwen (Port from Wine)
|
---|
6 | *
|
---|
7 | * Parts ported from Wine: (window\nonclient.c)
|
---|
8 | * Copyright 1994 Alexandre Julliard
|
---|
9 | *
|
---|
10 | *
|
---|
11 | * Project Odin Software License can be found in LICENSE.TXT
|
---|
12 | *
|
---|
13 | */
|
---|
14 | #include <os2win.h>
|
---|
15 |
|
---|
16 | /* Some useful macros */
|
---|
17 | #define HAS_DLGFRAME(style,exStyle) \
|
---|
18 | (((exStyle) & WS_EX_DLGMODALFRAME) || \
|
---|
19 | (((style) & WS_DLGFRAME) && !((style) & WS_BORDER)))
|
---|
20 |
|
---|
21 | #define HAS_THICKFRAME(style) \
|
---|
22 | (((style) & WS_THICKFRAME) && \
|
---|
23 | !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
|
---|
24 |
|
---|
25 | #define HAS_FIXEDFRAME(style,exStyle) \
|
---|
26 | (((((exStyle) & WS_EX_DLGMODALFRAME) || \
|
---|
27 | ((style) & WS_DLGFRAME)) && ((style) & WS_BORDER)) && \
|
---|
28 | !((style) & WS_THICKFRAME))
|
---|
29 |
|
---|
30 | /* win31 style (simple border) in win95 look */
|
---|
31 | #define HAS_CLASSICBORDER(style,exStyle) \
|
---|
32 | (!((exStyle) & WS_EX_STATICEDGE) && !((exStyle) & WS_EX_CLIENTEDGE) && \
|
---|
33 | !((style) & WS_THICKFRAME) && !((style) & WS_DLGFRAME) && \
|
---|
34 | ((style) & WS_BORDER))
|
---|
35 |
|
---|
36 | #define HAS_SIZEFRAME(style) \
|
---|
37 | (((style) & WS_THICKFRAME) && \
|
---|
38 | !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
|
---|
39 |
|
---|
40 | #define HAS_MENU(w) (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0))
|
---|
41 |
|
---|
42 | #define ON_LEFT_BORDER(hit) \
|
---|
43 | (((hit) == HTLEFT) || ((hit) == HTTOPLEFT) || ((hit) == HTBOTTOMLEFT))
|
---|
44 | #define ON_RIGHT_BORDER(hit) \
|
---|
45 | (((hit) == HTRIGHT) || ((hit) == HTTOPRIGHT) || ((hit) == HTBOTTOMRIGHT))
|
---|
46 | #define ON_TOP_BORDER(hit) \
|
---|
47 | (((hit) == HTTOP) || ((hit) == HTTOPLEFT) || ((hit) == HTTOPRIGHT))
|
---|
48 | #define ON_BOTTOM_BORDER(hit) \
|
---|
49 | (((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
|
---|
50 |
|
---|
51 | /******************************************************************************
|
---|
52 | * NC_AdjustRectOuter95
|
---|
53 | *
|
---|
54 | * Computes the size of the "outside" parts of the window based on the
|
---|
55 | * parameters of the client area.
|
---|
56 | *
|
---|
57 | + PARAMS
|
---|
58 | * LPRECT16 rect
|
---|
59 | * DWORD style
|
---|
60 | * BOOL32 menu
|
---|
61 | * DWORD exStyle
|
---|
62 | *
|
---|
63 | * NOTES
|
---|
64 | * "Outer" parts of a window means the whole window frame, caption and
|
---|
65 | * menu bar. It does not include "inner" parts of the frame like client
|
---|
66 | * edge, static edge or scroll bars.
|
---|
67 | *
|
---|
68 | * Revision history
|
---|
69 | * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
|
---|
70 | * Original (NC_AdjustRect95) cut & paste from NC_AdjustRect
|
---|
71 | *
|
---|
72 | * 20-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de)
|
---|
73 | * Split NC_AdjustRect95 into NC_AdjustRectOuter95 and
|
---|
74 | * NC_AdjustRectInner95 and added handling of Win95 styles.
|
---|
75 | *
|
---|
76 | *****************************************************************************/
|
---|
77 |
|
---|
78 | static void
|
---|
79 | NC_AdjustRectOuter95 (LPRECT rect, DWORD style, BOOL menu, DWORD exStyle)
|
---|
80 | {
|
---|
81 | if(style & WS_ICONIC) return;
|
---|
82 |
|
---|
83 | /* Decide if the window will be managed (see CreateWindowEx) */
|
---|
84 | #if 0
|
---|
85 | if (!(Options.managed && !(style & WS_CHILD) &&
|
---|
86 | ((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
|
---|
87 | (exStyle & WS_EX_DLGMODALFRAME))))
|
---|
88 | #else
|
---|
89 | if (!(style & WS_CHILD) &&
|
---|
90 | ((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
|
---|
91 | (exStyle & WS_EX_DLGMODALFRAME)))
|
---|
92 | #endif
|
---|
93 | {
|
---|
94 | if (HAS_FIXEDFRAME( style, exStyle ))
|
---|
95 | InflateRect(rect, GetSystemMetrics(SM_CXDLGFRAME), GetSystemMetrics(SM_CYDLGFRAME) );
|
---|
96 | else
|
---|
97 | {
|
---|
98 | if (HAS_SIZEFRAME(style))
|
---|
99 | InflateRect( rect, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME) );
|
---|
100 | #if 0
|
---|
101 | if (style & WS_BORDER)
|
---|
102 | InflateRect( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER));
|
---|
103 | #endif
|
---|
104 | }
|
---|
105 |
|
---|
106 | if ((style & WS_CAPTION) == WS_CAPTION)
|
---|
107 | {
|
---|
108 | if (exStyle & WS_EX_TOOLWINDOW)
|
---|
109 | rect->top -= GetSystemMetrics(SM_CYSMCAPTION);
|
---|
110 | else
|
---|
111 | rect->top -= GetSystemMetrics(SM_CYCAPTION);
|
---|
112 | }
|
---|
113 | }
|
---|
114 |
|
---|
115 | if (menu)
|
---|
116 | rect->top -= GetSystemMetrics(SM_CYMENU);
|
---|
117 | }
|
---|
118 |
|
---|
119 |
|
---|
120 | /******************************************************************************
|
---|
121 | * NC_AdjustRectInner95
|
---|
122 | *
|
---|
123 | * Computes the size of the "inside" part of the window based on the
|
---|
124 | * parameters of the client area.
|
---|
125 | *
|
---|
126 | + PARAMS
|
---|
127 | * LPRECT16 rect
|
---|
128 | * DWORD style
|
---|
129 | * DWORD exStyle
|
---|
130 | *
|
---|
131 | * NOTES
|
---|
132 | * "Inner" part of a window means the window frame inside of the flat
|
---|
133 | * window frame. It includes the client edge, the static edge and the
|
---|
134 | * scroll bars.
|
---|
135 | *
|
---|
136 | * Revision history
|
---|
137 | * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
|
---|
138 | * Original (NC_AdjustRect95) cut & paste from NC_AdjustRect
|
---|
139 | *
|
---|
140 | * 20-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de)
|
---|
141 | * Split NC_AdjustRect95 into NC_AdjustRectOuter95 and
|
---|
142 | * NC_AdjustRectInner95 and added handling of Win95 styles.
|
---|
143 | *
|
---|
144 | *****************************************************************************/
|
---|
145 |
|
---|
146 | static void
|
---|
147 | NC_AdjustRectInner95 (LPRECT rect, DWORD style, DWORD exStyle)
|
---|
148 | {
|
---|
149 | if(style & WS_ICONIC) return;
|
---|
150 |
|
---|
151 | if (exStyle & WS_EX_CLIENTEDGE)
|
---|
152 | InflateRect (rect, GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
|
---|
153 |
|
---|
154 | if (exStyle & WS_EX_STATICEDGE)
|
---|
155 | InflateRect (rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER));
|
---|
156 |
|
---|
157 | if (HAS_CLASSICBORDER(style, exStyle))
|
---|
158 | InflateRect( rect, GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER ));
|
---|
159 |
|
---|
160 | if (style & WS_VSCROLL) rect->right += GetSystemMetrics(SM_CXVSCROLL);
|
---|
161 | if (style & WS_HSCROLL) rect->bottom += GetSystemMetrics(SM_CYHSCROLL);
|
---|
162 | }
|
---|
163 |
|
---|
164 | /***********************************************************************
|
---|
165 | * AdjustWindowRectEx (USER.454)
|
---|
166 | */
|
---|
167 | BOOL WIN32API AdjustWindowRectEx(LPRECT rect, DWORD style,
|
---|
168 | BOOL menu, DWORD exStyle )
|
---|
169 | {
|
---|
170 | /* Correct the window style */
|
---|
171 | if (!(style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
|
---|
172 | style |= WS_CAPTION;
|
---|
173 | style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME | WS_CHILD);
|
---|
174 | exStyle &= (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE |
|
---|
175 | WS_EX_STATICEDGE | WS_EX_TOOLWINDOW);
|
---|
176 | if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
|
---|
177 |
|
---|
178 | NC_AdjustRectOuter95( rect, style, menu, exStyle );
|
---|
179 | NC_AdjustRectInner95( rect, style, exStyle );
|
---|
180 |
|
---|
181 | return TRUE;
|
---|
182 | }
|
---|
183 |
|
---|
184 | /***********************************************************************
|
---|
185 | * AdjustWindowRect (USER32.2)
|
---|
186 | */
|
---|
187 | BOOL WIN32API AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu )
|
---|
188 | {
|
---|
189 | return AdjustWindowRectEx( rect, style, menu, 0 );
|
---|
190 | }
|
---|