From 3be04f73f567b9c39efae697e2a9b7d3c6185fc3 Mon Sep 17 00:00:00 2001 From: geequlim Date: Sat, 20 Jan 2018 21:40:52 +0800 Subject: [PATCH 1/3] Windows: implement OS.get_unique_id and OS.set_ime_position --- platform/windows/detect.py | 4 ++-- platform/windows/os_windows.cpp | 18 ++++++++++++++++++ platform/windows/os_windows.h | 4 ++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/platform/windows/detect.py b/platform/windows/detect.py index 22d04153c82..2b3743b0667 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -179,7 +179,7 @@ def configure(env): if env["bits"] == "64": env.Append(CCFLAGS=['/D_WIN64']) - LIBS = ['winmm', 'opengl32', 'dsound', 'kernel32', 'ole32', 'oleaut32', 'user32', 'gdi32', 'IPHLPAPI', 'Shlwapi', 'wsock32', 'Ws2_32', 'shell32', 'advapi32', 'dinput8', 'dxguid'] + LIBS = ['winmm', 'opengl32', 'dsound', 'kernel32', 'ole32', 'oleaut32', 'user32', 'gdi32', 'IPHLPAPI', 'Shlwapi', 'wsock32', 'Ws2_32', 'shell32', 'advapi32', 'dinput8', 'dxguid', 'Imm32'] env.Append(LINKFLAGS=[p + env["LIBSUFFIX"] for p in LIBS]) env.Append(LIBPATH=[os.getenv("WindowsSdkDir") + "/Lib"]) @@ -281,7 +281,7 @@ def configure(env): env.Append(CCFLAGS=['-DRTAUDIO_ENABLED']) env.Append(CCFLAGS=['-DWASAPI_ENABLED']) env.Append(CCFLAGS=['-DWINVER=%s' % env['target_win_version'], '-D_WIN32_WINNT=%s' % env['target_win_version']]) - env.Append(LIBS=['mingw32', 'opengl32', 'dsound', 'ole32', 'd3d9', 'winmm', 'gdi32', 'iphlpapi', 'shlwapi', 'wsock32', 'ws2_32', 'kernel32', 'oleaut32', 'dinput8', 'dxguid', 'ksuser']) + env.Append(LIBS=['mingw32', 'opengl32', 'dsound', 'ole32', 'd3d9', 'winmm', 'gdi32', 'iphlpapi', 'shlwapi', 'wsock32', 'ws2_32', 'kernel32', 'oleaut32', 'dinput8', 'dxguid', 'ksuser', 'Imm32']) env.Append(CPPFLAGS=['-DMINGW_ENABLED']) diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index a2a51f10a79..de51c811b85 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -2442,6 +2442,24 @@ String OS_Windows::get_user_data_dir() const { return ProjectSettings::get_singleton()->get_resource_path(); } +String OS_Windows::get_unique_id() const { + + HW_PROFILE_INFO HwProfInfo; + ERR_FAIL_COND_V(!GetCurrentHwProfile(&HwProfInfo), ""); + return String(HwProfInfo.szHwProfileGuid); +} + +void OS_Windows::set_ime_position(const Point2 &p_pos) { + + HIMC himc = ImmGetContext(hWnd); + COMPOSITIONFORM cps; + cps.dwStyle = CFS_FORCE_POSITION; + cps.ptCurrentPos.x = p_pos.x; + cps.ptCurrentPos.y = p_pos.y; + ImmSetCompositionWindow(himc, &cps); + ImmReleaseContext(hWnd, himc); +} + bool OS_Windows::is_joy_known(int p_device) { return input->is_joy_mapped(p_device); } diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 73086506955..bcbcf219260 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -269,6 +269,10 @@ public: virtual String get_system_dir(SystemDir p_dir) const; virtual String get_user_data_dir() const; + virtual String get_unique_id() const; + + virtual void set_ime_position(const Point2 &p_pos); + virtual void release_rendering_thread(); virtual void make_rendering_thread(); virtual void swap_buffers(); From df1c16d0fe06426dfdea8259878e479b38623d04 Mon Sep 17 00:00:00 2001 From: geequlim Date: Sat, 20 Jan 2018 21:42:19 +0800 Subject: [PATCH 2/3] X11: implement OS.get_unique_id --- platform/x11/os_x11.cpp | 15 +++++++++++++++ platform/x11/os_x11.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index eaf72d4dbf1..43a7b41f8a8 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -549,6 +549,21 @@ void OS_X11::set_ime_position(const Point2 &p_pos) { XFree(preedit_attr); } +String OS_X11::get_unique_id() const { + + static String machine_id; + if (machine_id.empty()) { + if (FileAccess *f = FileAccess::open("/etc/machine-id", FileAccess::READ)) { + while (machine_id.empty() && !f->eof_reached()) { + machine_id = f->get_line().strip_edges(); + } + f->close(); + memdelete(f); + } + } + return machine_id; +} + void OS_X11::finalize() { if (main_loop) diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index f7bc0b73e01..c80a2920024 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -266,6 +266,8 @@ public: virtual bool get_borderless_window(); virtual void set_ime_position(const Point2 &p_pos); + virtual String get_unique_id() const; + virtual void move_window_to_foreground(); virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); From 5980bef67294e861b25071df76c0169e360a2f76 Mon Sep 17 00:00:00 2001 From: geequlim Date: Sat, 20 Jan 2018 23:17:39 +0800 Subject: [PATCH 3/3] OSX: implement OS.get_unique_id Update the documentations for OS.get_unique_id() --- doc/classes/OS.xml | 3 ++- platform/osx/os_osx.h | 2 ++ platform/osx/os_osx.mm | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 80febff4af7..a61b156b01f 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -346,7 +346,8 @@ - Returns a string that is unique to the device. Currently only works on Android and iOS. Returns empty string on other platforms. + Returns a string that is unique to the device. + Returns empty string on HTML5 and UWP which are not supported yet. diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index d9ad0a7db86..41e0585af67 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -229,6 +229,8 @@ public: virtual void set_ime_position(const Point2 &p_pos); virtual void set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp); + virtual String get_unique_id() const; + virtual OS::PowerState get_power_state(); virtual int get_power_seconds_left(); virtual int get_power_percent_left(); diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index ab54f620453..56ba80031b6 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -963,6 +963,30 @@ void OS_OSX::set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_ } } +String OS_OSX::get_unique_id() const { + + static String serial_number; + + if (serial_number.empty()) { + io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")); + CFStringRef serialNumberAsCFString = NULL; + if (platformExpert) { + serialNumberAsCFString = (CFStringRef)IORegistryEntryCreateCFProperty(platformExpert, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0); + IOObjectRelease(platformExpert); + } + + NSString *serialNumberAsNSString = nil; + if (serialNumberAsCFString) { + serialNumberAsNSString = [NSString stringWithString:(NSString *)serialNumberAsCFString]; + CFRelease(serialNumberAsCFString); + } + + serial_number = [serialNumberAsNSString UTF8String]; + } + + return serial_number; +} + void OS_OSX::set_ime_position(const Point2 &p_pos) { im_position = p_pos; }