Use SDL_FlashWindow to request user's attention

This commit is contained in:
Jupeyy 2021-06-05 01:34:26 +02:00
parent deaec2792a
commit 3c1e0fe663
3 changed files with 5 additions and 42 deletions

View file

@ -599,9 +599,8 @@ elseif(TARGET_OS STREQUAL "android")
else() else()
find_package(Notify) find_package(Notify)
find_package(OpenGL) find_package(OpenGL)
find_package(X11) set(PLATFORM_CLIENT_LIBS ${OPENGL_gl_LIBRARY} ${NOTIFY_LIBRARIES})
set(PLATFORM_CLIENT_LIBS ${OPENGL_gl_LIBRARY} ${X11_X11_LIB} ${NOTIFY_LIBRARIES}) set(PLATFORM_CLIENT_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR} ${NOTIFY_INCLUDE_DIRS})
set(PLATFORM_CLIENT_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR} ${X11_X11_INCLUDE_PATH} ${NOTIFY_INCLUDE_DIRS})
set(PLATFORM_CLIENT) set(PLATFORM_CLIENT)
if(TARGET_OS STREQUAL "linux") if(TARGET_OS STREQUAL "linux")
set(PLATFORM_LIBS rt) # clock_gettime for glibc < 2.17 set(PLATFORM_LIBS rt) # clock_gettime for glibc < 2.17

View file

@ -24,11 +24,6 @@
#include "SDL_pixels.h" #include "SDL_pixels.h"
#include "SDL_video.h" #include "SDL_video.h"
#if defined(SDL_VIDEO_DRIVER_X11)
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#endif
#include <engine/shared/config.h> #include <engine/shared/config.h>
#include <base/tl/threading.h> #include <base/tl/threading.h>
@ -1213,41 +1208,12 @@ void CGraphicsBackend_SDL_OpenGL::GetViewportSize(int &w, int &h)
void CGraphicsBackend_SDL_OpenGL::NotifyWindow() void CGraphicsBackend_SDL_OpenGL::NotifyWindow()
{ {
// get window handle #if SDL_MAJOR_VERSION > 2 || (SDL_MAJOR_VERSION == 2 && SDL_PATCHLEVEL >= 16)
SDL_SysWMinfo info; if(SDL_FlashWindow(m_pWindow, SDL_FlashOperation::SDL_FLASH_BRIEFLY) != 0)
SDL_VERSION(&info.version);
if(!SDL_GetWindowWMInfo(m_pWindow, &info))
{ {
dbg_msg("gfx", "unable to obtain window handle"); // fails if SDL hasn't implemented it
return; return;
} }
#if defined(CONF_FAMILY_WINDOWS)
FLASHWINFO desc;
desc.cbSize = sizeof(desc);
desc.hwnd = info.info.win.window;
desc.dwFlags = FLASHW_TRAY;
desc.uCount = 3; // flash 3 times
desc.dwTimeout = 0;
FlashWindowEx(&desc);
#elif defined(SDL_VIDEO_DRIVER_X11) && !defined(CONF_PLATFORM_MACOS)
Display *pX11Dpy = info.info.x11.display;
Window X11Win = info.info.x11.window;
static Atom s_DemandsAttention = XInternAtom(pX11Dpy, "_NET_WM_STATE_DEMANDS_ATTENTION", true);
static Atom s_WmState = XInternAtom(pX11Dpy, "_NET_WM_STATE", true);
XEvent SndNtfyEvent = {ClientMessage};
SndNtfyEvent.xclient.window = X11Win;
SndNtfyEvent.xclient.message_type = s_WmState;
SndNtfyEvent.xclient.format = 32;
SndNtfyEvent.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD
SndNtfyEvent.xclient.data.l[1] = s_DemandsAttention;
SndNtfyEvent.xclient.data.l[2] = 0;
SndNtfyEvent.xclient.data.l[3] = 1; // normal application
SndNtfyEvent.xclient.data.l[4] = 0;
XSendEvent(pX11Dpy, XDefaultRootWindow(pX11Dpy), False, SubstructureNotifyMask | SubstructureRedirectMask, &SndNtfyEvent);
#endif #endif
} }

View file

@ -1,7 +1,5 @@
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */
#include "SDL.h" // SDL_VIDEO_DRIVER_X11
#include <base/tl/string.h> #include <base/tl/string.h>
#include <base/math.h> #include <base/math.h>