2018-10-03 17:14:51 -04:00
|
|
|
// SPDX-License-Identifier: MIT
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
/*
|
|
|
|
* Compton - a compositor for X11
|
|
|
|
*
|
|
|
|
* Based on `xcompmgr` - Copyright (c) 2003, Keith Packard
|
|
|
|
*
|
|
|
|
* Copyright (c) 2011-2013, Christopher Jeffrey
|
2018-10-03 17:14:51 -04:00
|
|
|
* Copyright (c) 2018, Yuxuan Shui <yshuiv7@gmail.com>
|
|
|
|
*
|
2018-10-03 17:24:12 -04:00
|
|
|
* See LICENSE-mit for more information.
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2018-08-22 07:58:49 -04:00
|
|
|
#pragma once
|
2013-01-24 00:38:03 -05:00
|
|
|
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
// === Options ===
|
|
|
|
|
|
|
|
// Debug options, enable them using -D in CFLAGS
|
|
|
|
// #define DEBUG_REPAINT 1
|
|
|
|
// #define DEBUG_EVENTS 1
|
|
|
|
// #define DEBUG_RESTACK 1
|
|
|
|
// #define DEBUG_WINMATCH 1
|
2013-01-24 00:38:03 -05:00
|
|
|
// #define DEBUG_C2 1
|
2019-02-02 17:19:15 -05:00
|
|
|
// #define DEBUG_GLX_DEBUG_CONTEXT 1
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2018-11-10 07:48:36 -05:00
|
|
|
#define MAX_ALPHA (255)
|
|
|
|
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
// === Includes ===
|
|
|
|
|
|
|
|
// For some special functions
|
2019-03-10 08:34:37 -04:00
|
|
|
#include <assert.h>
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
#include <stdbool.h>
|
|
|
|
#include <sys/time.h>
|
2019-03-10 08:34:37 -04:00
|
|
|
#include <time.h>
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2019-05-05 21:47:01 -04:00
|
|
|
#include <X11/Xlib.h>
|
2019-03-10 08:34:37 -04:00
|
|
|
#include <ev.h>
|
|
|
|
#include <pixman.h>
|
2019-08-09 19:56:04 -04:00
|
|
|
#include <xcb/render.h>
|
|
|
|
#include <xcb/sync.h>
|
2022-12-14 09:23:55 -05:00
|
|
|
#include <xcb/xproto.h>
|
2018-09-29 05:46:29 -04:00
|
|
|
|
2019-04-03 03:36:02 -04:00
|
|
|
#include "uthash_extra.h"
|
2018-08-22 10:12:29 -04:00
|
|
|
#ifdef CONFIG_OPENGL
|
2019-02-08 19:36:14 -05:00
|
|
|
#include "backend/gl/glx.h"
|
2015-01-10 21:47:19 -05:00
|
|
|
#endif
|
|
|
|
|
2014-08-03 07:40:40 -04:00
|
|
|
// X resource checker
|
|
|
|
#ifdef DEBUG_XRC
|
|
|
|
#include "xrescheck.h"
|
|
|
|
#endif
|
|
|
|
|
2018-10-20 22:10:12 -04:00
|
|
|
// FIXME This list of includes should get shorter
|
2019-03-10 08:34:37 -04:00
|
|
|
#include "backend/backend.h"
|
2019-04-19 19:21:38 -04:00
|
|
|
#include "backend/driver.h"
|
2019-03-10 08:34:37 -04:00
|
|
|
#include "compiler.h"
|
2019-01-18 18:30:44 -05:00
|
|
|
#include "config.h"
|
2022-12-14 09:23:55 -05:00
|
|
|
#include "list.h"
|
2019-03-10 08:34:37 -04:00
|
|
|
#include "region.h"
|
2022-12-14 09:23:55 -05:00
|
|
|
#include "render.h"
|
2023-06-10 09:08:49 -04:00
|
|
|
#include "statistics.h"
|
2019-03-10 08:34:37 -04:00
|
|
|
#include "types.h"
|
2019-01-20 11:53:39 -05:00
|
|
|
#include "utils.h"
|
2019-08-10 10:31:23 -04:00
|
|
|
#include "win_defs.h"
|
2019-01-20 11:53:39 -05:00
|
|
|
#include "x.h"
|
Convert XfixesRegion to pixman region
Re-did the painting logic, and document it.
It is unclear to me what is the previous painting logic. But the current
one is basically this:
1. Go through all windows top to bottom, and put visible windows (not
unmapped, opacity > 0, etc) into a linked list, from bottom to top
2. Accumulate a region of ignore on each window, which is basically the
region of screen that is obscured by all the windows above current
one.
3. Paint all the visible windows from bottom to top. Subtract the region
of ignore from the painting region. If we need to paint shadow, we
subtract the body of the window from the shadow painting region too,
because we don't want shadow behind the window.
4. region of ignore is invalidated when window stack change, an
window on top moved or changed shape, when window changed between
opaque and transparent, etc.
Notes:
It is unclear whether all the different shapes of a window (extents,
noframe, border, bounding shape, etc) are calculated correctly or not.
It is unclear if window shape related events are handled correctly or
not. Need more testing.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2018-09-29 23:56:00 -04:00
|
|
|
|
2019-05-05 21:03:07 -04:00
|
|
|
// === Constants ===0
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
|
|
|
#define NS_PER_SEC 1000000000L
|
|
|
|
#define US_PER_SEC 1000000L
|
|
|
|
#define MS_PER_SEC 1000
|
|
|
|
|
2013-03-15 11:16:23 -04:00
|
|
|
/// @brief Maximum OpenGL FBConfig depth.
|
|
|
|
#define OPENGL_MAX_DEPTH 32
|
|
|
|
|
2013-04-26 02:01:20 -04:00
|
|
|
/// @brief Maximum OpenGL buffer age.
|
|
|
|
#define CGLX_MAX_BUFFER_AGE 5
|
|
|
|
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
// Window flags
|
|
|
|
|
|
|
|
// === Types ===
|
2018-12-30 19:38:13 -05:00
|
|
|
typedef struct glx_fbconfig glx_fbconfig_t;
|
2019-05-05 21:03:07 -04:00
|
|
|
struct glx_session;
|
2019-05-05 19:34:08 -04:00
|
|
|
struct atom;
|
2019-08-09 19:56:04 -04:00
|
|
|
struct conv;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2018-08-22 10:12:29 -04:00
|
|
|
#ifdef CONFIG_OPENGL
|
2014-03-17 11:25:34 -04:00
|
|
|
#ifdef DEBUG_GLX_DEBUG_CONTEXT
|
2019-03-10 08:34:37 -04:00
|
|
|
typedef GLXContext (*f_glXCreateContextAttribsARB)(Display *dpy, GLXFBConfig config,
|
|
|
|
GLXContext share_context, Bool direct,
|
|
|
|
const int *attrib_list);
|
|
|
|
typedef void (*GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity,
|
|
|
|
GLsizei length, const GLchar *message, GLvoid *userParam);
|
|
|
|
typedef void (*f_DebugMessageCallback)(GLDEBUGPROC, void *userParam);
|
2014-03-17 11:25:34 -04:00
|
|
|
#endif
|
|
|
|
|
2018-12-15 16:11:41 -05:00
|
|
|
typedef struct glx_prog_main {
|
2019-03-10 08:34:37 -04:00
|
|
|
/// GLSL program.
|
|
|
|
GLuint prog;
|
|
|
|
/// Location of uniform "opacity" in window GLSL program.
|
|
|
|
GLint unifm_opacity;
|
|
|
|
/// Location of uniform "invert_color" in blur GLSL program.
|
|
|
|
GLint unifm_invert_color;
|
|
|
|
/// Location of uniform "tex" in window GLSL program.
|
|
|
|
GLint unifm_tex;
|
2020-03-10 03:29:38 -04:00
|
|
|
/// Location of uniform "time" in window GLSL program.
|
|
|
|
GLint unifm_time;
|
2014-05-16 03:18:17 -04:00
|
|
|
} glx_prog_main_t;
|
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
#define GLX_PROG_MAIN_INIT \
|
2020-03-10 03:29:38 -04:00
|
|
|
{ \
|
|
|
|
.prog = 0, .unifm_opacity = -1, .unifm_invert_color = -1, \
|
|
|
|
.unifm_tex = -1, .unifm_time = -1 \
|
|
|
|
}
|
2014-05-16 03:18:17 -04:00
|
|
|
|
2018-09-29 17:47:12 -04:00
|
|
|
#else
|
2019-03-10 08:34:37 -04:00
|
|
|
struct glx_prog_main {};
|
2013-05-20 06:04:40 -04:00
|
|
|
#endif
|
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
#define PAINT_INIT \
|
|
|
|
{ .pixmap = XCB_NONE, .pict = XCB_NONE }
|
2013-03-15 11:16:23 -04:00
|
|
|
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
/// Linked list type of atoms.
|
|
|
|
typedef struct _latom {
|
2019-03-10 08:34:37 -04:00
|
|
|
xcb_atom_t atom;
|
|
|
|
struct _latom *next;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
} latom_t;
|
|
|
|
|
2022-07-17 12:49:35 -04:00
|
|
|
struct shader_info {
|
|
|
|
char *key;
|
|
|
|
char *source;
|
|
|
|
void *backend_shader;
|
2022-08-10 23:53:14 -04:00
|
|
|
uint64_t attributes;
|
2022-07-17 12:49:35 -04:00
|
|
|
UT_hash_handle hh;
|
|
|
|
};
|
|
|
|
|
2019-10-23 14:27:30 -04:00
|
|
|
/// Structure containing all necessary data for a session.
|
2018-08-22 08:26:42 -04:00
|
|
|
typedef struct session {
|
2019-03-10 08:34:37 -04:00
|
|
|
// === Event handlers ===
|
|
|
|
/// ev_io for X connection
|
|
|
|
ev_io xiow;
|
|
|
|
/// Timeout for delayed unredirection.
|
|
|
|
ev_timer unredir_timer;
|
|
|
|
/// Timer for fading
|
|
|
|
ev_timer fade_timer;
|
2022-12-13 15:56:11 -05:00
|
|
|
/// Use an ev_timer callback for drawing
|
|
|
|
ev_timer draw_timer;
|
2022-11-16 10:39:17 -05:00
|
|
|
/// Called every time we have timeouts or new data on socket,
|
2019-03-10 08:34:37 -04:00
|
|
|
/// so we can be sure if xcb read from X socket at anytime during event
|
|
|
|
/// handling, we will not left any event unhandled in the queue
|
|
|
|
ev_prepare event_check;
|
|
|
|
/// Signal handler for SIGUSR1
|
|
|
|
ev_signal usr1_signal;
|
|
|
|
/// Signal handler for SIGINT
|
|
|
|
ev_signal int_signal;
|
2022-07-17 12:49:35 -04:00
|
|
|
|
|
|
|
// === Backend related ===
|
2019-03-10 08:34:37 -04:00
|
|
|
/// backend data
|
|
|
|
backend_t *backend_data;
|
2019-06-09 14:25:34 -04:00
|
|
|
/// backend blur context
|
|
|
|
void *backend_blur_context;
|
|
|
|
/// graphic drivers used
|
2019-04-19 19:21:38 -04:00
|
|
|
enum driver drivers;
|
2019-11-10 13:58:01 -05:00
|
|
|
/// file watch handle
|
|
|
|
void *file_watch_handle;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// libev mainloop
|
|
|
|
struct ev_loop *loop;
|
2022-07-17 12:49:35 -04:00
|
|
|
/// Shaders
|
|
|
|
struct shader_info *shaders;
|
2019-03-10 08:34:37 -04:00
|
|
|
|
|
|
|
// === Display related ===
|
2023-06-29 00:39:36 -04:00
|
|
|
/// X connection
|
|
|
|
struct x_connection c;
|
2019-08-07 19:46:56 -04:00
|
|
|
/// Whether the X server is grabbed by us
|
|
|
|
bool server_grabbed;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Width of root window.
|
|
|
|
int root_width;
|
2023-06-29 00:39:36 -04:00
|
|
|
/// Height of root window.
|
|
|
|
int root_height;
|
2022-01-24 13:19:15 -05:00
|
|
|
/// X Composite overlay window.
|
2019-03-10 08:34:37 -04:00
|
|
|
xcb_window_t overlay;
|
2019-07-07 11:12:17 -04:00
|
|
|
/// The target window for debug mode
|
|
|
|
xcb_window_t debug_window;
|
2019-10-23 14:27:30 -04:00
|
|
|
/// Whether the root tile is filled by us.
|
2019-03-10 08:34:37 -04:00
|
|
|
bool root_tile_fill;
|
|
|
|
/// Picture of the root window background.
|
|
|
|
paint_t root_tile_paint;
|
|
|
|
/// The backend data the root pixmap bound to
|
2024-02-10 03:20:10 -05:00
|
|
|
image_handle root_image;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// A region of the size of the screen.
|
|
|
|
region_t screen_reg;
|
|
|
|
/// Picture of root window. Destination of painting in no-DBE painting
|
|
|
|
/// mode.
|
|
|
|
xcb_render_picture_t root_picture;
|
|
|
|
/// A Picture acting as the painting target.
|
|
|
|
xcb_render_picture_t tgt_picture;
|
|
|
|
/// Temporary buffer to paint to before sending to display.
|
|
|
|
paint_t tgt_buffer;
|
|
|
|
/// Window ID of the window we register as a symbol.
|
|
|
|
xcb_window_t reg_win;
|
2018-08-22 10:12:29 -04:00
|
|
|
#ifdef CONFIG_OPENGL
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Pointer to GLX data.
|
2019-05-05 21:03:07 -04:00
|
|
|
struct glx_session *psglx;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Custom GLX program used for painting window.
|
2019-05-05 21:03:07 -04:00
|
|
|
// XXX should be in struct glx_session
|
2019-03-10 08:34:37 -04:00
|
|
|
glx_prog_main_t glx_prog_win;
|
2024-02-10 09:19:48 -05:00
|
|
|
struct glx_fbconfig_info argb_fbconfig;
|
2014-07-28 00:50:15 -04:00
|
|
|
#endif
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Sync fence to sync draw operations
|
|
|
|
xcb_sync_fence_t sync_fence;
|
2019-09-28 19:11:32 -04:00
|
|
|
/// Whether we are rendering the first frame after screen is redirected
|
|
|
|
bool first_frame;
|
2022-12-15 05:53:31 -05:00
|
|
|
/// Whether screen has been turned off
|
|
|
|
bool screen_is_off;
|
2022-12-15 04:53:31 -05:00
|
|
|
/// When last MSC event happened, in useconds.
|
|
|
|
uint64_t last_msc_instant;
|
|
|
|
/// The last MSC number
|
2022-12-13 15:31:32 -05:00
|
|
|
uint64_t last_msc;
|
2023-06-10 09:08:49 -04:00
|
|
|
/// The delay between when the last frame was scheduled to be rendered, and when
|
|
|
|
/// the render actually started.
|
|
|
|
uint64_t last_schedule_delay;
|
|
|
|
/// When do we want our next frame to start rendering.
|
|
|
|
uint64_t next_render;
|
2022-12-13 15:56:11 -05:00
|
|
|
/// Whether we can perform frame pacing.
|
|
|
|
bool frame_pacing;
|
2023-07-09 11:39:44 -04:00
|
|
|
/// Vblank event scheduler
|
|
|
|
struct vblank_scheduler *vblank_scheduler;
|
2022-12-13 15:31:32 -05:00
|
|
|
|
2023-06-10 09:08:49 -04:00
|
|
|
/// Render statistics
|
|
|
|
struct render_statistics render_stats;
|
2019-03-10 08:34:37 -04:00
|
|
|
|
|
|
|
// === Operation related ===
|
2019-03-17 11:17:48 -04:00
|
|
|
/// Flags related to the root window
|
|
|
|
uint64_t root_flags;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Program options.
|
|
|
|
options_t o;
|
2024-02-13 17:47:12 -05:00
|
|
|
/// State object for c2.
|
|
|
|
struct c2_state *c2_state;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Whether we have hit unredirection timeout.
|
|
|
|
bool tmout_unredir_hit;
|
2023-07-09 11:39:44 -04:00
|
|
|
/// If the backend is busy. This means two things:
|
|
|
|
/// Either the backend is currently rendering a frame, or a frame has been
|
|
|
|
/// rendered but has yet to be presented. In either case, we should not start
|
|
|
|
/// another render right now. As if we start issuing rendering commands now, we
|
2024-01-30 22:09:28 -05:00
|
|
|
/// will have to wait for either the current render to finish, or the current
|
|
|
|
/// back buffer to become available again. In either case, we will be wasting
|
2023-07-09 11:39:44 -04:00
|
|
|
/// time.
|
|
|
|
bool backend_busy;
|
|
|
|
/// Whether a render is queued. This generally means there are pending updates
|
|
|
|
/// to the screen that's neither included in the current render, nor on the
|
|
|
|
/// screen.
|
|
|
|
bool render_queued;
|
2020-08-30 04:11:45 -04:00
|
|
|
|
2022-11-16 10:39:17 -05:00
|
|
|
/// Cache a xfixes region so we don't need to allocate it every time.
|
2020-08-30 04:11:45 -04:00
|
|
|
/// A workaround for yshui/picom#301
|
|
|
|
xcb_xfixes_region_t damaged_region;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// The region needs to painted on next paint.
|
|
|
|
region_t *damage;
|
|
|
|
/// The region damaged on the last paint.
|
|
|
|
region_t *damage_ring;
|
|
|
|
/// Number of damage regions we track
|
|
|
|
int ndamage;
|
|
|
|
/// Whether all windows are currently redirected.
|
|
|
|
bool redirected;
|
|
|
|
/// Pre-generated alpha pictures.
|
|
|
|
xcb_render_picture_t *alpha_picts;
|
|
|
|
/// Time of last fading. In milliseconds.
|
2021-11-25 03:21:41 -05:00
|
|
|
long long fade_time;
|
2019-03-10 08:34:37 -04:00
|
|
|
// Cached blur convolution kernels.
|
2019-06-06 02:37:48 -04:00
|
|
|
struct x_convolution_kernel **blur_kerns_cache;
|
2019-10-23 14:27:30 -04:00
|
|
|
/// If we should quit
|
2022-12-14 09:23:55 -05:00
|
|
|
bool quit : 1;
|
2024-01-30 22:09:28 -05:00
|
|
|
// TODO(yshui) use separate flags for different kinds of updates so we don't
|
2020-08-30 10:25:58 -04:00
|
|
|
// waste our time.
|
2019-05-22 17:38:22 -04:00
|
|
|
/// Whether there are pending updates, like window creation, etc.
|
2022-12-14 09:23:55 -05:00
|
|
|
bool pending_updates : 1;
|
2019-03-10 08:34:37 -04:00
|
|
|
|
|
|
|
// === Expose event related ===
|
|
|
|
/// Pointer to an array of <code>XRectangle</code>-s of exposed region.
|
|
|
|
/// XXX why do we need this array?
|
|
|
|
rect_t *expose_rects;
|
|
|
|
/// Number of <code>XRectangle</code>-s in <code>expose_rects</code>.
|
|
|
|
int size_expose;
|
|
|
|
/// Index of the next free slot in <code>expose_rects</code>.
|
|
|
|
int n_expose;
|
|
|
|
|
|
|
|
// === Window related ===
|
2019-04-03 03:36:02 -04:00
|
|
|
/// A hash table of all windows.
|
2019-04-17 18:14:45 -04:00
|
|
|
struct win *windows;
|
2019-04-03 03:36:02 -04:00
|
|
|
/// Windows in their stacking order
|
2019-04-04 04:11:27 -04:00
|
|
|
struct list_node window_stack;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Pointer to <code>win</code> of current active window. Used by
|
|
|
|
/// EWMH <code>_NET_ACTIVE_WINDOW</code> focus detection. In theory,
|
|
|
|
/// it's more reliable to store the window ID directly here, just in
|
|
|
|
/// case the WM does something extraordinary, but caching the pointer
|
|
|
|
/// means another layer of complexity.
|
2019-04-17 18:14:45 -04:00
|
|
|
struct managed_win *active_win;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Window ID of leader window of currently active window. Used for
|
|
|
|
/// subsidiary window detection.
|
|
|
|
xcb_window_t active_leader;
|
|
|
|
|
|
|
|
// === Shadow/dimming related ===
|
|
|
|
/// 1x1 black Picture.
|
|
|
|
xcb_render_picture_t black_picture;
|
|
|
|
/// 1x1 Picture of the shadow color.
|
|
|
|
xcb_render_picture_t cshadow_picture;
|
|
|
|
/// 1x1 white Picture.
|
|
|
|
xcb_render_picture_t white_picture;
|
2022-08-25 00:21:19 -04:00
|
|
|
/// Backend shadow context.
|
|
|
|
struct backend_shadow_context *shadow_context;
|
2019-03-10 08:34:37 -04:00
|
|
|
// for shadow precomputation
|
|
|
|
/// A region in which shadow is not painted on.
|
|
|
|
region_t shadow_exclude_reg;
|
|
|
|
|
|
|
|
// === Software-optimization-related ===
|
|
|
|
/// Nanosecond offset of the first painting.
|
|
|
|
long paint_tm_offset;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2013-01-24 00:38:03 -05:00
|
|
|
#ifdef CONFIG_VSYNC_DRM
|
2019-03-10 08:34:37 -04:00
|
|
|
// === DRM VSync related ===
|
|
|
|
/// File descriptor of DRI device file. Used for DRM VSync.
|
|
|
|
int drm_fd;
|
2013-01-24 00:38:03 -05:00
|
|
|
#endif
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
// === X extension related ===
|
|
|
|
/// Event base number for X Fixes extension.
|
|
|
|
int xfixes_event;
|
|
|
|
/// Error base number for X Fixes extension.
|
|
|
|
int xfixes_error;
|
|
|
|
/// Event base number for X Damage extension.
|
|
|
|
int damage_event;
|
|
|
|
/// Error base number for X Damage extension.
|
|
|
|
int damage_error;
|
|
|
|
/// Event base number for X Render extension.
|
|
|
|
int render_event;
|
|
|
|
/// Error base number for X Render extension.
|
|
|
|
int render_error;
|
|
|
|
/// Event base number for X Composite extension.
|
|
|
|
int composite_event;
|
|
|
|
/// Error base number for X Composite extension.
|
|
|
|
int composite_error;
|
|
|
|
/// Major opcode for X Composite extension.
|
|
|
|
int composite_opcode;
|
2022-12-15 05:53:31 -05:00
|
|
|
/// Whether X DPMS extension exists
|
|
|
|
bool dpms_exists;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Whether X Shape extension exists.
|
|
|
|
bool shape_exists;
|
|
|
|
/// Event base number for X Shape extension.
|
|
|
|
int shape_event;
|
|
|
|
/// Error base number for X Shape extension.
|
|
|
|
int shape_error;
|
|
|
|
/// Whether X RandR extension exists.
|
|
|
|
bool randr_exists;
|
|
|
|
/// Event base number for X RandR extension.
|
|
|
|
int randr_event;
|
|
|
|
/// Error base number for X RandR extension.
|
|
|
|
int randr_error;
|
|
|
|
/// Whether X Present extension exists.
|
|
|
|
bool present_exists;
|
|
|
|
/// Whether X GLX extension exists.
|
|
|
|
bool glx_exists;
|
|
|
|
/// Event base number for X GLX extension.
|
|
|
|
int glx_event;
|
|
|
|
/// Error base number for X GLX extension.
|
|
|
|
int glx_error;
|
2023-06-29 00:39:36 -04:00
|
|
|
/// Information about monitors.
|
|
|
|
struct x_monitors monitors;
|
2019-03-10 08:34:37 -04:00
|
|
|
/// Whether X Sync extension exists.
|
|
|
|
bool xsync_exists;
|
|
|
|
/// Event base number for X Sync extension.
|
|
|
|
int xsync_event;
|
|
|
|
/// Error base number for X Sync extension.
|
|
|
|
int xsync_error;
|
|
|
|
/// Whether X Render convolution filter exists.
|
|
|
|
bool xrfilter_convolution_exists;
|
|
|
|
|
|
|
|
// === Atoms ===
|
2019-05-05 19:34:08 -04:00
|
|
|
struct atom *atoms;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
|
|
|
#ifdef CONFIG_DBUS
|
2019-03-10 08:34:37 -04:00
|
|
|
// === DBus related ===
|
|
|
|
void *dbus_data;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
#endif
|
2019-03-10 10:55:17 -04:00
|
|
|
|
|
|
|
int (*vsync_wait)(session_t *);
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
} session_t;
|
|
|
|
|
|
|
|
/// Enumeration for window event hints.
|
2019-03-10 08:34:37 -04:00
|
|
|
typedef enum { WIN_EVMODE_UNKNOWN, WIN_EVMODE_FRAME, WIN_EVMODE_CLIENT } win_evmode_t;
|
2024-02-19 19:41:55 -05:00
|
|
|
struct wintype_info {
|
|
|
|
const char *name;
|
|
|
|
const char *atom;
|
|
|
|
};
|
|
|
|
extern const struct wintype_info WINTYPES[NUM_WINTYPES];
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
extern session_t *ps_g;
|
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
void ev_xcb_error(session_t *ps, xcb_generic_error_t *err);
|
2018-09-30 03:31:22 -04:00
|
|
|
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
// === Functions ===
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Subtracting two struct timespec values.
|
|
|
|
*
|
|
|
|
* Taken from glibc manual.
|
|
|
|
*
|
|
|
|
* Subtract the `struct timespec' values X and Y,
|
|
|
|
* storing the result in RESULT.
|
|
|
|
* Return 1 if the difference is negative, otherwise 0.
|
|
|
|
*/
|
|
|
|
static inline int
|
2019-03-10 08:34:37 -04:00
|
|
|
timespec_subtract(struct timespec *result, struct timespec *x, struct timespec *y) {
|
|
|
|
/* Perform the carry for the later subtraction by updating y. */
|
|
|
|
if (x->tv_nsec < y->tv_nsec) {
|
|
|
|
long nsec = (y->tv_nsec - x->tv_nsec) / NS_PER_SEC + 1;
|
|
|
|
y->tv_nsec -= NS_PER_SEC * nsec;
|
|
|
|
y->tv_sec += nsec;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (x->tv_nsec - y->tv_nsec > NS_PER_SEC) {
|
|
|
|
long nsec = (x->tv_nsec - y->tv_nsec) / NS_PER_SEC;
|
|
|
|
y->tv_nsec += NS_PER_SEC * nsec;
|
|
|
|
y->tv_sec -= nsec;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Compute the time remaining to wait.
|
|
|
|
tv_nsec is certainly positive. */
|
|
|
|
result->tv_sec = x->tv_sec - y->tv_sec;
|
|
|
|
result->tv_nsec = x->tv_nsec - y->tv_nsec;
|
|
|
|
|
|
|
|
/* Return 1 if result is negative. */
|
|
|
|
return x->tv_sec < y->tv_sec;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get current time in struct timeval.
|
|
|
|
*/
|
2019-03-10 08:34:37 -04:00
|
|
|
static inline struct timeval get_time_timeval(void) {
|
|
|
|
struct timeval tv = {0, 0};
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
gettimeofday(&tv, NULL);
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
// Return a time of all 0 if the call fails
|
|
|
|
return tv;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get current time in struct timespec.
|
|
|
|
*
|
|
|
|
* Note its starting time is unspecified.
|
|
|
|
*/
|
2019-03-10 08:34:37 -04:00
|
|
|
static inline struct timespec get_time_timespec(void) {
|
|
|
|
struct timespec tm = {0, 0};
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
clock_gettime(CLOCK_MONOTONIC, &tm);
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
// Return a time of all 0 if the call fails
|
|
|
|
return tm;
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
}
|
|
|
|
|
2013-03-15 11:16:23 -04:00
|
|
|
/**
|
|
|
|
* Return the painting target window.
|
|
|
|
*/
|
2019-03-10 08:34:37 -04:00
|
|
|
static inline xcb_window_t get_tgt_window(session_t *ps) {
|
2023-06-29 00:39:36 -04:00
|
|
|
return ps->overlay != XCB_NONE ? ps->overlay : ps->c.screen_info->root;
|
2013-03-15 11:16:23 -04:00
|
|
|
}
|
|
|
|
|
2013-12-10 09:06:02 -05:00
|
|
|
/**
|
|
|
|
* Check if current backend uses GLX.
|
|
|
|
*/
|
2019-03-10 08:34:37 -04:00
|
|
|
static inline bool bkend_use_glx(session_t *ps) {
|
|
|
|
return BKEND_GLX == ps->o.backend || BKEND_XR_GLX_HYBRID == ps->o.backend;
|
2013-12-10 09:06:02 -05:00
|
|
|
}
|
|
|
|
|
2013-01-24 00:38:03 -05:00
|
|
|
/**
|
|
|
|
* Determine if a window has a specific property.
|
|
|
|
*
|
|
|
|
* @param ps current session
|
|
|
|
* @param w window to check
|
|
|
|
* @param atom atom of property to check
|
2018-12-27 15:45:38 -05:00
|
|
|
* @return true if it has the attribute, false otherwise
|
2013-01-24 00:38:03 -05:00
|
|
|
*/
|
2024-02-19 12:34:07 -05:00
|
|
|
static inline bool wid_has_prop(xcb_connection_t *c, xcb_window_t w, xcb_atom_t atom) {
|
2019-03-10 08:34:37 -04:00
|
|
|
auto r = xcb_get_property_reply(
|
2024-02-19 12:34:07 -05:00
|
|
|
c, xcb_get_property(c, 0, w, atom, XCB_GET_PROPERTY_TYPE_ANY, 0, 0), NULL);
|
2019-03-10 08:34:37 -04:00
|
|
|
if (!r) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto rtype = r->type;
|
|
|
|
free(r);
|
|
|
|
|
|
|
|
if (rtype != XCB_NONE) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2013-01-24 00:38:03 -05:00
|
|
|
}
|
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
void force_repaint(session_t *ps);
|
2013-01-24 00:38:03 -05:00
|
|
|
|
2013-03-15 11:16:23 -04:00
|
|
|
/** @name DBus handling
|
|
|
|
*/
|
|
|
|
///@{
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
/** @name DBus hooks
|
|
|
|
*/
|
|
|
|
///@{
|
2019-03-10 08:34:37 -04:00
|
|
|
void opts_set_no_fading_openclose(session_t *ps, bool newval);
|
Feature #80: D-Bus support
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
2013-01-19 07:20:27 -05:00
|
|
|
//!@}
|
|
|
|
#endif
|
2013-01-24 00:38:03 -05:00
|
|
|
|
2018-08-22 07:58:49 -04:00
|
|
|
/**
|
|
|
|
* Set a <code>bool</code> array of all wintypes to true.
|
|
|
|
*/
|
2019-03-10 08:34:37 -04:00
|
|
|
static inline void wintype_arr_enable(bool arr[]) {
|
|
|
|
wintype_t i;
|
2018-08-22 07:58:49 -04:00
|
|
|
|
2019-03-10 08:34:37 -04:00
|
|
|
for (i = 0; i < NUM_WINTYPES; ++i) {
|
|
|
|
arr[i] = true;
|
|
|
|
}
|
2018-08-22 07:58:49 -04:00
|
|
|
}
|