xref: /aosp_15_r20/external/lzma/CPP/Windows/Window.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/Window.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker #include "Window.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
11*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
12*f6dc9357SAndroid Build Coastguard Worker #endif
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
MyRegisterClass(CONST WNDCLASSW * wndClass)17*f6dc9357SAndroid Build Coastguard Worker ATOM MyRegisterClass(CONST WNDCLASSW *wndClass)
18*f6dc9357SAndroid Build Coastguard Worker {
19*f6dc9357SAndroid Build Coastguard Worker   if (g_IsNT)
20*f6dc9357SAndroid Build Coastguard Worker     return RegisterClassW(wndClass);
21*f6dc9357SAndroid Build Coastguard Worker   WNDCLASSA wndClassA;
22*f6dc9357SAndroid Build Coastguard Worker   wndClassA.style = wndClass->style;
23*f6dc9357SAndroid Build Coastguard Worker   wndClassA.lpfnWndProc = wndClass->lpfnWndProc;
24*f6dc9357SAndroid Build Coastguard Worker   wndClassA.cbClsExtra = wndClass->cbClsExtra;
25*f6dc9357SAndroid Build Coastguard Worker   wndClassA.cbWndExtra = wndClass->cbWndExtra;
26*f6dc9357SAndroid Build Coastguard Worker   wndClassA.hInstance = wndClass->hInstance;
27*f6dc9357SAndroid Build Coastguard Worker   wndClassA.hIcon = wndClass->hIcon;
28*f6dc9357SAndroid Build Coastguard Worker   wndClassA.hCursor = wndClass->hCursor;
29*f6dc9357SAndroid Build Coastguard Worker   wndClassA.hbrBackground = wndClass->hbrBackground;
30*f6dc9357SAndroid Build Coastguard Worker   AString menuName;
31*f6dc9357SAndroid Build Coastguard Worker   AString className;
32*f6dc9357SAndroid Build Coastguard Worker   if (IS_INTRESOURCE(wndClass->lpszMenuName))
33*f6dc9357SAndroid Build Coastguard Worker     wndClassA.lpszMenuName = (LPCSTR)wndClass->lpszMenuName;
34*f6dc9357SAndroid Build Coastguard Worker   else
35*f6dc9357SAndroid Build Coastguard Worker   {
36*f6dc9357SAndroid Build Coastguard Worker     menuName = GetSystemString(wndClass->lpszMenuName);
37*f6dc9357SAndroid Build Coastguard Worker     wndClassA.lpszMenuName = menuName;
38*f6dc9357SAndroid Build Coastguard Worker   }
39*f6dc9357SAndroid Build Coastguard Worker   if (IS_INTRESOURCE(wndClass->lpszClassName))
40*f6dc9357SAndroid Build Coastguard Worker     wndClassA.lpszClassName = (LPCSTR)wndClass->lpszClassName;
41*f6dc9357SAndroid Build Coastguard Worker   else
42*f6dc9357SAndroid Build Coastguard Worker   {
43*f6dc9357SAndroid Build Coastguard Worker     className = GetSystemString(wndClass->lpszClassName);
44*f6dc9357SAndroid Build Coastguard Worker     wndClassA.lpszClassName = className;
45*f6dc9357SAndroid Build Coastguard Worker   }
46*f6dc9357SAndroid Build Coastguard Worker   return RegisterClassA(&wndClassA);
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker 
Create(LPCWSTR className,LPCWSTR windowName,DWORD style,int x,int y,int width,int height,HWND parentWindow,HMENU idOrHMenu,HINSTANCE instance,LPVOID createParam)49*f6dc9357SAndroid Build Coastguard Worker bool CWindow::Create(LPCWSTR className,
50*f6dc9357SAndroid Build Coastguard Worker       LPCWSTR windowName, DWORD style,
51*f6dc9357SAndroid Build Coastguard Worker       int x, int y, int width, int height,
52*f6dc9357SAndroid Build Coastguard Worker       HWND parentWindow, HMENU idOrHMenu,
53*f6dc9357SAndroid Build Coastguard Worker       HINSTANCE instance, LPVOID createParam)
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker   if (g_IsNT)
56*f6dc9357SAndroid Build Coastguard Worker   {
57*f6dc9357SAndroid Build Coastguard Worker     _window = ::CreateWindowW(className, windowName,
58*f6dc9357SAndroid Build Coastguard Worker         style, x, y, width, height, parentWindow,
59*f6dc9357SAndroid Build Coastguard Worker         idOrHMenu, instance, createParam);
60*f6dc9357SAndroid Build Coastguard Worker      return (_window != NULL);
61*f6dc9357SAndroid Build Coastguard Worker   }
62*f6dc9357SAndroid Build Coastguard Worker   return Create(GetSystemString(className), GetSystemString(windowName),
63*f6dc9357SAndroid Build Coastguard Worker         style, x, y, width, height, parentWindow,
64*f6dc9357SAndroid Build Coastguard Worker         idOrHMenu, instance, createParam);
65*f6dc9357SAndroid Build Coastguard Worker }
66*f6dc9357SAndroid Build Coastguard Worker 
CreateEx(DWORD exStyle,LPCWSTR className,LPCWSTR windowName,DWORD style,int x,int y,int width,int height,HWND parentWindow,HMENU idOrHMenu,HINSTANCE instance,LPVOID createParam)67*f6dc9357SAndroid Build Coastguard Worker bool CWindow::CreateEx(DWORD exStyle, LPCWSTR className,
68*f6dc9357SAndroid Build Coastguard Worker       LPCWSTR windowName, DWORD style,
69*f6dc9357SAndroid Build Coastguard Worker       int x, int y, int width, int height,
70*f6dc9357SAndroid Build Coastguard Worker       HWND parentWindow, HMENU idOrHMenu,
71*f6dc9357SAndroid Build Coastguard Worker       HINSTANCE instance, LPVOID createParam)
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   if (g_IsNT)
74*f6dc9357SAndroid Build Coastguard Worker   {
75*f6dc9357SAndroid Build Coastguard Worker     _window = ::CreateWindowExW(exStyle, className, windowName,
76*f6dc9357SAndroid Build Coastguard Worker       style, x, y, width, height, parentWindow,
77*f6dc9357SAndroid Build Coastguard Worker       idOrHMenu, instance, createParam);
78*f6dc9357SAndroid Build Coastguard Worker      return (_window != NULL);
79*f6dc9357SAndroid Build Coastguard Worker   }
80*f6dc9357SAndroid Build Coastguard Worker   AString classNameA;
81*f6dc9357SAndroid Build Coastguard Worker   LPCSTR classNameP;
82*f6dc9357SAndroid Build Coastguard Worker   if (IS_INTRESOURCE(className))
83*f6dc9357SAndroid Build Coastguard Worker     classNameP = (LPCSTR)className;
84*f6dc9357SAndroid Build Coastguard Worker   else
85*f6dc9357SAndroid Build Coastguard Worker   {
86*f6dc9357SAndroid Build Coastguard Worker     classNameA = GetSystemString(className);
87*f6dc9357SAndroid Build Coastguard Worker     classNameP = classNameA;
88*f6dc9357SAndroid Build Coastguard Worker   }
89*f6dc9357SAndroid Build Coastguard Worker   AString windowNameA;
90*f6dc9357SAndroid Build Coastguard Worker   LPCSTR windowNameP;
91*f6dc9357SAndroid Build Coastguard Worker   if (IS_INTRESOURCE(windowName))
92*f6dc9357SAndroid Build Coastguard Worker     windowNameP = (LPCSTR)windowName;
93*f6dc9357SAndroid Build Coastguard Worker   else
94*f6dc9357SAndroid Build Coastguard Worker   {
95*f6dc9357SAndroid Build Coastguard Worker     windowNameA = GetSystemString(windowName);
96*f6dc9357SAndroid Build Coastguard Worker     windowNameP = windowNameA;
97*f6dc9357SAndroid Build Coastguard Worker   }
98*f6dc9357SAndroid Build Coastguard Worker   return CreateEx(exStyle, classNameP, windowNameP,
99*f6dc9357SAndroid Build Coastguard Worker       style, x, y, width, height, parentWindow,
100*f6dc9357SAndroid Build Coastguard Worker       idOrHMenu, instance, createParam);
101*f6dc9357SAndroid Build Coastguard Worker }
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker #endif
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
MySetWindowText(HWND wnd,LPCWSTR s)106*f6dc9357SAndroid Build Coastguard Worker bool MySetWindowText(HWND wnd, LPCWSTR s)
107*f6dc9357SAndroid Build Coastguard Worker {
108*f6dc9357SAndroid Build Coastguard Worker   if (g_IsNT)
109*f6dc9357SAndroid Build Coastguard Worker     return BOOLToBool(::SetWindowTextW(wnd, s));
110*f6dc9357SAndroid Build Coastguard Worker   return BOOLToBool(::SetWindowTextA(wnd, UnicodeStringToMultiByte(s)));
111*f6dc9357SAndroid Build Coastguard Worker }
112*f6dc9357SAndroid Build Coastguard Worker #endif
113*f6dc9357SAndroid Build Coastguard Worker 
GetText(CSysString & s) const114*f6dc9357SAndroid Build Coastguard Worker bool CWindow::GetText(CSysString &s) const
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker   s.Empty();
117*f6dc9357SAndroid Build Coastguard Worker   unsigned len = (unsigned)GetTextLength();
118*f6dc9357SAndroid Build Coastguard Worker   if (len == 0)
119*f6dc9357SAndroid Build Coastguard Worker     return (::GetLastError() == ERROR_SUCCESS);
120*f6dc9357SAndroid Build Coastguard Worker   TCHAR *p = s.GetBuf(len);
121*f6dc9357SAndroid Build Coastguard Worker   {
122*f6dc9357SAndroid Build Coastguard Worker     const unsigned len2 = (unsigned)GetText(p, (int)(len + 1));
123*f6dc9357SAndroid Build Coastguard Worker     if (len > len2)
124*f6dc9357SAndroid Build Coastguard Worker       len = len2;
125*f6dc9357SAndroid Build Coastguard Worker   }
126*f6dc9357SAndroid Build Coastguard Worker   s.ReleaseBuf_CalcLen(len);
127*f6dc9357SAndroid Build Coastguard Worker   if (len == 0)
128*f6dc9357SAndroid Build Coastguard Worker     return (::GetLastError() == ERROR_SUCCESS);
129*f6dc9357SAndroid Build Coastguard Worker   return true;
130*f6dc9357SAndroid Build Coastguard Worker }
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
GetText(UString & s) const133*f6dc9357SAndroid Build Coastguard Worker bool CWindow::GetText(UString &s) const
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker   if (g_IsNT)
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     s.Empty();
138*f6dc9357SAndroid Build Coastguard Worker     unsigned len = (unsigned)GetWindowTextLengthW(_window);
139*f6dc9357SAndroid Build Coastguard Worker     if (len == 0)
140*f6dc9357SAndroid Build Coastguard Worker       return (::GetLastError() == ERROR_SUCCESS);
141*f6dc9357SAndroid Build Coastguard Worker     wchar_t *p = s.GetBuf(len);
142*f6dc9357SAndroid Build Coastguard Worker     {
143*f6dc9357SAndroid Build Coastguard Worker       const unsigned len2 = (unsigned)GetWindowTextW(_window, p, (int)(len + 1));
144*f6dc9357SAndroid Build Coastguard Worker       if (len > len2)
145*f6dc9357SAndroid Build Coastguard Worker         len = len2;
146*f6dc9357SAndroid Build Coastguard Worker     }
147*f6dc9357SAndroid Build Coastguard Worker     s.ReleaseBuf_CalcLen(len);
148*f6dc9357SAndroid Build Coastguard Worker     if (len == 0)
149*f6dc9357SAndroid Build Coastguard Worker       return (::GetLastError() == ERROR_SUCCESS);
150*f6dc9357SAndroid Build Coastguard Worker     return true;
151*f6dc9357SAndroid Build Coastguard Worker   }
152*f6dc9357SAndroid Build Coastguard Worker   CSysString sysString;
153*f6dc9357SAndroid Build Coastguard Worker   const bool result = GetText(sysString);
154*f6dc9357SAndroid Build Coastguard Worker   MultiByteToUnicodeString2(s, sysString);
155*f6dc9357SAndroid Build Coastguard Worker   return result;
156*f6dc9357SAndroid Build Coastguard Worker }
157*f6dc9357SAndroid Build Coastguard Worker #endif
158*f6dc9357SAndroid Build Coastguard Worker 
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker /*
161*f6dc9357SAndroid Build Coastguard Worker bool CWindow::ModifyStyleBase(int styleOffset,
162*f6dc9357SAndroid Build Coastguard Worker   DWORD remove, DWORD add, UINT flags)
163*f6dc9357SAndroid Build Coastguard Worker {
164*f6dc9357SAndroid Build Coastguard Worker   DWORD style = GetWindowLong(styleOffset);
165*f6dc9357SAndroid Build Coastguard Worker   DWORD newStyle = (style & ~remove) | add;
166*f6dc9357SAndroid Build Coastguard Worker   if (style == newStyle)
167*f6dc9357SAndroid Build Coastguard Worker     return false; // it is not good
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker   SetWindowLong(styleOffset, newStyle);
170*f6dc9357SAndroid Build Coastguard Worker   if (flags != 0)
171*f6dc9357SAndroid Build Coastguard Worker   {
172*f6dc9357SAndroid Build Coastguard Worker     ::SetWindowPos(_window, NULL, 0, 0, 0, 0,
173*f6dc9357SAndroid Build Coastguard Worker       SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | flags);
174*f6dc9357SAndroid Build Coastguard Worker   }
175*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
176*f6dc9357SAndroid Build Coastguard Worker }
177*f6dc9357SAndroid Build Coastguard Worker */
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker }
180