modules/jdk.packager/src/main/native/library/common/LinuxPlatform.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2014, 2016, Oracle and/or its affiliates. * All rights reserved. Use is subject to license terms. * * This file is available and licensed under the following license: * * Redistribution and use in source and binary forms, with or without --- 1,7 ---- /* ! * Copyright (c) 2014, 2017, Oracle and/or its affiliates. * All rights reserved. Use is subject to license terms. * * This file is available and licensed under the following license: * * Redistribution and use in source and binary forms, with or without
*** 40,49 **** --- 40,57 ---- #include "PlatformString.h" #include <stdlib.h> #include <pwd.h> + #include <sys/file.h> + #include <sys/stat.h> + #include <errno.h> + #include <unistd.h> + #include <sys/types.h> + #include <limits.h> + + #define LINUX_PACKAGER_TMP_DIR "/.java/packager/tmp" TString GetEnv(const TString &name) { TString result;
*** 193,202 **** --- 201,225 ---- bool LinuxPlatform::IsMainThread() { bool result = (FMainThread == pthread_self()); return result; } + const char* LinuxPlatform::getTmpDirString() { + return LINUX_PACKAGER_TMP_DIR; + } + + void LinuxPlatform::reactivateAnotherInstance() { + if (singleInstanceProcessId == 0) { + printf("Unable to reactivate another instance, PID is undefined"); + return; + } + Display* dsp = XOpenDisplay(NULL); + ProcessReactivator processReactivator(dsp, singleInstanceProcessId); + processReactivator.reactivateProcess(); + XCloseDisplay(dsp); + } + TPlatformNumber LinuxPlatform::GetMemorySize() { long pages = sysconf(_SC_PHYS_PAGES); long page_size = sysconf(_SC_PAGE_SIZE); TPlatformNumber result = pages * page_size; result = result / 1048576; // Convert from bytes to megabytes.
*** 1101,1108 **** --- 1124,1193 ---- } return result; } + ProcessReactivator::ProcessReactivator(Display* display, pid_t pid): + _pid(pid), _display(display) { + + _atomPid = XInternAtom(display, "_NET_WM_PID", True); + + if (_atomPid == None) { + return; + } + searchWindowHelper(XDefaultRootWindow(display)); + } + + void ProcessReactivator::searchWindowHelper(Window w) { + Atom type; + int format; + unsigned long num, bytesAfter; + unsigned char* propPid = 0; + if (Success == XGetWindowProperty(_display, w, _atomPid, 0, 1, False, XA_CARDINAL, + &type, &format, &num, &bytesAfter, &propPid)) { + if (propPid != 0) { + if (_pid == *((pid_t *)propPid)) { + _result.push_back(w); + } + XFree(propPid); + } + } + + Window root, parent; + Window* child; + unsigned int numChildren; + if (0 != XQueryTree(_display, w, &root, &parent, &child, &numChildren)) { + for (unsigned int i = 0; i < numChildren; i++) { + searchWindowHelper(child[i]); + } + } + } + + void ProcessReactivator::reactivateProcess() { + for (std::list<Window>::const_iterator it = _result.begin(); it != _result.end(); it++) { + // try sending an event to activate window, + // after that we can try to raise it. + XEvent xev; + Atom atom = XInternAtom (_display, "_NET_ACTIVE_WINDOW", False); + xev.xclient.type = ClientMessage; + xev.xclient.serial = 0; + xev.xclient.send_event = True; + xev.xclient.display = _display; + xev.xclient.window = *it; + xev.xclient.message_type = atom; + xev.xclient.format = 32; + xev.xclient.data.l[0] = 2; + xev.xclient.data.l[1] = 0; + xev.xclient.data.l[2] = 0; + xev.xclient.data.l[3] = 0; + xev.xclient.data.l[4] = 0; + XWindowAttributes attr; + XGetWindowAttributes(_display, *it, &attr); + XSendEvent(_display, attr.root, False, + SubstructureRedirectMask | SubstructureNotifyMask, &xev); + XRaiseWindow(_display, *it); + } + } + //-------------------------------------------------------------------------------------------------- #endif // LINUX