default: #define uint _uint #define String String_ #include #ifdef __WIN32__ #define WIN32_LEAN_AND_MEAN #include #include #include #else #define uint _uint #define property _property #define new _new #define class _class #define Window X11Window #define Cursor X11Cursor #define Font X11Font #define Display X11Display #define Time X11Time #define KeyCode X11KeyCode #include #include #include #include #include #include #undef Window #undef Cursor #undef Font #undef Display #undef Time #undef KeyCode #undef uint #undef new #undef property #undef class #endif #undef uint #undef String private: import "ecere" #ifdef __WIN32__ static bool CALLBACK EnumWindowsBringToTop(HWND hwnd, LPARAM lParam) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); if(pid == lParam) BringWindowToTop(hwnd); return true; } static bool CALLBACK EnumWindowsSetForeground(HWND hwnd, LPARAM lParam) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); if(pid == lParam) { for(;;) { HWND parent = GetParent(hwnd); if(parent) hwnd = parent; else break; } SetForegroundWindow(hwnd); //SetForegroundWindow( GetAncestor(hwnd, GA_ROOTOWNER)); return false; } return true; } class ShowProcessWindowsThread : Thread { int processId; unsigned int Main() { if(processId) { EnumWindows(EnumWindowsSetForeground, processId); EnumWindows(EnumWindowsBringToTop, processId); } return 0; } } #else extern void * IS_XGetDisplay(); static Atom xa_NET_WM_PID, xa_activeWindow; static void WaitForViewableWindow(X11Display * xGlobalDisplay, X11Window window) { int c; XFlush(xGlobalDisplay); for(c = 0; c<4; c++) // while(true) { XWindowAttributes attributes = { 0 }; XGetWindowAttributes(xGlobalDisplay, window, &attributes); if(attributes.map_state == IsViewable) break; else Sleep(1.0 / 18.2); } } static void EnumWindowBringToTop(X11Display * xGlobalDisplay, X11Window window, int processId) { Atom xa_type; X11Window root = 0, parent = 0, * children = null; uint numWindows = 0; int format; unsigned long len, fill; if(XQueryTree(xGlobalDisplay, window, &root, &parent, &children, &numWindows)) { int c; for(c = 0; c 0 && ppidColumn > 0) firstLine = false; else break; } else { if(count > pidColumn && count > ppidColumn && strtoul(tokens[ppidColumn], null, 0) == parentProcessId) { pid = (uint)strtoul(tokens[pidColumn], null, 0); break; } } } } delete f; } return pid; #endif } void setEcereLanguageInWinRegEnvironment(const char * languageCode) { #ifdef __WIN32__ HKEY key = null; uint16 wLanguage[256]; DWORD status; wLanguage[0] = 0; RegCreateKeyEx(HKEY_CURRENT_USER, "Environment", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, null, &key, &status); if(key) { UTF8toUTF16Buffer(languageCode, wLanguage, sizeof(wLanguage) / sizeof(uint16)); RegSetValueExW(key, L"ECERE_LANGUAGE", 0, REG_EXPAND_SZ, (byte *)wLanguage, (uint)(wcslen(wLanguage)+1) * 2); RegCloseKey(key); } #endif }