1
0
Fork 0

Platform/Unix/X11Display: implement setDecoration()

This commit is contained in:
Henrik Hautakoski 2022-10-02 17:01:40 +02:00
parent c20c79cfd3
commit b78ddba11e
2 changed files with 41 additions and 0 deletions

View file

@ -1,8 +1,10 @@
#include <cstring>
#include <Spectre/System/Log.h>
#include <Spectre/Graphics/Image.h>
#include "X11WindowEventHandler.h"
#include "Xlib.h"
#include "wm_hints.h"
#include "GLXContext.h"
#include "X11Display.h"
@ -157,6 +159,43 @@ void X11Display::setVisible(bool visible)
}
}
void X11Display::setDecoration(unsigned decoration)
{
Atom WMHintsAtom = Xlib::getAtom("_MOTIF_WM_HINTS", false);
Log::info("X11: Decoration");
if (WMHintsAtom) {
WMHints hints;
std::memset(&hints, 0, sizeof(hints));
hints.flags = MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS;
hints.decorations = 0;
hints.functions = 0;
if (decoration & DisplayDecorate::Menu) {
Log::info("X11: Decoration Menu");
hints.decorations |= MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MINIMIZE | MWM_DECOR_MENU;
hints.functions |= MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE;
}
if (decoration & DisplayDecorate::Resize) {
Log::info("X11: Decoration Resize");
hints.decorations |= MWM_DECOR_MAXIMIZE | MWM_DECOR_RESIZEH;
hints.functions |= MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE;
}
if (decoration & DisplayDecorate::Close) {
Log::info("X11: Decoration Close");
hints.decorations |= 0;
hints.functions |= MWM_FUNC_CLOSE;
}
::XChangeProperty(Xlib::getDisplay(), m_win, WMHintsAtom, WMHintsAtom,
32, PropModeReplace, (const unsigned char*)&hints, WMHINTS_NUM_ELEMENTS);
}
}
void X11Display::minimize()
{
::XIconifyWindow(Xlib::getDisplay(), m_win, m_screen);

View file

@ -38,6 +38,8 @@ public :
virtual void setVisible(bool visible);
virtual void setDecoration(unsigned decoration);
virtual void minimize();
virtual void maximize();