50 lines
940 B
C++
50 lines
940 B
C++
|
|
#include <assert.h>
|
|
#include "Xlib.h"
|
|
|
|
namespace sp { namespace Xlib {
|
|
|
|
namespace _priv {
|
|
// Define a global display (for simplicity, we always connect to local one.)
|
|
::Display* display = NULL;
|
|
};
|
|
|
|
void init()
|
|
{
|
|
_priv::display = XOpenDisplay(NULL);
|
|
}
|
|
|
|
void shutdown()
|
|
{
|
|
XCloseDisplay(_priv::display);
|
|
_priv::display = NULL;
|
|
}
|
|
|
|
::Display* getDisplay()
|
|
{
|
|
assert(_priv::display != NULL);
|
|
return _priv::display;
|
|
}
|
|
|
|
// Implementation borrowed from SFML :)
|
|
::Window getParentWindow(::Window win)
|
|
{
|
|
::Window root, parent;
|
|
::Window* children = nullptr;
|
|
unsigned int numChildren;
|
|
|
|
::XQueryTree(getDisplay(), win, &root, &parent, &children, &numChildren);
|
|
|
|
// Children information is not used, so must be freed.
|
|
if (children != nullptr)
|
|
XFree(children);
|
|
|
|
return parent;
|
|
}
|
|
|
|
::Atom getAtom(const std::string& name, bool onlyIfExists)
|
|
{
|
|
return XInternAtom(getDisplay(), name.c_str(), onlyIfExists);
|
|
}
|
|
|
|
} } // namespace sp::Xlib
|