Clean DisplayServerWindows and add missing guards
This commit is contained in:
parent
744d5829b7
commit
7ca6a0e849
1 changed files with 139 additions and 156 deletions
|
@ -80,7 +80,7 @@ String DisplayServerWindows::get_name() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
|
void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
|
||||||
if (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED || p_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
if (windows.has(MAIN_WINDOW_ID) && (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED || p_mode == MOUSE_MODE_CONFINED_HIDDEN)) {
|
||||||
// Mouse is grabbed (captured or confined).
|
// Mouse is grabbed (captured or confined).
|
||||||
WindowData &wd = windows[MAIN_WINDOW_ID];
|
WindowData &wd = windows[MAIN_WINDOW_ID];
|
||||||
|
|
||||||
|
@ -118,8 +118,10 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
|
||||||
void DisplayServerWindows::mouse_set_mode(MouseMode p_mode) {
|
void DisplayServerWindows::mouse_set_mode(MouseMode p_mode) {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
if (mouse_mode == p_mode)
|
if (mouse_mode == p_mode) {
|
||||||
|
// Already in the same mode; do nothing.
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mouse_mode = p_mode;
|
mouse_mode = p_mode;
|
||||||
|
|
||||||
|
@ -134,7 +136,7 @@ void DisplayServerWindows::mouse_warp_to_position(const Point2i &p_to) {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
if (!windows.has(last_focused_window)) {
|
if (!windows.has(last_focused_window)) {
|
||||||
return; //no window focused?
|
return; // No focused window?
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse_mode == MOUSE_MODE_CAPTURED) {
|
if (mouse_mode == MOUSE_MODE_CAPTURED) {
|
||||||
|
@ -154,7 +156,6 @@ Point2i DisplayServerWindows::mouse_get_position() const {
|
||||||
POINT p;
|
POINT p;
|
||||||
GetCursorPos(&p);
|
GetCursorPos(&p);
|
||||||
return Point2i(p.x, p.y);
|
return Point2i(p.x, p.y);
|
||||||
//return Point2(old_x, old_y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseButton DisplayServerWindows::mouse_get_button_state() const {
|
MouseButton DisplayServerWindows::mouse_get_button_state() const {
|
||||||
|
@ -165,12 +166,12 @@ void DisplayServerWindows::clipboard_set(const String &p_text) {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
if (!windows.has(last_focused_window)) {
|
if (!windows.has(last_focused_window)) {
|
||||||
return; //no window focused?
|
return; // No focused window?
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert LF line endings to CRLF in clipboard content
|
// Convert LF line endings to CRLF in clipboard content.
|
||||||
// Otherwise, line endings won't be visible when pasted in other software
|
// Otherwise, line endings won't be visible when pasted in other software.
|
||||||
String text = p_text.replace("\r\n", "\n").replace("\n", "\r\n"); // avoid \r\r\n
|
String text = p_text.replace("\r\n", "\n").replace("\n", "\r\n"); // Avoid \r\r\n.
|
||||||
|
|
||||||
if (!OpenClipboard(windows[last_focused_window].hWnd)) {
|
if (!OpenClipboard(windows[last_focused_window].hWnd)) {
|
||||||
ERR_FAIL_MSG("Unable to open clipboard.");
|
ERR_FAIL_MSG("Unable to open clipboard.");
|
||||||
|
@ -187,7 +188,7 @@ void DisplayServerWindows::clipboard_set(const String &p_text) {
|
||||||
|
|
||||||
SetClipboardData(CF_UNICODETEXT, mem);
|
SetClipboardData(CF_UNICODETEXT, mem);
|
||||||
|
|
||||||
// set the CF_TEXT version (not needed?)
|
// Set the CF_TEXT version (not needed?).
|
||||||
CharString utf8 = text.utf8();
|
CharString utf8 = text.utf8();
|
||||||
mem = GlobalAlloc(GMEM_MOVEABLE, utf8.length() + 1);
|
mem = GlobalAlloc(GMEM_MOVEABLE, utf8.length() + 1);
|
||||||
ERR_FAIL_COND_MSG(mem == nullptr, "Unable to allocate memory for clipboard contents.");
|
ERR_FAIL_COND_MSG(mem == nullptr, "Unable to allocate memory for clipboard contents.");
|
||||||
|
@ -206,7 +207,7 @@ String DisplayServerWindows::clipboard_get() const {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
if (!windows.has(last_focused_window)) {
|
if (!windows.has(last_focused_window)) {
|
||||||
return String(); //no window focused?
|
return String(); // No focused window?
|
||||||
}
|
}
|
||||||
|
|
||||||
String ret;
|
String ret;
|
||||||
|
@ -498,16 +499,18 @@ DisplayServer::WindowID DisplayServerWindows::create_sub_window(WindowMode p_mod
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::show_window(WindowID p_id) {
|
void DisplayServerWindows::show_window(WindowID p_id) {
|
||||||
|
ERR_FAIL_COND(!windows.has(p_id));
|
||||||
|
|
||||||
WindowData &wd = windows[p_id];
|
WindowData &wd = windows[p_id];
|
||||||
|
|
||||||
if (p_id != MAIN_WINDOW_ID) {
|
if (p_id != MAIN_WINDOW_ID) {
|
||||||
_update_window_style(p_id);
|
_update_window_style(p_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowWindow(wd.hWnd, wd.no_focus ? SW_SHOWNOACTIVATE : SW_SHOW); // Show The Window
|
ShowWindow(wd.hWnd, wd.no_focus ? SW_SHOWNOACTIVATE : SW_SHOW); // Show the window.
|
||||||
if (!wd.no_focus) {
|
if (!wd.no_focus) {
|
||||||
SetForegroundWindow(wd.hWnd); // Slightly Higher Priority
|
SetForegroundWindow(wd.hWnd); // Slightly higher priority.
|
||||||
SetFocus(wd.hWnd); // Sets Keyboard Focus To
|
SetFocus(wd.hWnd); // Set keyboard focus.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,6 +609,8 @@ void DisplayServerWindows::window_set_mouse_passthrough(const Vector<Vector2> &p
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::_update_window_mouse_passthrough(WindowID p_window) {
|
void DisplayServerWindows::_update_window_mouse_passthrough(WindowID p_window) {
|
||||||
|
ERR_FAIL_COND(!windows.has(p_window));
|
||||||
|
|
||||||
if (windows[p_window].mpath.size() == 0) {
|
if (windows[p_window].mpath.size() == 0) {
|
||||||
SetWindowRgn(windows[p_window].hWnd, nullptr, TRUE);
|
SetWindowRgn(windows[p_window].hWnd, nullptr, TRUE);
|
||||||
} else {
|
} else {
|
||||||
|
@ -664,16 +669,11 @@ Point2i DisplayServerWindows::window_get_position(WindowID p_window) const {
|
||||||
ClientToScreen(wd.hWnd, &point);
|
ClientToScreen(wd.hWnd, &point);
|
||||||
|
|
||||||
return Point2i(point.x, point.y);
|
return Point2i(point.x, point.y);
|
||||||
|
|
||||||
#if 0
|
|
||||||
//do not use this method, as it includes windows decorations
|
|
||||||
RECT r;
|
|
||||||
GetWindowRect(wd.hWnd, &r);
|
|
||||||
return Point2(r.left, r.top);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::_update_real_mouse_position(WindowID p_window) {
|
void DisplayServerWindows::_update_real_mouse_position(WindowID p_window) {
|
||||||
|
ERR_FAIL_COND(!windows.has(p_window));
|
||||||
|
|
||||||
POINT mouse_pos;
|
POINT mouse_pos;
|
||||||
if (GetCursorPos(&mouse_pos) && ScreenToClient(windows[p_window].hWnd, &mouse_pos)) {
|
if (GetCursorPos(&mouse_pos) && ScreenToClient(windows[p_window].hWnd, &mouse_pos)) {
|
||||||
if (mouse_pos.x > 0 && mouse_pos.y > 0 && mouse_pos.x <= windows[p_window].width && mouse_pos.y <= windows[p_window].height) {
|
if (mouse_pos.x > 0 && mouse_pos.y > 0 && mouse_pos.x <= windows[p_window].width && mouse_pos.y <= windows[p_window].height) {
|
||||||
|
@ -691,14 +691,9 @@ void DisplayServerWindows::window_set_position(const Point2i &p_position, Window
|
||||||
ERR_FAIL_COND(!windows.has(p_window));
|
ERR_FAIL_COND(!windows.has(p_window));
|
||||||
WindowData &wd = windows[p_window];
|
WindowData &wd = windows[p_window];
|
||||||
|
|
||||||
if (wd.fullscreen)
|
if (wd.fullscreen) {
|
||||||
return;
|
return;
|
||||||
#if 0
|
}
|
||||||
//wrong needs to account properly for decorations
|
|
||||||
RECT r;
|
|
||||||
GetWindowRect(wd.hWnd, &r);
|
|
||||||
MoveWindow(wd.hWnd, p_position.x, p_position.y, r.right - r.left, r.bottom - r.top, TRUE);
|
|
||||||
#else
|
|
||||||
|
|
||||||
RECT rc;
|
RECT rc;
|
||||||
rc.left = p_position.x;
|
rc.left = p_position.x;
|
||||||
|
@ -711,8 +706,8 @@ void DisplayServerWindows::window_set_position(const Point2i &p_position, Window
|
||||||
|
|
||||||
AdjustWindowRectEx(&rc, style, false, exStyle);
|
AdjustWindowRectEx(&rc, style, false, exStyle);
|
||||||
MoveWindow(wd.hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
|
MoveWindow(wd.hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
|
||||||
#endif
|
|
||||||
// Don't let the mouse leave the window when moved
|
// Don't let the mouse leave the window when moved.
|
||||||
if (mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
if (mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
RECT rect;
|
RECT rect;
|
||||||
GetClientRect(wd.hWnd, &rect);
|
GetClientRect(wd.hWnd, &rect);
|
||||||
|
@ -729,16 +724,15 @@ void DisplayServerWindows::window_set_transient(WindowID p_window, WindowID p_pa
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
ERR_FAIL_COND(p_window == p_parent);
|
ERR_FAIL_COND(p_window == p_parent);
|
||||||
|
|
||||||
ERR_FAIL_COND(!windows.has(p_window));
|
ERR_FAIL_COND(!windows.has(p_window));
|
||||||
|
|
||||||
WindowData &wd_window = windows[p_window];
|
WindowData &wd_window = windows[p_window];
|
||||||
|
|
||||||
ERR_FAIL_COND(wd_window.transient_parent == p_parent);
|
ERR_FAIL_COND(wd_window.transient_parent == p_parent);
|
||||||
|
|
||||||
ERR_FAIL_COND_MSG(wd_window.always_on_top, "Windows with the 'on top' can't become transient.");
|
ERR_FAIL_COND_MSG(wd_window.always_on_top, "Windows with the 'on top' can't become transient.");
|
||||||
|
|
||||||
if (p_parent == INVALID_WINDOW_ID) {
|
if (p_parent == INVALID_WINDOW_ID) {
|
||||||
//remove transient
|
// Remove transient.
|
||||||
|
|
||||||
ERR_FAIL_COND(wd_window.transient_parent == INVALID_WINDOW_ID);
|
ERR_FAIL_COND(wd_window.transient_parent == INVALID_WINDOW_ID);
|
||||||
ERR_FAIL_COND(!windows.has(wd_window.transient_parent));
|
ERR_FAIL_COND(!windows.has(wd_window.transient_parent));
|
||||||
|
@ -838,7 +832,7 @@ void DisplayServerWindows::window_set_size(const Size2i p_size, WindowID p_windo
|
||||||
|
|
||||||
MoveWindow(wd.hWnd, rect.left, rect.top, w, h, TRUE);
|
MoveWindow(wd.hWnd, rect.left, rect.top, w, h, TRUE);
|
||||||
|
|
||||||
// Don't let the mouse leave the window when resizing to a smaller resolution
|
// Don't let the mouse leave the window when resizing to a smaller resolution.
|
||||||
if (mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
if (mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
RECT crect;
|
RECT crect;
|
||||||
GetClientRect(wd.hWnd, &crect);
|
GetClientRect(wd.hWnd, &crect);
|
||||||
|
@ -860,7 +854,7 @@ Size2i DisplayServerWindows::window_get_size(WindowID p_window) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
RECT r;
|
RECT r;
|
||||||
if (GetClientRect(wd.hWnd, &r)) { // Retrieves area inside of window border.
|
if (GetClientRect(wd.hWnd, &r)) { // Retrieves area inside of window border, including decoration.
|
||||||
return Size2(r.right - r.left, r.bottom - r.top);
|
return Size2(r.right - r.left, r.bottom - r.top);
|
||||||
}
|
}
|
||||||
return Size2();
|
return Size2();
|
||||||
|
@ -873,13 +867,17 @@ Size2i DisplayServerWindows::window_get_real_size(WindowID p_window) const {
|
||||||
const WindowData &wd = windows[p_window];
|
const WindowData &wd = windows[p_window];
|
||||||
|
|
||||||
RECT r;
|
RECT r;
|
||||||
if (GetWindowRect(wd.hWnd, &r)) { // Includes area of the window border
|
if (GetWindowRect(wd.hWnd, &r)) { // Retrieves area inside of window border, including decoration.
|
||||||
return Size2(r.right - r.left, r.bottom - r.top);
|
return Size2(r.right - r.left, r.bottom - r.top);
|
||||||
}
|
}
|
||||||
return Size2();
|
return Size2();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_fullscreen, bool p_borderless, bool p_resizable, bool p_maximized, bool p_no_activate_focus, DWORD &r_style, DWORD &r_style_ex) {
|
void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_fullscreen, bool p_borderless, bool p_resizable, bool p_maximized, bool p_no_activate_focus, DWORD &r_style, DWORD &r_style_ex) {
|
||||||
|
// Windows docs for window styles:
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles
|
||||||
|
|
||||||
r_style = 0;
|
r_style = 0;
|
||||||
r_style_ex = WS_EX_WINDOWEDGE;
|
r_style_ex = WS_EX_WINDOWEDGE;
|
||||||
if (p_main_window) {
|
if (p_main_window) {
|
||||||
|
@ -887,10 +885,7 @@ void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_fullscre
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_fullscreen || p_borderless) {
|
if (p_fullscreen || p_borderless) {
|
||||||
r_style |= WS_POPUP;
|
r_style |= WS_POPUP; // p_borderless was WS_EX_TOOLWINDOW in the past.
|
||||||
//if (p_borderless) {
|
|
||||||
// r_style_ex |= WS_EX_TOOLWINDOW;
|
|
||||||
//}
|
|
||||||
} else {
|
} else {
|
||||||
if (p_resizable) {
|
if (p_resizable) {
|
||||||
if (p_maximized) {
|
if (p_maximized) {
|
||||||
|
@ -1026,7 +1021,7 @@ bool DisplayServerWindows::window_is_maximize_allowed(WindowID p_window) const {
|
||||||
|
|
||||||
// FIXME: Implement this, or confirm that it should always be true.
|
// FIXME: Implement this, or confirm that it should always be true.
|
||||||
|
|
||||||
return true; //no idea
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) {
|
void DisplayServerWindows::window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window) {
|
||||||
|
@ -1171,8 +1166,9 @@ void DisplayServerWindows::window_set_ime_position(const Point2i &p_pos, WindowI
|
||||||
void DisplayServerWindows::console_set_visible(bool p_enabled) {
|
void DisplayServerWindows::console_set_visible(bool p_enabled) {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
if (console_visible == p_enabled)
|
if (console_visible == p_enabled) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
ShowWindow(GetConsoleWindow(), p_enabled ? SW_SHOW : SW_HIDE);
|
ShowWindow(GetConsoleWindow(), p_enabled ? SW_SHOW : SW_HIDE);
|
||||||
console_visible = p_enabled;
|
console_visible = p_enabled;
|
||||||
}
|
}
|
||||||
|
@ -1186,8 +1182,9 @@ void DisplayServerWindows::cursor_set_shape(CursorShape p_shape) {
|
||||||
|
|
||||||
ERR_FAIL_INDEX(p_shape, CURSOR_MAX);
|
ERR_FAIL_INDEX(p_shape, CURSOR_MAX);
|
||||||
|
|
||||||
if (cursor_shape == p_shape)
|
if (cursor_shape == p_shape) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (mouse_mode != MOUSE_MODE_VISIBLE && mouse_mode != MOUSE_MODE_CONFINED) {
|
if (mouse_mode != MOUSE_MODE_VISIBLE && mouse_mode != MOUSE_MODE_CONFINED) {
|
||||||
cursor_shape = p_shape;
|
cursor_shape = p_shape;
|
||||||
|
@ -1197,7 +1194,7 @@ void DisplayServerWindows::cursor_set_shape(CursorShape p_shape) {
|
||||||
static const LPCTSTR win_cursors[CURSOR_MAX] = {
|
static const LPCTSTR win_cursors[CURSOR_MAX] = {
|
||||||
IDC_ARROW,
|
IDC_ARROW,
|
||||||
IDC_IBEAM,
|
IDC_IBEAM,
|
||||||
IDC_HAND, //finger
|
IDC_HAND, // Finger.
|
||||||
IDC_CROSS,
|
IDC_CROSS,
|
||||||
IDC_WAIT,
|
IDC_WAIT,
|
||||||
IDC_APPSTARTING,
|
IDC_APPSTARTING,
|
||||||
|
@ -1228,49 +1225,49 @@ DisplayServer::CursorShape DisplayServerWindows::cursor_get_shape() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, OUT HBITMAP &hAndMaskBitmap, OUT HBITMAP &hXorMaskBitmap) {
|
void DisplayServerWindows::GetMaskBitmaps(HBITMAP hSourceBitmap, COLORREF clrTransparent, OUT HBITMAP &hAndMaskBitmap, OUT HBITMAP &hXorMaskBitmap) {
|
||||||
// Get the system display DC
|
// Get the system display DC.
|
||||||
HDC hDC = GetDC(nullptr);
|
HDC hDC = GetDC(nullptr);
|
||||||
|
|
||||||
// Create helper DC
|
// Create helper DC.
|
||||||
HDC hMainDC = CreateCompatibleDC(hDC);
|
HDC hMainDC = CreateCompatibleDC(hDC);
|
||||||
HDC hAndMaskDC = CreateCompatibleDC(hDC);
|
HDC hAndMaskDC = CreateCompatibleDC(hDC);
|
||||||
HDC hXorMaskDC = CreateCompatibleDC(hDC);
|
HDC hXorMaskDC = CreateCompatibleDC(hDC);
|
||||||
|
|
||||||
// Get the dimensions of the source bitmap
|
// Get the dimensions of the source bitmap.
|
||||||
BITMAP bm;
|
BITMAP bm;
|
||||||
GetObject(hSourceBitmap, sizeof(BITMAP), &bm);
|
GetObject(hSourceBitmap, sizeof(BITMAP), &bm);
|
||||||
|
|
||||||
// Create the mask bitmaps
|
// Create the mask bitmaps.
|
||||||
hAndMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // color
|
hAndMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // Color.
|
||||||
hXorMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // color
|
hXorMaskBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight); // Color.
|
||||||
|
|
||||||
// Release the system display DC
|
// Release the system display DC.
|
||||||
ReleaseDC(nullptr, hDC);
|
ReleaseDC(nullptr, hDC);
|
||||||
|
|
||||||
// Select the bitmaps to helper DC
|
// Select the bitmaps to helper DC.
|
||||||
HBITMAP hOldMainBitmap = (HBITMAP)SelectObject(hMainDC, hSourceBitmap);
|
HBITMAP hOldMainBitmap = (HBITMAP)SelectObject(hMainDC, hSourceBitmap);
|
||||||
HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject(hAndMaskDC, hAndMaskBitmap);
|
HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject(hAndMaskDC, hAndMaskBitmap);
|
||||||
HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject(hXorMaskDC, hXorMaskBitmap);
|
HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject(hXorMaskDC, hXorMaskBitmap);
|
||||||
|
|
||||||
// Assign the monochrome AND mask bitmap pixels so that the pixels of the source bitmap
|
// Assign the monochrome AND mask bitmap pixels so that the pixels of the source bitmap
|
||||||
// with 'clrTransparent' will be white pixels of the monochrome bitmap
|
// with 'clrTransparent' will be white pixels of the monochrome bitmap.
|
||||||
SetBkColor(hMainDC, clrTransparent);
|
SetBkColor(hMainDC, clrTransparent);
|
||||||
BitBlt(hAndMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCCOPY);
|
BitBlt(hAndMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCCOPY);
|
||||||
|
|
||||||
// Assign the color XOR mask bitmap pixels so that the pixels of the source bitmap
|
// Assign the color XOR mask bitmap pixels so that the pixels of the source bitmap
|
||||||
// with 'clrTransparent' will be black and rest the pixels same as corresponding
|
// with 'clrTransparent' will be black and rest the pixels same as corresponding
|
||||||
// pixels of the source bitmap
|
// pixels of the source bitmap.
|
||||||
SetBkColor(hXorMaskDC, RGB(0, 0, 0));
|
SetBkColor(hXorMaskDC, RGB(0, 0, 0));
|
||||||
SetTextColor(hXorMaskDC, RGB(255, 255, 255));
|
SetTextColor(hXorMaskDC, RGB(255, 255, 255));
|
||||||
BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hAndMaskDC, 0, 0, SRCCOPY);
|
BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hAndMaskDC, 0, 0, SRCCOPY);
|
||||||
BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCAND);
|
BitBlt(hXorMaskDC, 0, 0, bm.bmWidth, bm.bmHeight, hMainDC, 0, 0, SRCAND);
|
||||||
|
|
||||||
// Deselect bitmaps from the helper DC
|
// Deselect bitmaps from the helper DC.
|
||||||
SelectObject(hMainDC, hOldMainBitmap);
|
SelectObject(hMainDC, hOldMainBitmap);
|
||||||
SelectObject(hAndMaskDC, hOldAndMaskBitmap);
|
SelectObject(hAndMaskDC, hOldAndMaskBitmap);
|
||||||
SelectObject(hXorMaskDC, hOldXorMaskBitmap);
|
SelectObject(hXorMaskDC, hOldXorMaskBitmap);
|
||||||
|
|
||||||
// Delete the helper DC
|
// Delete the helper DC.
|
||||||
DeleteDC(hXorMaskDC);
|
DeleteDC(hXorMaskDC);
|
||||||
DeleteDC(hAndMaskDC);
|
DeleteDC(hAndMaskDC);
|
||||||
DeleteDC(hMainDC);
|
DeleteDC(hMainDC);
|
||||||
|
@ -1327,7 +1324,7 @@ void DisplayServerWindows::cursor_set_custom_image(const RES &p_cursor, CursorSh
|
||||||
|
|
||||||
UINT image_size = texture_size.width * texture_size.height;
|
UINT image_size = texture_size.width * texture_size.height;
|
||||||
|
|
||||||
// Create the BITMAP with alpha channel
|
// Create the BITMAP with alpha channel.
|
||||||
COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size);
|
COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size);
|
||||||
|
|
||||||
for (UINT index = 0; index < image_size; index++) {
|
for (UINT index = 0; index < image_size; index++) {
|
||||||
|
@ -1342,11 +1339,11 @@ void DisplayServerWindows::cursor_set_custom_image(const RES &p_cursor, CursorSh
|
||||||
*(buffer + index) = image->get_pixel(column_index, row_index).to_argb32();
|
*(buffer + index) = image->get_pixel(column_index, row_index).to_argb32();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Using 4 channels, so 4 * 8 bits
|
// Using 4 channels, so 4 * 8 bits.
|
||||||
HBITMAP bitmap = CreateBitmap(texture_size.width, texture_size.height, 1, 4 * 8, buffer);
|
HBITMAP bitmap = CreateBitmap(texture_size.width, texture_size.height, 1, 4 * 8, buffer);
|
||||||
COLORREF clrTransparent = -1;
|
COLORREF clrTransparent = -1;
|
||||||
|
|
||||||
// Create the AND and XOR masks for the bitmap
|
// Create the AND and XOR masks for the bitmap.
|
||||||
HBITMAP hAndMask = nullptr;
|
HBITMAP hAndMask = nullptr;
|
||||||
HBITMAP hXorMask = nullptr;
|
HBITMAP hXorMask = nullptr;
|
||||||
|
|
||||||
|
@ -1358,7 +1355,7 @@ void DisplayServerWindows::cursor_set_custom_image(const RES &p_cursor, CursorSh
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally, create the icon
|
// Finally, create the icon.
|
||||||
ICONINFO iconinfo;
|
ICONINFO iconinfo;
|
||||||
iconinfo.fIcon = FALSE;
|
iconinfo.fIcon = FALSE;
|
||||||
iconinfo.xHotspot = p_hotspot.x;
|
iconinfo.xHotspot = p_hotspot.x;
|
||||||
|
@ -1366,8 +1363,9 @@ void DisplayServerWindows::cursor_set_custom_image(const RES &p_cursor, CursorSh
|
||||||
iconinfo.hbmMask = hAndMask;
|
iconinfo.hbmMask = hAndMask;
|
||||||
iconinfo.hbmColor = hXorMask;
|
iconinfo.hbmColor = hXorMask;
|
||||||
|
|
||||||
if (cursors[p_shape])
|
if (cursors[p_shape]) {
|
||||||
DestroyIcon(cursors[p_shape]);
|
DestroyIcon(cursors[p_shape]);
|
||||||
|
}
|
||||||
|
|
||||||
cursors[p_shape] = CreateIconIndirect(&iconinfo);
|
cursors[p_shape] = CreateIconIndirect(&iconinfo);
|
||||||
|
|
||||||
|
@ -1393,7 +1391,7 @@ void DisplayServerWindows::cursor_set_custom_image(const RES &p_cursor, CursorSh
|
||||||
memfree(buffer);
|
memfree(buffer);
|
||||||
DeleteObject(bitmap);
|
DeleteObject(bitmap);
|
||||||
} else {
|
} else {
|
||||||
// Reset to default system cursor
|
// Reset to default system cursor.
|
||||||
if (cursors[p_shape]) {
|
if (cursors[p_shape]) {
|
||||||
DestroyIcon(cursors[p_shape]);
|
DestroyIcon(cursors[p_shape]);
|
||||||
cursors[p_shape] = nullptr;
|
cursors[p_shape] = nullptr;
|
||||||
|
@ -1575,9 +1573,9 @@ void DisplayServerWindows::set_native_icon(const String &p_filename) {
|
||||||
icon_dir = (ICONDIR *)memrealloc(icon_dir, 3 * sizeof(WORD) + icon_dir->idCount * sizeof(ICONDIRENTRY));
|
icon_dir = (ICONDIR *)memrealloc(icon_dir, 3 * sizeof(WORD) + icon_dir->idCount * sizeof(ICONDIRENTRY));
|
||||||
f->get_buffer((uint8_t *)&icon_dir->idEntries[0], icon_dir->idCount * sizeof(ICONDIRENTRY));
|
f->get_buffer((uint8_t *)&icon_dir->idEntries[0], icon_dir->idCount * sizeof(ICONDIRENTRY));
|
||||||
|
|
||||||
int small_icon_index = -1; // Select 16x16 with largest color count
|
int small_icon_index = -1; // Select 16x16 with largest color count.
|
||||||
int small_icon_cc = 0;
|
int small_icon_cc = 0;
|
||||||
int big_icon_index = -1; // Select largest
|
int big_icon_index = -1; // Select largest.
|
||||||
int big_icon_width = 16;
|
int big_icon_width = 16;
|
||||||
int big_icon_cc = 0;
|
int big_icon_cc = 0;
|
||||||
|
|
||||||
|
@ -1607,7 +1605,7 @@ void DisplayServerWindows::set_native_icon(const String &p_filename) {
|
||||||
small_icon_cc = big_icon_cc;
|
small_icon_cc = big_icon_cc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the big icon
|
// Read the big icon.
|
||||||
DWORD bytecount_big = icon_dir->idEntries[big_icon_index].dwBytesInRes;
|
DWORD bytecount_big = icon_dir->idEntries[big_icon_index].dwBytesInRes;
|
||||||
Vector<uint8_t> data_big;
|
Vector<uint8_t> data_big;
|
||||||
data_big.resize(bytecount_big);
|
data_big.resize(bytecount_big);
|
||||||
|
@ -1617,7 +1615,7 @@ void DisplayServerWindows::set_native_icon(const String &p_filename) {
|
||||||
HICON icon_big = CreateIconFromResource((PBYTE)&data_big.write[0], bytecount_big, TRUE, 0x00030000);
|
HICON icon_big = CreateIconFromResource((PBYTE)&data_big.write[0], bytecount_big, TRUE, 0x00030000);
|
||||||
ERR_FAIL_COND_MSG(!icon_big, "Could not create " + itos(big_icon_width) + "x" + itos(big_icon_width) + " @" + itos(big_icon_cc) + " icon, error: " + format_error_message(GetLastError()) + ".");
|
ERR_FAIL_COND_MSG(!icon_big, "Could not create " + itos(big_icon_width) + "x" + itos(big_icon_width) + " @" + itos(big_icon_cc) + " icon, error: " + format_error_message(GetLastError()) + ".");
|
||||||
|
|
||||||
// Read the small icon
|
// Read the small icon.
|
||||||
DWORD bytecount_small = icon_dir->idEntries[small_icon_index].dwBytesInRes;
|
DWORD bytecount_small = icon_dir->idEntries[small_icon_index].dwBytesInRes;
|
||||||
Vector<uint8_t> data_small;
|
Vector<uint8_t> data_small;
|
||||||
data_small.resize(bytecount_small);
|
data_small.resize(bytecount_small);
|
||||||
|
@ -1627,7 +1625,7 @@ void DisplayServerWindows::set_native_icon(const String &p_filename) {
|
||||||
HICON icon_small = CreateIconFromResource((PBYTE)&data_small.write[0], bytecount_small, TRUE, 0x00030000);
|
HICON icon_small = CreateIconFromResource((PBYTE)&data_small.write[0], bytecount_small, TRUE, 0x00030000);
|
||||||
ERR_FAIL_COND_MSG(!icon_small, "Could not create 16x16 @" + itos(small_icon_cc) + " icon, error: " + format_error_message(GetLastError()) + ".");
|
ERR_FAIL_COND_MSG(!icon_small, "Could not create 16x16 @" + itos(small_icon_cc) + " icon, error: " + format_error_message(GetLastError()) + ".");
|
||||||
|
|
||||||
// Online tradition says to be sure last error is cleared and set the small icon first
|
// Online tradition says to be sure last error is cleared and set the small icon first.
|
||||||
int err = 0;
|
int err = 0;
|
||||||
SetLastError(err);
|
SetLastError(err);
|
||||||
|
|
||||||
|
@ -1648,12 +1646,13 @@ void DisplayServerWindows::set_icon(const Ref<Image> &p_icon) {
|
||||||
|
|
||||||
ERR_FAIL_COND(!p_icon.is_valid());
|
ERR_FAIL_COND(!p_icon.is_valid());
|
||||||
Ref<Image> icon = p_icon->duplicate();
|
Ref<Image> icon = p_icon->duplicate();
|
||||||
if (icon->get_format() != Image::FORMAT_RGBA8)
|
if (icon->get_format() != Image::FORMAT_RGBA8) {
|
||||||
icon->convert(Image::FORMAT_RGBA8);
|
icon->convert(Image::FORMAT_RGBA8);
|
||||||
|
}
|
||||||
int w = icon->get_width();
|
int w = icon->get_width();
|
||||||
int h = icon->get_height();
|
int h = icon->get_height();
|
||||||
|
|
||||||
/* Create temporary bitmap buffer */
|
// Create temporary bitmap buffer.
|
||||||
int icon_len = 40 + h * w * 4;
|
int icon_len = 40 + h * w * 4;
|
||||||
Vector<BYTE> v;
|
Vector<BYTE> v;
|
||||||
v.resize(icon_len);
|
v.resize(icon_len);
|
||||||
|
@ -1687,10 +1686,10 @@ void DisplayServerWindows::set_icon(const Ref<Image> &p_icon) {
|
||||||
|
|
||||||
HICON hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000);
|
HICON hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000);
|
||||||
|
|
||||||
/* Set the icon for the window */
|
// Set the icon for the window.
|
||||||
SendMessage(windows[MAIN_WINDOW_ID].hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);
|
SendMessage(windows[MAIN_WINDOW_ID].hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);
|
||||||
|
|
||||||
/* Set the icon in the task manager (should we do this?) */
|
// Set the icon in the task manager (should we do this?).
|
||||||
SendMessage(windows[MAIN_WINDOW_ID].hWnd, WM_SETICON, ICON_BIG, (LPARAM)hicon);
|
SendMessage(windows[MAIN_WINDOW_ID].hWnd, WM_SETICON, ICON_BIG, (LPARAM)hicon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1718,13 +1717,13 @@ void DisplayServerWindows::set_context(Context p_context) {
|
||||||
// Keeping the name suggested by Microsoft, but this macro really answers:
|
// Keeping the name suggested by Microsoft, but this macro really answers:
|
||||||
// Is this mouse event emulated from touch or pen input?
|
// Is this mouse event emulated from touch or pen input?
|
||||||
#define IsPenEvent(dw) (((dw)&SIGNATURE_MASK) == MI_WP_SIGNATURE)
|
#define IsPenEvent(dw) (((dw)&SIGNATURE_MASK) == MI_WP_SIGNATURE)
|
||||||
// This one tells whether the event comes from touchscreen (and not from pen)
|
// This one tells whether the event comes from touchscreen (and not from pen).
|
||||||
#define IsTouchEvent(dw) (IsPenEvent(dw) && ((dw)&0x80))
|
#define IsTouchEvent(dw) (IsPenEvent(dw) && ((dw)&0x80))
|
||||||
|
|
||||||
void DisplayServerWindows::_touch_event(WindowID p_window, bool p_pressed, float p_x, float p_y, int idx) {
|
void DisplayServerWindows::_touch_event(WindowID p_window, bool p_pressed, float p_x, float p_y, int idx) {
|
||||||
// Defensive
|
if (touch_state.has(idx) == p_pressed) {
|
||||||
if (touch_state.has(idx) == p_pressed)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (p_pressed) {
|
if (p_pressed) {
|
||||||
touch_state.insert(idx, Vector2(p_x, p_y));
|
touch_state.insert(idx, Vector2(p_x, p_y));
|
||||||
|
@ -1744,12 +1743,13 @@ void DisplayServerWindows::_touch_event(WindowID p_window, bool p_pressed, float
|
||||||
|
|
||||||
void DisplayServerWindows::_drag_event(WindowID p_window, float p_x, float p_y, int idx) {
|
void DisplayServerWindows::_drag_event(WindowID p_window, float p_x, float p_y, int idx) {
|
||||||
Map<int, Vector2>::Element *curr = touch_state.find(idx);
|
Map<int, Vector2>::Element *curr = touch_state.find(idx);
|
||||||
// Defensive
|
if (!curr) {
|
||||||
if (!curr)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (curr->get() == Vector2(p_x, p_y))
|
if (curr->get() == Vector2(p_x, p_y)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<InputEventScreenDrag> event;
|
Ref<InputEventScreenDrag> event;
|
||||||
event.instantiate();
|
event.instantiate();
|
||||||
|
@ -1791,7 +1791,7 @@ void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event)
|
||||||
|
|
||||||
Ref<InputEventFromWindow> event_from_window = p_event;
|
Ref<InputEventFromWindow> event_from_window = p_event;
|
||||||
if (event_from_window.is_valid() && event_from_window->get_window_id() != INVALID_WINDOW_ID) {
|
if (event_from_window.is_valid() && event_from_window->get_window_id() != INVALID_WINDOW_ID) {
|
||||||
//send to a window
|
// Send to a single window.
|
||||||
if (!windows.has(event_from_window->get_window_id())) {
|
if (!windows.has(event_from_window->get_window_id())) {
|
||||||
in_dispatch_input_event = false;
|
in_dispatch_input_event = false;
|
||||||
ERR_FAIL_MSG("DisplayServerWindows: Invalid window id in input event.");
|
ERR_FAIL_MSG("DisplayServerWindows: Invalid window id in input event.");
|
||||||
|
@ -1803,7 +1803,7 @@ void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event)
|
||||||
}
|
}
|
||||||
callable.call((const Variant **)&evp, 1, ret, ce);
|
callable.call((const Variant **)&evp, 1, ret, ce);
|
||||||
} else {
|
} else {
|
||||||
//send to all windows
|
// Send to all windows.
|
||||||
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
||||||
Callable callable = E->get().input_event_callback;
|
Callable callable = E->get().input_event_callback;
|
||||||
if (callable.is_null()) {
|
if (callable.is_null()) {
|
||||||
|
@ -1816,6 +1816,9 @@ void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event)
|
||||||
in_dispatch_input_event = false;
|
in_dispatch_input_event = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Our default window procedure to handle processing of window-related system messages/events.
|
||||||
|
// Also known as DefProc or DefWindowProc.
|
||||||
|
// See: https://docs.microsoft.com/en-us/windows/win32/winmsg/window-procedures
|
||||||
LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
||||||
if (drop_events) {
|
if (drop_events) {
|
||||||
if (user_proc) {
|
if (user_proc) {
|
||||||
|
@ -1828,6 +1831,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
WindowID window_id = INVALID_WINDOW_ID;
|
WindowID window_id = INVALID_WINDOW_ID;
|
||||||
bool window_created = false;
|
bool window_created = false;
|
||||||
|
|
||||||
|
// Check whether window exists.
|
||||||
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
||||||
if (E->get().hWnd == hWnd) {
|
if (E->get().hWnd == hWnd) {
|
||||||
window_id = E->key();
|
window_id = E->key();
|
||||||
|
@ -1836,19 +1840,19 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Window doesn't exist or creation in progress, don't handle messages yet.
|
||||||
if (!window_created) {
|
if (!window_created) {
|
||||||
// Window creation in progress.
|
|
||||||
window_id = window_id_counter;
|
window_id = window_id_counter;
|
||||||
ERR_FAIL_COND_V(!windows.has(window_id), 0);
|
ERR_FAIL_COND_V(!windows.has(window_id), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (uMsg) // Check For Windows Messages
|
// Process window messages.
|
||||||
{
|
switch (uMsg) {
|
||||||
case WM_SETFOCUS: {
|
case WM_SETFOCUS: {
|
||||||
windows[window_id].window_has_focus = true;
|
windows[window_id].window_has_focus = true;
|
||||||
last_focused_window = window_id;
|
last_focused_window = window_id;
|
||||||
|
|
||||||
// Restore mouse mode
|
// Restore mouse mode.
|
||||||
_set_mouse_mode_impl(mouse_mode);
|
_set_mouse_mode_impl(mouse_mode);
|
||||||
|
|
||||||
if (!app_focused) {
|
if (!app_focused) {
|
||||||
|
@ -1857,16 +1861,15 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
app_focused = true;
|
app_focused = true;
|
||||||
}
|
}
|
||||||
break;
|
} break;
|
||||||
}
|
|
||||||
case WM_KILLFOCUS: {
|
case WM_KILLFOCUS: {
|
||||||
windows[window_id].window_has_focus = false;
|
windows[window_id].window_has_focus = false;
|
||||||
last_focused_window = window_id;
|
last_focused_window = window_id;
|
||||||
|
|
||||||
// Release capture unconditionally because it can be set due to dragging, in addition to captured mode
|
// Release capture unconditionally because it can be set due to dragging, in addition to captured mode.
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
|
|
||||||
// Release every touch to avoid sticky points
|
// Release every touch to avoid sticky points.
|
||||||
for (Map<int, Vector2>::Element *E = touch_state.front(); E; E = E->next()) {
|
for (Map<int, Vector2>::Element *E = touch_state.front(); E; E = E->next()) {
|
||||||
_touch_event(window_id, false, E->get().x, E->get().y, E->key());
|
_touch_event(window_id, false, E->get().x, E->get().y, E->key());
|
||||||
}
|
}
|
||||||
|
@ -1884,10 +1887,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
app_focused = false;
|
app_focused = false;
|
||||||
}
|
}
|
||||||
|
} break;
|
||||||
break;
|
case WM_ACTIVATE: { // Watch for window activate message.
|
||||||
}
|
|
||||||
case WM_ACTIVATE: { // Watch For Window Activate Message
|
|
||||||
if (!windows[window_id].window_focused) {
|
if (!windows[window_id].window_focused) {
|
||||||
_process_activate_event(window_id, wParam, lParam);
|
_process_activate_event(window_id, wParam, lParam);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1897,8 +1898,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
// Run a timer to prevent event catching warning if the focused window is closing.
|
// Run a timer to prevent event catching warning if the focused window is closing.
|
||||||
windows[window_id].focus_timer_id = SetTimer(windows[window_id].hWnd, 2, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
windows[window_id].focus_timer_id = SetTimer(windows[window_id].hWnd, 2, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
||||||
}
|
}
|
||||||
return 0; // Return To The Message Loop
|
return 0; // Return to the message loop.
|
||||||
}
|
} break;
|
||||||
case WM_GETMINMAXINFO: {
|
case WM_GETMINMAXINFO: {
|
||||||
if (windows[window_id].resizable && !windows[window_id].fullscreen) {
|
if (windows[window_id].resizable && !windows[window_id].fullscreen) {
|
||||||
// Size of window decorations.
|
// Size of window decorations.
|
||||||
|
@ -1914,37 +1915,31 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
min_max_info->ptMaxTrackSize.y = windows[window_id].max_size.y + decor.y;
|
min_max_info->ptMaxTrackSize.y = windows[window_id].max_size.y + decor.y;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
} break;
|
||||||
case WM_PAINT:
|
case WM_PAINT: {
|
||||||
|
|
||||||
Main::force_redraw();
|
Main::force_redraw();
|
||||||
break;
|
} break;
|
||||||
|
case WM_SYSCOMMAND: // Intercept system commands.
|
||||||
case WM_SYSCOMMAND: // Intercept System Commands
|
|
||||||
{
|
{
|
||||||
switch (wParam) // Check System Calls
|
switch (wParam) // Check system calls.
|
||||||
{
|
{
|
||||||
case SC_SCREENSAVE: // Screensaver Trying To Start?
|
case SC_SCREENSAVE: // Screensaver trying to start?
|
||||||
case SC_MONITORPOWER: // Monitor Trying To Enter Powersave?
|
case SC_MONITORPOWER: // Monitor trying to enter powersave?
|
||||||
return 0; // Prevent From Happening
|
return 0; // Prevent from happening.
|
||||||
case SC_KEYMENU:
|
case SC_KEYMENU:
|
||||||
if ((lParam >> 16) <= 0)
|
if ((lParam >> 16) <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break; // Exit
|
} break;
|
||||||
}
|
case WM_CLOSE: // Did we receive a close message?
|
||||||
|
|
||||||
case WM_CLOSE: // Did We Receive A Close Message?
|
|
||||||
{
|
{
|
||||||
if (windows[window_id].focus_timer_id != 0U) {
|
if (windows[window_id].focus_timer_id != 0U) {
|
||||||
KillTimer(windows[window_id].hWnd, windows[window_id].focus_timer_id);
|
KillTimer(windows[window_id].hWnd, windows[window_id].focus_timer_id);
|
||||||
}
|
}
|
||||||
_send_window_event(windows[window_id], WINDOW_EVENT_CLOSE_REQUEST);
|
_send_window_event(windows[window_id], WINDOW_EVENT_CLOSE_REQUEST);
|
||||||
|
|
||||||
return 0; // Jump Back
|
return 0; // Jump back.
|
||||||
}
|
}
|
||||||
case WM_MOUSELEAVE: {
|
case WM_MOUSELEAVE: {
|
||||||
old_invalid = true;
|
old_invalid = true;
|
||||||
|
@ -1986,7 +1981,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
|
|
||||||
Point2i c(windows[window_id].width / 2, windows[window_id].height / 2);
|
Point2i c(windows[window_id].width / 2, windows[window_id].height / 2);
|
||||||
|
|
||||||
// centering just so it works as before
|
// Centering just so it works as before.
|
||||||
POINT pos = { (int)c.x, (int)c.y };
|
POINT pos = { (int)c.x, (int)c.y };
|
||||||
ClientToScreen(windows[window_id].hWnd, &pos);
|
ClientToScreen(windows[window_id].hWnd, &pos);
|
||||||
SetCursorPos(pos.x, pos.y);
|
SetCursorPos(pos.x, pos.y);
|
||||||
|
@ -2009,7 +2004,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
(double(raw->data.mouse.lLastX) - 65536.0 / (nScreenWidth)) * nScreenWidth / 65536.0 + nScreenLeft,
|
(double(raw->data.mouse.lLastX) - 65536.0 / (nScreenWidth)) * nScreenWidth / 65536.0 + nScreenLeft,
|
||||||
(double(raw->data.mouse.lLastY) - 65536.0 / (nScreenHeight)) * nScreenHeight / 65536.0 + nScreenTop);
|
(double(raw->data.mouse.lLastY) - 65536.0 / (nScreenHeight)) * nScreenHeight / 65536.0 + nScreenTop);
|
||||||
|
|
||||||
POINT coords; //client coords
|
POINT coords; // Client coords.
|
||||||
coords.x = abs_pos.x;
|
coords.x = abs_pos.x;
|
||||||
coords.y = abs_pos.y;
|
coords.y = abs_pos.y;
|
||||||
|
|
||||||
|
@ -2018,14 +2013,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
mm->set_relative(Vector2(coords.x - old_x, coords.y - old_y));
|
mm->set_relative(Vector2(coords.x - old_x, coords.y - old_y));
|
||||||
old_x = coords.x;
|
old_x = coords.x;
|
||||||
old_y = coords.y;
|
old_y = coords.y;
|
||||||
|
|
||||||
/*Input.mi.dx = (int)((((double)(pos.x)-nScreenLeft) * 65536) / nScreenWidth + 65536 / (nScreenWidth));
|
|
||||||
Input.mi.dy = (int)((((double)(pos.y)-nScreenTop) * 65536) / nScreenHeight + 65536 / (nScreenHeight));
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (windows[window_id].window_has_focus && mm->get_relative() != Vector2())
|
if (windows[window_id].window_has_focus && mm->get_relative() != Vector2()) {
|
||||||
Input::get_singleton()->parse_input_event(mm);
|
Input::get_singleton()->parse_input_event(mm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delete[] lpb;
|
delete[] lpb;
|
||||||
} break;
|
} break;
|
||||||
|
@ -2170,7 +2162,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Input::get_singleton()->is_emulating_mouse_from_touch()) {
|
if (Input::get_singleton()->is_emulating_mouse_from_touch()) {
|
||||||
// Universal translation enabled; ignore OS translation
|
// Universal translation enabled; ignore OS translation.
|
||||||
LPARAM extra = GetMessageExtraInfo();
|
LPARAM extra = GetMessageExtraInfo();
|
||||||
if (IsTouchEvent(extra)) {
|
if (IsTouchEvent(extra)) {
|
||||||
break;
|
break;
|
||||||
|
@ -2178,7 +2170,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outside) {
|
if (outside) {
|
||||||
//mouse enter
|
// Mouse enter.
|
||||||
|
|
||||||
if (mouse_mode != MOUSE_MODE_CAPTURED) {
|
if (mouse_mode != MOUSE_MODE_CAPTURED) {
|
||||||
_send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_ENTER);
|
_send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_ENTER);
|
||||||
|
@ -2189,7 +2181,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
cursor_set_shape(c);
|
cursor_set_shape(c);
|
||||||
outside = false;
|
outside = false;
|
||||||
|
|
||||||
//Once-Off notification, must call again....
|
// Once-off notification, must call again.
|
||||||
TRACKMOUSEEVENT tme;
|
TRACKMOUSEEVENT tme;
|
||||||
tme.cbSize = sizeof(TRACKMOUSEEVENT);
|
tme.cbSize = sizeof(TRACKMOUSEEVENT);
|
||||||
tme.dwFlags = TME_LEAVE;
|
tme.dwFlags = TME_LEAVE;
|
||||||
|
@ -2222,7 +2214,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
|
|
||||||
mm->set_button_mask(last_button_state);
|
mm->set_button_mask(last_button_state);
|
||||||
|
|
||||||
POINT coords; //client coords
|
POINT coords; // Client coords.
|
||||||
coords.x = GET_X_LPARAM(lParam);
|
coords.x = GET_X_LPARAM(lParam);
|
||||||
coords.y = GET_Y_LPARAM(lParam);
|
coords.y = GET_Y_LPARAM(lParam);
|
||||||
|
|
||||||
|
@ -2264,7 +2256,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
Input::get_singleton()->parse_input_event(mm);
|
Input::get_singleton()->parse_input_event(mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; //Pointer event handled return 0 to avoid duplicate WM_MOUSEMOVE event
|
return 0; // Pointer event handled return 0 to avoid duplicate WM_MOUSEMOVE event.
|
||||||
} break;
|
} break;
|
||||||
case WM_MOUSEMOVE: {
|
case WM_MOUSEMOVE: {
|
||||||
if (windows[window_id].block_mm) {
|
if (windows[window_id].block_mm) {
|
||||||
|
@ -2276,7 +2268,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Input::get_singleton()->is_emulating_mouse_from_touch()) {
|
if (Input::get_singleton()->is_emulating_mouse_from_touch()) {
|
||||||
// Universal translation enabled; ignore OS translation
|
// Universal translation enabled; ignore OS translation.
|
||||||
LPARAM extra = GetMessageExtraInfo();
|
LPARAM extra = GetMessageExtraInfo();
|
||||||
if (IsTouchEvent(extra)) {
|
if (IsTouchEvent(extra)) {
|
||||||
break;
|
break;
|
||||||
|
@ -2284,7 +2276,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outside) {
|
if (outside) {
|
||||||
//mouse enter
|
// Mouse enter.
|
||||||
|
|
||||||
if (mouse_mode != MOUSE_MODE_CAPTURED) {
|
if (mouse_mode != MOUSE_MODE_CAPTURED) {
|
||||||
_send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_ENTER);
|
_send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_ENTER);
|
||||||
|
@ -2295,7 +2287,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
cursor_set_shape(c);
|
cursor_set_shape(c);
|
||||||
outside = false;
|
outside = false;
|
||||||
|
|
||||||
//Once-Off notification, must call again....
|
// Once-off notification, must call again.
|
||||||
TRACKMOUSEEVENT tme;
|
TRACKMOUSEEVENT tme;
|
||||||
tme.cbSize = sizeof(TRACKMOUSEEVENT);
|
tme.cbSize = sizeof(TRACKMOUSEEVENT);
|
||||||
tme.dwFlags = TME_LEAVE;
|
tme.dwFlags = TME_LEAVE;
|
||||||
|
@ -2373,7 +2365,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
if (Input::get_singleton()->is_emulating_mouse_from_touch()) {
|
if (Input::get_singleton()->is_emulating_mouse_from_touch()) {
|
||||||
// Universal translation enabled; ignore OS translations for left button
|
// Universal translation enabled; ignore OS translations for left button.
|
||||||
LPARAM extra = GetMessageExtraInfo();
|
LPARAM extra = GetMessageExtraInfo();
|
||||||
if (IsTouchEvent(extra)) {
|
if (IsTouchEvent(extra)) {
|
||||||
break;
|
break;
|
||||||
|
@ -2497,7 +2489,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
mb->set_ctrl_pressed((wParam & MK_CONTROL) != 0);
|
mb->set_ctrl_pressed((wParam & MK_CONTROL) != 0);
|
||||||
mb->set_shift_pressed((wParam & MK_SHIFT) != 0);
|
mb->set_shift_pressed((wParam & MK_SHIFT) != 0);
|
||||||
mb->set_alt_pressed(alt_mem);
|
mb->set_alt_pressed(alt_mem);
|
||||||
//mb->is_alt_pressed()=(wParam&MK_MENU)!=0;
|
// mb->is_alt_pressed()=(wParam&MK_MENU)!=0;
|
||||||
if (mb->is_pressed()) {
|
if (mb->is_pressed()) {
|
||||||
last_button_state |= MouseButton(1 << (mb->get_button_index() - 1));
|
last_button_state |= MouseButton(1 << (mb->get_button_index() - 1));
|
||||||
} else {
|
} else {
|
||||||
|
@ -2524,7 +2516,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// for reasons unknown to mankind, wheel comes in screen coordinates
|
// For reasons unknown to mankind, wheel comes in screen coordinates.
|
||||||
POINT coords;
|
POINT coords;
|
||||||
coords.x = mb->get_position().x;
|
coords.x = mb->get_position().x;
|
||||||
coords.y = mb->get_position().y;
|
coords.y = mb->get_position().y;
|
||||||
|
@ -2538,7 +2530,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
|
|
||||||
Input::get_singleton()->parse_input_event(mb);
|
Input::get_singleton()->parse_input_event(mb);
|
||||||
if (mb->is_pressed() && mb->get_button_index() > 3 && mb->get_button_index() < 8) {
|
if (mb->is_pressed() && mb->get_button_index() > 3 && mb->get_button_index() < 8) {
|
||||||
//send release for mouse wheel
|
// Send release for mouse wheel.
|
||||||
Ref<InputEventMouseButton> mbd = mb->duplicate();
|
Ref<InputEventMouseButton> mbd = mb->duplicate();
|
||||||
mbd->set_window_id(window_id);
|
mbd->set_window_id(window_id);
|
||||||
last_button_state &= (MouseButton) ~(1 << (mbd->get_button_index() - 1));
|
last_button_state &= (MouseButton) ~(1 << (mbd->get_button_index() - 1));
|
||||||
|
@ -2548,7 +2540,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case WM_MOVE: {
|
case WM_MOVE: {
|
||||||
if (!IsIconic(windows[window_id].hWnd)) {
|
if (!IsIconic(windows[window_id].hWnd)) {
|
||||||
int x = int16_t(LOWORD(lParam));
|
int x = int16_t(LOWORD(lParam));
|
||||||
|
@ -2564,7 +2555,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case WM_SIZE: {
|
case WM_SIZE: {
|
||||||
// Ignore window size change when a SIZE_MINIMIZED event is triggered.
|
// Ignore window size change when a SIZE_MINIMIZED event is triggered.
|
||||||
if (wParam != SIZE_MINIMIZED) {
|
if (wParam != SIZE_MINIMIZED) {
|
||||||
|
@ -2642,7 +2632,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case WM_ENTERSIZEMOVE: {
|
case WM_ENTERSIZEMOVE: {
|
||||||
Input::get_singleton()->release_pressed_events();
|
Input::get_singleton()->release_pressed_events();
|
||||||
windows[window_id].move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
windows[window_id].move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
||||||
|
@ -2662,7 +2651,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
windows[window_id].focus_timer_id = 0U;
|
windows[window_id].focus_timer_id = 0U;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case WM_SYSKEYDOWN:
|
case WM_SYSKEYDOWN:
|
||||||
case WM_SYSKEYUP:
|
case WM_SYSKEYUP:
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
|
@ -2714,7 +2702,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
case WM_INPUTLANGCHANGEREQUEST: {
|
case WM_INPUTLANGCHANGEREQUEST: {
|
||||||
// FIXME: Do something?
|
// FIXME: Do something?
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case WM_TOUCH: {
|
case WM_TOUCH: {
|
||||||
BOOL bHandled = FALSE;
|
BOOL bHandled = FALSE;
|
||||||
UINT cInputs = LOWORD(wParam);
|
UINT cInputs = LOWORD(wParam);
|
||||||
|
@ -2728,7 +2715,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
TOUCH_COORD_TO_PIXEL(ti.y),
|
TOUCH_COORD_TO_PIXEL(ti.y),
|
||||||
};
|
};
|
||||||
ScreenToClient(hWnd, &touch_pos);
|
ScreenToClient(hWnd, &touch_pos);
|
||||||
//do something with each touch input entry
|
// Do something with each touch input entry.
|
||||||
if (ti.dwFlags & TOUCHEVENTF_MOVE) {
|
if (ti.dwFlags & TOUCHEVENTF_MOVE) {
|
||||||
_drag_event(window_id, touch_pos.x, touch_pos.y, ti.dwID);
|
_drag_event(window_id, touch_pos.x, touch_pos.y, ti.dwID);
|
||||||
} else if (ti.dwFlags & (TOUCHEVENTF_UP | TOUCHEVENTF_DOWN)) {
|
} else if (ti.dwFlags & (TOUCHEVENTF_UP | TOUCHEVENTF_DOWN)) {
|
||||||
|
@ -2737,11 +2724,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
bHandled = TRUE;
|
bHandled = TRUE;
|
||||||
} else {
|
} else {
|
||||||
/* handle the error here */
|
// TODO: Handle the error here.
|
||||||
}
|
}
|
||||||
memdelete_arr(pInputs);
|
memdelete_arr(pInputs);
|
||||||
} else {
|
} else {
|
||||||
/* handle the error here, probably out of memory */
|
// TODO: Handle the error here, probably out of memory.
|
||||||
}
|
}
|
||||||
if (bHandled) {
|
if (bHandled) {
|
||||||
CloseTouchInputHandle((HTOUCHINPUT)lParam);
|
CloseTouchInputHandle((HTOUCHINPUT)lParam);
|
||||||
|
@ -2749,14 +2736,13 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
};
|
};
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case WM_DEVICECHANGE: {
|
case WM_DEVICECHANGE: {
|
||||||
joypad->probe_joypads();
|
joypad->probe_joypads();
|
||||||
} break;
|
} break;
|
||||||
case WM_SETCURSOR: {
|
case WM_SETCURSOR: {
|
||||||
if (LOWORD(lParam) == HTCLIENT) {
|
if (LOWORD(lParam) == HTCLIENT) {
|
||||||
if (windows[window_id].window_has_focus && (mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN)) {
|
if (windows[window_id].window_has_focus && (mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN)) {
|
||||||
//Hide the cursor
|
// Hide the cursor.
|
||||||
if (hCursor == nullptr) {
|
if (hCursor == nullptr) {
|
||||||
hCursor = SetCursor(nullptr);
|
hCursor = SetCursor(nullptr);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2771,7 +2757,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case WM_DROPFILES: {
|
case WM_DROPFILES: {
|
||||||
HDROP hDropInfo = (HDROP)wParam;
|
HDROP hDropInfo = (HDROP)wParam;
|
||||||
|
@ -2795,9 +2780,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
Callable::CallError ce;
|
Callable::CallError ce;
|
||||||
windows[window_id].drop_files_callback.call((const Variant **)&vp, 1, ret, ce);
|
windows[window_id].drop_files_callback.call((const Variant **)&vp, 1, ret, ce);
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
if (user_proc) {
|
if (user_proc) {
|
||||||
return CallWindowProcW(user_proc, hWnd, uMsg, wParam, lParam);
|
return CallWindowProcW(user_proc, hWnd, uMsg, wParam, lParam);
|
||||||
|
@ -2823,7 +2806,7 @@ void DisplayServerWindows::_process_activate_event(WindowID p_window_id, WPARAM
|
||||||
alt_mem = false;
|
alt_mem = false;
|
||||||
control_mem = false;
|
control_mem = false;
|
||||||
shift_mem = false;
|
shift_mem = false;
|
||||||
} else { // WM_INACTIVE
|
} else { // WM_INACTIVE.
|
||||||
Input::get_singleton()->release_pressed_events();
|
Input::get_singleton()->release_pressed_events();
|
||||||
_send_window_event(windows[p_window_id], WINDOW_EVENT_FOCUS_OUT);
|
_send_window_event(windows[p_window_id], WINDOW_EVENT_FOCUS_OUT);
|
||||||
windows[p_window_id].window_focused = false;
|
windows[p_window_id].window_focused = false;
|
||||||
|
@ -2840,7 +2823,7 @@ void DisplayServerWindows::_process_key_events() {
|
||||||
KeyEvent &ke = key_event_buffer[i];
|
KeyEvent &ke = key_event_buffer[i];
|
||||||
switch (ke.uMsg) {
|
switch (ke.uMsg) {
|
||||||
case WM_CHAR: {
|
case WM_CHAR: {
|
||||||
// extended keys should only be processed as WM_KEYDOWN message.
|
// Extended keys should only be processed as WM_KEYDOWN message.
|
||||||
if (!KeyMappingWindows::is_extended_key(ke.wParam) && ((i == 0 && ke.uMsg == WM_CHAR) || (i > 0 && key_event_buffer[i - 1].uMsg == WM_CHAR))) {
|
if (!KeyMappingWindows::is_extended_key(ke.wParam) && ((i == 0 && ke.uMsg == WM_CHAR) || (i > 0 && key_event_buffer[i - 1].uMsg == WM_CHAR))) {
|
||||||
static char32_t prev_wc = 0;
|
static char32_t prev_wc = 0;
|
||||||
char32_t unicode = ke.wParam;
|
char32_t unicode = ke.wParam;
|
||||||
|
@ -2881,9 +2864,9 @@ void DisplayServerWindows::_process_key_events() {
|
||||||
k->set_unicode(0);
|
k->set_unicode(0);
|
||||||
|
|
||||||
Input::get_singleton()->parse_input_event(k);
|
Input::get_singleton()->parse_input_event(k);
|
||||||
|
} else {
|
||||||
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
//do nothing
|
|
||||||
} break;
|
} break;
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
case WM_KEYDOWN: {
|
case WM_KEYDOWN: {
|
||||||
|
@ -2899,7 +2882,7 @@ void DisplayServerWindows::_process_key_events() {
|
||||||
k->set_pressed(ke.uMsg == WM_KEYDOWN);
|
k->set_pressed(ke.uMsg == WM_KEYDOWN);
|
||||||
|
|
||||||
if ((ke.lParam & (1 << 24)) && (ke.wParam == VK_RETURN)) {
|
if ((ke.lParam & (1 << 24)) && (ke.wParam == VK_RETURN)) {
|
||||||
// Special case for Numpad Enter key
|
// Special case for Numpad Enter key.
|
||||||
k->set_keycode(KEY_KP_ENTER);
|
k->set_keycode(KEY_KP_ENTER);
|
||||||
} else {
|
} else {
|
||||||
k->set_keycode((Key)KeyMappingWindows::get_keysym(ke.wParam));
|
k->set_keycode((Key)KeyMappingWindows::get_keysym(ke.wParam));
|
||||||
|
@ -3045,8 +3028,8 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||||
if (p_mode != WINDOW_MODE_FULLSCREEN) {
|
if (p_mode != WINDOW_MODE_FULLSCREEN) {
|
||||||
wd.pre_fs_valid = true;
|
wd.pre_fs_valid = true;
|
||||||
}
|
}
|
||||||
#ifdef VULKAN_ENABLED
|
|
||||||
|
|
||||||
|
#ifdef VULKAN_ENABLED
|
||||||
if (rendering_driver == "vulkan") {
|
if (rendering_driver == "vulkan") {
|
||||||
if (context_vulkan->window_create(id, p_vsync_mode, wd.hWnd, hInstance, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top) == -1) {
|
if (context_vulkan->window_create(id, p_vsync_mode, wd.hWnd, hInstance, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top) == -1) {
|
||||||
memdelete(context_vulkan);
|
memdelete(context_vulkan);
|
||||||
|
@ -3101,7 +3084,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||||
wd.last_pressure_update = 0;
|
wd.last_pressure_update = 0;
|
||||||
wd.last_tilt = Vector2();
|
wd.last_tilt = Vector2();
|
||||||
|
|
||||||
// IME
|
// IME.
|
||||||
wd.im_himc = ImmGetContext(wd.hWnd);
|
wd.im_himc = ImmGetContext(wd.hWnd);
|
||||||
ImmReleaseContext(wd.hWnd, wd.im_himc);
|
ImmReleaseContext(wd.hWnd, wd.im_himc);
|
||||||
|
|
||||||
|
@ -3116,7 +3099,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// WinTab API
|
// WinTab API.
|
||||||
bool DisplayServerWindows::wintab_available = false;
|
bool DisplayServerWindows::wintab_available = false;
|
||||||
WTOpenPtr DisplayServerWindows::wintab_WTOpen = nullptr;
|
WTOpenPtr DisplayServerWindows::wintab_WTOpen = nullptr;
|
||||||
WTClosePtr DisplayServerWindows::wintab_WTClose = nullptr;
|
WTClosePtr DisplayServerWindows::wintab_WTClose = nullptr;
|
||||||
|
@ -3124,7 +3107,7 @@ WTInfoPtr DisplayServerWindows::wintab_WTInfo = nullptr;
|
||||||
WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr;
|
WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr;
|
||||||
WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr;
|
WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr;
|
||||||
|
|
||||||
// Windows Ink API
|
// Windows Ink API.
|
||||||
bool DisplayServerWindows::winink_available = false;
|
bool DisplayServerWindows::winink_available = false;
|
||||||
GetPointerTypePtr DisplayServerWindows::win8p_GetPointerType = nullptr;
|
GetPointerTypePtr DisplayServerWindows::win8p_GetPointerType = nullptr;
|
||||||
GetPointerPenInfoPtr DisplayServerWindows::win8p_GetPointerPenInfo = nullptr;
|
GetPointerPenInfoPtr DisplayServerWindows::win8p_GetPointerPenInfo = nullptr;
|
||||||
|
@ -3187,7 +3170,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
|
|
||||||
outside = true;
|
outside = true;
|
||||||
|
|
||||||
//Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink.
|
// Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink.
|
||||||
HMODULE wintab_lib = LoadLibraryW(L"wintab32.dll");
|
HMODULE wintab_lib = LoadLibraryW(L"wintab32.dll");
|
||||||
if (wintab_lib) {
|
if (wintab_lib) {
|
||||||
wintab_WTOpen = (WTOpenPtr)GetProcAddress(wintab_lib, "WTOpenW");
|
wintab_WTOpen = (WTOpenPtr)GetProcAddress(wintab_lib, "WTOpenW");
|
||||||
|
@ -3203,7 +3186,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
tablet_drivers.push_back("wintab");
|
tablet_drivers.push_back("wintab");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Note: Windows Ink API for pen input, available on Windows 8+ only.
|
// Note: Windows Ink API for pen input, available on Windows 8+ only.
|
||||||
HMODULE user32_lib = LoadLibraryW(L"user32.dll");
|
HMODULE user32_lib = LoadLibraryW(L"user32.dll");
|
||||||
if (user32_lib) {
|
if (user32_lib) {
|
||||||
win8p_GetPointerType = (GetPointerTypePtr)GetProcAddress(user32_lib, "GetPointerType");
|
win8p_GetPointerType = (GetPointerTypePtr)GetProcAddress(user32_lib, "GetPointerType");
|
||||||
|
@ -3236,7 +3219,6 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
wc.lpfnWndProc = (WNDPROC)::WndProc;
|
wc.lpfnWndProc = (WNDPROC)::WndProc;
|
||||||
wc.cbClsExtra = 0;
|
wc.cbClsExtra = 0;
|
||||||
wc.cbWndExtra = 0;
|
wc.cbWndExtra = 0;
|
||||||
//wc.hInstance = hInstance;
|
|
||||||
wc.hInstance = hInstance ? hInstance : GetModuleHandle(nullptr);
|
wc.hInstance = hInstance ? hInstance : GetModuleHandle(nullptr);
|
||||||
wc.hIcon = LoadIcon(nullptr, IDI_WINLOGO);
|
wc.hIcon = LoadIcon(nullptr, IDI_WINLOGO);
|
||||||
wc.hCursor = nullptr; //LoadCursor(nullptr, IDC_ARROW);
|
wc.hCursor = nullptr; //LoadCursor(nullptr, IDC_ARROW);
|
||||||
|
@ -3260,7 +3242,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
Rid[0].hwndTarget = 0;
|
Rid[0].hwndTarget = 0;
|
||||||
|
|
||||||
if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) {
|
if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) {
|
||||||
//registration failed.
|
// Registration failed.
|
||||||
use_raw_input = false;
|
use_raw_input = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3277,6 +3259,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OPENGL_ENABLED)
|
#if defined(OPENGL_ENABLED)
|
||||||
if (rendering_driver_index == VIDEO_DRIVER_GLES2) {
|
if (rendering_driver_index == VIDEO_DRIVER_GLES2) {
|
||||||
context_gles2 = memnew(ContextGL_Windows(hWnd, false));
|
context_gles2 = memnew(ContextGL_Windows(hWnd, false));
|
||||||
|
@ -3299,6 +3282,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Point2i window_position(
|
Point2i window_position(
|
||||||
(screen_get_size(0).width - p_resolution.width) / 2,
|
(screen_get_size(0).width - p_resolution.width) / 2,
|
||||||
(screen_get_size(0).height - p_resolution.height) / 2);
|
(screen_get_size(0).height - p_resolution.height) / 2);
|
||||||
|
@ -3327,7 +3311,6 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
//set_ime_active(false);
|
//set_ime_active(false);
|
||||||
|
|
||||||
if (!OS::get_singleton()->is_in_low_processor_usage_mode()) {
|
if (!OS::get_singleton()->is_in_low_processor_usage_mode()) {
|
||||||
//SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
|
|
||||||
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
|
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
|
||||||
DWORD index = 0;
|
DWORD index = 0;
|
||||||
HANDLE handle = AvSetMmThreadCharacteristics("Games", &index);
|
HANDLE handle = AvSetMmThreadCharacteristics("Games", &index);
|
||||||
|
@ -3335,7 +3318,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
AvSetMmThreadPriority(handle, AVRT_PRIORITY_CRITICAL);
|
AvSetMmThreadPriority(handle, AVRT_PRIORITY_CRITICAL);
|
||||||
|
|
||||||
// This is needed to make sure that background work does not starve the main thread.
|
// This is needed to make sure that background work does not starve the main thread.
|
||||||
// This is only setting priority of this thread, not the whole process.
|
// This is only setting the priority of this thread, not the whole process.
|
||||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue