22 #include "C4Version.h"
30 #ifdef SDL_VIDEO_DRIVER_X11
32 #include <X11/Xutil.h>
33 #include <SDL_syswm.h>
39 Active(false), pSurface(nullptr), eKind(W_Fullscreen), window(nullptr)
51 static void SetMultisamplingAttributes(
int samples)
53 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, samples > 0 ? 1 : 0);
54 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples);
58 static void EnumerateMultiSamplesSDL(std::vector<int>& samples)
61 glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
63 max_samples = std::max(max_samples, 16);
65 for (
int s = 2;
s <= max_samples;
s *= 2)
68 SetMultisamplingAttributes(
s);
69 SDL_Window *wnd = SDL_CreateWindow(
"OpenClonk Test Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100, SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN);
72 SDL_DestroyWindow(wnd);
94 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
95 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
96 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
97 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
98 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
99 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
101 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
102 EnumerateMultiSamplesSDL(available_samples);
104 for (
auto e : available_samples)
107 SetMultisamplingAttributes(samples);
108 uint32_t flags = SDL_WINDOW_OPENGL;
110 flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
112 flags |= SDL_WINDOW_FULLSCREEN;
113 window = SDL_CreateWindow(Title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, size->
Wdt, size->
Hgt, flags);
120 SDL_SetWindowData(window,
"C4Window",
this);
122 SDL_ShowCursor(SDL_DISABLE);
136 if (window) SDL_DestroyWindow(window);
139 #ifdef WITH_QT_EDITOR
150 samples = available_samples;
162 pRect->
x = pRect->
y = 0;
163 SDL_GL_GetDrawableSize(window, &pRect->
Wdt, &pRect->
Hgt);
169 SDL_SetWindowSize(window,
X, Y);
174 SDL_SetWindowTitle(window, Title);
183 static void SetUrgencyHint(SDL_Window *window,
bool urgency_hint)
185 #ifdef SDL_VIDEO_DRIVER_X11
186 SDL_SysWMinfo wminfo;
187 SDL_VERSION(&wminfo.version);
188 if (!SDL_GetWindowWMInfo(window, &wminfo))
190 LogF(
"FlashWindow SDL: %s", SDL_GetError());
194 if (wminfo.subsystem == SDL_SYSWM_X11)
196 auto x11 = wminfo.info.x11;
197 XWMHints *wmhints = XGetWMHints(x11.display, x11.window);
198 if (wmhints ==
nullptr)
199 wmhints = XAllocWMHints();
202 wmhints->flags |= XUrgencyHint;
204 wmhints->flags &= ~XUrgencyHint;
205 XSetWMHints(x11.display, x11.window, wmhints);
213 SetUrgencyHint(window,
true);
218 SDL_SetWindowGrab(window, grab ? SDL_TRUE : SDL_FALSE);
221 void C4Window::HandleSDLEvent(SDL_WindowEvent &e)
225 case SDL_WINDOWEVENT_FOCUS_GAINED:
226 SetUrgencyHint(window,
false);
228 case SDL_WINDOWEVENT_RESIZED:
229 case SDL_WINDOWEVENT_SIZE_CHANGED:
C4Application Application
const char * LoadResStr(const char *id)
bool Log(const char *szMessage)
bool LogF(const char *strMessage,...)
void OnResolutionChanged(unsigned int iXRes, unsigned int iYRes) override
C4ConfigGraphics Graphics
void AddViewport(C4ViewportWindow *cvp)
void RemoveViewport(C4ViewportWindow *cvp)
bool ShowMessage(const char *szMessage, const char *szCaption, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
virtual void EnumerateMultiSamples(std::vector< int > &samples, int min_expected=0) const
virtual C4Window * Init(WindowKind windowKind, C4AbstractApp *pApp, const char *Title, const C4Rect *size)
bool GetSize(C4Rect *pRect)
virtual bool ReInit(C4AbstractApp *pApp)
void SetTitle(const char *Title)
virtual void PerformUpdate()
bool RestorePosition(const char *szWindowName, const char *szSubKey, bool fHidden=false)
void SetSize(unsigned int cx, unsigned int cy)
virtual void RequestUpdate()
bool StorePosition(const char *szWindowName, const char *szSubKey, bool fStoreSize=true)
void GrabMouse(bool grab)