diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index b9e73ac..2cbb3d0 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -7,6 +7,11 @@ #include "GLXContext.h" #include "X11Display.h" +// Sometimes not defined in headers. +#ifndef _NET_WM_STATE_TOGGLE +#define _NET_WM_STATE_TOGGLE 2 +#endif + namespace sp { X11Display:: @@ -61,7 +66,7 @@ bool X11Display::create(DisplayDescription description) protocols = getAtom("WM_DELETE_WINDOW"); XSetWMProtocols(m_disp, m_win, &protocols, 1); - XMapWindow(m_disp, m_win); + setVisible(true); setSize(description.mode.width, description.mode.height); @@ -125,6 +130,49 @@ void X11Display::setPosition(unsigned int x, unsigned int y) ::XMoveWindow(m_disp, m_win, x, y); } +Vector2u X11Display::getPosition() const +{ + Vector2u pos(0, 0); + XWindowAttributes attr; + + if (XGetWindowAttributes(m_disp, m_win, &attr)) { + pos.x = attr.x; + pos.y = attr.y; + } + return pos; +} + +void X11Display::setVisible(bool visible) +{ + if (visible) { + ::XMapWindow(m_disp, m_win); + } else { + ::XUnmapWindow(m_disp, m_win); + } +} + +void X11Display::minimize() +{ + ::XIconifyWindow(m_disp, m_win, m_screen); +} + +void X11Display::maximize() +{ + ::XClientMessageEvent ev = {}; + + ev.type = ClientMessage; + ev.window = m_win; + ev.message_type = getAtom("_NET_WM_STATE"); + ev.format = 32; + ev.data.l[0] = _NET_WM_STATE_TOGGLE; + ev.data.l[1] = getAtom("_NET_WM_STATE_MAXIMIZED_HORZ"); + ev.data.l[2] = getAtom("_NET_WM_STATE_MAXIMIZED_VERT"); + ev.data.l[3] = 1; + + ::XSendEvent(m_disp, DefaultRootWindow(m_disp), False, + SubstructureNotifyMask, (XEvent*) &ev); +} + void X11Display::setCaption(const std::string& caption) { ::XStoreName(m_disp, m_win, caption.c_str()); @@ -190,6 +238,11 @@ void X11Display::showCursor(bool value) XDefineCursor(m_disp, m_win, value ? m_cur_last : m_cur_hidden); } +void X11Display::grabCursor(bool value) +{ + // TODO (this is abit harder on X11 than windows.) +} + void X11Display::processEvent(const ::XEvent& event) { Vector2u size; diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 538e5c0..b62a372 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -32,6 +32,14 @@ public : virtual void setPosition(unsigned int x, unsigned int y); + virtual Vector2u getPosition() const; + + virtual void setVisible(bool visible); + + virtual void minimize(); + + virtual void maximize(); + virtual void setCaption(const std::string& caption); virtual void setIcon(const std::string& icon); @@ -40,6 +48,8 @@ public : virtual void showCursor(bool value); + virtual void grabCursor(bool value); + void processEvent(const ::XEvent& event); protected :