mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-07-14 21:32:23 +08:00
Added signal handling if the user terminates the program
This commit is contained in:
parent
6eaea71086
commit
e56f128592
32
main.cpp
32
main.cpp
@ -8,8 +8,12 @@
|
|||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <csignal>
|
||||||
#include "GLFW/glfw3.h"
|
#include "GLFW/glfw3.h"
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
|
||||||
#include "WallpaperEngine/Core/CProject.h"
|
#include "WallpaperEngine/Core/CProject.h"
|
||||||
#include "WallpaperEngine/Render/CWallpaper.h"
|
#include "WallpaperEngine/Render/CWallpaper.h"
|
||||||
#include "WallpaperEngine/Render/CContext.h"
|
#include "WallpaperEngine/Render/CContext.h"
|
||||||
@ -54,6 +58,26 @@ std::string stringPathFixes(const std::string& s)
|
|||||||
return std::move (str);
|
return std::move (str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void free_display_wallpaper(int sig)
|
||||||
|
{
|
||||||
|
Display* display = XOpenDisplay (nullptr);
|
||||||
|
Window root = DefaultRootWindow(display);
|
||||||
|
// create a blank pm to reset compositors values, compositors will render as a blank X window.
|
||||||
|
Pixmap pm = XCreatePixmap(display, root, 1, 1, 1);
|
||||||
|
Atom prop_root = XInternAtom(display, "_XROOTPMAP_ID", False);
|
||||||
|
Atom prop_esetroot = XInternAtom(display, "ESETROOT_PMAP_ID", False);
|
||||||
|
XChangeProperty(display, root, prop_root, XA_PIXMAP, 32, PropModeReplace, (unsigned char *) &pm, 1);
|
||||||
|
XChangeProperty(display, root, prop_esetroot, XA_PIXMAP, 32, PropModeReplace, (unsigned char *) &pm, 1);
|
||||||
|
XFreePixmap(display, pm);
|
||||||
|
// set background to black. Only needed if no compositors are running
|
||||||
|
XSetWindowBackground(display, root, 0);
|
||||||
|
// sync changes before exiting
|
||||||
|
XClearWindow(display, root);
|
||||||
|
XFlush(display);
|
||||||
|
XCloseDisplay(display);
|
||||||
|
exit(sig);
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char* argv[])
|
int main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
std::vector <std::string> screens;
|
std::vector <std::string> screens;
|
||||||
@ -145,6 +169,14 @@ int main (int argc, char* argv[])
|
|||||||
|
|
||||||
// ensure the path has a trailing slash
|
// ensure the path has a trailing slash
|
||||||
|
|
||||||
|
// Attach signals for unexpected killing of program by user. We need to reset the
|
||||||
|
// screen otherwise the background will remain the last frame on sigterm or sigint.
|
||||||
|
if (!screens.empty())
|
||||||
|
{
|
||||||
|
std::signal(SIGINT, free_display_wallpaper);
|
||||||
|
std::signal(SIGTERM, free_display_wallpaper);
|
||||||
|
}
|
||||||
|
|
||||||
// first of all, initialize the window
|
// first of all, initialize the window
|
||||||
if (glfwInit () == GLFW_FALSE)
|
if (glfwInit () == GLFW_FALSE)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user