diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/android/build.gradle.template | 3 | ||||
-rw-r--r-- | platform/android/export/export.cpp | 3 | ||||
-rw-r--r-- | platform/bb10/export/export.cpp | 3 | ||||
-rw-r--r-- | platform/javascript/export/export.cpp | 4 | ||||
-rw-r--r-- | platform/osx/export/export.cpp | 3 | ||||
-rw-r--r-- | platform/uwp/export/export.cpp | 3 | ||||
-rw-r--r-- | platform/windows/export/export.cpp | 3 | ||||
-rw-r--r-- | platform/windows/os_windows.cpp | 53 | ||||
-rw-r--r-- | platform/windows/os_windows.h | 1 | ||||
-rw-r--r-- | platform/x11/detect.py | 25 | ||||
-rw-r--r-- | platform/x11/export/export.cpp | 3 | ||||
-rw-r--r-- | platform/x11/os_x11.cpp | 96 | ||||
-rw-r--r-- | platform/x11/os_x11.h | 2 |
13 files changed, 135 insertions, 67 deletions
diff --git a/platform/android/build.gradle.template b/platform/android/build.gradle.template index 873eef0566..c46a15bd12 100644 --- a/platform/android/build.gradle.template +++ b/platform/android/build.gradle.template @@ -52,11 +52,10 @@ android { java.srcDirs = ['src' $$GRADLE_JAVA_DIRS$$ ] - resources.srcDirs = [ + res.srcDirs = [ 'res' $$GRADLE_RES_DIRS$$ ] - res.srcDirs = ['res'] // libs.srcDirs = ['libs'] aidl.srcDirs = [ 'aidl' diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 33283eccea..8e1fda74ed 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -38,7 +38,7 @@ #include "os/os.h" #include "platform/android/logo.h" #include <string.h> - +#if 0 static const char* android_perms[]={ "ACCESS_CHECKIN_PROPERTIES", @@ -1915,3 +1915,4 @@ void register_android_exporter() { EditorImportExport::get_singleton()->add_export_platform(exporter); } +#endif diff --git a/platform/bb10/export/export.cpp b/platform/bb10/export/export.cpp index cc994c8f24..3e6dadb094 100644 --- a/platform/bb10/export/export.cpp +++ b/platform/bb10/export/export.cpp @@ -40,7 +40,7 @@ #include "io/xml_parser.h" #define MAX_DEVICES 5 - +#if 0 class EditorExportPlatformBB10 : public EditorExportPlatform { GDCLASS( EditorExportPlatformBB10,EditorExportPlatform ); @@ -827,3 +827,4 @@ void register_bb10_exporter() { } +#endif diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index 0990d0750d..e487383ef4 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -38,6 +38,9 @@ #include "os/os.h" #include "platform/javascript/logo.h" #include "string.h" + + +#if 0 class EditorExportPlatformJavaScript : public EditorExportPlatform { GDCLASS( EditorExportPlatformJavaScript,EditorExportPlatform ); @@ -424,3 +427,4 @@ void register_javascript_exporter() { } +#endif diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp index 1cb41cede2..3a97827c16 100644 --- a/platform/osx/export/export.cpp +++ b/platform/osx/export/export.cpp @@ -39,7 +39,7 @@ #include "os/os.h" #include "platform/osx/logo.h" #include "string.h" - +#if 0 class EditorExportPlatformOSX : public EditorExportPlatform { @@ -546,3 +546,4 @@ void register_osx_exporter() { } +#endif diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp index f31c91ef6d..167a5831cf 100644 --- a/platform/uwp/export/export.cpp +++ b/platform/uwp/export/export.cpp @@ -65,7 +65,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *************************************************************************/ - +#if 0 #include "version.h" #include "export.h" #include "object.h" @@ -2390,3 +2390,4 @@ void register_uwp_exporter() { Ref<EditorExportPlatformUWP> exporter = Ref<EditorExportPlatformUWP>(memnew(EditorExportPlatformUWP)); EditorImportExport::get_singleton()->add_export_platform(exporter); } +#endif diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp index 1ad61844d0..88d534887b 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -29,7 +29,7 @@ #include "export.h" #include "platform/windows/logo.h" #include "tools/editor/editor_import_export.h" - +#if 0 void register_windows_exporter() { Image img(_windows_logo); @@ -50,3 +50,4 @@ void register_windows_exporter() { } +#endif diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 6439de67a6..b230dda9cb 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -254,6 +254,25 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) // Check For Windows Messages { + case WM_SETFOCUS: + { + window_has_focus = true; + // Re-capture cursor if we're in one of the capture modes + if (mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode==MOUSE_MODE_CONFINED) { + SetCapture(hWnd); + } + break; + } + case WM_KILLFOCUS: + { + window_has_focus = false; + + // Release capture if we're in one of the capture modes + if (mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode==MOUSE_MODE_CONFINED) { + ReleaseCapture(); + } + break; + } case WM_ACTIVATE: // Watch For Window Activate Message { minimized = HIWORD(wParam) != 0; @@ -266,19 +285,17 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { alt_mem=false; control_mem=false; shift_mem=false; - if (mouse_mode==MOUSE_MODE_CAPTURED) { + if (mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode==MOUSE_MODE_CONFINED) { RECT clipRect; GetClientRect(hWnd, &clipRect); ClientToScreen(hWnd, (POINT*) &clipRect.left); ClientToScreen(hWnd, (POINT*) &clipRect.right); ClipCursor(&clipRect); SetCapture(hWnd); - } } else { main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); alt_mem=false; - }; return 0; // Return To The Message Loop @@ -345,6 +362,9 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { } + // Don't calculate relative mouse movement if we don't have focus in CAPTURED mode. + if (!window_has_focus && mouse_mode==MOUSE_MODE_CAPTURED) + break; /* LPARAM extra = GetMessageExtraInfo(); if (IsPenEvent(extra)) { @@ -376,7 +396,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { mm.button_mask|=(wParam&MK_XBUTTON2)?(1<<6):0;*/ mm.x=GET_X_LPARAM(lParam); mm.y=GET_Y_LPARAM(lParam); - + if (mouse_mode==MOUSE_MODE_CAPTURED) { Point2i c(video_mode.width/2,video_mode.height/2); @@ -410,7 +430,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { mm.relative_y=mm.y-old_y; old_x=mm.x; old_y=mm.y; - if (main_loop) + if (window_has_focus && main_loop) input->parse_input_event(event); @@ -714,9 +734,8 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { joypad->probe_joypads(); } break; case WM_SETCURSOR: { - if(LOWORD(lParam) == HTCLIENT) { - if(mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED) { + if(window_has_focus && (mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED)) { //Hide the cursor if(hCursor == NULL) hCursor = SetCursor(NULL); @@ -948,7 +967,7 @@ void OS_Windows::initialize(const VideoMode& p_desired,int p_video_driver,int p_ main_loop=NULL; outside=true; - + window_has_focus=true; WNDCLASSEXW wc; video_mode=p_desired; @@ -1300,18 +1319,10 @@ void OS_Windows::vprint(const char* p_format, va_list p_list, bool p_stderr) { MultiByteToWideChar(CP_UTF8,0,buf,len,wbuf,wlen); wbuf[wlen]=0; -// Recent MinGW and MSVC compilers seem to disagree on the case here -#ifdef __MINGW32__ - if (p_stderr) - fwprintf(stderr, L"%S", wbuf); - else - wprintf(L"%S", wbuf); -#else // MSVC if (p_stderr) - fwprintf(stderr, L"%s", wbuf); + fwprintf(stderr, L"%ls", wbuf); else - wprintf(L"%s", wbuf); -#endif + wprintf(L"%ls", wbuf); #ifdef STDOUT_FILE //vwfprintf(stdo,p_format,p_list); @@ -1334,17 +1345,17 @@ void OS_Windows::set_mouse_mode(MouseMode p_mode) { if (mouse_mode==p_mode) return; mouse_mode=p_mode; - if (p_mode==MOUSE_MODE_CAPTURED) { + if (mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode==MOUSE_MODE_CONFINED) { RECT clipRect; GetClientRect(hWnd, &clipRect); ClientToScreen(hWnd, (POINT*) &clipRect.left); ClientToScreen(hWnd, (POINT*) &clipRect.right); ClipCursor(&clipRect); - SetCapture(hWnd); center=Point2i(video_mode.width/2,video_mode.height/2); POINT pos = { (int) center.x, (int) center.y }; ClientToScreen(hWnd, &pos); - SetCursorPos(pos.x, pos.y); + if (mouse_mode==MOUSE_MODE_CAPTURED) + SetCursorPos(pos.x, pos.y); } else { ReleaseCapture(); ClipCursor(NULL); diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index a5c8ecbe1b..2c8fa64f8e 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -118,6 +118,7 @@ class OS_Windows : public OS { bool control_mem; bool meta_mem; bool force_quit; + bool window_has_focus; uint32_t last_button_state; CursorShape cursor_shape; diff --git a/platform/x11/detect.py b/platform/x11/detect.py index b5f6359d21..89cf639114 100644 --- a/platform/x11/detect.py +++ b/platform/x11/detect.py @@ -61,6 +61,7 @@ def get_opts(): ('use_static_cpp', 'link stdc++ statically', 'no'), ('use_sanitizer', 'Use llvm compiler sanitize address', 'no'), ('use_leak_sanitizer', 'Use llvm compiler sanitize memory leaks', 'no'), + ('use_lto', 'Use link time optimization', 'no'), ('pulseaudio', 'Detect & Use pulseaudio', 'yes'), ('udev', 'Use udev for gamepad connection callbacks', 'no'), ('debug_release', 'Add debug symbols to release version', 'no'), @@ -97,12 +98,12 @@ def configure(env): env.extra_suffix = ".llvm" if (env["use_sanitizer"] == "yes"): - env.Append(CXXFLAGS=['-fsanitize=address', '-fno-omit-frame-pointer']) + env.Append(CCFLAGS=['-fsanitize=address', '-fno-omit-frame-pointer']) env.Append(LINKFLAGS=['-fsanitize=address']) env.extra_suffix += "s" if (env["use_leak_sanitizer"] == "yes"): - env.Append(CXXFLAGS=['-fsanitize=address', '-fno-omit-frame-pointer']) + env.Append(CCFLAGS=['-fsanitize=address', '-fno-omit-frame-pointer']) env.Append(LINKFLAGS=['-fsanitize=address']) env.extra_suffix += "s" @@ -111,22 +112,28 @@ def configure(env): # env['OBJSUFFIX'] = ".nt"+env['OBJSUFFIX'] # env['LIBSUFFIX'] = ".nt"+env['LIBSUFFIX'] - if (env["target"] == "release"): + if (env["use_lto"] == "yes"): + env.Append(CCFLAGS=['-flto']) + env.Append(LINKFLAGS=['-flto']) + + + env.Append(CCFLAGS=['-pipe']) + env.Append(LINKFLAGS=['-pipe']) + if (env["target"] == "release"): + env.Prepend(CCFLAGS=['-Ofast']) if (env["debug_release"] == "yes"): - env.Append(CCFLAGS=['-g2']) - else: - env.Append(CCFLAGS=['-O3', '-ffast-math']) + env.Prepend(CCFLAGS=['-g2']) elif (env["target"] == "release_debug"): - env.Append(CCFLAGS=['-O2', '-ffast-math', '-DDEBUG_ENABLED']) + env.Prepend(CCFLAGS=['-O2', '-ffast-math', '-DDEBUG_ENABLED']) if (env["debug_release"] == "yes"): - env.Append(CCFLAGS=['-g2']) + env.Prepend(CCFLAGS=['-g2']) elif (env["target"] == "debug"): - env.Append(CCFLAGS=['-g2', '-Wall', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) + env.Prepend(CCFLAGS=['-g2', '-Wall', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) env.ParseConfig('pkg-config x11 --cflags --libs') env.ParseConfig('pkg-config xinerama --cflags --libs') diff --git a/platform/x11/export/export.cpp b/platform/x11/export/export.cpp index c1af323453..5a4751b387 100644 --- a/platform/x11/export/export.cpp +++ b/platform/x11/export/export.cpp @@ -30,7 +30,7 @@ #include "platform/x11/logo.h" #include "tools/editor/editor_import_export.h" #include "scene/resources/texture.h" - +#if 0 void register_x11_exporter() { Image img(_x11_logo); @@ -50,3 +50,4 @@ void register_x11_exporter() { } } +#endif diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 41746c2431..e792d0465e 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -295,6 +295,7 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi } + ERR_FAIL_COND(!visual_server); ERR_FAIL_COND(x11_window==0); @@ -449,6 +450,8 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi physics_2d_server->init(); input = memnew( InputDefault ); + + window_has_focus = true; // Set focus to true at init #ifdef JOYDEV_ENABLED joypad = memnew( JoypadLinux(input)); #endif @@ -517,17 +520,21 @@ void OS_X11::set_mouse_mode(MouseMode p_mode) { if (p_mode==mouse_mode) return; - if (mouse_mode==MOUSE_MODE_CAPTURED) + if (mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode==MOUSE_MODE_CONFINED) XUngrabPointer(x11_display, CurrentTime); - if (mouse_mode!=MOUSE_MODE_VISIBLE && p_mode==MOUSE_MODE_VISIBLE) - XUndefineCursor(x11_display,x11_window); - if (p_mode!=MOUSE_MODE_VISIBLE && mouse_mode==MOUSE_MODE_VISIBLE) { - XDefineCursor(x11_display,x11_window,null_cursor); + + // The only modes that show a cursor are VISIBLE and CONFINED + bool showCursor = (p_mode == MOUSE_MODE_VISIBLE || p_mode == MOUSE_MODE_CONFINED); + + if (showCursor) { + XUndefineCursor(x11_display,x11_window); // show cursor + } else { + XDefineCursor(x11_display,x11_window,null_cursor); // hide cursor } mouse_mode=p_mode; - if (mouse_mode==MOUSE_MODE_CAPTURED) { + if (mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED) { while(true) { //flush pending motion events @@ -768,13 +775,31 @@ void OS_X11::set_window_position(const Point2& p_position) { } Size2 OS_X11::get_window_size() const { - XWindowAttributes xwa; - XGetWindowAttributes(x11_display, x11_window, &xwa); - return Size2i(xwa.width, xwa.height); + // Use current_videomode width and height instead of XGetWindowAttributes + // since right after a XResizeWindow the attributes may not be updated yet + return Size2i(current_videomode.width, current_videomode.height); } void OS_X11::set_window_size(const Size2 p_size) { + // If window resizable is disabled we need to update the attributes first + if (is_window_resizable() == false) { + XSizeHints *xsh; + xsh = XAllocSizeHints(); + xsh->flags = PMinSize | PMaxSize; + xsh->min_width = p_size.x; + xsh->max_width = p_size.x; + xsh->min_height = p_size.y; + xsh->max_height = p_size.y; + XSetWMNormalHints(x11_display, x11_window, xsh); + XFree(xsh); + } + + // Resize the window XResizeWindow(x11_display, x11_window, p_size.x, p_size.y); + + // Update our videomode width and height + current_videomode.width = p_size.x; + current_videomode.height = p_size.y; } void OS_X11::set_window_fullscreen(bool p_enabled) { @@ -788,15 +813,15 @@ bool OS_X11::is_window_fullscreen() const { void OS_X11::set_window_resizable(bool p_enabled) { XSizeHints *xsh; + Size2 size = get_window_size(); + xsh = XAllocSizeHints(); xsh->flags = p_enabled ? 0L : PMinSize | PMaxSize; if(!p_enabled) { - XWindowAttributes xwa; - XGetWindowAttributes(x11_display,x11_window,&xwa); - xsh->min_width = xwa.width; - xsh->max_width = xwa.width; - xsh->min_height = xwa.height; - xsh->max_height = xwa.height; + xsh->min_width = size.x; + xsh->max_width = size.x; + xsh->min_height = size.y; + xsh->max_height = size.y; } XSetWMNormalHints(x11_display, x11_window, xsh); XFree(xsh); @@ -1253,6 +1278,10 @@ void OS_X11::process_xevents() { do_mouse_warp=false; + + // Is the current mouse mode one where it needs to be grabbed. + bool mouse_mode_grab = mouse_mode==MOUSE_MODE_CAPTURED || mouse_mode==MOUSE_MODE_CONFINED; + while (XPending(x11_display) > 0) { XEvent event; XNextEvent(x11_display, &event); @@ -1271,35 +1300,45 @@ void OS_X11::process_xevents() { minimized = (visibility->state == VisibilityFullyObscured); } break; case LeaveNotify: { - - if (main_loop && mouse_mode!=MOUSE_MODE_CAPTURED) + if (main_loop && !mouse_mode_grab) main_loop->notification(MainLoop::NOTIFICATION_WM_MOUSE_EXIT); if (input) input->set_mouse_in_window(false); } break; case EnterNotify: { - - if (main_loop && mouse_mode!=MOUSE_MODE_CAPTURED) + if (main_loop && !mouse_mode_grab) main_loop->notification(MainLoop::NOTIFICATION_WM_MOUSE_ENTER); if (input) input->set_mouse_in_window(true); } break; case FocusIn: minimized = false; + window_has_focus = true; main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); - if (mouse_mode==MOUSE_MODE_CAPTURED) { + if (mouse_mode_grab) { + // Show and update the cursor if confined and the window regained focus. + if (mouse_mode==MOUSE_MODE_CONFINED) + XUndefineCursor(x11_display, x11_window); + else if (mouse_mode==MOUSE_MODE_CAPTURED) // or re-hide it in captured mode + XDefineCursor(x11_display, x11_window, null_cursor); + XGrabPointer( - x11_display, x11_window, True, + x11_display, x11_window, True, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, x11_window, None, CurrentTime); } break; case FocusOut: + window_has_focus = false; main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); - if (mouse_mode==MOUSE_MODE_CAPTURED) { + if (mouse_mode_grab) { //dear X11, I try, I really try, but you never work, you do whathever you want. + if (mouse_mode==MOUSE_MODE_CAPTURED) { + // Show the cursor if we're in captured mode so it doesn't look weird. + XUndefineCursor(x11_display, x11_window); + } XUngrabPointer(x11_display, CurrentTime); } break; @@ -1319,7 +1358,7 @@ void OS_X11::process_xevents() { /* exit in case of a mouse button press */ last_timestamp=event.xbutton.time; - if (mouse_mode==MOUSE_MODE_CAPTURED) { + if (mouse_mode == MOUSE_MODE_CAPTURED) { event.xbutton.x=last_mouse_pos.x; event.xbutton.y=last_mouse_pos.y; } @@ -1342,7 +1381,6 @@ void OS_X11::process_xevents() { mouse_event.mouse_button.pressed=(event.type==ButtonPress); - if (event.type==ButtonPress && event.xbutton.button==1) { uint64_t diff = get_ticks_usec()/1000 - last_click_ms; @@ -1376,7 +1414,6 @@ void OS_X11::process_xevents() { // PLEASE DO ME A FAVOR AND DIE DROWNED IN A FECAL // MOUNTAIN BECAUSE THAT'S WHERE YOU BELONG. - while(true) { if (mouse_mode==MOUSE_MODE_CAPTURED && event.xmotion.x==current_videomode.width/2 && event.xmotion.y==current_videomode.height/2) { //this is likely the warp event since it was warped here @@ -1418,7 +1455,7 @@ void OS_X11::process_xevents() { Point2i new_center = pos; pos = last_mouse_pos + ( pos - center ); center=new_center; - do_mouse_warp=true; + do_mouse_warp=window_has_focus; // warp the cursor if we're focused in #else //Dear X11, thanks for making my life miserable @@ -1461,8 +1498,11 @@ void OS_X11::process_xevents() { last_mouse_pos=pos; // printf("rel: %d,%d\n", rel.x, rel.y ); - - input->parse_input_event( motion_event); + // Don't propagate the motion event unless we have focus + // this is so that the relative motion doesn't get messed up + // after we regain focus. + if (window_has_focus || !mouse_mode_grab) + input->parse_input_event( motion_event); } break; case KeyPress: diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index 3245df32c6..3ec358f103 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -134,7 +134,7 @@ class OS_X11 : public OS_Unix { bool force_quit; bool minimized; - + bool window_has_focus; bool do_mouse_warp; const char *cursor_theme; |