annotate foosdk/sdk/pfc/win-objects.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "pfc-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "win-objects.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "array.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "pp-winapi.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "string_conv.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "string_base.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "debug.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #include "string-conv-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #include "pfc-fb2k-hooks.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #include "sortstring.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 // StrCmpLogicalW()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 #include <Shlwapi.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #pragma comment(lib, "Shlwapi.lib")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 BOOL winFormatSystemErrorMessageImpl(pfc::string_base & p_out,DWORD p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 switch(p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 case ERROR_CHILD_NOT_COMPLETE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 p_out = "Application cannot be run in Win32 mode.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 case ERROR_INVALID_ORDINAL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 p_out = "Invalid ordinal.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 case ERROR_INVALID_STARTING_CODESEG:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 p_out = "Invalid code segment.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 case ERROR_INVALID_STACKSEG:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 p_out = "Invalid stack segment.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 case ERROR_INVALID_MODULETYPE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 p_out = "Invalid module type.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 case ERROR_INVALID_EXE_SIGNATURE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 p_out = "Invalid executable signature.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 case ERROR_BAD_EXE_FORMAT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 p_out = "Not a valid Win32 application.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 case ERROR_EXE_MACHINE_TYPE_MISMATCH:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 p_out = "Machine type mismatch.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 case ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 case ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 p_out = "Unable to modify a signed binary.";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 TCHAR temp[512];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,p_code,0,temp,_countof(temp),0) == 0) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 for(t_size n=0;n<_countof(temp);n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 switch(temp[n]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 case '\n':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 case '\r':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 temp[n] = ' ';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 p_out = stringcvt::string_utf8_from_os(temp,_countof(temp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 void winPrefixPath(pfc::string_base & out, const char * p_path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 if (pfc::string_has_prefix(p_path, "..\\") || strstr(p_path, "\\..\\") ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 // do not touch relative paths if we somehow got them here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 out = p_path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 const char * prepend_header = "\\\\?\\";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 const char * prepend_header_net = "\\\\?\\UNC\\";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 if (pfc::strcmp_partial( p_path, prepend_header ) == 0) { out = p_path; return; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (pfc::strcmp_partial(p_path,"\\\\") != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 out << prepend_header << p_path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 out << prepend_header_net << (p_path+2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 BOOL winFormatSystemErrorMessage(pfc::string_base & p_out, DWORD p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 return winFormatSystemErrorMessageHook( p_out, p_code );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 void winUnPrefixPath(pfc::string_base & out, const char * p_path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 const char * prepend_header = "\\\\?\\";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 const char * prepend_header_net = "\\\\?\\UNC\\";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (pfc::strcmp_partial(p_path, prepend_header_net) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 out = PFC_string_formatter() << "\\\\" << (p_path + strlen(prepend_header_net) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if (pfc::strcmp_partial(p_path, prepend_header) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 out = (p_path + strlen(prepend_header));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 out = p_path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 string8 winPrefixPath(const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 string8 temp; winPrefixPath(temp, in); return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 string8 winUnPrefixPath(const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 string8 temp; winUnPrefixPath(temp, in); return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 } // namespace pfc
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 pfc::string8 format_win32_error(DWORD p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 pfc::LastErrorRevertScope revert;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 pfc::string8 buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if (p_code == 0) buffer = "Undefined error";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 else if (!pfc::winFormatSystemErrorMessage(buffer,p_code)) buffer << "Unknown error code (" << (unsigned)p_code << ")";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 return buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 static void format_hresult_stamp_hex(pfc::string8 & buffer, HRESULT p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 buffer << " (0x" << pfc::format_hex((t_uint32)p_code, 8) << ")";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 pfc::string8 format_hresult(HRESULT p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 pfc::string8 buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (!pfc::winFormatSystemErrorMessage(buffer,(DWORD)p_code)) buffer = "Unknown error code";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 format_hresult_stamp_hex(buffer, p_code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 return buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 pfc::string8 format_hresult(HRESULT p_code, const char * msgOverride) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 pfc::string8 buffer = msgOverride;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 format_hresult_stamp_hex(buffer, p_code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 HWND findOwningPopup(HWND p_wnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 HWND walk = p_wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 while (walk != 0 && (GetWindowLong(walk, GWL_STYLE) & WS_CHILD) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 walk = GetParent(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 return walk ? walk : p_wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 string8 getWindowClassName(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 TCHAR temp[1024] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if (GetClassName(wnd, temp, PFC_TABSIZE(temp)) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 PFC_ASSERT(!"Should not get here");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 return "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return pfc::stringcvt::string_utf8_from_os(temp).get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 void setWindowText(HWND wnd, const char * txt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 SetWindowText(wnd, stringcvt::string_os_from_utf8(txt));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 string8 getWindowText(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 PFC_ASSERT(wnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 int len = GetWindowTextLength(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 if (len >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 len++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 pfc::array_t<TCHAR> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 temp.set_size(len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 temp[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (GetWindowText(wnd, temp.get_ptr(), len) > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 return stringcvt::string_utf8_from_os(temp.get_ptr(), len).get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 return "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 void uAddWindowStyle(HWND p_wnd,LONG p_style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 SetWindowLong(p_wnd,GWL_STYLE, GetWindowLong(p_wnd,GWL_STYLE) | p_style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void uRemoveWindowStyle(HWND p_wnd,LONG p_style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 SetWindowLong(p_wnd,GWL_STYLE, GetWindowLong(p_wnd,GWL_STYLE) & ~p_style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 void uAddWindowExStyle(HWND p_wnd,LONG p_style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 SetWindowLong(p_wnd,GWL_EXSTYLE, GetWindowLong(p_wnd,GWL_EXSTYLE) | p_style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 void uRemoveWindowExStyle(HWND p_wnd,LONG p_style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 SetWindowLong(p_wnd,GWL_EXSTYLE, GetWindowLong(p_wnd,GWL_EXSTYLE) & ~p_style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 unsigned MapDialogWidth(HWND p_dialog,unsigned p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 RECT temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 temp.left = 0; temp.right = p_value; temp.top = temp.bottom = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if (!MapDialogRect(p_dialog,&temp)) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 return temp.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 bool IsKeyPressed(unsigned vk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 return (GetKeyState(vk) & 0x8000) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 //! Returns current modifier keys pressed, using win32 MOD_* flags.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 unsigned GetHotkeyModifierFlags() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 unsigned ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 if (IsKeyPressed(VK_CONTROL)) ret |= MOD_CONTROL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 if (IsKeyPressed(VK_SHIFT)) ret |= MOD_SHIFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 if (IsKeyPressed(VK_MENU)) ret |= MOD_ALT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 if (IsKeyPressed(VK_LWIN) || IsKeyPressed(VK_RWIN)) ret |= MOD_WIN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 bool CClipboardOpenScope::Open(HWND p_owner) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 if (OpenClipboard(p_owner)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 m_open = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 void CClipboardOpenScope::Close() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 if (m_open) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 m_open = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 CloseClipboard();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 CGlobalLockScope::CGlobalLockScope(HGLOBAL p_handle) : m_ptr(GlobalLock(p_handle)), m_handle(p_handle) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 if (m_ptr == NULL) throw std::bad_alloc();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 CGlobalLockScope::~CGlobalLockScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 if (m_ptr != NULL) GlobalUnlock(m_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 bool IsPointInsideControl(const POINT& pt, HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 HWND walk = WindowFromPoint(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 if (walk == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 if (walk == wnd) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 if (GetWindowLong(walk,GWL_STYLE) & WS_POPUP) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 walk = GetParent(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 bool IsPopupWindowChildOf(HWND child, HWND parent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 HWND walk = child;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 while (walk != parent && walk != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 walk = GetParent(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 return walk == parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 bool IsWindowChildOf(HWND child, HWND parent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 HWND walk = child;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 while(walk != parent && walk != NULL && (GetWindowLong(walk,GWL_STYLE) & WS_CHILD) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 walk = GetParent(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 return walk == parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 void ResignActiveWindow(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 if (IsPopupWindowChildOf(GetActiveWindow(), wnd)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 HWND parent = GetParent(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 if ( parent != NULL ) SetActiveWindow(parent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 void win32_menu::release() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 if (m_menu != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 DestroyMenu(m_menu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 m_menu = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 void win32_menu::create_popup() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 SetLastError(NO_ERROR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 m_menu = CreatePopupMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if (m_menu == NULL) throw exception_win32(GetLastError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 #endif // #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 void win32_event::create(bool p_manualreset,bool p_initialstate) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 SetLastError(NO_ERROR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 m_handle = CreateEvent(NULL,p_manualreset ? TRUE : FALSE, p_initialstate ? TRUE : FALSE,NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 if (m_handle == NULL) throw exception_win32(GetLastError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 void win32_event::release() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 HANDLE temp = detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 if (temp != NULL) CloseHandle(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 DWORD win32_event::g_calculate_wait_time(double p_seconds) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 DWORD time = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 if (p_seconds> 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 time = pfc::rint32(p_seconds * 1000.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 if (time == 0) time = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 } else if (p_seconds < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 time = INFINITE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 return time;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 //! Returns true when signaled, false on timeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 bool win32_event::g_wait_for(HANDLE p_event,double p_timeout_seconds) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 SetLastError(NO_ERROR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 DWORD status = WaitForSingleObject(p_event,g_calculate_wait_time(p_timeout_seconds));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 switch(status) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 case WAIT_FAILED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 throw exception_win32(GetLastError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 case WAIT_TIMEOUT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 pfc::crash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 void win32_event::set_state(bool p_state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 PFC_ASSERT(m_handle != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 if (p_state) SetEvent(m_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 else ResetEvent(m_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 size_t win32_event::g_multiWait(const HANDLE* events, size_t count, double timeout) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 auto status = WaitForMultipleObjects((DWORD)count, events, FALSE, g_calculate_wait_time(timeout));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 size_t idx = (size_t)(status - WAIT_OBJECT_0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 if (idx < count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 return idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 if (status == WAIT_TIMEOUT) return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 pfc::crash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 size_t win32_event::g_multiWait( std::initializer_list<HANDLE> const & arg, double timeout ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 return g_multiWait(arg.begin(), arg.size(), timeout);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 int win32_event::g_twoEventWait( HANDLE ev1, HANDLE ev2, double timeout ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 HANDLE h[2] = {ev1, ev2};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 switch(WaitForMultipleObjects(2, h, FALSE, g_calculate_wait_time( timeout ) )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 pfc::crash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 case WAIT_TIMEOUT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 case WAIT_OBJECT_0 + 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 return 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 int win32_event::g_twoEventWait( win32_event & ev1, win32_event & ev2, double timeout ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 return g_twoEventWait( ev1.get_handle(), ev2.get_handle(), timeout );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 void win32_icon::release() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 HICON temp = detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if (temp != NULL) DestroyIcon(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 void win32_accelerator::load(HINSTANCE p_inst,const TCHAR * p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 SetLastError(NO_ERROR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 m_accel = LoadAccelerators(p_inst,p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 if (m_accel == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 throw exception_win32(GetLastError());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 void win32_accelerator::release() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 if (m_accel != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 DestroyAcceleratorTable(m_accel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 m_accel = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 #endif // #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 void uSleepSeconds(double p_time,bool p_alertable) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 SleepEx(win32_event::g_calculate_wait_time(p_time),p_alertable ? TRUE : FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 WORD GetWindowsVersionCode() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 const DWORD ver = GetVersion();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 return (WORD)HIBYTE(LOWORD(ver)) | ((WORD)LOBYTE(LOWORD(ver)) << 8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 bool isShiftKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 return IsKeyPressed(VK_SHIFT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 bool isCtrlKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 return IsKeyPressed(VK_CONTROL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 bool isAltKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 return IsKeyPressed(VK_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 void winSetThreadDescription(HANDLE hThread, const wchar_t * desc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 #if _WIN32_WINNT >= 0xA00
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 SetThreadDescription(hThread, desc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 auto proc = GetProcAddress(GetModuleHandle(L"KernelBase.dll"), "SetThreadDescription");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 if (proc == nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 proc = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "SetThreadDescription");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 if (proc != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 typedef HRESULT(__stdcall * pSetThreadDescription_t)(HANDLE hThread, PCWSTR lpThreadDescription);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 auto proc2 = reinterpret_cast<pSetThreadDescription_t>(proc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 proc2(hThread, desc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 pfc::string8 format_window(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 pfc::string_formatter ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 ret << "0x" << format_hex( (size_t)wnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 auto title = getWindowText(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 if (title.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 ret << " [" << title << "]";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 #define _(X) {X, #X}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 struct winStyle_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 DWORD v; const char * n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 static const winStyle_t winStyles[] = {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 _(WS_POPUP), _(WS_CHILD), _(WS_MINIMIZE), _(WS_VISIBLE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 _(WS_DISABLED), _(WS_CLIPSIBLINGS), _(WS_CLIPCHILDREN), _(WS_MAXIMIZE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 _(WS_BORDER), _(WS_DLGFRAME), _(WS_VSCROLL), _(WS_HSCROLL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 _(WS_SYSMENU), _(WS_THICKFRAME), _(WS_GROUP), _(WS_TABSTOP),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 _(WS_MINIMIZEBOX), _(WS_MAXIMIZEBOX)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 pfc::string8 format_windowStyle(DWORD style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 pfc::string_formatter ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 ret << "0x" << format_hex( style, 8 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 if (style != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 pfc::string_formatter label;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 for (auto& s : winStyles) if (style & s.v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 if ( label.length() > 0 ) label << "|";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 label << s.n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 if (label.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 ret << " [" << label << "]";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 // If unknown / not available on this architecture, return false always
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 bool isShiftKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 bool isCtrlKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 bool isAltKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 #endif // #ifdef PFC_WINDOWS_DESKTOP_APP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 void winSleep( double seconds ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 DWORD ms = INFINITE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 if (seconds > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 ms = rint32(seconds * 1000);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 if (ms < 1) ms = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 } else if (seconds == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 ms = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 Sleep(ms);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 void sleepSeconds(double seconds) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 winSleep(seconds);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 void yield() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 Sleep(1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 static pfc::string8 winUnicodeNormalize(const char* str, NORM_FORM form) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 if (str != nullptr && *str != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 auto w = wideFromUTF8(str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 int needed = NormalizeString(form, w, -1, nullptr, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 if (needed > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 pfc::array_t<wchar_t> buf; buf.resize(needed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 int status = NormalizeString(form, w, -1, buf.get_ptr(), needed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 if (status > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 ret = utf8FromWide(buf.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 pfc::string8 unicodeNormalizeD(const char* str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 return winUnicodeNormalize(str, NormalizationD);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 pfc::string8 unicodeNormalizeC(const char* str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 return winUnicodeNormalize(str, NormalizationC);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 int winNaturalSortCompare(const char* s1, const char* s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 int ret = winNaturalSortCompareI(s1, s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 if (ret == 0) ret = strcmp(s1, s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 int winNaturalSortCompare(const wchar_t* s1, const wchar_t* s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 int ret = winNaturalSortCompareI(s1, s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 if (ret == 0) ret = wcscmp(s1, s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 int winNaturalSortCompareI(const char* s1, const char* s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 return winNaturalSortCompareI(wideFromUTF8(s1), wideFromUTF8(s2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 int winNaturalSortCompareI(const wchar_t* s1, const wchar_t* s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 return StrCmpLogicalW(s1, s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 #ifndef PFC_SORTSTRING_GENERIC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 sortString_t makeSortString(const char* in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 auto out = std::make_unique<wchar_t[]>(pfc::stringcvt::estimate_utf8_to_wide(in));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 pfc::stringcvt::convert_utf8_to_wide_unchecked(out.get(), in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 return out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 sortString_t makeSortString(const wchar_t* in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 size_t l = wcslen(in) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 auto out = std::make_unique<wchar_t[]>(l+1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 memcpy(out.get(), in, sizeof(wchar_t) * l);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 return out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 int sortStringCompare(sortString_t const& s1, sortString_t const& s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 return winNaturalSortCompare(s1.get(), s2.get());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 int sortStringCompareI(sortString_t const& s1, sortString_t const& s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 return winNaturalSortCompareI(s1.get(), s2.get());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 #endif // _WIN32