2003-11-10 11:45:17 +08:00
|
|
|
/*
|
2012-02-27 12:00:12 +08:00
|
|
|
* Compton - a compositor for X11
|
2003-11-10 11:45:17 +08:00
|
|
|
*
|
2012-02-27 12:00:12 +08:00
|
|
|
* Based on `xcompmgr` - Copyright (c) 2003, Keith Packard
|
2003-11-10 11:45:17 +08: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 20:20:27 +08:00
|
|
|
* Copyright (c) 2011-2013, Christopher Jeffrey
|
2011-11-07 09:58:30 +08:00
|
|
|
* See LICENSE for more information.
|
2003-11-10 11:45:17 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2012-02-08 18:31:39 +08:00
|
|
|
#include "compton.h"
|
2013-04-25 22:23:35 +08:00
|
|
|
#include <ctype.h>
|
2012-02-08 18:31:39 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Global constants ===
|
2012-02-27 12:00:12 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/// Name strings for window types.
|
2013-01-24 13:38:03 +08:00
|
|
|
const char * const WINTYPES[NUM_WINTYPES] = {
|
2012-09-25 21:04:10 +08:00
|
|
|
"unknown",
|
|
|
|
"desktop",
|
|
|
|
"dock",
|
|
|
|
"toolbar",
|
|
|
|
"menu",
|
|
|
|
"utility",
|
|
|
|
"splash",
|
|
|
|
"dialog",
|
|
|
|
"normal",
|
|
|
|
"dropdown_menu",
|
|
|
|
"popup_menu",
|
|
|
|
"tooltip",
|
|
|
|
"notify",
|
|
|
|
"combo",
|
|
|
|
"dnd",
|
|
|
|
};
|
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
/// Names of VSync modes.
|
2013-04-21 22:30:22 +08:00
|
|
|
const char * const VSYNC_STRS[NUM_VSYNC + 1] = {
|
2013-03-23 22:06:41 +08:00
|
|
|
"none", // VSYNC_NONE
|
|
|
|
"drm", // VSYNC_DRM
|
|
|
|
"opengl", // VSYNC_OPENGL
|
|
|
|
"opengl-oml", // VSYNC_OPENGL_OML
|
|
|
|
"opengl-swc", // VSYNC_OPENGL_SWC
|
|
|
|
"opengl-mswc", // VSYNC_OPENGL_MSWC
|
2013-04-21 22:30:22 +08:00
|
|
|
NULL
|
2013-01-30 13:41:08 +08:00
|
|
|
};
|
|
|
|
|
2013-03-16 22:54:43 +08:00
|
|
|
/// Names of backends.
|
2013-04-21 22:30:22 +08:00
|
|
|
const char * const BACKEND_STRS[NUM_BKEND + 1] = {
|
2013-03-16 22:54:43 +08:00
|
|
|
"xrender", // BKEND_XRENDER
|
|
|
|
"glx", // BKEND_GLX
|
2013-04-21 22:30:22 +08:00
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
/// Function pointers to init VSync modes.
|
|
|
|
static bool (* const (VSYNC_FUNCS_INIT[NUM_VSYNC]))(session_t *ps) = {
|
2013-03-23 22:06:41 +08:00
|
|
|
[VSYNC_DRM ] = vsync_drm_init,
|
|
|
|
[VSYNC_OPENGL ] = vsync_opengl_init,
|
|
|
|
[VSYNC_OPENGL_OML ] = vsync_opengl_oml_init,
|
|
|
|
[VSYNC_OPENGL_SWC ] = vsync_opengl_swc_init,
|
|
|
|
[VSYNC_OPENGL_MSWC ] = vsync_opengl_mswc_init,
|
2013-01-30 13:41:08 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/// Function pointers to wait for VSync.
|
|
|
|
static int (* const (VSYNC_FUNCS_WAIT[NUM_VSYNC]))(session_t *ps) = {
|
|
|
|
#ifdef CONFIG_VSYNC_DRM
|
|
|
|
[VSYNC_DRM ] = vsync_drm_wait,
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
[VSYNC_OPENGL ] = vsync_opengl_wait,
|
|
|
|
[VSYNC_OPENGL_OML ] = vsync_opengl_oml_wait,
|
|
|
|
#endif
|
2013-01-24 13:38:03 +08:00
|
|
|
};
|
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
/// Function pointers to deinitialize VSync.
|
|
|
|
static void (* const (VSYNC_FUNCS_DEINIT[NUM_VSYNC]))(session_t *ps) = {
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
[VSYNC_OPENGL_SWC ] = vsync_opengl_swc_deinit,
|
|
|
|
[VSYNC_OPENGL_MSWC ] = vsync_opengl_mswc_deinit,
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/// Names of root window properties that could point to a pixmap of
|
|
|
|
/// background.
|
2013-01-24 13:38:03 +08:00
|
|
|
const static char *background_props_str[] = {
|
2012-02-09 06:45:08 +08:00
|
|
|
"_XROOTPMAP_ID",
|
|
|
|
"_XSETROOT_ID",
|
|
|
|
0,
|
|
|
|
};
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Global variables ===
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/// Pointer to current session, as a global variable. Only used by
|
|
|
|
/// <code>error()</code> and <code>reset_enable()</code>, which could not
|
|
|
|
/// have a pointer to current session passed in.
|
|
|
|
session_t *ps_g = NULL;
|
2003-11-25 01:11:00 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Fading ===
|
2012-09-26 15:37:11 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
/**
|
|
|
|
* Get the time left before next fading point.
|
|
|
|
*
|
|
|
|
* In milliseconds.
|
|
|
|
*/
|
|
|
|
static int
|
2012-11-19 09:46:07 +08:00
|
|
|
fade_timeout(session_t *ps) {
|
|
|
|
int diff = ps->o.fade_delta - get_time_ms() + ps->fade_time;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
diff = normalize_i_range(diff, 0, ps->o.fade_delta * 2);
|
2004-07-08 15:07:26 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
return diff;
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
/**
|
|
|
|
* Run fading on a window.
|
|
|
|
*
|
|
|
|
* @param steps steps of fading
|
|
|
|
*/
|
2012-02-27 12:00:12 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
run_fade(session_t *ps, win *w, unsigned steps) {
|
2012-10-29 22:00:11 +08:00
|
|
|
// If we have reached target opacity, return
|
2012-09-19 20:49:16 +08:00
|
|
|
if (w->opacity == w->opacity_tgt) {
|
|
|
|
return;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2004-07-08 15:07:26 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
if (!w->fade)
|
|
|
|
w->opacity = w->opacity_tgt;
|
|
|
|
else if (steps) {
|
|
|
|
// Use double below because opacity_t will probably overflow during
|
|
|
|
// calculations
|
|
|
|
if (w->opacity < w->opacity_tgt)
|
|
|
|
w->opacity = normalize_d_range(
|
2012-11-19 09:46:07 +08:00
|
|
|
(double) w->opacity + (double) ps->o.fade_in_step * steps,
|
2012-09-19 20:49:16 +08:00
|
|
|
0.0, w->opacity_tgt);
|
|
|
|
else
|
|
|
|
w->opacity = normalize_d_range(
|
2012-11-19 09:46:07 +08:00
|
|
|
(double) w->opacity - (double) ps->o.fade_out_step * steps,
|
2012-09-19 20:49:16 +08:00
|
|
|
w->opacity_tgt, OPAQUE);
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2004-07-08 15:07:26 +08:00
|
|
|
|
2012-10-29 22:00:11 +08:00
|
|
|
if (w->opacity != w->opacity_tgt) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->idling = false;
|
2012-09-29 22:53:57 +08:00
|
|
|
}
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
/**
|
|
|
|
* Set fade callback of a window, and possibly execute the previous
|
|
|
|
* callback.
|
|
|
|
*
|
|
|
|
* @param exec_callback whether the previous callback is to be executed
|
|
|
|
*/
|
2012-02-27 12:00:12 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
set_fade_callback(session_t *ps, win *w,
|
|
|
|
void (*callback) (session_t *ps, win *w), bool exec_callback) {
|
|
|
|
void (*old_callback) (session_t *ps, win *w) = w->fade_callback;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
w->fade_callback = callback;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
// Must be the last line as the callback could destroy w!
|
2012-09-29 22:53:57 +08:00
|
|
|
if (exec_callback && old_callback) {
|
2012-11-19 09:46:07 +08:00
|
|
|
old_callback(ps, w);
|
2012-09-29 22:53:57 +08:00
|
|
|
// Although currently no callback function affects window state on
|
|
|
|
// next paint, it could, in the future
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->idling = false;
|
2012-09-29 22:53:57 +08:00
|
|
|
}
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Shadows ===
|
2012-02-09 06:45:08 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
static double __attribute__((const))
|
2011-11-04 14:33:23 +08:00
|
|
|
gaussian(double r, double x, double y) {
|
|
|
|
return ((1 / (sqrt(2 * M_PI * r))) *
|
2012-02-27 20:49:50 +08:00
|
|
|
exp((- (x * x + y * y)) / (2 * r * r)));
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static conv *
|
2012-11-19 09:46:07 +08:00
|
|
|
make_gaussian_map(double r) {
|
2011-11-04 16:41:56 +08:00
|
|
|
conv *c;
|
|
|
|
int size = ((int) ceil((r * 3)) + 1) & ~1;
|
|
|
|
int center = size / 2;
|
|
|
|
int x, y;
|
|
|
|
double t;
|
|
|
|
double g;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
c = malloc(sizeof(conv) + size * size * sizeof(double));
|
|
|
|
c->size = size;
|
|
|
|
c->data = (double *) (c + 1);
|
|
|
|
t = 0.0;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
|
|
|
for (y = 0; y < size; y++) {
|
2011-11-04 14:33:23 +08:00
|
|
|
for (x = 0; x < size; x++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
g = gaussian(r, x - center, y - center);
|
2011-11-04 14:33:23 +08:00
|
|
|
t += g;
|
|
|
|
c->data[y * size + x] = g;
|
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
for (y = 0; y < size; y++) {
|
2011-11-04 14:33:23 +08:00
|
|
|
for (x = 0; x < size; x++) {
|
2011-11-07 05:52:39 +08:00
|
|
|
c->data[y * size + x] /= t;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
return c;
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A picture will help
|
|
|
|
*
|
2011-11-04 17:01:45 +08:00
|
|
|
* -center 0 width width+center
|
2003-11-10 09:32:01 +08:00
|
|
|
* -center +-----+-------------------+-----+
|
2011-11-04 17:01:45 +08:00
|
|
|
* | | | |
|
|
|
|
* | | | |
|
|
|
|
* 0 +-----+-------------------+-----+
|
|
|
|
* | | | |
|
|
|
|
* | | | |
|
|
|
|
* | | | |
|
2003-11-10 09:32:01 +08:00
|
|
|
* height +-----+-------------------+-----+
|
2011-11-04 17:01:45 +08:00
|
|
|
* | | | |
|
|
|
|
* height+ | | | |
|
2003-11-10 09:32:01 +08:00
|
|
|
* center +-----+-------------------+-----+
|
|
|
|
*/
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static unsigned char
|
2011-11-04 17:18:10 +08:00
|
|
|
sum_gaussian(conv *map, double opacity,
|
|
|
|
int x, int y, int width, int height) {
|
2011-11-04 16:41:56 +08:00
|
|
|
int fx, fy;
|
|
|
|
double *g_data;
|
|
|
|
double *g_line = map->data;
|
|
|
|
int g_size = map->size;
|
|
|
|
int center = g_size / 2;
|
|
|
|
int fx_start, fx_end;
|
|
|
|
int fy_start, fy_end;
|
|
|
|
double v;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Compute set of filter values which are "in range",
|
|
|
|
* that's the set with:
|
|
|
|
* 0 <= x + (fx-center) && x + (fx-center) < width &&
|
|
|
|
* 0 <= y + (fy-center) && y + (fy-center) < height
|
|
|
|
*
|
|
|
|
* 0 <= x + (fx - center) x + fx - center < width
|
|
|
|
* center - x <= fx fx < width + center - x
|
|
|
|
*/
|
|
|
|
|
|
|
|
fx_start = center - x;
|
2011-11-04 16:41:56 +08:00
|
|
|
if (fx_start < 0) fx_start = 0;
|
2011-11-04 14:33:23 +08:00
|
|
|
fx_end = width + center - x;
|
2011-11-04 16:41:56 +08:00
|
|
|
if (fx_end > g_size) fx_end = g_size;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
fy_start = center - y;
|
2011-11-04 16:41:56 +08:00
|
|
|
if (fy_start < 0) fy_start = 0;
|
2011-11-04 14:33:23 +08:00
|
|
|
fy_end = height + center - y;
|
2011-11-04 16:41:56 +08:00
|
|
|
if (fy_end > g_size) fy_end = g_size;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
g_line = g_line + fy_start * g_size + fx_start;
|
|
|
|
|
|
|
|
v = 0;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
for (fy = fy_start; fy < fy_end; fy++) {
|
|
|
|
g_data = g_line;
|
|
|
|
g_line += g_size;
|
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
for (fx = fx_start; fx < fx_end; fx++) {
|
2011-11-04 14:33:23 +08:00
|
|
|
v += *g_data++;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
|
|
|
if (v > 1) v = 1;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
return ((unsigned char) (v * opacity * 255.0));
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 17:18:10 +08:00
|
|
|
/* precompute shadow corners and sides
|
|
|
|
to save time for large windows */
|
2012-02-27 20:49:50 +08:00
|
|
|
|
2004-09-22 06:59:38 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
presum_gaussian(session_t *ps, conv *map) {
|
2012-02-27 20:49:50 +08:00
|
|
|
int center = map->size / 2;
|
2011-11-04 14:33:23 +08:00
|
|
|
int opacity, x, y;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->cgsize = map->size;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->shadow_corner)
|
|
|
|
free(ps->shadow_corner);
|
|
|
|
if (ps->shadow_top)
|
|
|
|
free(ps->shadow_top);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->shadow_corner = malloc((ps->cgsize + 1) * (ps->cgsize + 1) * 26);
|
|
|
|
ps->shadow_top = malloc((ps->cgsize + 1) * 26);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
for (x = 0; x <= ps->cgsize; x++) {
|
|
|
|
ps->shadow_top[25 * (ps->cgsize + 1) + x] =
|
|
|
|
sum_gaussian(map, 1, x - center, center, ps->cgsize * 2, ps->cgsize * 2);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
|
|
|
for (opacity = 0; opacity < 25; opacity++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->shadow_top[opacity * (ps->cgsize + 1) + x] =
|
|
|
|
ps->shadow_top[25 * (ps->cgsize + 1) + x] * opacity / 25;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
for (y = 0; y <= x; y++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->shadow_corner[25 * (ps->cgsize + 1) * (ps->cgsize + 1) + y * (ps->cgsize + 1) + x]
|
|
|
|
= sum_gaussian(map, 1, x - center, y - center, ps->cgsize * 2, ps->cgsize * 2);
|
|
|
|
ps->shadow_corner[25 * (ps->cgsize + 1) * (ps->cgsize + 1) + x * (ps->cgsize + 1) + y]
|
|
|
|
= ps->shadow_corner[25 * (ps->cgsize + 1) * (ps->cgsize + 1) + y * (ps->cgsize + 1) + x];
|
2011-11-04 16:41:56 +08:00
|
|
|
|
|
|
|
for (opacity = 0; opacity < 25; opacity++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->shadow_corner[opacity * (ps->cgsize + 1) * (ps->cgsize + 1)
|
|
|
|
+ y * (ps->cgsize + 1) + x]
|
|
|
|
= ps->shadow_corner[opacity * (ps->cgsize + 1) * (ps->cgsize + 1)
|
|
|
|
+ x * (ps->cgsize + 1) + y]
|
|
|
|
= ps->shadow_corner[25 * (ps->cgsize + 1) * (ps->cgsize + 1)
|
|
|
|
+ y * (ps->cgsize + 1) + x] * opacity / 25;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
|
|
|
}
|
2004-09-22 06:59:38 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static XImage *
|
2012-11-19 09:46:07 +08:00
|
|
|
make_shadow(session_t *ps, double opacity,
|
|
|
|
int width, int height) {
|
2011-11-04 16:41:56 +08:00
|
|
|
XImage *ximage;
|
|
|
|
unsigned char *data;
|
|
|
|
int ylimit, xlimit;
|
2012-11-19 09:46:07 +08:00
|
|
|
int swidth = width + ps->cgsize;
|
|
|
|
int sheight = height + ps->cgsize;
|
|
|
|
int center = ps->cgsize / 2;
|
2011-11-04 16:41:56 +08:00
|
|
|
int x, y;
|
|
|
|
unsigned char d;
|
|
|
|
int x_diff;
|
|
|
|
int opacity_int = (int)(opacity * 25);
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
data = malloc(swidth * sheight * sizeof(unsigned char));
|
2011-11-04 16:41:56 +08:00
|
|
|
if (!data) return 0;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ximage = XCreateImage(ps->dpy, ps->vis, 8,
|
|
|
|
ZPixmap, 0, (char *) data, swidth, sheight, 8, swidth * sizeof(char));
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
if (!ximage) {
|
|
|
|
free(data);
|
|
|
|
return 0;
|
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
/*
|
|
|
|
* Build the gaussian in sections
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* center (fill the complete data array)
|
|
|
|
*/
|
2011-11-04 17:18:10 +08:00
|
|
|
|
2012-09-26 18:54:35 +08:00
|
|
|
// If clear_shadow is enabled and the border & corner shadow (which
|
2012-09-12 21:01:06 +08:00
|
|
|
// later will be filled) could entirely cover the area of the shadow
|
|
|
|
// that will be displayed, do not bother filling other pixels. If it
|
|
|
|
// can't, we must fill the other pixels here.
|
2012-11-19 09:46:07 +08:00
|
|
|
/* if (!(clear_shadow && ps->o.shadow_offset_x <= 0 && ps->o.shadow_offset_x >= -ps->cgsize
|
|
|
|
&& ps->o.shadow_offset_y <= 0 && ps->o.shadow_offset_y >= -ps->cgsize)) { */
|
|
|
|
if (ps->cgsize > 0) {
|
|
|
|
d = ps->shadow_top[opacity_int * (ps->cgsize + 1) + ps->cgsize];
|
2012-02-27 12:00:12 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
d = sum_gaussian(ps->gaussian_map,
|
2012-02-27 12:00:12 +08:00
|
|
|
opacity, center, center, width, height);
|
|
|
|
}
|
|
|
|
memset(data, d, sheight * swidth);
|
2012-10-28 17:02:07 +08:00
|
|
|
// }
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
/*
|
|
|
|
* corners
|
|
|
|
*/
|
2011-11-04 17:18:10 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ylimit = ps->cgsize;
|
2011-11-04 16:41:56 +08:00
|
|
|
if (ylimit > sheight / 2) ylimit = (sheight + 1) / 2;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
xlimit = ps->cgsize;
|
2011-11-04 16:41:56 +08:00
|
|
|
if (xlimit > swidth / 2) xlimit = (swidth + 1) / 2;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-02-27 12:00:12 +08:00
|
|
|
for (y = 0; y < ylimit; y++) {
|
2011-11-04 14:33:23 +08:00
|
|
|
for (x = 0; x < xlimit; x++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
if (xlimit == ps->cgsize && ylimit == ps->cgsize) {
|
|
|
|
d = ps->shadow_corner[opacity_int * (ps->cgsize + 1) * (ps->cgsize + 1)
|
|
|
|
+ y * (ps->cgsize + 1) + x];
|
2011-11-04 16:41:56 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
d = sum_gaussian(ps->gaussian_map,
|
2011-11-04 17:18:10 +08:00
|
|
|
opacity, x - center, y - center, width, height);
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
data[y * swidth + x] = d;
|
|
|
|
data[(sheight - y - 1) * swidth + x] = d;
|
|
|
|
data[(sheight - y - 1) * swidth + (swidth - x - 1)] = d;
|
|
|
|
data[y * swidth + (swidth - x - 1)] = d;
|
|
|
|
}
|
2012-02-27 12:00:12 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* top/bottom
|
|
|
|
*/
|
2011-11-04 17:18:10 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
x_diff = swidth - (ps->cgsize * 2);
|
2011-11-04 14:33:23 +08:00
|
|
|
if (x_diff > 0 && ylimit > 0) {
|
|
|
|
for (y = 0; y < ylimit; y++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ylimit == ps->cgsize) {
|
|
|
|
d = ps->shadow_top[opacity_int * (ps->cgsize + 1) + y];
|
2011-11-04 16:41:56 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
d = sum_gaussian(ps->gaussian_map,
|
2011-11-04 17:18:10 +08:00
|
|
|
opacity, center, y - center, width, height);
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
memset(&data[y * swidth + ps->cgsize], d, x_diff);
|
|
|
|
memset(&data[(sheight - y - 1) * swidth + ps->cgsize], d, x_diff);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* sides
|
|
|
|
*/
|
|
|
|
|
|
|
|
for (x = 0; x < xlimit; x++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
if (xlimit == ps->cgsize) {
|
|
|
|
d = ps->shadow_top[opacity_int * (ps->cgsize + 1) + x];
|
2011-11-04 16:41:56 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
d = sum_gaussian(ps->gaussian_map,
|
2011-11-04 17:18:10 +08:00
|
|
|
opacity, x - center, center, width, height);
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
for (y = ps->cgsize; y < sheight - ps->cgsize; y++) {
|
2011-11-04 14:33:23 +08:00
|
|
|
data[y * swidth + x] = d;
|
|
|
|
data[y * swidth + (swidth - x - 1)] = d;
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2003-11-10 09:32:01 +08:00
|
|
|
|
2012-10-28 17:02:07 +08:00
|
|
|
/*
|
|
|
|
if (clear_shadow) {
|
2012-09-12 21:01:06 +08:00
|
|
|
// Clear the region in the shadow that the window would cover based
|
|
|
|
// on shadow_offset_{x,y} user provides
|
2012-11-19 09:46:07 +08:00
|
|
|
int xstart = normalize_i_range(- (int) ps->o.shadow_offset_x, 0, swidth);
|
|
|
|
int xrange = normalize_i_range(width - (int) ps->o.shadow_offset_x,
|
2012-09-12 21:01:06 +08:00
|
|
|
0, swidth) - xstart;
|
2012-11-19 09:46:07 +08:00
|
|
|
int ystart = normalize_i_range(- (int) ps->o.shadow_offset_y, 0, sheight);
|
|
|
|
int yend = normalize_i_range(height - (int) ps->o.shadow_offset_y,
|
2012-09-12 21:01:06 +08:00
|
|
|
0, sheight);
|
|
|
|
int y;
|
|
|
|
|
2012-09-13 13:58:05 +08:00
|
|
|
for (y = ystart; y < yend; y++) {
|
2012-09-12 21:01:06 +08:00
|
|
|
memset(&data[y * swidth + xstart], 0, xrange);
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-02-02 03:52:35 +08:00
|
|
|
}
|
2012-10-28 17:02:07 +08:00
|
|
|
*/
|
2012-02-02 03:52:35 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
return ximage;
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Generate shadow <code>Picture</code> for a window.
|
|
|
|
*/
|
2013-03-15 23:16:23 +08:00
|
|
|
static bool
|
|
|
|
win_build_shadow(session_t *ps, win *w, double opacity) {
|
|
|
|
const int width = w->widthb;
|
|
|
|
const int height = w->heightb;
|
|
|
|
|
2012-09-29 13:15:09 +08:00
|
|
|
XImage *shadow_image = NULL;
|
|
|
|
Pixmap shadow_pixmap = None, shadow_pixmap_argb = None;
|
|
|
|
Picture shadow_picture = None, shadow_picture_argb = None;
|
|
|
|
GC gc = None;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
shadow_image = make_shadow(ps, opacity, width, height);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (!shadow_image)
|
|
|
|
return None;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
shadow_pixmap = XCreatePixmap(ps->dpy, ps->root,
|
2012-06-04 00:08:50 +08:00
|
|
|
shadow_image->width, shadow_image->height, 8);
|
2012-11-19 09:46:07 +08:00
|
|
|
shadow_pixmap_argb = XCreatePixmap(ps->dpy, ps->root,
|
2012-09-29 13:15:09 +08:00
|
|
|
shadow_image->width, shadow_image->height, 32);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-09-29 13:15:09 +08:00
|
|
|
if (!shadow_pixmap || !shadow_pixmap_argb)
|
|
|
|
goto shadow_picture_err;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
shadow_picture = XRenderCreatePicture(ps->dpy, shadow_pixmap,
|
|
|
|
XRenderFindStandardFormat(ps->dpy, PictStandardA8), 0, 0);
|
|
|
|
shadow_picture_argb = XRenderCreatePicture(ps->dpy, shadow_pixmap_argb,
|
|
|
|
XRenderFindStandardFormat(ps->dpy, PictStandardARGB32), 0, 0);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (!shadow_picture || !shadow_picture_argb)
|
|
|
|
goto shadow_picture_err;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
gc = XCreateGC(ps->dpy, shadow_pixmap, 0, 0);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (!gc)
|
|
|
|
goto shadow_picture_err;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XPutImage(ps->dpy, shadow_pixmap, gc, shadow_image, 0, 0, 0, 0,
|
2012-06-04 00:08:50 +08:00
|
|
|
shadow_image->width, shadow_image->height);
|
2012-11-19 09:46:07 +08:00
|
|
|
XRenderComposite(ps->dpy, PictOpSrc, ps->cshadow_picture, shadow_picture,
|
2012-09-29 13:15:09 +08:00
|
|
|
shadow_picture_argb, 0, 0, 0, 0, 0, 0,
|
|
|
|
shadow_image->width, shadow_image->height);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
w->shadow_paint.pixmap = shadow_pixmap_argb;
|
|
|
|
w->shadow_paint.pict = shadow_picture_argb;
|
2013-03-18 11:48:28 +08:00
|
|
|
|
2013-03-17 12:14:00 +08:00
|
|
|
bool success = paint_bind_tex(ps, &w->shadow_paint, shadow_image->width, shadow_image->height, 32, true);
|
2013-03-15 23:16:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreeGC(ps->dpy, gc);
|
2012-06-04 00:08:50 +08:00
|
|
|
XDestroyImage(shadow_image);
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreePixmap(ps->dpy, shadow_pixmap);
|
|
|
|
XRenderFreePicture(ps->dpy, shadow_picture);
|
2012-09-29 13:15:09 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
return success;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-09-29 13:15:09 +08:00
|
|
|
shadow_picture_err:
|
|
|
|
if (shadow_image)
|
|
|
|
XDestroyImage(shadow_image);
|
|
|
|
if (shadow_pixmap)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreePixmap(ps->dpy, shadow_pixmap);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (shadow_pixmap_argb)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreePixmap(ps->dpy, shadow_pixmap_argb);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (shadow_picture)
|
2012-11-19 09:46:07 +08:00
|
|
|
XRenderFreePicture(ps->dpy, shadow_picture);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (shadow_picture_argb)
|
2012-11-19 09:46:07 +08:00
|
|
|
XRenderFreePicture(ps->dpy, shadow_picture_argb);
|
2012-09-29 13:15:09 +08:00
|
|
|
if (gc)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreeGC(ps->dpy, gc);
|
2013-03-15 23:16:23 +08:00
|
|
|
|
|
|
|
return false;
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Generate a 1x1 <code>Picture</code> of a particular color.
|
|
|
|
*/
|
2012-02-27 12:00:12 +08:00
|
|
|
static Picture
|
2012-11-19 09:46:07 +08:00
|
|
|
solid_picture(session_t *ps, bool argb, double a,
|
2011-11-04 17:18:10 +08:00
|
|
|
double r, double g, double b) {
|
2011-11-04 16:41:56 +08:00
|
|
|
Pixmap pixmap;
|
|
|
|
Picture picture;
|
|
|
|
XRenderPictureAttributes pa;
|
|
|
|
XRenderColor c;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
pixmap = XCreatePixmap(ps->dpy, ps->root, 1, 1, argb ? 32 : 8);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
|
|
|
if (!pixmap) return None;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
pa.repeat = True;
|
2012-11-19 09:46:07 +08:00
|
|
|
picture = XRenderCreatePicture(ps->dpy, pixmap,
|
|
|
|
XRenderFindStandardFormat(ps->dpy, argb
|
2011-11-04 17:18:10 +08:00
|
|
|
? PictStandardARGB32 : PictStandardA8),
|
2011-11-04 16:41:56 +08:00
|
|
|
CPRepeat,
|
|
|
|
&pa);
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
if (!picture) {
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreePixmap(ps->dpy, pixmap);
|
2011-11-04 14:33:23 +08:00
|
|
|
return None;
|
|
|
|
}
|
|
|
|
|
|
|
|
c.alpha = a * 0xffff;
|
2012-12-05 12:43:34 +08:00
|
|
|
c.red = r * 0xffff;
|
2011-11-04 14:33:23 +08:00
|
|
|
c.green = g * 0xffff;
|
2012-12-05 12:43:34 +08:00
|
|
|
c.blue = b * 0xffff;
|
2011-11-05 05:18:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XRenderFillRectangle(ps->dpy, PictOpSrc, picture, &c, 0, 0, 1, 1);
|
|
|
|
XFreePixmap(ps->dpy, pixmap);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
return picture;
|
2004-06-27 12:48:37 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Error handling ===
|
2012-02-09 06:45:08 +08:00
|
|
|
|
2012-02-27 12:00:12 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
discard_ignore(session_t *ps, unsigned long sequence) {
|
|
|
|
while (ps->ignore_head) {
|
|
|
|
if ((long) (sequence - ps->ignore_head->sequence) > 0) {
|
|
|
|
ignore_t *next = ps->ignore_head->next;
|
|
|
|
free(ps->ignore_head);
|
|
|
|
ps->ignore_head = next;
|
|
|
|
if (!ps->ignore_head) {
|
|
|
|
ps->ignore_tail = &ps->ignore_head;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
} else {
|
2011-11-04 14:33:23 +08:00
|
|
|
break;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2004-06-27 12:48:37 +08:00
|
|
|
}
|
|
|
|
|
2012-02-27 12:00:12 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
set_ignore(session_t *ps, unsigned long sequence) {
|
|
|
|
ignore_t *i = malloc(sizeof(ignore_t));
|
2011-11-04 16:41:56 +08:00
|
|
|
if (!i) return;
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
i->sequence = sequence;
|
|
|
|
i->next = 0;
|
2012-11-19 09:46:07 +08:00
|
|
|
*ps->ignore_tail = i;
|
|
|
|
ps->ignore_tail = &i->next;
|
2004-06-27 12:48:37 +08:00
|
|
|
}
|
|
|
|
|
2012-02-27 12:00:12 +08:00
|
|
|
static int
|
2012-11-19 09:46:07 +08:00
|
|
|
should_ignore(session_t *ps, unsigned long sequence) {
|
|
|
|
discard_ignore(ps, sequence);
|
|
|
|
return ps->ignore_head && ps->ignore_head->sequence == sequence;
|
2004-06-27 12:48:37 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Windows ===
|
2012-02-09 06:45:08 +08:00
|
|
|
|
2013-01-24 13:38:03 +08:00
|
|
|
/**
|
|
|
|
* Get a specific attribute of a window.
|
|
|
|
*
|
|
|
|
* Returns a blank structure if the returned type and format does not
|
|
|
|
* match the requested type and format.
|
|
|
|
*
|
|
|
|
* @param ps current session
|
|
|
|
* @param w window
|
|
|
|
* @param atom atom of attribute to fetch
|
|
|
|
* @param length length to read
|
|
|
|
* @param rtype atom of the requested type
|
|
|
|
* @param rformat requested format
|
|
|
|
* @return a <code>winprop_t</code> structure containing the attribute
|
|
|
|
* and number of items. A blank one on failure.
|
|
|
|
*/
|
|
|
|
winprop_t
|
|
|
|
wid_get_prop_adv(const session_t *ps, Window w, Atom atom, long offset,
|
|
|
|
long length, Atom rtype, int rformat) {
|
|
|
|
Atom type = None;
|
|
|
|
int format = 0;
|
|
|
|
unsigned long nitems = 0, after = 0;
|
|
|
|
unsigned char *data = NULL;
|
|
|
|
|
|
|
|
if (Success == XGetWindowProperty(ps->dpy, w, atom, offset, length,
|
|
|
|
False, rtype, &type, &format, &nitems, &after, &data)
|
|
|
|
&& nitems && (AnyPropertyType == type || type == rtype)
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
&& (!rformat || format == rformat)
|
2013-01-24 13:38:03 +08:00
|
|
|
&& (8 == format || 16 == format || 32 == format)) {
|
|
|
|
return (winprop_t) {
|
|
|
|
.data.p8 = data,
|
|
|
|
.nitems = nitems,
|
|
|
|
.type = type,
|
|
|
|
.format = format,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(data);
|
2013-01-24 13:38:03 +08:00
|
|
|
|
|
|
|
return (winprop_t) {
|
|
|
|
.data.p8 = NULL,
|
|
|
|
.nitems = 0,
|
|
|
|
.type = AnyPropertyType,
|
|
|
|
.format = 0
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2012-10-01 10:34:40 +08:00
|
|
|
/**
|
|
|
|
* Check if a window has rounded corners.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
win_rounded_corners(session_t *ps, win *w) {
|
2012-10-01 10:34:40 +08:00
|
|
|
if (!w->bounding_shaped)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Fetch its bounding region
|
|
|
|
if (!w->border_size)
|
2012-12-15 20:07:45 +08:00
|
|
|
w->border_size = border_size(ps, w, true);
|
2012-10-01 10:34:40 +08:00
|
|
|
|
|
|
|
// Quit if border_size() returns None
|
|
|
|
if (!w->border_size)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Determine the minimum width/height of a rectangle that could mark
|
|
|
|
// a window as having rounded corners
|
|
|
|
unsigned short minwidth = max_i(w->widthb * (1 - ROUNDED_PERCENT),
|
|
|
|
w->widthb - ROUNDED_PIXELS);
|
|
|
|
unsigned short minheight = max_i(w->heightb * (1 - ROUNDED_PERCENT),
|
|
|
|
w->heightb - ROUNDED_PIXELS);
|
|
|
|
|
|
|
|
// Get the rectangles in the bounding region
|
|
|
|
int nrects = 0, i;
|
2012-11-19 09:46:07 +08:00
|
|
|
XRectangle *rects = XFixesFetchRegion(ps->dpy, w->border_size, &nrects);
|
2012-10-01 10:34:40 +08:00
|
|
|
if (!rects)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Look for a rectangle large enough for this window be considered
|
|
|
|
// having rounded corners
|
|
|
|
for (i = 0; i < nrects; ++i)
|
|
|
|
if (rects[i].width >= minwidth && rects[i].height >= minheight) {
|
2012-11-19 09:46:07 +08:00
|
|
|
w->rounded_corners = true;
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(rects);
|
2012-10-01 10:34:40 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
w->rounded_corners = false;
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(rects);
|
2012-10-01 10:34:40 +08:00
|
|
|
}
|
|
|
|
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
/**
|
|
|
|
* Add a pattern to a condition linked list.
|
|
|
|
*/
|
2012-11-19 09:46:07 +08:00
|
|
|
static bool
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
condlst_add(session_t *ps, c2_lptr_t **pcondlst, const char *pattern) {
|
2012-09-25 10:19:20 +08:00
|
|
|
if (!pattern)
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
2012-09-25 10:19:20 +08:00
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
#ifdef CONFIG_C2
|
|
|
|
if (!c2_parse(ps, pcondlst, pattern))
|
|
|
|
exit(1);
|
|
|
|
#else
|
|
|
|
printf_errfq(1, "(): Condition support not compiled in.");
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
#endif
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return true;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Determine the event mask for a window.
|
|
|
|
*/
|
2012-09-13 23:24:37 +08:00
|
|
|
static long
|
2012-11-19 09:46:07 +08:00
|
|
|
determine_evmask(session_t *ps, Window wid, win_evmode_t mode) {
|
2012-09-13 22:30:18 +08:00
|
|
|
long evmask = NoEventMask;
|
2012-12-08 11:10:08 +08:00
|
|
|
win *w = NULL;
|
2012-09-13 22:30:18 +08:00
|
|
|
|
2012-12-08 11:10:08 +08:00
|
|
|
// Check if it's a mapped frame window
|
|
|
|
if (WIN_EVMODE_FRAME == mode
|
|
|
|
|| ((w = find_win(ps, wid)) && IsViewable == w->a.map_state)) {
|
2012-09-13 22:30:18 +08:00
|
|
|
evmask |= PropertyChangeMask;
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.track_focus && !ps->o.use_ewmh_active_win)
|
2012-11-04 18:11:08 +08:00
|
|
|
evmask |= FocusChangeMask;
|
2012-09-13 22:30:18 +08:00
|
|
|
}
|
2012-09-13 23:12:54 +08:00
|
|
|
|
2012-12-08 11:10:08 +08:00
|
|
|
// Check if it's a mapped client window
|
|
|
|
if (WIN_EVMODE_CLIENT == mode
|
|
|
|
|| ((w = find_toplevel(ps, wid)) && IsViewable == w->a.map_state)) {
|
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 20:20:27 +08:00
|
|
|
if (ps->o.frame_opacity || ps->o.track_wdata || ps->track_atom_lst
|
2012-11-19 09:46:07 +08:00
|
|
|
|| ps->o.detect_client_opacity)
|
2012-09-14 11:51:46 +08:00
|
|
|
evmask |= PropertyChangeMask;
|
2012-09-13 22:30:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return evmask;
|
|
|
|
}
|
|
|
|
|
2012-09-13 21:38:55 +08:00
|
|
|
/**
|
|
|
|
* Find out the WM frame of a client window by querying X.
|
|
|
|
*
|
2012-11-19 09:46:07 +08:00
|
|
|
* @param ps current session
|
2013-01-29 09:57:04 +08:00
|
|
|
* @param wid window ID
|
2012-09-13 21:38:55 +08:00
|
|
|
* @return struct _win object of the found window, NULL if not found
|
|
|
|
*/
|
2012-09-13 23:12:54 +08:00
|
|
|
static win *
|
2012-11-19 09:46:07 +08:00
|
|
|
find_toplevel2(session_t *ps, Window wid) {
|
2012-09-13 21:38:55 +08:00
|
|
|
win *w = NULL;
|
|
|
|
|
|
|
|
// We traverse through its ancestors to find out the frame
|
2012-11-19 09:46:07 +08:00
|
|
|
while (wid && wid != ps->root && !(w = find_win(ps, wid))) {
|
2012-09-13 21:38:55 +08:00
|
|
|
Window troot;
|
|
|
|
Window parent;
|
|
|
|
Window *tchildren;
|
|
|
|
unsigned tnchildren;
|
|
|
|
|
|
|
|
// XQueryTree probably fails if you run compton when X is somehow
|
|
|
|
// initializing (like add it in .xinitrc). In this case
|
|
|
|
// just leave it alone.
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!XQueryTree(ps->dpy, wid, &troot, &parent, &tchildren,
|
2012-09-13 21:38:55 +08:00
|
|
|
&tnchildren)) {
|
2012-09-17 16:04:04 +08:00
|
|
|
parent = 0;
|
2012-09-13 21:38:55 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(tchildren);
|
2012-09-13 23:12:54 +08:00
|
|
|
|
2012-09-13 21:38:55 +08:00
|
|
|
wid = parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
return w;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Recheck currently focused window and set its <code>w->focused</code>
|
2012-11-19 09:46:07 +08:00
|
|
|
* to true.
|
2012-09-13 21:38:55 +08:00
|
|
|
*
|
2012-11-19 09:46:07 +08:00
|
|
|
* @param ps current session
|
2012-09-13 21:38:55 +08:00
|
|
|
* @return struct _win of currently focused window, NULL if not found
|
|
|
|
*/
|
2012-09-13 23:12:54 +08:00
|
|
|
static win *
|
2012-11-19 09:46:07 +08:00
|
|
|
recheck_focus(session_t *ps) {
|
2012-11-04 18:11:08 +08:00
|
|
|
// Use EWMH _NET_ACTIVE_WINDOW if enabled
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.use_ewmh_active_win) {
|
|
|
|
update_ewmh_active_win(ps);
|
|
|
|
return ps->active_win;
|
2012-11-04 18:11:08 +08:00
|
|
|
}
|
|
|
|
|
2012-09-13 21:38:55 +08:00
|
|
|
// Determine the currently focused window so we can apply appropriate
|
|
|
|
// opacity on it
|
|
|
|
Window wid = 0;
|
|
|
|
int revert_to;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XGetInputFocus(ps->dpy, &wid, &revert_to);
|
2012-09-13 21:38:55 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
win *w = find_win_all(ps, wid);
|
2012-09-13 21:38:55 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
// And we set the focus state here
|
2012-09-13 21:38:55 +08:00
|
|
|
if (w) {
|
2012-11-28 11:44:00 +08:00
|
|
|
win_set_focused(ps, w, true);
|
2012-09-13 21:38:55 +08:00
|
|
|
return w;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
2012-02-01 06:10:30 +08:00
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
static bool
|
|
|
|
get_root_tile(session_t *ps) {
|
2012-10-24 10:09:59 +08:00
|
|
|
/*
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.paint_on_overlay) {
|
|
|
|
return ps->root_picture;
|
2012-10-24 10:09:59 +08:00
|
|
|
} */
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
assert(!ps->root_tile_paint.pixmap);
|
|
|
|
ps->root_tile_fill = false;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
bool fill = false;
|
|
|
|
Pixmap pixmap = None;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-04 18:11:08 +08:00
|
|
|
// Get the values of background attributes
|
2013-03-15 23:16:23 +08:00
|
|
|
for (int p = 0; background_props_str[p]; p++) {
|
2012-11-19 09:46:07 +08:00
|
|
|
winprop_t prop = wid_get_prop(ps, ps->root,
|
2013-01-09 20:25:01 +08:00
|
|
|
get_atom(ps, background_props_str[p]),
|
2012-11-19 09:46:07 +08:00
|
|
|
1L, XA_PIXMAP, 32);
|
|
|
|
if (prop.nitems) {
|
2012-11-21 09:15:49 +08:00
|
|
|
pixmap = *prop.data.p32;
|
2012-11-19 09:46:07 +08:00
|
|
|
fill = false;
|
|
|
|
free_winprop(&prop);
|
2011-11-04 14:33:23 +08:00
|
|
|
break;
|
2012-11-04 18:11:08 +08:00
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
free_winprop(&prop);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-05-01 22:08:43 +08:00
|
|
|
// Make sure the pixmap we got is valid
|
|
|
|
if (pixmap && !validate_pixmap(ps, pixmap))
|
|
|
|
pixmap = None;
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Create a pixmap if there isn't any
|
2011-11-04 14:33:23 +08:00
|
|
|
if (!pixmap) {
|
2012-11-19 09:46:07 +08:00
|
|
|
pixmap = XCreatePixmap(ps->dpy, ps->root, 1, 1, ps->depth);
|
|
|
|
fill = true;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Create Picture
|
|
|
|
{
|
|
|
|
XRenderPictureAttributes pa = {
|
|
|
|
.repeat = True,
|
|
|
|
};
|
|
|
|
ps->root_tile_paint.pict = XRenderCreatePicture(
|
|
|
|
ps->dpy, pixmap, XRenderFindVisualFormat(ps->dpy, ps->vis),
|
|
|
|
CPRepeat, &pa);
|
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Fill pixmap if needed
|
2011-11-04 14:33:23 +08:00
|
|
|
if (fill) {
|
|
|
|
XRenderColor c;
|
|
|
|
|
|
|
|
c.red = c.green = c.blue = 0x8080;
|
|
|
|
c.alpha = 0xffff;
|
2013-03-15 23:16:23 +08:00
|
|
|
XRenderFillRectangle(ps->dpy, PictOpSrc, ps->root_tile_paint.pict, &c, 0, 0, 1, 1);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
ps->root_tile_fill = fill;
|
|
|
|
ps->root_tile_paint.pixmap = pixmap;
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (BKEND_GLX == ps->o.backend)
|
2013-03-18 11:48:28 +08:00
|
|
|
return glx_bind_pixmap(ps, &ps->root_tile_paint.ptex, ps->root_tile_paint.pixmap, 0, 0, 0);
|
2013-03-15 23:16:23 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
return true;
|
2003-11-10 10:03:26 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Paint root window content.
|
|
|
|
*/
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2013-03-15 23:16:23 +08:00
|
|
|
paint_root(session_t *ps, XserverRegion reg_paint) {
|
|
|
|
if (!ps->root_tile_paint.pixmap)
|
|
|
|
get_root_tile(ps);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
win_render(ps, NULL, 0, 0, ps->root_width, ps->root_height, 1.0, reg_paint,
|
2013-04-06 20:21:38 +08:00
|
|
|
NULL, ps->root_tile_paint.pict);
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
/**
|
|
|
|
* Get a rectangular region a window occupies, excluding shadow.
|
|
|
|
*/
|
|
|
|
static XserverRegion
|
2012-12-15 20:07:45 +08:00
|
|
|
win_get_region(session_t *ps, win *w, bool use_offset) {
|
2012-10-21 20:44:24 +08:00
|
|
|
XRectangle r;
|
|
|
|
|
2012-12-15 20:07:45 +08:00
|
|
|
r.x = (use_offset ? w->a.x: 0);
|
|
|
|
r.y = (use_offset ? w->a.y: 0);
|
2012-10-21 20:44:24 +08:00
|
|
|
r.width = w->widthb;
|
|
|
|
r.height = w->heightb;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return XFixesCreateRegion(ps->dpy, &r, 1);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a rectangular region a window occupies, excluding frame and shadow.
|
|
|
|
*/
|
|
|
|
static XserverRegion
|
2012-12-15 20:07:45 +08:00
|
|
|
win_get_region_noframe(session_t *ps, win *w, bool use_offset) {
|
2012-10-21 20:44:24 +08:00
|
|
|
XRectangle r;
|
|
|
|
|
2012-12-15 20:07:45 +08:00
|
|
|
r.x = (use_offset ? w->a.x: 0) + w->a.border_width + w->left_width;
|
|
|
|
r.y = (use_offset ? w->a.y: 0) + w->a.border_width + w->top_width;
|
2012-11-01 19:03:56 +08:00
|
|
|
r.width = max_i(w->a.width - w->left_width - w->right_width, 0);
|
|
|
|
r.height = max_i(w->a.height - w->top_width - w->bottom_width, 0);
|
|
|
|
|
|
|
|
if (r.width > 0 && r.height > 0)
|
2012-11-19 09:46:07 +08:00
|
|
|
return XFixesCreateRegion(ps->dpy, &r, 1);
|
2012-11-01 19:03:56 +08:00
|
|
|
else
|
2012-11-19 09:46:07 +08:00
|
|
|
return XFixesCreateRegion(ps->dpy, NULL, 0);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
|
2012-09-17 22:15:04 +08:00
|
|
|
/**
|
|
|
|
* Get a rectangular region a window (and possibly its shadow) occupies.
|
|
|
|
*
|
|
|
|
* Note w->shadow and shadow geometry must be correct before calling this
|
|
|
|
* function.
|
|
|
|
*/
|
2003-11-20 00:12:15 +08:00
|
|
|
static XserverRegion
|
2012-11-19 09:46:07 +08:00
|
|
|
win_extents(session_t *ps, win *w) {
|
2011-11-04 16:41:56 +08:00
|
|
|
XRectangle r;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
r.x = w->a.x;
|
|
|
|
r.y = w->a.y;
|
2012-09-17 22:15:04 +08:00
|
|
|
r.width = w->widthb;
|
|
|
|
r.height = w->heightb;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-09-17 22:15:04 +08:00
|
|
|
if (w->shadow) {
|
2011-11-04 17:18:10 +08:00
|
|
|
XRectangle sr;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 17:18:10 +08:00
|
|
|
sr.x = w->a.x + w->shadow_dx;
|
|
|
|
sr.y = w->a.y + w->shadow_dy;
|
|
|
|
sr.width = w->shadow_width;
|
|
|
|
sr.height = w->shadow_height;
|
|
|
|
|
|
|
|
if (sr.x < r.x) {
|
|
|
|
r.width = (r.x + r.width) - sr.x;
|
|
|
|
r.x = sr.x;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sr.y < r.y) {
|
|
|
|
r.height = (r.y + r.height) - sr.y;
|
|
|
|
r.y = sr.y;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sr.x + sr.width > r.x + r.width) {
|
|
|
|
r.width = sr.x + sr.width - r.x;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sr.y + sr.height > r.y + r.height) {
|
|
|
|
r.height = sr.y + sr.height - r.y;
|
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return XFixesCreateRegion(ps->dpy, &r, 1);
|
2003-11-10 09:32:01 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Retrieve the bounding shape of a window.
|
|
|
|
*/
|
2003-11-20 00:12:15 +08:00
|
|
|
static XserverRegion
|
2012-12-15 20:07:45 +08:00
|
|
|
border_size(session_t *ps, win *w, bool use_offset) {
|
2012-11-01 19:03:56 +08:00
|
|
|
// Start with the window rectangular region
|
2012-12-15 20:07:45 +08:00
|
|
|
XserverRegion fin = win_get_region(ps, w, use_offset);
|
2012-11-01 19:03:56 +08:00
|
|
|
|
|
|
|
// Only request for a bounding region if the window is shaped
|
|
|
|
if (w->bounding_shaped) {
|
|
|
|
/*
|
|
|
|
* if window doesn't exist anymore, this will generate an error
|
|
|
|
* as well as not generate a region. Perhaps a better XFixes
|
|
|
|
* architecture would be to have a request that copies instead
|
|
|
|
* of creates, that way you'd just end up with an empty region
|
|
|
|
* instead of an invalid XID.
|
|
|
|
*/
|
|
|
|
|
|
|
|
XserverRegion border = XFixesCreateRegionFromWindow(
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->dpy, w->id, WindowRegionBounding);
|
2012-11-01 19:03:56 +08:00
|
|
|
|
|
|
|
if (!border)
|
|
|
|
return fin;
|
|
|
|
|
2012-12-15 20:07:45 +08:00
|
|
|
if (use_offset) {
|
|
|
|
// Translate the region to the correct place
|
|
|
|
XFixesTranslateRegion(ps->dpy, border,
|
|
|
|
w->a.x + w->a.border_width,
|
|
|
|
w->a.y + w->a.border_width);
|
|
|
|
}
|
2012-11-01 19:03:56 +08:00
|
|
|
|
|
|
|
// Intersect the bounding region we got with the window rectangle, to
|
|
|
|
// make sure the bounding region is not bigger than the window
|
|
|
|
// rectangle
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, fin, fin, border);
|
|
|
|
XFixesDestroyRegion(ps->dpy, border);
|
2012-11-01 19:03:56 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-01 19:03:56 +08:00
|
|
|
return fin;
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Look for the client window of a particular window.
|
|
|
|
*/
|
2012-09-13 23:12:54 +08:00
|
|
|
static Window
|
2012-11-19 09:46:07 +08:00
|
|
|
find_client_win(session_t *ps, Window w) {
|
2012-12-07 22:38:10 +08:00
|
|
|
if (wid_has_prop(ps, w, ps->atom_client)) {
|
2012-09-13 21:38:55 +08:00
|
|
|
return w;
|
2012-09-13 23:12:54 +08:00
|
|
|
}
|
2011-11-06 10:39:58 +08:00
|
|
|
|
|
|
|
Window *children;
|
|
|
|
unsigned int nchildren;
|
|
|
|
unsigned int i;
|
2012-09-13 21:38:55 +08:00
|
|
|
Window ret = 0;
|
2011-11-06 10:39:58 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!wid_get_children(ps, w, &children, &nchildren)) {
|
2011-11-06 10:39:58 +08:00
|
|
|
return 0;
|
2012-09-13 23:12:54 +08:00
|
|
|
}
|
2011-11-06 10:39:58 +08:00
|
|
|
|
2012-09-13 23:12:54 +08:00
|
|
|
for (i = 0; i < nchildren; ++i) {
|
2012-11-19 09:46:07 +08:00
|
|
|
if ((ret = find_client_win(ps, children[i])))
|
2012-09-13 21:38:55 +08:00
|
|
|
break;
|
2012-09-13 23:12:54 +08:00
|
|
|
}
|
2011-11-06 10:39:58 +08:00
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(children);
|
2011-11-06 10:39:58 +08:00
|
|
|
|
2012-09-13 21:38:55 +08:00
|
|
|
return ret;
|
2011-11-06 10:39:58 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Retrieve frame extents from a window.
|
|
|
|
*/
|
2011-11-06 10:39:58 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
get_frame_extents(session_t *ps, win *w, Window client) {
|
2012-09-20 13:50:27 +08:00
|
|
|
w->left_width = 0;
|
|
|
|
w->right_width = 0;
|
|
|
|
w->top_width = 0;
|
|
|
|
w->bottom_width = 0;
|
2011-11-06 10:39:58 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
winprop_t prop = wid_get_prop(ps, client, ps->atom_frame_extents,
|
2012-11-04 18:11:08 +08:00
|
|
|
4L, XA_CARDINAL, 32);
|
2011-11-06 10:39:58 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (4 == prop.nitems) {
|
2012-11-21 09:15:49 +08:00
|
|
|
const long * const extents = prop.data.p32;
|
2012-11-04 18:11:08 +08:00
|
|
|
w->left_width = extents[0];
|
|
|
|
w->right_width = extents[1];
|
|
|
|
w->top_width = extents[2];
|
|
|
|
w->bottom_width = extents[3];
|
2012-10-31 08:54:09 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.frame_opacity)
|
|
|
|
update_reg_ignore_expire(ps, w);
|
2011-11-06 10:39:58 +08:00
|
|
|
}
|
2012-11-04 18:11:08 +08:00
|
|
|
|
2012-12-05 12:43:34 +08:00
|
|
|
#ifdef DEBUG_FRAME
|
|
|
|
printf_dbgf("(%#010lx): %d, %d, %d, %d\n", w->id,
|
|
|
|
w->left_width, w->right_width, w->top_width, w->bottom_width);
|
|
|
|
#endif
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
free_winprop(&prop);
|
2011-11-06 10:39:58 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Get alpha <code>Picture</code> for an opacity in <code>double</code>.
|
|
|
|
*/
|
2012-10-13 18:46:59 +08:00
|
|
|
static inline Picture
|
2012-11-19 09:46:07 +08:00
|
|
|
get_alpha_pict_d(session_t *ps, double o) {
|
2012-11-21 09:15:49 +08:00
|
|
|
assert((round(normalize_d(o) / ps->o.alpha_step)) <= round(1.0 / ps->o.alpha_step));
|
|
|
|
return ps->alpha_picts[(int) (round(normalize_d(o)
|
|
|
|
/ ps->o.alpha_step))];
|
2012-10-13 18:46:59 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Get alpha <code>Picture</code> for an opacity in
|
|
|
|
* <code>opacity_t</code>.
|
|
|
|
*/
|
2012-10-13 18:46:59 +08:00
|
|
|
static inline Picture
|
2012-11-19 09:46:07 +08:00
|
|
|
get_alpha_pict_o(session_t *ps, opacity_t o) {
|
|
|
|
return get_alpha_pict_d(ps, (double) o / OPAQUE);
|
2012-10-13 18:46:59 +08:00
|
|
|
}
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
static win *
|
2012-11-19 09:46:07 +08:00
|
|
|
paint_preprocess(session_t *ps, win *list) {
|
2012-09-19 20:49:16 +08:00
|
|
|
win *t = NULL, *next = NULL;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// Fading step calculation
|
2013-01-11 21:31:02 +08:00
|
|
|
time_ms_t steps = 0L;
|
|
|
|
if (ps->fade_time) {
|
|
|
|
steps = ((get_time_ms() - ps->fade_time) + FADE_DELTA_TOLERANCE * ps->o.fade_delta) / ps->o.fade_delta;
|
|
|
|
}
|
|
|
|
// Reset fade_time if unset, or there appears to be a time disorder
|
|
|
|
if (!ps->fade_time || steps < 0L) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ps->fade_time = get_time_ms();
|
2013-01-11 21:31:02 +08:00
|
|
|
steps = 0L;
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->fade_time += steps * ps->o.fade_delta;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
XserverRegion last_reg_ignore = None;
|
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
bool unredir_possible = false;
|
|
|
|
// Trace whether it's the highest window to paint
|
|
|
|
bool is_highest = true;
|
|
|
|
for (win *w = list; w; w = next) {
|
2012-11-19 09:46:07 +08:00
|
|
|
bool to_paint = true;
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
const winmode_t mode_old = w->mode;
|
2012-10-31 08:54:09 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
// In case calling the fade callback function destroys this window
|
|
|
|
next = w->next;
|
|
|
|
opacity_t opacity_old = w->opacity;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// Data expiration
|
|
|
|
{
|
|
|
|
// Remove built shadow if needed
|
|
|
|
if (w->flags & WFLAG_SIZE_CHANGE)
|
|
|
|
free_paint(ps, &w->shadow_paint);
|
|
|
|
|
|
|
|
// Destroy reg_ignore on all windows if they should expire
|
|
|
|
if (ps->reg_ignore_expire)
|
|
|
|
free_region(ps, &w->reg_ignore);
|
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-28 11:44:00 +08:00
|
|
|
// Update window opacity target and dim state if asked
|
|
|
|
if (WFLAG_OPCT_CHANGE & w->flags) {
|
|
|
|
calc_opacity(ps, w);
|
|
|
|
calc_dim(ps, w);
|
|
|
|
}
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
// Run fading
|
2012-11-19 09:46:07 +08:00
|
|
|
run_fade(ps, w, steps);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// Opacity will not change, from now on.
|
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
// Give up if it's not damaged or invisible, or it's unmapped and its
|
2013-09-12 21:23:20 +08:00
|
|
|
// pixmap is gone (for example due to a ConfigureNotify), or when it's
|
|
|
|
// excluded
|
2012-09-19 20:49:16 +08:00
|
|
|
if (!w->damaged
|
|
|
|
|| w->a.x + w->a.width < 1 || w->a.y + w->a.height < 1
|
2012-11-19 09:46:07 +08:00
|
|
|
|| w->a.x >= ps->root_width || w->a.y >= ps->root_height
|
2013-09-12 21:23:20 +08:00
|
|
|
|| ((IsUnmapped == w->a.map_state || w->destroyed) && !w->paint.pixmap)
|
|
|
|
|| get_alpha_pict_o(ps, w->opacity) == ps->alpha_picts[0]
|
|
|
|
|| w->paint_excluded)
|
2012-11-19 09:46:07 +08:00
|
|
|
to_paint = false;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// to_paint will never change afterward
|
2013-06-19 19:36:48 +08:00
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// Determine mode as early as possible
|
|
|
|
if (to_paint && (!w->to_paint || w->opacity != opacity_old))
|
|
|
|
win_determine_mode(ps, w);
|
2012-09-20 13:50:27 +08:00
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
if (to_paint) {
|
2012-11-01 10:43:15 +08:00
|
|
|
// Fetch bounding region
|
2013-09-12 21:23:20 +08:00
|
|
|
if (!w->border_size)
|
2012-12-15 20:07:45 +08:00
|
|
|
w->border_size = border_size(ps, w, true);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-01 10:43:15 +08:00
|
|
|
// Fetch window extents
|
2013-09-12 21:23:20 +08:00
|
|
|
if (!w->extents)
|
2012-11-19 09:46:07 +08:00
|
|
|
w->extents = win_extents(ps, w);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
// Calculate frame_opacity
|
|
|
|
{
|
|
|
|
double frame_opacity_old = w->frame_opacity;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.frame_opacity && 1.0 != ps->o.frame_opacity
|
2012-10-31 08:54:09 +08:00
|
|
|
&& win_has_frame(w))
|
2012-11-19 09:46:07 +08:00
|
|
|
w->frame_opacity = get_opacity_percent(w) *
|
|
|
|
ps->o.frame_opacity;
|
2012-10-31 08:54:09 +08:00
|
|
|
else
|
|
|
|
w->frame_opacity = 0.0;
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// Destroy all reg_ignore above when frame opaque state changes on
|
|
|
|
// SOLID mode
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (w->to_paint && WMODE_SOLID == mode_old
|
2012-10-31 08:54:09 +08:00
|
|
|
&& (0.0 == frame_opacity_old) != (0.0 == w->frame_opacity))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->reg_ignore_expire = true;
|
2012-10-31 08:54:09 +08:00
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
// Calculate shadow opacity
|
|
|
|
if (w->frame_opacity)
|
2012-11-19 09:46:07 +08:00
|
|
|
w->shadow_opacity = ps->o.shadow_opacity * w->frame_opacity;
|
2012-10-31 08:54:09 +08:00
|
|
|
else
|
2012-11-19 09:46:07 +08:00
|
|
|
w->shadow_opacity = ps->o.shadow_opacity * get_opacity_percent(w);
|
2012-09-29 13:15:09 +08:00
|
|
|
}
|
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// Add window to damaged area if its painting status changes
|
|
|
|
// or opacity changes
|
|
|
|
if (to_paint != w->to_paint || w->opacity != opacity_old)
|
|
|
|
add_damage_win(ps, w);
|
|
|
|
|
|
|
|
// Destroy all reg_ignore above when window mode changes
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if ((to_paint && WMODE_SOLID == w->mode)
|
|
|
|
!= (w->to_paint && WMODE_SOLID == mode_old))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->reg_ignore_expire = true;
|
2012-10-31 08:54:09 +08:00
|
|
|
|
|
|
|
if (to_paint) {
|
|
|
|
// Generate ignore region for painting to reduce GPU load
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->reg_ignore_expire || !w->to_paint) {
|
|
|
|
free_region(ps, &w->reg_ignore);
|
2012-10-31 08:54:09 +08:00
|
|
|
|
|
|
|
// If the window is solid, we add the window region to the
|
|
|
|
// ignored region
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (WMODE_SOLID == w->mode) {
|
2012-11-01 19:03:56 +08:00
|
|
|
if (!w->frame_opacity) {
|
|
|
|
if (w->border_size)
|
2012-11-19 09:46:07 +08:00
|
|
|
w->reg_ignore = copy_region(ps, w->border_size);
|
2012-11-01 19:03:56 +08:00
|
|
|
else
|
2012-12-15 20:07:45 +08:00
|
|
|
w->reg_ignore = win_get_region(ps, w, true);
|
2012-11-01 19:03:56 +08:00
|
|
|
}
|
|
|
|
else {
|
2012-12-15 20:07:45 +08:00
|
|
|
w->reg_ignore = win_get_region_noframe(ps, w, true);
|
2012-11-01 19:03:56 +08:00
|
|
|
if (w->border_size)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, w->reg_ignore, w->reg_ignore,
|
2012-11-01 19:03:56 +08:00
|
|
|
w->border_size);
|
|
|
|
}
|
2012-10-31 08:54:09 +08:00
|
|
|
|
|
|
|
if (last_reg_ignore)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesUnionRegion(ps->dpy, w->reg_ignore, w->reg_ignore,
|
2012-10-31 08:54:09 +08:00
|
|
|
last_reg_ignore);
|
|
|
|
}
|
|
|
|
// Otherwise we copy the last region over
|
|
|
|
else if (last_reg_ignore)
|
2012-11-19 09:46:07 +08:00
|
|
|
w->reg_ignore = copy_region(ps, last_reg_ignore);
|
2012-10-21 20:44:24 +08:00
|
|
|
else
|
2012-10-31 08:54:09 +08:00
|
|
|
w->reg_ignore = None;
|
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
last_reg_ignore = w->reg_ignore;
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
// (Un)redirect screen
|
|
|
|
// We could definitely unredirect the screen when there's no window to
|
|
|
|
// paint, but this is typically unnecessary, may cause flickering when
|
|
|
|
// fading is enabled, and could create inconsistency when the wallpaper
|
|
|
|
// is not correctly set.
|
2013-07-26 12:52:16 +08:00
|
|
|
if (ps->o.unredir_if_possible && is_highest && to_paint) {
|
2012-11-19 09:46:07 +08:00
|
|
|
is_highest = false;
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (WMODE_SOLID == w->mode
|
2012-11-09 21:44:02 +08:00
|
|
|
&& (!w->frame_opacity || !win_has_frame(w))
|
2013-09-04 22:00:51 +08:00
|
|
|
&& win_is_fullscreen(ps, w)
|
|
|
|
&& !w->unredir_if_possible_excluded)
|
2013-07-26 12:52:16 +08:00
|
|
|
unredir_possible = true;
|
2012-11-09 21:44:02 +08:00
|
|
|
}
|
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
// Reset flags
|
|
|
|
w->flags = 0;
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
|
2012-11-04 19:14:21 +08:00
|
|
|
// Avoid setting w->to_paint if w is to be freed
|
|
|
|
bool destroyed = (w->opacity_tgt == w->opacity && w->destroyed);
|
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
if (to_paint) {
|
|
|
|
w->prev_trans = t;
|
|
|
|
t = w;
|
|
|
|
}
|
|
|
|
else {
|
2012-11-19 09:46:07 +08:00
|
|
|
check_fade_fin(ps, w);
|
2012-10-31 08:54:09 +08:00
|
|
|
}
|
2012-11-04 19:14:21 +08:00
|
|
|
|
|
|
|
if (!destroyed)
|
|
|
|
w->to_paint = to_paint;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
|
2012-11-09 21:44:02 +08:00
|
|
|
// If possible, unredirect all windows and stop painting
|
2013-07-26 12:52:16 +08:00
|
|
|
if (UNSET != ps->o.redirected_force)
|
|
|
|
unredir_possible = !ps->o.redirected_force;
|
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// If there's no window to paint, and the screen isn't redirected,
|
|
|
|
// don't redirect it.
|
|
|
|
if (ps->o.unredir_if_possible && is_highest && !ps->redirected)
|
|
|
|
unredir_possible = true;
|
2013-09-04 22:00:51 +08:00
|
|
|
if (unredir_possible) {
|
|
|
|
if (ps->redirected) {
|
|
|
|
if (!ps->o.unredir_if_possible_delay || ps->tmout_unredir_hit)
|
|
|
|
redir_stop(ps);
|
|
|
|
else if (!ps->tmout_unredir->enabled) {
|
|
|
|
timeout_reset(ps, ps->tmout_unredir);
|
|
|
|
ps->tmout_unredir->enabled = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ps->tmout_unredir->enabled = false;
|
2012-11-19 09:46:07 +08:00
|
|
|
redir_start(ps);
|
2013-09-04 22:00:51 +08:00
|
|
|
}
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
return t;
|
|
|
|
}
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
/**
|
|
|
|
* Paint the shadow of a window.
|
|
|
|
*/
|
|
|
|
static inline void
|
2013-04-06 20:21:38 +08:00
|
|
|
win_paint_shadow(session_t *ps, win *w,
|
|
|
|
XserverRegion reg_paint, const reg_data_t *pcache_reg) {
|
2013-03-15 23:16:23 +08:00
|
|
|
if (!paint_isvalid(ps, &w->shadow_paint)) {
|
|
|
|
printf_errf("(%#010lx): Missing painting data. This is a bad sign.", w->id);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
render(ps, 0, 0, w->a.x + w->shadow_dx, w->a.y + w->shadow_dy,
|
|
|
|
w->shadow_width, w->shadow_height, w->shadow_opacity, true, false,
|
2013-04-06 20:21:38 +08:00
|
|
|
w->shadow_paint.pict, w->shadow_paint.ptex, reg_paint, pcache_reg);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
|
2013-01-12 22:21:35 +08:00
|
|
|
/**
|
2013-05-20 18:04:40 +08:00
|
|
|
* Create an picture.
|
2013-01-12 22:21:35 +08:00
|
|
|
*/
|
|
|
|
static inline Picture
|
2013-05-20 18:04:40 +08:00
|
|
|
xr_build_picture(session_t *ps, int wid, int hei,
|
|
|
|
XRenderPictFormat *pictfmt) {
|
2013-03-15 23:16:23 +08:00
|
|
|
if (!pictfmt)
|
|
|
|
pictfmt = XRenderFindVisualFormat(ps->dpy, ps->vis);
|
2013-01-12 22:21:35 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
int depth = pictfmt->depth;
|
2013-01-12 22:21:35 +08:00
|
|
|
|
|
|
|
Pixmap tmp_pixmap = XCreatePixmap(ps->dpy, ps->root, wid, hei, depth);
|
|
|
|
if (!tmp_pixmap)
|
|
|
|
return None;
|
|
|
|
|
|
|
|
Picture tmp_picture = XRenderCreatePicture(ps->dpy, tmp_pixmap,
|
2013-03-15 23:16:23 +08:00
|
|
|
pictfmt, 0, 0);
|
2013-01-12 22:21:35 +08:00
|
|
|
free_pixmap(ps, &tmp_pixmap);
|
|
|
|
|
|
|
|
return tmp_picture;
|
|
|
|
}
|
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
/**
|
|
|
|
* @brief Blur an area on a buffer.
|
|
|
|
*
|
|
|
|
* @param ps current session
|
|
|
|
* @param tgt_buffer a buffer as both source and destination
|
|
|
|
* @param x x pos
|
|
|
|
* @param y y pos
|
|
|
|
* @param wid width
|
|
|
|
* @param hei height
|
|
|
|
* @param blur_kerns blur kernels, ending with a NULL, guaranteed to have at
|
|
|
|
* least one kernel
|
|
|
|
* @param reg_clip a clipping region to be applied on intermediate buffers
|
|
|
|
*
|
|
|
|
* @return true if successful, false otherwise
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
xr_blur_dst(session_t *ps, Picture tgt_buffer,
|
|
|
|
int x, int y, int wid, int hei, XFixed **blur_kerns,
|
|
|
|
XserverRegion reg_clip) {
|
|
|
|
assert(blur_kerns[0]);
|
|
|
|
|
|
|
|
// Directly copying from tgt_buffer to it does not work, so we create a
|
|
|
|
// Picture in the middle.
|
|
|
|
Picture tmp_picture = xr_build_picture(ps, wid, hei, NULL);
|
|
|
|
|
|
|
|
if (!tmp_picture) {
|
|
|
|
printf_errf("(): Failed to build intermediate Picture.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (reg_clip && tmp_picture)
|
|
|
|
XFixesSetPictureClipRegion(ps->dpy, tmp_picture, reg_clip, 0, 0);
|
|
|
|
|
|
|
|
Picture src_pict = tgt_buffer, dst_pict = tmp_picture;
|
|
|
|
for (int i = 0; blur_kerns[i]; ++i) {
|
|
|
|
assert(i < MAX_BLUR_PASS - 1);
|
|
|
|
XFixed *convolution_blur = blur_kerns[i];
|
|
|
|
int kwid = XFixedToDouble(convolution_blur[0]),
|
|
|
|
khei = XFixedToDouble(convolution_blur[1]);
|
|
|
|
bool rd_from_tgt = (tgt_buffer == src_pict);
|
|
|
|
|
|
|
|
// Copy from source picture to destination. The filter must
|
|
|
|
// be applied on source picture, to get the nearby pixels outside the
|
|
|
|
// window.
|
|
|
|
XRenderSetPictureFilter(ps->dpy, src_pict, XRFILTER_CONVOLUTION,
|
|
|
|
convolution_blur, kwid * khei + 2);
|
|
|
|
XRenderComposite(ps->dpy, PictOpSrc, src_pict, None, dst_pict,
|
|
|
|
(rd_from_tgt ? x: 0), (rd_from_tgt ? y: 0), 0, 0,
|
|
|
|
(rd_from_tgt ? 0: x), (rd_from_tgt ? 0: y), wid, hei);
|
|
|
|
xrfilter_reset(ps, src_pict);
|
|
|
|
|
|
|
|
{
|
|
|
|
XserverRegion tmp = src_pict;
|
|
|
|
src_pict = dst_pict;
|
|
|
|
dst_pict = tmp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (src_pict != tgt_buffer)
|
|
|
|
XRenderComposite(ps->dpy, PictOpSrc, src_pict, None, tgt_buffer,
|
|
|
|
0, 0, 0, 0, x, y, wid, hei);
|
|
|
|
|
|
|
|
free_picture(ps, &tmp_picture);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-12-14 20:32:46 +08:00
|
|
|
/**
|
|
|
|
* Blur the background of a window.
|
|
|
|
*/
|
|
|
|
static inline void
|
|
|
|
win_blur_background(session_t *ps, win *w, Picture tgt_buffer,
|
2013-04-06 20:21:38 +08:00
|
|
|
XserverRegion reg_paint, const reg_data_t *pcache_reg) {
|
2013-01-12 22:21:35 +08:00
|
|
|
const int x = w->a.x;
|
|
|
|
const int y = w->a.y;
|
|
|
|
const int wid = w->widthb;
|
|
|
|
const int hei = w->heightb;
|
2012-12-14 20:32:46 +08:00
|
|
|
|
2013-03-20 17:29:45 +08:00
|
|
|
double factor_center = 1.0;
|
2012-12-15 20:07:45 +08:00
|
|
|
// Adjust blur strength according to window opacity, to make it appear
|
|
|
|
// better during fading
|
|
|
|
if (!ps->o.blur_background_fixed) {
|
|
|
|
double pct = 1.0 - get_opacity_percent(w) * (1.0 - 1.0 / 9.0);
|
2013-03-20 17:29:45 +08:00
|
|
|
factor_center = pct * 8.0 / (1.1 - pct);
|
2012-12-15 20:07:45 +08:00
|
|
|
}
|
|
|
|
|
2013-03-20 17:29:45 +08:00
|
|
|
switch (ps->o.backend) {
|
|
|
|
case BKEND_XRENDER:
|
|
|
|
{
|
2013-05-20 18:04:40 +08:00
|
|
|
// Normalize blur kernels
|
|
|
|
for (int i = 0; i < MAX_BLUR_PASS; ++i) {
|
|
|
|
XFixed *kern_src = ps->o.blur_kerns[i];
|
|
|
|
XFixed *kern_dst = ps->blur_kerns_cache[i];
|
|
|
|
assert(i < MAX_BLUR_PASS);
|
|
|
|
if (!kern_src) {
|
|
|
|
assert(!kern_dst);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert(!kern_dst
|
|
|
|
|| (kern_src[0] == kern_dst[0] && kern_src[1] == kern_dst[1]));
|
|
|
|
|
|
|
|
// Skip for fixed factor_center if the cache exists already
|
|
|
|
if (ps->o.blur_background_fixed && kern_dst) continue;
|
|
|
|
|
|
|
|
int kwid = XFixedToDouble(kern_src[0]),
|
|
|
|
khei = XFixedToDouble(kern_src[1]);
|
2013-03-20 17:29:45 +08:00
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
// Allocate cache space if needed
|
|
|
|
if (!kern_dst) {
|
|
|
|
kern_dst = malloc((kwid * khei + 2) * sizeof(XFixed));
|
|
|
|
if (!kern_dst) {
|
|
|
|
printf_errf("(): Failed to allocate memory for blur kernel.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ps->blur_kerns_cache[i] = kern_dst;
|
|
|
|
}
|
2013-03-20 17:29:45 +08:00
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
// Modify the factor of the center pixel
|
|
|
|
kern_src[2 + (khei / 2) * kwid + kwid / 2] =
|
|
|
|
XDoubleToFixed(factor_center);
|
2013-04-25 22:23:35 +08:00
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
// Copy over
|
|
|
|
memcpy(kern_dst, kern_src, (kwid * khei + 2) * sizeof(XFixed));
|
|
|
|
normalize_conv_kern(kwid, khei, kern_dst + 2);
|
|
|
|
}
|
2013-03-20 17:29:45 +08:00
|
|
|
|
|
|
|
// Minimize the region we try to blur, if the window itself is not
|
|
|
|
// opaque, only the frame is.
|
2013-05-20 18:04:40 +08:00
|
|
|
XserverRegion reg_noframe = None;
|
|
|
|
if (WMODE_SOLID == w->mode) {
|
2013-03-20 17:29:45 +08:00
|
|
|
XserverRegion reg_all = border_size(ps, w, false);
|
2013-05-20 18:04:40 +08:00
|
|
|
reg_noframe = win_get_region_noframe(ps, w, false);
|
2013-03-20 17:29:45 +08:00
|
|
|
XFixesSubtractRegion(ps->dpy, reg_noframe, reg_all, reg_noframe);
|
|
|
|
free_region(ps, ®_all);
|
|
|
|
}
|
2013-05-20 18:04:40 +08:00
|
|
|
xr_blur_dst(ps, tgt_buffer, x, y, wid, hei, ps->blur_kerns_cache,
|
|
|
|
reg_noframe);
|
|
|
|
free_region(ps, ®_noframe);
|
2013-03-20 17:29:45 +08:00
|
|
|
}
|
|
|
|
break;
|
2013-05-20 18:04:40 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL_GLSL
|
2013-03-20 17:29:45 +08:00
|
|
|
case BKEND_GLX:
|
2013-05-20 18:04:40 +08:00
|
|
|
// TODO: Handle frame opacity
|
2013-04-06 20:21:38 +08:00
|
|
|
glx_blur_dst(ps, x, y, wid, hei, ps->glx_z - 0.5, factor_center,
|
2013-05-20 18:04:40 +08:00
|
|
|
reg_paint, pcache_reg, &w->glx_blur_cache);
|
2013-03-20 17:29:45 +08:00
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
assert(0);
|
|
|
|
}
|
2012-12-14 20:32:46 +08:00
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
static void
|
|
|
|
render(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
|
|
|
|
double opacity, bool argb, bool neg,
|
2013-04-06 20:21:38 +08:00
|
|
|
Picture pict, glx_texture_t *ptex,
|
|
|
|
XserverRegion reg_paint, const reg_data_t *pcache_reg) {
|
2013-03-15 23:16:23 +08:00
|
|
|
switch (ps->o.backend) {
|
|
|
|
case BKEND_XRENDER:
|
|
|
|
{
|
|
|
|
Picture alpha_pict = get_alpha_pict_d(ps, opacity);
|
|
|
|
if (alpha_pict != ps->alpha_picts[0]) {
|
|
|
|
int op = ((!argb && !alpha_pict) ? PictOpSrc: PictOpOver);
|
|
|
|
XRenderComposite(ps->dpy, op, pict, alpha_pict,
|
|
|
|
ps->tgt_buffer, x, y, 0, 0, dx, dy, wid, hei);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
case BKEND_GLX:
|
|
|
|
glx_render(ps, ptex, x, y, dx, dy, wid, hei,
|
2013-04-06 20:21:38 +08:00
|
|
|
ps->glx_z, opacity, neg, reg_paint, pcache_reg);
|
2013-03-15 23:16:23 +08:00
|
|
|
ps->glx_z += 1;
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
assert(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
/**
|
|
|
|
* Paint a window itself and dim it if asked.
|
|
|
|
*/
|
|
|
|
static inline void
|
2013-04-06 20:21:38 +08:00
|
|
|
win_paint_win(session_t *ps, win *w, XserverRegion reg_paint,
|
|
|
|
const reg_data_t *pcache_reg) {
|
2013-05-12 18:21:16 +08:00
|
|
|
glx_mark(ps, w->id, true);
|
|
|
|
|
2013-03-17 12:14:00 +08:00
|
|
|
// Fetch Pixmap
|
|
|
|
if (!w->paint.pixmap && ps->has_name_pixmap) {
|
|
|
|
set_ignore_next(ps);
|
|
|
|
w->paint.pixmap = XCompositeNameWindowPixmap(ps->dpy, w->id);
|
|
|
|
}
|
|
|
|
// XRender: Build picture
|
|
|
|
if (BKEND_XRENDER == ps->o.backend && !w->paint.pict) {
|
|
|
|
Drawable draw = w->paint.pixmap;
|
|
|
|
if (!draw)
|
|
|
|
draw = w->id;
|
|
|
|
{
|
|
|
|
XRenderPictureAttributes pa = {
|
|
|
|
.subwindow_mode = IncludeInferiors,
|
|
|
|
};
|
|
|
|
|
|
|
|
w->paint.pict = XRenderCreatePicture(ps->dpy, draw, w->pictfmt,
|
|
|
|
CPSubwindowMode, &pa);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// GLX: Build texture
|
2013-03-18 11:48:28 +08:00
|
|
|
// Let glx_bind_pixmap() determine pixmap size, because if the user
|
|
|
|
// is resizing windows, the width and height we get may not be up-to-date,
|
|
|
|
// causing the jittering issue M4he reported in #7.
|
2013-04-05 21:05:19 +08:00
|
|
|
if (!paint_bind_tex(ps, &w->paint, 0, 0, 0,
|
|
|
|
(!ps->o.glx_no_rebind_pixmap && w->pixmap_damaged))) {
|
2013-03-17 12:14:00 +08:00
|
|
|
printf_errf("(%#010lx): Failed to bind texture. Expect troubles.", w->id);
|
|
|
|
}
|
|
|
|
w->pixmap_damaged = false;
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
if (!paint_isvalid(ps, &w->paint)) {
|
|
|
|
printf_errf("(%#010lx): Missing painting data. This is a bad sign.", w->id);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const int x = w->a.x;
|
|
|
|
const int y = w->a.y;
|
|
|
|
const int wid = w->widthb;
|
|
|
|
const int hei = w->heightb;
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
Picture pict = w->paint.pict;
|
2013-01-12 22:21:35 +08:00
|
|
|
|
|
|
|
// Invert window color, if required
|
2013-03-15 23:16:23 +08:00
|
|
|
if (BKEND_XRENDER == ps->o.backend && w->invert_color) {
|
2013-05-20 18:04:40 +08:00
|
|
|
Picture newpict = xr_build_picture(ps, wid, hei, w->pictfmt);
|
2013-01-12 22:21:35 +08:00
|
|
|
if (newpict) {
|
2013-01-29 09:57:04 +08:00
|
|
|
// Apply clipping region to save some CPU
|
|
|
|
if (reg_paint) {
|
|
|
|
XserverRegion reg = copy_region(ps, reg_paint);
|
|
|
|
XFixesTranslateRegion(ps->dpy, reg, -x, -y);
|
|
|
|
XFixesSetPictureClipRegion(ps->dpy, newpict, 0, 0, reg);
|
|
|
|
free_region(ps, ®);
|
|
|
|
}
|
|
|
|
|
2013-01-12 22:21:35 +08:00
|
|
|
XRenderComposite(ps->dpy, PictOpSrc, pict, None,
|
|
|
|
newpict, 0, 0, 0, 0, 0, 0, wid, hei);
|
|
|
|
XRenderComposite(ps->dpy, PictOpDifference, ps->white_picture, None,
|
|
|
|
newpict, 0, 0, 0, 0, 0, 0, wid, hei);
|
|
|
|
// We use an extra PictOpInReverse operation to get correct pixel
|
|
|
|
// alpha. There could be a better solution.
|
|
|
|
if (WMODE_ARGB == w->mode)
|
|
|
|
XRenderComposite(ps->dpy, PictOpInReverse, pict, None,
|
|
|
|
newpict, 0, 0, 0, 0, 0, 0, wid, hei);
|
|
|
|
pict = newpict;
|
|
|
|
}
|
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
double dopacity = get_opacity_percent(w);;
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
if (!w->frame_opacity) {
|
2013-04-06 20:21:38 +08:00
|
|
|
win_render(ps, w, 0, 0, wid, hei, dopacity, reg_paint, pcache_reg, pict);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
else {
|
2013-01-09 20:25:01 +08:00
|
|
|
// Painting parameters
|
|
|
|
const int t = w->a.border_width + w->top_width;
|
|
|
|
const int l = w->a.border_width + w->left_width;
|
|
|
|
const int b = w->a.border_width + w->bottom_width;
|
|
|
|
const int r = w->a.border_width + w->right_width;
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-01 19:03:56 +08:00
|
|
|
#define COMP_BDR(cx, cy, cwid, chei) \
|
2013-03-15 23:16:23 +08:00
|
|
|
win_render(ps, w, (cx), (cy), (cwid), (chei), w->frame_opacity, \
|
2013-04-06 20:21:38 +08:00
|
|
|
reg_paint, pcache_reg, pict)
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-06 11:32:02 +08:00
|
|
|
// The following complicated logic is required because some broken
|
2012-11-01 19:03:56 +08:00
|
|
|
// window managers (I'm talking about you, Openbox!) that makes
|
|
|
|
// top_width + bottom_width > height in some cases.
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-01 19:03:56 +08:00
|
|
|
// top
|
2012-11-06 11:32:02 +08:00
|
|
|
int phei = min_i(t, hei);
|
|
|
|
if (phei > 0)
|
|
|
|
COMP_BDR(0, 0, wid, phei);
|
2012-11-01 19:03:56 +08:00
|
|
|
|
|
|
|
if (hei > t) {
|
2012-11-06 11:32:02 +08:00
|
|
|
phei = min_i(hei - t, b);
|
2012-11-01 19:03:56 +08:00
|
|
|
|
|
|
|
// bottom
|
2012-11-06 11:32:02 +08:00
|
|
|
if (phei > 0)
|
2012-11-01 19:03:56 +08:00
|
|
|
COMP_BDR(0, hei - phei, wid, phei);
|
|
|
|
|
2012-11-06 11:32:02 +08:00
|
|
|
phei = hei - t - phei;
|
|
|
|
if (phei > 0) {
|
|
|
|
int pwid = min_i(l, wid);
|
|
|
|
// left
|
|
|
|
if (pwid > 0)
|
|
|
|
COMP_BDR(0, t, pwid, phei);
|
|
|
|
|
|
|
|
if (wid > l) {
|
|
|
|
pwid = min_i(wid - l, r);
|
|
|
|
|
|
|
|
// right
|
|
|
|
if (pwid > 0)
|
|
|
|
COMP_BDR(wid - pwid, t, pwid, phei);
|
|
|
|
|
|
|
|
pwid = wid - l - pwid;
|
|
|
|
if (pwid > 0) {
|
|
|
|
// body
|
2013-04-06 20:21:38 +08:00
|
|
|
win_render(ps, w, l, t, pwid, phei, dopacity, reg_paint, pcache_reg, pict);
|
2012-11-01 19:03:56 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
|
2012-11-01 19:03:56 +08:00
|
|
|
#undef COMP_BDR
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
if (pict != w->paint.pict)
|
2013-01-12 22:21:35 +08:00
|
|
|
free_picture(ps, &pict);
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Dimming the window if needed
|
2013-03-25 11:36:39 +08:00
|
|
|
if (w->dim) {
|
|
|
|
double dim_opacity = ps->o.inactive_dim;
|
|
|
|
if (!ps->o.inactive_dim_fixed)
|
|
|
|
dim_opacity *= get_opacity_percent(w);
|
|
|
|
|
|
|
|
switch (ps->o.backend) {
|
|
|
|
case BKEND_XRENDER:
|
|
|
|
{
|
|
|
|
unsigned short cval = 0xffff * dim_opacity;
|
|
|
|
|
|
|
|
// Premultiply color
|
|
|
|
XRenderColor color = {
|
|
|
|
.red = 0, .green = 0, .blue = 0, .alpha = cval,
|
|
|
|
};
|
|
|
|
|
|
|
|
XRectangle rect = {
|
|
|
|
.x = x,
|
|
|
|
.y = y,
|
|
|
|
.width = wid,
|
|
|
|
.height = hei,
|
|
|
|
};
|
|
|
|
|
|
|
|
XRenderFillRectangles(ps->dpy, PictOpOver, ps->tgt_buffer, &color,
|
|
|
|
&rect, 1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
case BKEND_GLX:
|
2013-04-06 20:21:38 +08:00
|
|
|
glx_dim_dst(ps, x, y, wid, hei, ps->glx_z - 0.7, dim_opacity,
|
|
|
|
reg_paint, pcache_reg);
|
2013-03-25 11:36:39 +08:00
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
2013-05-12 18:21:16 +08:00
|
|
|
|
|
|
|
glx_mark(ps, w->id, false);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
|
2012-11-03 10:30:32 +08:00
|
|
|
/**
|
|
|
|
* Rebuild cached <code>screen_reg</code>.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
rebuild_screen_reg(session_t *ps) {
|
|
|
|
if (ps->screen_reg)
|
|
|
|
XFixesDestroyRegion(ps->dpy, ps->screen_reg);
|
|
|
|
ps->screen_reg = get_screen_region(ps);
|
2012-11-03 10:30:32 +08:00
|
|
|
}
|
|
|
|
|
2013-06-09 17:06:35 +08:00
|
|
|
/**
|
|
|
|
* Rebuild <code>shadow_exclude_reg</code>.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
rebuild_shadow_exclude_reg(session_t *ps) {
|
|
|
|
free_region(ps, &ps->shadow_exclude_reg);
|
|
|
|
XRectangle rect = geom_to_rect(ps, &ps->o.shadow_exclude_reg_geom, NULL);
|
|
|
|
ps->shadow_exclude_reg = rect_to_reg(ps, &rect);
|
|
|
|
}
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
static void
|
2013-04-27 17:34:42 +08:00
|
|
|
paint_all(session_t *ps, XserverRegion region, XserverRegion region_real, win *t) {
|
|
|
|
if (!region_real)
|
|
|
|
region_real = region;
|
|
|
|
|
2012-10-26 11:12:28 +08:00
|
|
|
#ifdef DEBUG_REPAINT
|
|
|
|
static struct timespec last_paint = { 0 };
|
|
|
|
#endif
|
2012-10-21 20:44:24 +08:00
|
|
|
XserverRegion reg_paint = None, reg_tmp = None, reg_tmp2 = None;
|
2012-09-19 20:49:16 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (BKEND_GLX == ps->o.backend) {
|
2013-03-19 20:58:55 +08:00
|
|
|
glx_paint_pre(ps, ®ion);
|
2013-03-15 23:16:23 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
if (!region) {
|
2013-04-27 20:43:39 +08:00
|
|
|
region_real = region = get_screen_region(ps);
|
2012-09-19 20:49:16 +08:00
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
else {
|
|
|
|
// Remove the damaged area out of screen
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, region, region, ps->screen_reg);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
2012-09-19 20:49:16 +08:00
|
|
|
|
|
|
|
#ifdef MONITOR_REPAINT
|
2012-10-23 13:42:20 +08:00
|
|
|
// Note: MONITOR_REPAINT cannot work with DBE right now.
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->tgt_buffer = ps->tgt_picture;
|
2012-09-19 20:49:16 +08:00
|
|
|
#else
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->tgt_buffer) {
|
2012-10-23 13:42:20 +08:00
|
|
|
// DBE painting mode: Directly paint to a Picture of the back buffer
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.dbe) {
|
|
|
|
ps->tgt_buffer = XRenderCreatePicture(ps->dpy, ps->root_dbe,
|
|
|
|
XRenderFindVisualFormat(ps->dpy, ps->vis),
|
2012-10-23 13:42:20 +08:00
|
|
|
0, 0);
|
|
|
|
}
|
|
|
|
// No-DBE painting mode: Paint to an intermediate Picture then paint
|
|
|
|
// the Picture to root window
|
|
|
|
else {
|
|
|
|
Pixmap root_pixmap = XCreatePixmap(
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->dpy, ps->root, ps->root_width, ps->root_height,
|
|
|
|
ps->depth);
|
2012-09-19 20:49:16 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->tgt_buffer = XRenderCreatePicture(ps->dpy, root_pixmap,
|
|
|
|
XRenderFindVisualFormat(ps->dpy, ps->vis),
|
2012-10-23 13:42:20 +08:00
|
|
|
0, 0);
|
2012-09-19 20:49:16 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XFreePixmap(ps->dpy, root_pixmap);
|
2012-10-23 13:42:20 +08:00
|
|
|
}
|
2012-09-19 20:49:16 +08:00
|
|
|
}
|
2003-11-24 07:20:42 +08:00
|
|
|
#endif
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-04-27 17:34:42 +08:00
|
|
|
if (BKEND_XRENDER == ps->o.backend)
|
|
|
|
XFixesSetPictureClipRegion(ps->dpy, ps->tgt_picture, 0, 0, region_real);
|
2012-09-19 20:49:16 +08:00
|
|
|
|
|
|
|
#ifdef MONITOR_REPAINT
|
2013-04-25 22:23:35 +08:00
|
|
|
switch (ps->o.backend) {
|
|
|
|
case BKEND_XRENDER:
|
|
|
|
XRenderComposite(ps->dpy, PictOpSrc, ps->black_picture, None,
|
|
|
|
ps->tgt_picture, 0, 0, 0, 0, 0, 0,
|
|
|
|
ps->root_width, ps->root_height);
|
|
|
|
break;
|
|
|
|
case BKEND_GLX:
|
|
|
|
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
break;
|
|
|
|
}
|
2012-09-19 20:49:16 +08:00
|
|
|
#endif
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
if (t && t->reg_ignore) {
|
|
|
|
// Calculate the region upon which the root window is to be painted
|
|
|
|
// based on the ignore region of the lowest window, if available
|
2012-11-19 09:46:07 +08:00
|
|
|
reg_paint = reg_tmp = XFixesCreateRegion(ps->dpy, NULL, 0);
|
|
|
|
XFixesSubtractRegion(ps->dpy, reg_paint, region, t->reg_ignore);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
reg_paint = region;
|
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-04-06 20:21:38 +08:00
|
|
|
set_tgt_clip(ps, reg_paint, NULL);
|
2013-03-15 23:16:23 +08:00
|
|
|
paint_root(ps, reg_paint);
|
2012-09-17 16:04:04 +08:00
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Create temporary regions for use during painting
|
|
|
|
if (!reg_tmp)
|
2012-11-19 09:46:07 +08:00
|
|
|
reg_tmp = XFixesCreateRegion(ps->dpy, NULL, 0);
|
|
|
|
reg_tmp2 = XFixesCreateRegion(ps->dpy, NULL, 0);
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
for (win *w = t; w; w = w->prev_trans) {
|
2012-09-17 16:04:04 +08:00
|
|
|
// Painting shadow
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
if (w->shadow) {
|
2013-09-12 21:23:20 +08:00
|
|
|
// Lazy shadow building
|
|
|
|
if (!paint_isvalid(ps, &w->shadow_paint))
|
|
|
|
win_build_shadow(ps, w, 1);
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Shadow is to be painted based on the ignore region of current
|
|
|
|
// window
|
|
|
|
if (w->reg_ignore) {
|
|
|
|
if (w == t) {
|
|
|
|
// If it's the first cycle and reg_tmp2 is not ready, calculate
|
|
|
|
// the paint region here
|
|
|
|
reg_paint = reg_tmp;
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesSubtractRegion(ps->dpy, reg_paint, region, w->reg_ignore);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
// Otherwise, used the cached region during last cycle
|
|
|
|
reg_paint = reg_tmp2;
|
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, reg_paint, reg_paint, w->extents);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
else {
|
2012-10-28 17:02:07 +08:00
|
|
|
reg_paint = reg_tmp;
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, reg_paint, region, w->extents);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
2013-03-17 12:14:00 +08:00
|
|
|
|
2013-06-09 17:06:35 +08:00
|
|
|
if (ps->shadow_exclude_reg)
|
|
|
|
XFixesSubtractRegion(ps->dpy, reg_paint, reg_paint,
|
|
|
|
ps->shadow_exclude_reg);
|
|
|
|
|
2013-03-17 12:14:00 +08:00
|
|
|
// Might be worthwhile to crop the region to shadow border
|
|
|
|
{
|
|
|
|
XRectangle rec_shadow_border = {
|
|
|
|
.x = w->a.x + w->shadow_dx,
|
|
|
|
.y = w->a.y + w->shadow_dy,
|
|
|
|
.width = w->shadow_width,
|
|
|
|
.height = w->shadow_height
|
|
|
|
};
|
|
|
|
XserverRegion reg_shadow = XFixesCreateRegion(ps->dpy,
|
|
|
|
&rec_shadow_border, 1);
|
|
|
|
XFixesIntersectRegion(ps->dpy, reg_paint, reg_paint, reg_shadow);
|
|
|
|
free_region(ps, ®_shadow);
|
|
|
|
}
|
|
|
|
|
2012-10-28 17:02:07 +08:00
|
|
|
// Clear the shadow here instead of in make_shadow() for saving GPU
|
|
|
|
// power and handling shaped windows
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.clear_shadow && w->border_size)
|
|
|
|
XFixesSubtractRegion(ps->dpy, reg_paint, reg_paint, w->border_size);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-08-22 21:15:04 +08:00
|
|
|
#ifdef CONFIG_XINERAMA
|
|
|
|
if (ps->o.xinerama_shadow_crop && w->xinerama_scr >= 0)
|
|
|
|
XFixesIntersectRegion(ps->dpy, reg_paint, reg_paint,
|
|
|
|
ps->xinerama_scr_regs[w->xinerama_scr]);
|
|
|
|
#endif
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Detect if the region is empty before painting
|
2013-04-05 21:05:19 +08:00
|
|
|
{
|
2013-04-06 20:21:38 +08:00
|
|
|
reg_data_t cache_reg = REG_DATA_INIT;
|
2013-04-05 21:05:19 +08:00
|
|
|
if (region == reg_paint
|
2013-04-06 20:21:38 +08:00
|
|
|
|| !is_region_empty(ps, reg_paint, &cache_reg)) {
|
|
|
|
set_tgt_clip(ps, reg_paint, &cache_reg);
|
2011-11-04 17:18:10 +08:00
|
|
|
|
2013-04-06 20:21:38 +08:00
|
|
|
win_paint_shadow(ps, w, reg_paint, &cache_reg);
|
2013-04-05 21:05:19 +08:00
|
|
|
}
|
2013-04-06 20:21:38 +08:00
|
|
|
free_reg_data(&cache_reg);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
|
|
|
}
|
2011-11-04 17:18:10 +08:00
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Calculate the region based on the reg_ignore of the next (higher)
|
|
|
|
// window and the bounding region
|
|
|
|
reg_paint = reg_tmp;
|
|
|
|
if (w->prev_trans && w->prev_trans->reg_ignore) {
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesSubtractRegion(ps->dpy, reg_paint, region,
|
2012-10-21 20:44:24 +08:00
|
|
|
w->prev_trans->reg_ignore);
|
|
|
|
// Copy the subtracted region to be used for shadow painting in next
|
|
|
|
// cycle
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesCopyRegion(ps->dpy, reg_tmp2, reg_paint);
|
2012-11-01 10:43:15 +08:00
|
|
|
|
|
|
|
if (w->border_size)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, reg_paint, reg_paint, w->border_size);
|
2012-09-17 16:04:04 +08:00
|
|
|
}
|
|
|
|
else {
|
2012-11-01 10:43:15 +08:00
|
|
|
if (w->border_size)
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesIntersectRegion(ps->dpy, reg_paint, region, w->border_size);
|
2012-11-01 10:43:15 +08:00
|
|
|
else
|
|
|
|
reg_paint = region;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 17:18:10 +08:00
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
{
|
2013-04-06 20:21:38 +08:00
|
|
|
reg_data_t cache_reg = REG_DATA_INIT;
|
|
|
|
if (!is_region_empty(ps, reg_paint, &cache_reg)) {
|
|
|
|
set_tgt_clip(ps, reg_paint, &cache_reg);
|
2013-04-05 21:05:19 +08:00
|
|
|
// Blur window background
|
|
|
|
if (w->blur_background && (WMODE_SOLID != w->mode
|
|
|
|
|| (ps->o.blur_background_frame && w->frame_opacity))) {
|
2013-04-06 20:21:38 +08:00
|
|
|
win_blur_background(ps, w, ps->tgt_buffer, reg_paint, &cache_reg);
|
2013-04-05 21:05:19 +08:00
|
|
|
}
|
2012-09-17 16:04:04 +08:00
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
// Painting the window
|
2013-04-06 20:21:38 +08:00
|
|
|
win_paint_win(ps, w, reg_paint, &cache_reg);
|
2013-04-05 21:05:19 +08:00
|
|
|
}
|
2013-04-06 20:21:38 +08:00
|
|
|
free_reg_data(&cache_reg);
|
2012-10-21 20:44:24 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Free up all temporary regions
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesDestroyRegion(ps->dpy, reg_tmp);
|
|
|
|
XFixesDestroyRegion(ps->dpy, reg_tmp2);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-10-27 21:46:01 +08:00
|
|
|
// Do this as early as possible
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->o.dbe)
|
2013-04-06 20:21:38 +08:00
|
|
|
set_tgt_clip(ps, None, NULL);
|
2012-10-27 21:46:01 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
if (ps->o.vsync) {
|
2012-11-01 10:43:15 +08:00
|
|
|
// Make sure all previous requests are processed to achieve best
|
|
|
|
// effect
|
2012-11-19 09:46:07 +08:00
|
|
|
XSync(ps->dpy, False);
|
2013-01-30 13:41:08 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (ps->glx_context) {
|
|
|
|
glFlush();
|
|
|
|
glXWaitX();
|
|
|
|
}
|
|
|
|
#endif
|
2012-11-01 10:43:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Wait for VBlank. We could do it aggressively (send the painting
|
|
|
|
// request and XFlush() on VBlank) or conservatively (send the request
|
|
|
|
// only on VBlank).
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->o.vsync_aggressive)
|
|
|
|
vsync_wait(ps);
|
2012-10-26 11:12:28 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
switch (ps->o.backend) {
|
|
|
|
case BKEND_XRENDER:
|
|
|
|
// DBE painting mode, only need to swap the buffer
|
|
|
|
if (ps->o.dbe) {
|
|
|
|
XdbeSwapInfo swap_info = {
|
|
|
|
.swap_window = get_tgt_window(ps),
|
|
|
|
// Is it safe to use XdbeUndefined?
|
|
|
|
.swap_action = XdbeCopied
|
|
|
|
};
|
|
|
|
XdbeSwapBuffers(ps->dpy, &swap_info, 1);
|
|
|
|
}
|
|
|
|
// No-DBE painting mode
|
|
|
|
else if (ps->tgt_buffer != ps->tgt_picture) {
|
|
|
|
XRenderComposite(
|
|
|
|
ps->dpy, PictOpSrc, ps->tgt_buffer, None,
|
|
|
|
ps->tgt_picture, 0, 0, 0, 0,
|
|
|
|
0, 0, ps->root_width, ps->root_height);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
case BKEND_GLX:
|
2013-03-21 13:05:56 +08:00
|
|
|
if (ps->o.glx_use_copysubbuffermesa)
|
2013-04-27 17:34:42 +08:00
|
|
|
glx_swap_copysubbuffermesa(ps, region_real);
|
2013-03-21 13:05:56 +08:00
|
|
|
else
|
|
|
|
glXSwapBuffers(ps->dpy, get_tgt_window(ps));
|
2013-03-15 23:16:23 +08:00
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
assert(0);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2013-05-12 18:21:16 +08:00
|
|
|
glx_mark_frame(ps);
|
2012-10-26 11:12:28 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.vsync_aggressive)
|
|
|
|
vsync_wait(ps);
|
2012-11-01 10:43:15 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XFlush(ps->dpy);
|
2012-10-26 11:12:28 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (ps->glx_context) {
|
|
|
|
glFlush();
|
|
|
|
glXWaitX();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2013-03-21 13:05:56 +08:00
|
|
|
XFixesDestroyRegion(ps->dpy, region);
|
|
|
|
|
2012-10-26 11:12:28 +08:00
|
|
|
#ifdef DEBUG_REPAINT
|
2012-11-19 09:46:07 +08:00
|
|
|
print_timestamp(ps);
|
2012-10-26 11:12:28 +08:00
|
|
|
struct timespec now = get_time_timespec();
|
|
|
|
struct timespec diff = { 0 };
|
|
|
|
timespec_subtract(&diff, &now, &last_paint);
|
|
|
|
printf("[ %5ld:%09ld ] ", diff.tv_sec, diff.tv_nsec);
|
|
|
|
last_paint = now;
|
2012-10-30 18:11:30 +08:00
|
|
|
printf("paint:");
|
2013-09-04 22:00:51 +08:00
|
|
|
for (win *w = t; w; w = w->prev_trans)
|
2012-10-30 18:11:30 +08:00
|
|
|
printf(" %#010lx", w->id);
|
|
|
|
putchar('\n');
|
2012-10-26 11:12:28 +08:00
|
|
|
fflush(stdout);
|
|
|
|
#endif
|
2013-03-15 23:16:23 +08:00
|
|
|
|
|
|
|
// Check if fading is finished on all painted windows
|
|
|
|
{
|
|
|
|
win *pprev = NULL;
|
2013-09-04 22:00:51 +08:00
|
|
|
for (win *w = t; w; w = pprev) {
|
2013-03-15 23:16:23 +08:00
|
|
|
pprev = w->prev_trans;
|
|
|
|
check_fade_fin(ps, w);
|
|
|
|
}
|
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage(session_t *ps, XserverRegion damage) {
|
2013-09-04 22:00:51 +08:00
|
|
|
// Ignore damage when screen isn't redirected
|
|
|
|
if (!ps->redirected)
|
|
|
|
free_region(ps, &damage);
|
|
|
|
|
|
|
|
if (!damage) return;
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->all_damage) {
|
|
|
|
XFixesUnionRegion(ps->dpy, ps->all_damage, ps->all_damage, damage);
|
|
|
|
XFixesDestroyRegion(ps->dpy, damage);
|
2011-11-04 16:41:56 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->all_damage = damage;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
repair_win(session_t *ps, win *w) {
|
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 20:20:27 +08:00
|
|
|
if (IsViewable != w->a.map_state)
|
|
|
|
return;
|
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
XserverRegion parts;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
if (!w->damaged) {
|
2012-11-19 09:46:07 +08:00
|
|
|
parts = win_extents(ps, w);
|
|
|
|
set_ignore_next(ps);
|
|
|
|
XDamageSubtract(ps->dpy, w->damage, None, None);
|
2011-11-04 14:33:23 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
parts = XFixesCreateRegion(ps->dpy, 0, 0);
|
|
|
|
set_ignore_next(ps);
|
|
|
|
XDamageSubtract(ps->dpy, w->damage, None, parts);
|
|
|
|
XFixesTranslateRegion(ps->dpy, parts,
|
2011-11-04 16:41:56 +08:00
|
|
|
w->a.x + w->a.border_width,
|
|
|
|
w->a.y + w->a.border_width);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
w->damaged = true;
|
|
|
|
w->pixmap_damaged = true;
|
|
|
|
|
|
|
|
// Why care about damage when screen is unredirected?
|
|
|
|
// We will force full-screen repaint on redirection.
|
|
|
|
if (!ps->redirected) return;
|
|
|
|
|
2012-10-21 20:44:24 +08:00
|
|
|
// Remove the part in the damage area that could be ignored
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->reg_ignore_expire && w->prev_trans && w->prev_trans->reg_ignore)
|
|
|
|
XFixesSubtractRegion(ps->dpy, parts, parts, w->prev_trans->reg_ignore);
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage(ps, parts);
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
static wintype_t
|
|
|
|
wid_get_prop_wintype(session_t *ps, Window wid) {
|
|
|
|
set_ignore_next(ps);
|
|
|
|
winprop_t prop = wid_get_prop(ps, wid, ps->atom_win_type, 32L, XA_ATOM, 32);
|
|
|
|
|
2013-01-29 09:57:04 +08:00
|
|
|
for (unsigned i = 0; i < prop.nitems; ++i) {
|
2012-11-28 11:44:00 +08:00
|
|
|
for (wintype_t j = 1; j < NUM_WINTYPES; ++j) {
|
2012-11-21 09:15:49 +08:00
|
|
|
if (ps->atoms_wintypes[j] == (Atom) prop.data.p32[i]) {
|
2012-11-19 09:46:07 +08:00
|
|
|
free_winprop(&prop);
|
2012-09-22 20:49:17 +08:00
|
|
|
return j;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
|
|
|
}
|
2012-09-22 20:49:17 +08:00
|
|
|
}
|
2008-02-15 12:38:32 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
free_winprop(&prop);
|
2008-02-15 12:38:32 +08:00
|
|
|
|
2012-09-22 20:49:17 +08:00
|
|
|
return WINTYPE_UNKNOWN;
|
2008-02-15 12:38:32 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-21 09:15:49 +08:00
|
|
|
map_win(session_t *ps, Window id) {
|
2013-09-12 21:23:20 +08:00
|
|
|
// Unmap overlay window if it got mapped but we are currently not
|
|
|
|
// in redirected state.
|
|
|
|
if (ps->overlay && id == ps->overlay && !ps->redirected) {
|
|
|
|
XUnmapWindow(ps->dpy, ps->overlay);
|
|
|
|
XFlush(ps->dpy);
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
win *w = find_win(ps, id);
|
2003-11-09 15:08:23 +08:00
|
|
|
|
2012-10-27 21:46:01 +08:00
|
|
|
// Don't care about window mapping if it's an InputOnly window
|
2012-12-07 22:38:10 +08:00
|
|
|
// Try avoiding mapping a window twice
|
|
|
|
if (!w || InputOnly == w->a.class
|
|
|
|
|| IsViewable == w->a.map_state)
|
|
|
|
return;
|
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
assert(!win_is_focused_real(ps, w));
|
2004-09-10 13:55:19 +08:00
|
|
|
|
2012-12-07 22:38:10 +08:00
|
|
|
w->a.map_state = IsViewable;
|
|
|
|
|
2013-08-22 21:15:04 +08:00
|
|
|
cxinerama_win_upd_scr(ps, w);
|
|
|
|
|
2012-09-18 11:28:09 +08:00
|
|
|
// Call XSelectInput() before reading properties so that no property
|
|
|
|
// changes are lost
|
2012-11-19 09:46:07 +08:00
|
|
|
XSelectInput(ps->dpy, id, determine_evmask(ps, id, WIN_EVMODE_FRAME));
|
2012-09-18 11:28:09 +08:00
|
|
|
|
|
|
|
// Notify compton when the shape of a window changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->shape_exists) {
|
|
|
|
XShapeSelectInput(ps->dpy, id, ShapeNotifyMask);
|
2012-09-18 11:28:09 +08:00
|
|
|
}
|
2012-09-14 11:51:46 +08:00
|
|
|
|
2012-12-05 12:43:34 +08:00
|
|
|
// Make sure the XSelectInput() requests are sent
|
|
|
|
XSync(ps->dpy, False);
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Update window mode here to check for ARGB windows
|
2013-03-10 18:45:54 +08:00
|
|
|
win_determine_mode(ps, w);
|
|
|
|
|
2012-09-18 11:28:09 +08:00
|
|
|
// Detect client window here instead of in add_win() as the client
|
|
|
|
// window should have been prepared at this point
|
2012-09-20 13:50:27 +08:00
|
|
|
if (!w->client_win) {
|
2012-12-07 22:38:10 +08:00
|
|
|
win_recheck_client(ps, w);
|
2012-02-27 12:00:12 +08:00
|
|
|
}
|
2012-11-10 11:41:01 +08:00
|
|
|
else {
|
|
|
|
// Re-mark client window here
|
2012-12-07 22:38:10 +08:00
|
|
|
win_mark_client(ps, w, w->client_win);
|
2012-09-20 13:50:27 +08:00
|
|
|
}
|
2011-11-05 01:02:17 +08:00
|
|
|
|
2012-12-05 12:43:34 +08:00
|
|
|
assert(w->client_win);
|
2012-10-21 21:19:00 +08:00
|
|
|
|
2012-09-22 20:49:17 +08:00
|
|
|
#ifdef DEBUG_WINTYPE
|
2012-12-05 12:43:34 +08:00
|
|
|
printf_dbgf("(%#010lx): type %s\n", w->id, WINTYPES[w->window_type]);
|
2012-09-22 20:49:17 +08:00
|
|
|
#endif
|
|
|
|
|
2012-10-01 10:34:40 +08:00
|
|
|
// Detect if the window is shaped or has rounded corners
|
2012-11-19 09:46:07 +08:00
|
|
|
win_update_shape_raw(ps, w);
|
2012-10-01 10:34:40 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
// FocusIn/Out may be ignored when the window is unmapped, so we must
|
|
|
|
// recheck focus here
|
|
|
|
if (ps->o.track_focus)
|
2012-11-28 11:44:00 +08:00
|
|
|
recheck_focus(ps);
|
2012-09-12 11:06:16 +08:00
|
|
|
|
2012-11-28 11:44:00 +08:00
|
|
|
// Update window focus state
|
|
|
|
win_update_focused(ps, w);
|
|
|
|
|
|
|
|
// Update opacity and dim state
|
|
|
|
win_update_opacity_prop(ps, w);
|
|
|
|
w->flags |= WFLAG_OPCT_CHANGE;
|
|
|
|
|
2012-11-09 11:35:40 +08:00
|
|
|
// Check for _COMPTON_SHADOW
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.respect_prop_shadow)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
win_update_prop_shadow_raw(ps, w);
|
2012-11-09 11:35:40 +08:00
|
|
|
|
|
|
|
// Many things above could affect shadow
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_shadow(ps, w);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-10-01 10:34:40 +08:00
|
|
|
// Set fading state
|
2013-05-20 18:04:40 +08:00
|
|
|
w->in_openclose = true;
|
|
|
|
set_fade_callback(ps, w, finish_map_win, true);
|
2013-01-13 13:44:05 +08:00
|
|
|
win_determine_fade(ps, w);
|
2008-02-15 13:55:17 +08:00
|
|
|
|
2013-03-23 22:06:41 +08:00
|
|
|
win_determine_blur_background(ps, w);
|
|
|
|
|
2013-01-31 22:53:44 +08:00
|
|
|
w->damaged = false;
|
2004-09-10 13:55:19 +08:00
|
|
|
|
2011-11-04 17:18:10 +08:00
|
|
|
/* if any configure events happened while
|
|
|
|
the window was unmapped, then configure
|
|
|
|
the window to its correct place */
|
2011-11-04 16:41:56 +08:00
|
|
|
if (w->need_configure) {
|
2012-11-19 09:46:07 +08:00
|
|
|
configure_win(ps, &w->queue_configure);
|
2011-11-04 16:41:56 +08: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 20:20:27 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
// Send D-Bus signal
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
cdbus_ev_win_mapped(ps, w);
|
|
|
|
}
|
|
|
|
#endif
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-09-26 21:40:48 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
finish_map_win(session_t *ps, win *w) {
|
2013-01-13 13:44:05 +08:00
|
|
|
w->in_openclose = false;
|
|
|
|
if (ps->o.no_fading_openclose) {
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_fade(ps, w);
|
2013-01-13 13:44:05 +08:00
|
|
|
}
|
2012-09-26 21:40:48 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
finish_unmap_win(session_t *ps, win *w) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
w->damaged = false;
|
2012-10-31 08:54:09 +08:00
|
|
|
|
2013-01-13 13:44:05 +08:00
|
|
|
w->in_openclose = false;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
update_reg_ignore_expire(ps, w);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
if (w->extents != None) {
|
2012-02-27 12:00:12 +08:00
|
|
|
/* destroys region */
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage(ps, w->extents);
|
2011-11-04 14:33:23 +08:00
|
|
|
w->extents = None;
|
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
free_paint(ps, &w->paint);
|
2012-11-19 09:46:07 +08:00
|
|
|
free_region(ps, &w->border_size);
|
2013-03-15 23:16:23 +08:00
|
|
|
free_paint(ps, &w->shadow_paint);
|
2003-11-25 01:11:00 +08:00
|
|
|
}
|
|
|
|
|
2004-07-08 15:07:26 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
unmap_callback(session_t *ps, win *w) {
|
|
|
|
finish_unmap_win(ps, w);
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
2003-11-25 01:11:00 +08:00
|
|
|
|
2004-07-08 15:07:26 +08:00
|
|
|
static void
|
2013-01-29 09:57:04 +08:00
|
|
|
unmap_win(session_t *ps, win *w) {
|
2012-11-09 21:44:02 +08:00
|
|
|
if (!w || IsUnmapped == w->a.map_state) return;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-12-05 18:12:21 +08:00
|
|
|
// Set focus out
|
|
|
|
win_set_focused(ps, w, false);
|
|
|
|
|
2012-12-07 22:38:10 +08:00
|
|
|
w->a.map_state = IsUnmapped;
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
// Fading out
|
2012-11-28 11:44:00 +08:00
|
|
|
w->flags |= WFLAG_OPCT_CHANGE;
|
2012-11-19 09:46:07 +08:00
|
|
|
set_fade_callback(ps, w, unmap_callback, false);
|
2013-05-20 18:04:40 +08:00
|
|
|
w->in_openclose = true;
|
2013-01-29 09:57:04 +08:00
|
|
|
win_determine_fade(ps, w);
|
|
|
|
|
|
|
|
// Validate pixmap if we have to do fading
|
|
|
|
if (w->fade)
|
|
|
|
win_validate_pixmap(ps, w);
|
2012-09-19 20:49:16 +08:00
|
|
|
|
2012-09-17 16:04:04 +08:00
|
|
|
// don't care about properties anymore
|
2012-11-19 09:46:07 +08:00
|
|
|
win_ev_stop(ps, w);
|
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 20:20:27 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
// Send D-Bus signal
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
cdbus_ev_win_unmapped(ps, w);
|
|
|
|
}
|
|
|
|
#endif
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
2003-11-25 01:11:00 +08:00
|
|
|
|
2012-09-13 13:58:05 +08:00
|
|
|
static opacity_t
|
2012-11-19 09:46:07 +08:00
|
|
|
wid_get_opacity_prop(session_t *ps, Window wid, opacity_t def) {
|
|
|
|
opacity_t val = def;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
winprop_t prop = wid_get_prop(ps, wid, ps->atom_opacity, 1L,
|
|
|
|
XA_CARDINAL, 32);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (prop.nitems)
|
2012-11-21 09:15:49 +08:00
|
|
|
val = *prop.data.p32;
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
free_winprop(&prop);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return val;
|
2003-11-25 01:11:00 +08:00
|
|
|
}
|
|
|
|
|
2004-09-10 13:55:19 +08:00
|
|
|
static double
|
2012-11-19 09:46:07 +08:00
|
|
|
get_opacity_percent(win *w) {
|
2012-09-16 23:12:02 +08:00
|
|
|
return ((double) w->opacity) / OPAQUE;
|
2004-09-10 13:55:19 +08:00
|
|
|
}
|
|
|
|
|
2004-07-08 15:07:26 +08:00
|
|
|
static void
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_mode(session_t *ps, win *w) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
winmode_t mode = WMODE_SOLID;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
if (w->pictfmt && w->pictfmt->type == PictTypeDirect
|
|
|
|
&& w->pictfmt->direct.alphaMask) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
mode = WMODE_ARGB;
|
2011-11-04 14:33:23 +08:00
|
|
|
} else if (w->opacity != OPAQUE) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
mode = WMODE_TRANS;
|
2011-11-04 14:33:23 +08:00
|
|
|
} else {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
mode = WMODE_SOLID;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
w->mode = mode;
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-09-11 22:22:58 +08:00
|
|
|
/**
|
|
|
|
* Calculate and set the opacity of a window.
|
|
|
|
*
|
2012-09-26 18:54:35 +08:00
|
|
|
* If window is inactive and inactive_opacity_override is set, the
|
2012-09-11 22:22:58 +08:00
|
|
|
* priority is: (Simulates the old behavior)
|
|
|
|
*
|
2012-09-26 18:54:35 +08:00
|
|
|
* inactive_opacity > _NET_WM_WINDOW_OPACITY (if not opaque)
|
2012-09-11 22:22:58 +08:00
|
|
|
* > window type default opacity
|
|
|
|
*
|
|
|
|
* Otherwise:
|
|
|
|
*
|
|
|
|
* _NET_WM_WINDOW_OPACITY (if not opaque)
|
|
|
|
* > window type default opacity (if not opaque)
|
2012-09-26 18:54:35 +08:00
|
|
|
* > inactive_opacity
|
2012-09-11 22:22:58 +08:00
|
|
|
*
|
2013-01-24 13:38:03 +08:00
|
|
|
* @param ps current session
|
2012-09-11 22:22:58 +08:00
|
|
|
* @param w struct _win object representing the window
|
|
|
|
*/
|
2012-09-13 13:58:05 +08:00
|
|
|
static void
|
2012-11-28 11:44:00 +08:00
|
|
|
calc_opacity(session_t *ps, win *w) {
|
|
|
|
opacity_t opacity = OPAQUE;
|
2012-09-11 22:22:58 +08:00
|
|
|
|
2012-11-28 11:44:00 +08:00
|
|
|
if (w->destroyed || IsViewable != w->a.map_state)
|
|
|
|
opacity = 0;
|
|
|
|
else {
|
|
|
|
// Try obeying opacity property and window type opacity firstly
|
|
|
|
if (OPAQUE == (opacity = w->opacity_prop)
|
|
|
|
&& OPAQUE == (opacity = w->opacity_prop_client)) {
|
|
|
|
opacity = ps->o.wintype_opacity[w->window_type] * OPAQUE;
|
|
|
|
}
|
2012-09-13 13:39:43 +08:00
|
|
|
|
2012-11-28 11:44:00 +08:00
|
|
|
// Respect inactive_opacity in some cases
|
2012-12-10 10:31:24 +08:00
|
|
|
if (ps->o.inactive_opacity && false == w->focused
|
2012-11-28 11:44:00 +08:00
|
|
|
&& (OPAQUE == opacity || ps->o.inactive_opacity_override)) {
|
|
|
|
opacity = ps->o.inactive_opacity;
|
|
|
|
}
|
2013-03-30 11:46:32 +08:00
|
|
|
|
|
|
|
// Respect active_opacity only when the window is physically focused
|
2013-09-18 21:50:57 +08:00
|
|
|
if (OPAQUE == opacity && ps->o.active_opacity && win_is_focused_real(ps, w))
|
2013-03-30 11:46:32 +08:00
|
|
|
opacity = ps->o.active_opacity;
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-09-11 22:22:58 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
w->opacity_tgt = opacity;
|
2012-09-11 22:22:58 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Determine whether a window is to be dimmed.
|
|
|
|
*/
|
2012-09-13 13:58:05 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
calc_dim(session_t *ps, win *w) {
|
|
|
|
bool dim;
|
2012-09-12 10:52:52 +08:00
|
|
|
|
2012-11-28 11:44:00 +08:00
|
|
|
// Make sure we do nothing if the window is unmapped / destroyed
|
|
|
|
if (w->destroyed || IsViewable != w->a.map_state)
|
|
|
|
return;
|
|
|
|
|
2012-12-10 10:31:24 +08:00
|
|
|
if (ps->o.inactive_dim && !(w->focused)) {
|
2012-11-19 09:46:07 +08:00
|
|
|
dim = true;
|
2012-09-13 13:58:05 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
dim = false;
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-09-12 10:52:52 +08:00
|
|
|
|
|
|
|
if (dim != w->dim) {
|
|
|
|
w->dim = dim;
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage_win(ps, w);
|
2012-09-12 10:52:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-17 22:15:04 +08:00
|
|
|
/**
|
2012-09-19 20:49:16 +08:00
|
|
|
* Determine if a window should fade on opacity change.
|
|
|
|
*/
|
|
|
|
static void
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_fade(session_t *ps, win *w) {
|
2013-05-20 18:04:40 +08:00
|
|
|
if (UNSET != w->fade_force)
|
|
|
|
w->fade = w->fade_force;
|
|
|
|
else if ((ps->o.no_fading_openclose && w->in_openclose)
|
2013-04-21 22:30:22 +08:00
|
|
|
|| win_match(ps, w, ps->o.fade_blacklist, &w->cache_fblst))
|
2013-01-13 13:44:05 +08:00
|
|
|
w->fade = false;
|
|
|
|
else
|
|
|
|
w->fade = ps->o.wintype_fade[w->window_type];
|
2012-09-19 20:49:16 +08:00
|
|
|
}
|
|
|
|
|
2012-11-09 11:35:40 +08:00
|
|
|
/**
|
|
|
|
* Update window-shape.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
win_update_shape_raw(session_t *ps, win *w) {
|
|
|
|
if (ps->shape_exists) {
|
|
|
|
w->bounding_shaped = wid_bounding_shaped(ps, w->id);
|
|
|
|
if (w->bounding_shaped && ps->o.detect_rounded_corners)
|
|
|
|
win_rounded_corners(ps, w);
|
2012-11-09 11:35:40 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-28 17:02:07 +08:00
|
|
|
/**
|
|
|
|
* Update window-shape related information.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
win_update_shape(session_t *ps, win *w) {
|
|
|
|
if (ps->shape_exists) {
|
|
|
|
// bool bounding_shaped_old = w->bounding_shaped;
|
2012-10-28 17:02:07 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
win_update_shape_raw(ps, w);
|
2012-10-28 17:02:07 +08:00
|
|
|
|
|
|
|
// Shadow state could be changed
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_shadow(ps, w);
|
2012-10-28 17:02:07 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
// If clear_shadow state on the window possibly changed, destroy the old
|
|
|
|
// shadow_pict
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.clear_shadow && w->bounding_shaped != bounding_shaped_old)
|
2013-03-15 23:16:23 +08:00
|
|
|
free_paint(ps, &w->shadow_paint);
|
2012-10-28 17:02:07 +08:00
|
|
|
*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-09 11:35:40 +08:00
|
|
|
/**
|
|
|
|
* Reread _COMPTON_SHADOW property from a window.
|
|
|
|
*
|
|
|
|
* The property must be set on the outermost window, usually the WM frame.
|
|
|
|
*/
|
|
|
|
static void
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
win_update_prop_shadow_raw(session_t *ps, win *w) {
|
2012-11-19 09:46:07 +08:00
|
|
|
winprop_t prop = wid_get_prop(ps, w->id, ps->atom_compton_shadow, 1,
|
2012-11-09 11:35:40 +08:00
|
|
|
XA_CARDINAL, 32);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!prop.nitems) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
w->prop_shadow = -1;
|
2012-11-19 09:46:07 +08:00
|
|
|
}
|
|
|
|
else {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
w->prop_shadow = *prop.data.p32;
|
2012-11-09 11:35:40 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
free_winprop(&prop);
|
2012-11-09 11:35:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reread _COMPTON_SHADOW property from a window and update related
|
|
|
|
* things.
|
|
|
|
*/
|
|
|
|
static void
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
win_update_prop_shadow(session_t *ps, win *w) {
|
|
|
|
long attr_shadow_old = w->prop_shadow;
|
2012-11-09 11:35:40 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
win_update_prop_shadow_raw(ps, w);
|
2012-11-09 11:35:40 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (w->prop_shadow != attr_shadow_old)
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_shadow(ps, w);
|
2012-11-09 11:35:40 +08:00
|
|
|
}
|
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
/**
|
|
|
|
* Determine if a window should have shadow, and update things depending
|
|
|
|
* on shadow state.
|
2012-09-17 22:15:04 +08:00
|
|
|
*/
|
|
|
|
static void
|
2013-01-12 22:21:35 +08:00
|
|
|
win_determine_shadow(session_t *ps, win *w) {
|
2012-11-19 09:46:07 +08:00
|
|
|
bool shadow_old = w->shadow;
|
2012-09-19 20:49:16 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
w->shadow = (UNSET == w->shadow_force ?
|
|
|
|
(ps->o.wintype_shadow[w->window_type]
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
&& !win_match(ps, w, ps->o.shadow_blacklist, &w->cache_sblst)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
&& !(ps->o.shadow_ignore_shaped && w->bounding_shaped
|
|
|
|
&& !w->rounded_corners)
|
|
|
|
&& !(ps->o.respect_prop_shadow && 0 == w->prop_shadow))
|
|
|
|
: w->shadow_force);
|
2012-09-19 20:49:16 +08:00
|
|
|
|
|
|
|
// Window extents need update on shadow state change
|
|
|
|
if (w->shadow != shadow_old) {
|
|
|
|
// Shadow geometry currently doesn't change on shadow state change
|
2012-11-19 09:46:07 +08:00
|
|
|
// calc_shadow_geometry(ps, w);
|
2012-09-19 20:49:16 +08:00
|
|
|
if (w->extents) {
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
// Mark the old extents as damaged if the shadow is removed
|
|
|
|
if (!w->shadow)
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage(ps, w->extents);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
else
|
2012-11-19 09:46:07 +08:00
|
|
|
free_region(ps, &w->extents);
|
|
|
|
w->extents = win_extents(ps, w);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
// Mark the new extents as damaged if the shadow is added
|
|
|
|
if (w->shadow)
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage_win(ps, w);
|
2012-09-19 20:49:16 +08:00
|
|
|
}
|
|
|
|
}
|
2012-09-17 22:15:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-01-12 22:21:35 +08:00
|
|
|
* Determine if a window should have color inverted.
|
2012-09-17 22:15:04 +08:00
|
|
|
*/
|
2013-01-12 22:21:35 +08:00
|
|
|
static void
|
|
|
|
win_determine_invert_color(session_t *ps, win *w) {
|
2013-01-31 22:53:44 +08:00
|
|
|
// Do not change window invert color state when the window is unmapped,
|
|
|
|
// unless it comes from w->invert_color_force.
|
|
|
|
if (UNSET == w->invert_color_force && IsViewable != w->a.map_state)
|
|
|
|
return;
|
|
|
|
|
2013-01-12 22:21:35 +08:00
|
|
|
bool invert_color_old = w->invert_color;
|
|
|
|
|
|
|
|
if (UNSET != w->invert_color_force)
|
|
|
|
w->invert_color = w->invert_color_force;
|
|
|
|
else
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
w->invert_color = win_match(ps, w, ps->o.invert_color_list, &w->cache_ivclst);
|
2012-09-17 22:15:04 +08:00
|
|
|
|
2013-01-12 22:21:35 +08:00
|
|
|
if (w->invert_color != invert_color_old)
|
|
|
|
add_damage_win(ps, w);
|
|
|
|
}
|
|
|
|
|
2013-03-23 22:06:41 +08:00
|
|
|
/**
|
|
|
|
* Determine if a window should have background blurred.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_determine_blur_background(session_t *ps, win *w) {
|
|
|
|
bool blur_background_old = w->blur_background;
|
|
|
|
|
|
|
|
w->blur_background = ps->o.blur_background
|
|
|
|
&& !win_match(ps, w, ps->o.blur_background_blacklist, &w->cache_bbblst);
|
|
|
|
|
|
|
|
// Only consider window damaged if it's previously painted with background
|
|
|
|
// blurred
|
|
|
|
if (w->blur_background != blur_background_old && (WMODE_SOLID != w->mode
|
|
|
|
|| (ps->o.blur_background_frame && w->frame_opacity)))
|
|
|
|
add_damage_win(ps, w);
|
|
|
|
}
|
|
|
|
|
2013-05-21 09:18:41 +08:00
|
|
|
/**
|
|
|
|
* Update window opacity according to opacity rules.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_update_opacity_rule(session_t *ps, win *w) {
|
|
|
|
// If long is 32-bit, unfortunately there's no way could we express "unset",
|
|
|
|
// so we just entirely don't distinguish "unset" and OPAQUE
|
|
|
|
long opacity = OPAQUE;
|
|
|
|
void *val = NULL;
|
|
|
|
if (c2_matchd(ps, w, ps->o.opacity_rules, &w->cache_oparule, &val))
|
|
|
|
opacity = ((double) (long) val) / 100.0 * OPAQUE;
|
|
|
|
|
|
|
|
if (opacity == w->opacity_set)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (OPAQUE != opacity)
|
|
|
|
wid_set_opacity_prop(ps, w->id, opacity);
|
|
|
|
else if (OPAQUE != w->opacity_set)
|
|
|
|
wid_rm_opacity_prop(ps, w->id);
|
|
|
|
w->opacity_set = opacity;
|
|
|
|
}
|
|
|
|
|
2013-01-12 22:21:35 +08:00
|
|
|
/**
|
|
|
|
* Function to be called on window type changes.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_on_wtype_change(session_t *ps, win *w) {
|
|
|
|
win_determine_shadow(ps, w);
|
|
|
|
win_determine_fade(ps, w);
|
|
|
|
win_update_focused(ps, w);
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
if (ps->o.invert_color_list)
|
|
|
|
win_determine_invert_color(ps, w);
|
2013-05-21 09:18:41 +08:00
|
|
|
if (ps->o.opacity_rules)
|
|
|
|
win_update_opacity_rule(ps, w);
|
2013-01-12 22:21:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Function to be called on window data changes.
|
|
|
|
*/
|
|
|
|
static void
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
win_on_factor_change(session_t *ps, win *w) {
|
2013-01-12 22:21:35 +08:00
|
|
|
if (ps->o.shadow_blacklist)
|
|
|
|
win_determine_shadow(ps, w);
|
|
|
|
if (ps->o.fade_blacklist)
|
|
|
|
win_determine_fade(ps, w);
|
|
|
|
if (ps->o.invert_color_list)
|
|
|
|
win_determine_invert_color(ps, w);
|
|
|
|
if (ps->o.focus_blacklist)
|
|
|
|
win_update_focused(ps, w);
|
2013-03-23 22:06:41 +08:00
|
|
|
if (ps->o.blur_background_blacklist)
|
|
|
|
win_determine_blur_background(ps, w);
|
2013-05-21 09:18:41 +08:00
|
|
|
if (ps->o.opacity_rules)
|
|
|
|
win_update_opacity_rule(ps, w);
|
2013-06-19 19:36:48 +08:00
|
|
|
if (ps->o.paint_blacklist)
|
|
|
|
w->paint_excluded = win_match(ps, w, ps->o.paint_blacklist,
|
|
|
|
&w->cache_pblst);
|
2013-09-04 22:00:51 +08:00
|
|
|
if (ps->o.unredir_if_possible_blacklist)
|
|
|
|
w->unredir_if_possible_excluded = win_match(ps, w,
|
|
|
|
ps->o.unredir_if_possible_blacklist, &w->cache_uipblst);
|
2013-01-12 22:21:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process needed window updates.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_upd_run(session_t *ps, win *w, win_upd_t *pupd) {
|
|
|
|
if (pupd->shadow) {
|
|
|
|
win_determine_shadow(ps, w);
|
|
|
|
pupd->shadow = false;
|
|
|
|
}
|
|
|
|
if (pupd->fade) {
|
|
|
|
win_determine_fade(ps, w);
|
|
|
|
pupd->fade = false;
|
|
|
|
}
|
|
|
|
if (pupd->invert_color) {
|
|
|
|
win_determine_invert_color(ps, w);
|
|
|
|
pupd->invert_color = false;
|
|
|
|
}
|
|
|
|
if (pupd->focus) {
|
|
|
|
win_update_focused(ps, w);
|
|
|
|
pupd->focus = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update cache data in struct _win that depends on window size.
|
|
|
|
*/
|
2012-09-17 22:15:04 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
calc_win_size(session_t *ps, win *w) {
|
2012-09-17 22:15:04 +08:00
|
|
|
w->widthb = w->a.width + w->a.border_width * 2;
|
|
|
|
w->heightb = w->a.height + w->a.border_width * 2;
|
2012-11-19 09:46:07 +08:00
|
|
|
calc_shadow_geometry(ps, w);
|
2012-09-17 22:15:04 +08:00
|
|
|
w->flags |= WFLAG_SIZE_CHANGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Calculate and update geometry of the shadow of a window.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
calc_shadow_geometry(session_t *ps, win *w) {
|
|
|
|
w->shadow_dx = ps->o.shadow_offset_x;
|
|
|
|
w->shadow_dy = ps->o.shadow_offset_y;
|
|
|
|
w->shadow_width = w->widthb + ps->gaussian_map->size;
|
|
|
|
w->shadow_height = w->heightb + ps->gaussian_map->size;
|
2012-09-17 22:15:04 +08:00
|
|
|
}
|
|
|
|
|
2013-09-15 11:07:49 +08:00
|
|
|
/**
|
|
|
|
* Update window type.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_upd_wintype(session_t *ps, win *w) {
|
|
|
|
const wintype_t wtype_old = w->window_type;
|
|
|
|
|
|
|
|
// Detect window type here
|
|
|
|
w->window_type = wid_get_prop_wintype(ps, w->client_win);
|
|
|
|
|
|
|
|
// Conform to EWMH standard, if _NET_WM_WINDOW_TYPE is not present, take
|
|
|
|
// override-redirect windows or windows without WM_TRANSIENT_FOR as
|
|
|
|
// _NET_WM_WINDOW_TYPE_NORMAL, otherwise as _NET_WM_WINDOW_TYPE_DIALOG.
|
|
|
|
if (WINTYPE_UNKNOWN == w->window_type) {
|
|
|
|
if (w->a.override_redirect
|
|
|
|
|| !wid_has_prop(ps, w->client_win, ps->atom_transient))
|
|
|
|
w->window_type = WINTYPE_NORMAL;
|
|
|
|
else
|
|
|
|
w->window_type = WINTYPE_DIALOG;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (w->window_type != wtype_old)
|
|
|
|
win_on_wtype_change(ps, w);
|
|
|
|
}
|
|
|
|
|
2012-09-14 11:51:46 +08:00
|
|
|
/**
|
|
|
|
* Mark a window as the client window of another.
|
|
|
|
*
|
2012-12-07 22:38:10 +08:00
|
|
|
* @param ps current session
|
2012-09-14 11:51:46 +08:00
|
|
|
* @param w struct _win of the parent window
|
|
|
|
* @param client window ID of the client window
|
|
|
|
*/
|
|
|
|
static void
|
2012-12-07 22:38:10 +08:00
|
|
|
win_mark_client(session_t *ps, win *w, Window client) {
|
2012-09-14 11:51:46 +08:00
|
|
|
w->client_win = client;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-12-08 11:10:08 +08:00
|
|
|
// If the window isn't mapped yet, stop here, as the function will be
|
|
|
|
// called in map_win()
|
|
|
|
if (IsViewable != w->a.map_state)
|
|
|
|
return;
|
|
|
|
|
2013-01-12 22:21:35 +08:00
|
|
|
XSelectInput(ps->dpy, client,
|
|
|
|
determine_evmask(ps, client, WIN_EVMODE_CLIENT));
|
2012-10-03 21:13:34 +08:00
|
|
|
|
2012-12-07 22:38:10 +08:00
|
|
|
// Make sure the XSelectInput() requests are sent
|
|
|
|
XSync(ps->dpy, False);
|
|
|
|
|
2013-09-15 11:07:49 +08:00
|
|
|
win_upd_wintype(ps, w);
|
2012-10-02 21:46:37 +08:00
|
|
|
|
2013-09-15 11:07:49 +08:00
|
|
|
// Get frame widths. The window is in damaged area already.
|
|
|
|
if (ps->o.frame_opacity)
|
|
|
|
get_frame_extents(ps, w, client);
|
2012-12-07 22:38:10 +08:00
|
|
|
|
2012-12-12 12:01:51 +08:00
|
|
|
// Get window group
|
|
|
|
if (ps->o.track_leader)
|
|
|
|
win_update_leader(ps, w);
|
|
|
|
|
2013-01-09 20:25:01 +08:00
|
|
|
// Get window name and class if we are tracking them
|
|
|
|
if (ps->o.track_wdata) {
|
|
|
|
win_get_name(ps, w);
|
|
|
|
win_get_class(ps, w);
|
|
|
|
win_get_role(ps, w);
|
|
|
|
}
|
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
// Update everything related to conditions
|
|
|
|
win_on_factor_change(ps, w);
|
|
|
|
|
2013-01-09 20:25:01 +08:00
|
|
|
// Update window focus state
|
2012-12-07 22:38:10 +08:00
|
|
|
win_update_focused(ps, w);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unmark current client window of a window.
|
|
|
|
*
|
|
|
|
* @param ps current session
|
|
|
|
* @param w struct _win of the parent window
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_unmark_client(session_t *ps, win *w) {
|
|
|
|
Window client = w->client_win;
|
|
|
|
|
|
|
|
w->client_win = None;
|
|
|
|
|
|
|
|
// Recheck event mask
|
|
|
|
XSelectInput(ps->dpy, client,
|
|
|
|
determine_evmask(ps, client, WIN_EVMODE_UNKNOWN));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Recheck client window of a window.
|
|
|
|
*
|
|
|
|
* @param ps current session
|
|
|
|
* @param w struct _win of the parent window
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_recheck_client(session_t *ps, win *w) {
|
|
|
|
// Initialize wmwin to false
|
|
|
|
w->wmwin = false;
|
|
|
|
|
|
|
|
// Look for the client window
|
|
|
|
|
|
|
|
// Always recursively look for a window with WM_STATE, as Fluxbox
|
|
|
|
// sets override-redirect flags on all frame windows.
|
|
|
|
Window cw = find_client_win(ps, w->id);
|
|
|
|
#ifdef DEBUG_CLIENTWIN
|
|
|
|
if (cw)
|
|
|
|
printf_dbgf("(%#010lx): client %#010lx\n", w->id, cw);
|
|
|
|
#endif
|
|
|
|
// Set a window's client window to itself if we couldn't find a
|
|
|
|
// client window
|
|
|
|
if (!cw) {
|
|
|
|
cw = w->id;
|
|
|
|
w->wmwin = !w->a.override_redirect;
|
|
|
|
#ifdef DEBUG_CLIENTWIN
|
|
|
|
printf_dbgf("(%#010lx): client self (%s)\n", w->id,
|
|
|
|
(w->wmwin ? "wmwin": "override-redirected"));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unmark the old one
|
|
|
|
if (w->client_win && w->client_win != cw)
|
|
|
|
win_unmark_client(ps, w);
|
|
|
|
|
|
|
|
// Mark the new one
|
|
|
|
win_mark_client(ps, w, cw);
|
2012-09-14 11:51:46 +08:00
|
|
|
}
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
static bool
|
2012-11-21 09:15:49 +08:00
|
|
|
add_win(session_t *ps, Window id, Window prev) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
const static win win_def = {
|
|
|
|
.next = NULL,
|
|
|
|
.prev_trans = NULL,
|
|
|
|
|
|
|
|
.id = None,
|
|
|
|
.a = { },
|
2013-08-22 21:15:04 +08:00
|
|
|
#ifdef CONFIG_XINERAMA
|
|
|
|
.xinerama_scr = -1,
|
|
|
|
#endif
|
2013-03-15 23:16:23 +08:00
|
|
|
.pictfmt = NULL,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
.mode = WMODE_TRANS,
|
|
|
|
.damaged = false,
|
|
|
|
.damage = None,
|
2013-03-17 12:14:00 +08:00
|
|
|
.pixmap_damaged = false,
|
2013-03-15 23:16:23 +08:00
|
|
|
.paint = PAINT_INIT,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
.border_size = None,
|
|
|
|
.extents = None,
|
|
|
|
.flags = 0,
|
|
|
|
.need_configure = false,
|
|
|
|
.queue_configure = { },
|
|
|
|
.reg_ignore = None,
|
|
|
|
.widthb = 0,
|
|
|
|
.heightb = 0,
|
2013-01-13 13:44:05 +08:00
|
|
|
.destroyed = false,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
.bounding_shaped = false,
|
|
|
|
.rounded_corners = false,
|
|
|
|
.to_paint = false,
|
2013-01-13 13:44:05 +08:00
|
|
|
.in_openclose = false,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
|
|
|
.client_win = None,
|
|
|
|
.window_type = WINTYPE_UNKNOWN,
|
|
|
|
.wmwin = false,
|
|
|
|
.leader = None,
|
|
|
|
.cache_leader = None,
|
|
|
|
|
|
|
|
.focused = false,
|
|
|
|
.focused_force = UNSET,
|
|
|
|
|
|
|
|
.name = NULL,
|
|
|
|
.class_instance = NULL,
|
|
|
|
.class_general = NULL,
|
|
|
|
.role = NULL,
|
|
|
|
.cache_sblst = NULL,
|
|
|
|
.cache_fblst = NULL,
|
|
|
|
.cache_fcblst = NULL,
|
2013-01-12 22:21:35 +08:00
|
|
|
.cache_ivclst = NULL,
|
2013-03-23 22:06:41 +08:00
|
|
|
.cache_bbblst = NULL,
|
2013-05-21 09:18:41 +08:00
|
|
|
.cache_oparule = NULL,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
|
|
|
.opacity = 0,
|
|
|
|
.opacity_tgt = 0,
|
|
|
|
.opacity_prop = OPAQUE,
|
|
|
|
.opacity_prop_client = OPAQUE,
|
2013-05-21 09:18:41 +08:00
|
|
|
.opacity_set = OPAQUE,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
|
|
|
.fade = false,
|
2013-05-20 18:04:40 +08:00
|
|
|
.fade_force = UNSET,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
.fade_callback = NULL,
|
|
|
|
|
|
|
|
.frame_opacity = 0.0,
|
|
|
|
.left_width = 0,
|
|
|
|
.right_width = 0,
|
|
|
|
.top_width = 0,
|
|
|
|
.bottom_width = 0,
|
|
|
|
|
|
|
|
.shadow = false,
|
|
|
|
.shadow_force = UNSET,
|
|
|
|
.shadow_opacity = 0.0,
|
|
|
|
.shadow_dx = 0,
|
|
|
|
.shadow_dy = 0,
|
|
|
|
.shadow_width = 0,
|
|
|
|
.shadow_height = 0,
|
2013-03-15 23:16:23 +08:00
|
|
|
.shadow_paint = PAINT_INIT,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
.prop_shadow = -1,
|
|
|
|
|
|
|
|
.dim = false,
|
2013-01-12 22:21:35 +08:00
|
|
|
|
|
|
|
.invert_color = false,
|
|
|
|
.invert_color_force = UNSET,
|
2013-03-23 22:06:41 +08:00
|
|
|
|
|
|
|
.blur_background = false,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
};
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// Reject overlay window and already added windows
|
|
|
|
if (id == ps->overlay || find_win(ps, id)) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
return false;
|
2012-09-09 10:13:56 +08:00
|
|
|
}
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
// Allocate and initialize the new win structure
|
2011-11-04 16:41:56 +08:00
|
|
|
win *new = malloc(sizeof(win));
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (!new) {
|
|
|
|
printf_errf("(%#010lx): Failed to allocate memory for the new window.", id);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(new, &win_def, sizeof(win));
|
2011-11-04 14:33:23 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
// Find window insertion point
|
|
|
|
win **p = NULL;
|
2011-11-04 14:33:23 +08:00
|
|
|
if (prev) {
|
2012-11-19 09:46:07 +08:00
|
|
|
for (p = &ps->list; *p; p = &(*p)->next) {
|
2011-11-04 14:33:23 +08:00
|
|
|
if ((*p)->id == prev && !(*p)->destroyed)
|
|
|
|
break;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
p = &ps->list;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
// Fill structure
|
2011-11-04 14:33:23 +08:00
|
|
|
new->id = id;
|
2011-11-04 16:41:56 +08: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 20:20:27 +08:00
|
|
|
set_ignore_next(ps);
|
2013-03-03 21:53:08 +08:00
|
|
|
if (!XGetWindowAttributes(ps->dpy, id, &new->a)
|
|
|
|
|| IsUnviewable == new->a.map_state) {
|
|
|
|
// Failed to get window attributes probably means the window is gone
|
|
|
|
// already. IsUnviewable means the window is already reparented
|
|
|
|
// elsewhere.
|
2011-11-04 14:33:23 +08:00
|
|
|
free(new);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
return false;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-12-07 22:38:10 +08:00
|
|
|
// Delay window mapping
|
|
|
|
int map_state = new->a.map_state;
|
|
|
|
assert(IsViewable == map_state || IsUnmapped == map_state);
|
|
|
|
new->a.map_state = IsUnmapped;
|
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
if (InputOutput == new->a.class) {
|
|
|
|
// Get window picture format
|
2013-03-15 23:16:23 +08:00
|
|
|
new->pictfmt = XRenderFindVisualFormat(ps->dpy, new->a.visual);
|
|
|
|
|
2013-09-12 21:23:20 +08:00
|
|
|
// Create Damage for window
|
|
|
|
set_ignore_next(ps);
|
|
|
|
new->damage = XDamageCreate(ps->dpy, id, XDamageReportNonEmpty);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
calc_win_size(ps, new);
|
2012-09-17 22:15:04 +08:00
|
|
|
|
2011-11-07 05:52:39 +08:00
|
|
|
new->next = *p;
|
|
|
|
*p = new;
|
2011-11-06 10:39:58 +08: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 20:20:27 +08:00
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
// Send D-Bus signal
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
cdbus_ev_win_added(ps, new);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (IsViewable == map_state) {
|
2012-11-21 09:15:49 +08:00
|
|
|
map_win(ps, id);
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
|
|
|
return true;
|
2003-11-24 07:20:42 +08:00
|
|
|
}
|
|
|
|
|
2012-02-27 12:00:12 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
restack_win(session_t *ps, win *w, Window new_above) {
|
2011-11-04 16:41:56 +08:00
|
|
|
Window old_above;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
update_reg_ignore_expire(ps, w);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
if (w->next) {
|
2011-11-04 14:33:23 +08:00
|
|
|
old_above = w->next->id;
|
2011-11-04 16:41:56 +08:00
|
|
|
} else {
|
2011-11-04 14:33:23 +08:00
|
|
|
old_above = None;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
if (old_above != new_above) {
|
2013-03-18 11:48:28 +08:00
|
|
|
win **prev = NULL, **prev_old = NULL;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-03-18 11:48:28 +08:00
|
|
|
// unhook
|
2012-11-19 09:46:07 +08:00
|
|
|
for (prev = &ps->list; *prev; prev = &(*prev)->next) {
|
2011-11-04 16:41:56 +08:00
|
|
|
if ((*prev) == w) break;
|
|
|
|
}
|
2011-11-05 20:00:39 +08:00
|
|
|
|
2013-03-18 11:48:28 +08:00
|
|
|
prev_old = prev;
|
|
|
|
|
|
|
|
bool found = false;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-03-18 11:48:28 +08:00
|
|
|
// rehook
|
2012-11-19 09:46:07 +08:00
|
|
|
for (prev = &ps->list; *prev; prev = &(*prev)->next) {
|
2013-03-18 11:48:28 +08:00
|
|
|
if ((*prev)->id == new_above && !(*prev)->destroyed) {
|
|
|
|
found = true;
|
2011-11-04 14:33:23 +08:00
|
|
|
break;
|
2013-03-18 11:48:28 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-03-22 16:44:03 +08:00
|
|
|
if (new_above && !found) {
|
2013-03-18 11:48:28 +08:00
|
|
|
printf_errf("(%#010lx, %#010lx): "
|
|
|
|
"Failed to found new above window.", w->id, new_above);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
*prev_old = w->next;
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
w->next = *prev;
|
|
|
|
*prev = w;
|
2012-09-11 21:33:03 +08:00
|
|
|
|
2012-09-12 09:08:15 +08:00
|
|
|
#ifdef DEBUG_RESTACK
|
2012-09-11 21:33:03 +08:00
|
|
|
{
|
|
|
|
const char *desc;
|
2012-11-14 21:34:51 +08:00
|
|
|
char *window_name = NULL;
|
|
|
|
bool to_free;
|
2012-11-19 09:46:07 +08:00
|
|
|
win* c = ps->list;
|
2012-09-13 13:39:43 +08:00
|
|
|
|
2012-12-05 12:43:34 +08:00
|
|
|
printf_dbgf("(%#010lx, %#010lx): "
|
2012-09-13 13:58:05 +08:00
|
|
|
"Window stack modified. Current stack:\n", w->id, new_above);
|
|
|
|
|
2012-09-11 21:33:03 +08:00
|
|
|
for (; c; c = c->next) {
|
|
|
|
window_name = "(Failed to get title)";
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
to_free = ev_window_name(ps, c->id, &window_name);
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-09-11 21:33:03 +08:00
|
|
|
desc = "";
|
2012-09-13 13:58:05 +08:00
|
|
|
if (c->destroyed) desc = "(D) ";
|
2013-03-18 11:48:28 +08:00
|
|
|
printf("%#010lx \"%s\" %s", c->id, window_name, desc);
|
|
|
|
if (c->next)
|
|
|
|
printf("-> ");
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-09-11 21:33:03 +08:00
|
|
|
if (to_free) {
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(window_name);
|
2012-09-11 21:33:03 +08:00
|
|
|
window_name = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fputs("\n", stdout);
|
|
|
|
}
|
|
|
|
#endif
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
configure_win(session_t *ps, XConfigureEvent *ce) {
|
2013-03-15 23:16:23 +08:00
|
|
|
// On root window changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ce->window == ps->root) {
|
|
|
|
if (ps->tgt_buffer) {
|
|
|
|
XRenderFreePicture(ps->dpy, ps->tgt_buffer);
|
|
|
|
ps->tgt_buffer = None;
|
2012-10-30 18:11:30 +08:00
|
|
|
}
|
2013-06-09 17:06:35 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->root_width = ce->width;
|
|
|
|
ps->root_height = ce->height;
|
2012-10-30 18:11:30 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
rebuild_screen_reg(ps);
|
2013-06-09 17:06:35 +08:00
|
|
|
rebuild_shadow_exclude_reg(ps);
|
2012-11-03 10:30:32 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (BKEND_GLX == ps->o.backend)
|
|
|
|
glx_on_root_change(ps);
|
|
|
|
#endif
|
|
|
|
|
2012-10-30 18:11:30 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Other window changes
|
2012-11-19 09:46:07 +08:00
|
|
|
win *w = find_win(ps, ce->window);
|
2011-11-04 16:41:56 +08:00
|
|
|
XserverRegion damage = None;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-10-30 18:11:30 +08:00
|
|
|
if (!w)
|
2011-11-04 14:33:23 +08:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (w->a.map_state == IsUnmapped) {
|
|
|
|
/* save the configure event for when the window maps */
|
2012-11-19 09:46:07 +08:00
|
|
|
w->need_configure = true;
|
2011-11-04 14:33:23 +08:00
|
|
|
w->queue_configure = *ce;
|
2012-11-19 09:46:07 +08:00
|
|
|
restack_win(ps, w, ce->above);
|
2011-11-04 14:33:23 +08:00
|
|
|
} else {
|
2012-09-13 13:58:05 +08:00
|
|
|
if (!(w->need_configure)) {
|
2012-11-19 09:46:07 +08:00
|
|
|
restack_win(ps, w, ce->above);
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
|
|
|
|
2013-06-19 19:36:48 +08:00
|
|
|
bool factor_change = false;
|
|
|
|
|
2012-10-31 08:54:09 +08:00
|
|
|
// Windows restack (including window restacks happened when this
|
|
|
|
// window is not mapped) could mess up all reg_ignore
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->reg_ignore_expire = true;
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
w->need_configure = false;
|
2008-02-15 13:55:17 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
damage = XFixesCreateRegion(ps->dpy, 0, 0);
|
2012-10-31 08:54:09 +08:00
|
|
|
if (w->extents != None) {
|
2012-11-19 09:46:07 +08:00
|
|
|
XFixesCopyRegion(ps->dpy, damage, w->extents);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2008-02-15 13:55:17 +08:00
|
|
|
|
2012-11-01 10:43:15 +08:00
|
|
|
// If window geometry did not change, don't free extents here
|
|
|
|
if (w->a.x != ce->x || w->a.y != ce->y
|
2013-01-09 20:25:01 +08:00
|
|
|
|| w->a.width != ce->width || w->a.height != ce->height
|
|
|
|
|| w->a.border_width != ce->border_width) {
|
2013-06-19 19:36:48 +08:00
|
|
|
factor_change = true;
|
2012-11-19 09:46:07 +08:00
|
|
|
free_region(ps, &w->extents);
|
|
|
|
free_region(ps, &w->border_size);
|
2012-11-01 10:43:15 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
w->a.x = ce->x;
|
|
|
|
w->a.y = ce->y;
|
2011-11-05 20:00:39 +08:00
|
|
|
|
2013-01-09 20:25:01 +08:00
|
|
|
if (w->a.width != ce->width || w->a.height != ce->height
|
2013-03-15 23:16:23 +08:00
|
|
|
|| w->a.border_width != ce->border_width)
|
|
|
|
free_paint(ps, &w->paint);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-09-17 22:15:04 +08:00
|
|
|
if (w->a.width != ce->width || w->a.height != ce->height
|
|
|
|
|| w->a.border_width != ce->border_width) {
|
|
|
|
w->a.width = ce->width;
|
|
|
|
w->a.height = ce->height;
|
|
|
|
w->a.border_width = ce->border_width;
|
2012-11-19 09:46:07 +08:00
|
|
|
calc_win_size(ps, w);
|
2012-11-01 10:43:15 +08:00
|
|
|
|
|
|
|
// Rounded corner detection is affected by window size
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->shape_exists && ps->o.shadow_ignore_shaped
|
|
|
|
&& ps->o.detect_rounded_corners && w->bounding_shaped)
|
|
|
|
win_update_shape(ps, w);
|
2012-09-17 22:15:04 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-09 21:44:02 +08:00
|
|
|
if (damage) {
|
2012-11-19 09:46:07 +08:00
|
|
|
XserverRegion extents = win_extents(ps, w);
|
|
|
|
XFixesUnionRegion(ps->dpy, damage, damage, extents);
|
|
|
|
XFixesDestroyRegion(ps->dpy, extents);
|
|
|
|
add_damage(ps, damage);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2013-06-19 19:36:48 +08:00
|
|
|
|
2013-08-22 21:15:04 +08:00
|
|
|
if (factor_change) {
|
|
|
|
cxinerama_win_upd_scr(ps, w);
|
2013-06-19 19:36:48 +08:00
|
|
|
win_on_factor_change(ps, w);
|
2013-08-22 21:15:04 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2008-02-20 14:20:40 +08:00
|
|
|
|
2013-01-29 09:57:04 +08:00
|
|
|
// override_redirect flag cannot be changed after window creation, as far
|
|
|
|
// as I know, so there's no point to re-match windows here.
|
2011-11-04 14:33:23 +08:00
|
|
|
w->a.override_redirect = ce->override_redirect;
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2003-11-24 07:20:42 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
circulate_win(session_t *ps, XCirculateEvent *ce) {
|
|
|
|
win *w = find_win(ps, ce->window);
|
2011-11-04 16:41:56 +08:00
|
|
|
Window new_above;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
if (!w) return;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
if (ce->place == PlaceOnTop) {
|
2012-11-19 09:46:07 +08:00
|
|
|
new_above = ps->list->id;
|
2011-11-04 16:41:56 +08:00
|
|
|
} else {
|
2011-11-04 14:33:23 +08:00
|
|
|
new_above = None;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
restack_win(ps, w, new_above);
|
2003-11-24 07:20:42 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
finish_destroy_win(session_t *ps, Window id) {
|
2011-11-04 16:41:56 +08:00
|
|
|
win **prev, *w;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
for (prev = &ps->list; (w = *prev); prev = &w->next) {
|
2011-11-04 14:33:23 +08:00
|
|
|
if (w->id == id && w->destroyed) {
|
2012-11-19 09:46:07 +08:00
|
|
|
finish_unmap_win(ps, w);
|
2011-11-04 14:33:23 +08:00
|
|
|
*prev = w->next;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-04 18:11:08 +08:00
|
|
|
// Clear active_win if it's pointing to the destroyed window
|
2012-11-27 00:02:18 +08:00
|
|
|
if (w == ps->active_win)
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->active_win = NULL;
|
2012-11-04 18:11:08 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
free_win_res(ps, w);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
free(w);
|
|
|
|
break;
|
|
|
|
}
|
2011-11-05 05:18:56 +08:00
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2004-07-08 15:07:26 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
destroy_callback(session_t *ps, win *w) {
|
|
|
|
finish_destroy_win(ps, w->id);
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
destroy_win(session_t *ps, Window id) {
|
|
|
|
win *w = find_win(ps, id);
|
2008-02-15 13:55:17 +08:00
|
|
|
|
2012-09-19 20:49:16 +08:00
|
|
|
if (w) {
|
2013-01-29 09:57:04 +08:00
|
|
|
unmap_win(ps, w);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
w->destroyed = true;
|
2008-02-19 05:44:41 +08:00
|
|
|
|
2013-01-29 09:57:04 +08:00
|
|
|
// Set fading callback
|
2012-11-19 09:46:07 +08:00
|
|
|
set_fade_callback(ps, w, destroy_callback, false);
|
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 20:20:27 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
// Send D-Bus signal
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
cdbus_ev_win_destroyed(ps, w);
|
|
|
|
}
|
|
|
|
#endif
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2004-07-08 15:07:26 +08:00
|
|
|
}
|
|
|
|
|
2012-10-24 10:09:59 +08:00
|
|
|
static inline void
|
2012-11-19 09:46:07 +08:00
|
|
|
root_damaged(session_t *ps) {
|
2013-03-15 23:16:23 +08:00
|
|
|
if (ps->root_tile_paint.pixmap) {
|
2012-11-19 09:46:07 +08:00
|
|
|
XClearArea(ps->dpy, ps->root, 0, 0, 0, 0, true);
|
|
|
|
// if (ps->root_picture != ps->root_tile) {
|
2013-03-15 23:16:23 +08:00
|
|
|
free_root_tile(ps);
|
2012-10-24 10:09:59 +08:00
|
|
|
/* }
|
|
|
|
if (root_damage) {
|
2012-11-19 09:46:07 +08:00
|
|
|
XserverRegion parts = XFixesCreateRegion(ps->dpy, 0, 0);
|
|
|
|
XDamageSubtract(ps->dpy, root_damage, None, parts);
|
|
|
|
add_damage(ps, parts);
|
2012-10-24 10:09:59 +08:00
|
|
|
} */
|
|
|
|
}
|
2013-01-24 13:38:03 +08:00
|
|
|
|
|
|
|
// Mark screen damaged
|
|
|
|
force_repaint(ps);
|
2012-10-24 10:09:59 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
damage_win(session_t *ps, XDamageNotifyEvent *de) {
|
2012-10-24 10:09:59 +08:00
|
|
|
/*
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->root == de->drawable) {
|
2012-10-24 10:09:59 +08:00
|
|
|
root_damaged();
|
|
|
|
return;
|
|
|
|
} */
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
win *w = find_win(ps, de->drawable);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
|
|
|
if (!w) return;
|
2004-08-13 16:25:51 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
repair_win(ps, w);
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Xlib error handler function.
|
|
|
|
*/
|
2003-11-20 00:12:15 +08:00
|
|
|
static int
|
2012-11-21 09:15:49 +08:00
|
|
|
error(Display __attribute__((unused)) *dpy, XErrorEvent *ev) {
|
2012-11-19 09:46:07 +08:00
|
|
|
session_t * const ps = ps_g;
|
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
int o;
|
2011-11-05 05:18:56 +08:00
|
|
|
const char *name = "Unknown";
|
2003-11-20 00:12:15 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (should_ignore(ps, ev->serial)) {
|
2003-11-20 00:12:15 +08:00
|
|
|
return 0;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ev->request_code == ps->composite_opcode
|
2011-11-04 17:18:10 +08:00
|
|
|
&& ev->minor_code == X_CompositeRedirectSubwindows) {
|
2011-11-04 14:33:23 +08:00
|
|
|
fprintf(stderr, "Another composite manager is already running\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2012-11-03 05:51:40 +08:00
|
|
|
#define CASESTRRET2(s) case s: name = #s; break
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
o = ev->error_code - ps->xfixes_error;
|
2011-11-04 14:33:23 +08:00
|
|
|
switch (o) {
|
2012-11-03 05:51:40 +08:00
|
|
|
CASESTRRET2(BadRegion);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
o = ev->error_code - ps->damage_error;
|
2011-11-04 14:33:23 +08:00
|
|
|
switch (o) {
|
2012-11-03 05:51:40 +08:00
|
|
|
CASESTRRET2(BadDamage);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
o = ev->error_code - ps->render_error;
|
2011-11-04 14:33:23 +08:00
|
|
|
switch (o) {
|
2012-11-03 05:51:40 +08:00
|
|
|
CASESTRRET2(BadPictFormat);
|
|
|
|
CASESTRRET2(BadPicture);
|
|
|
|
CASESTRRET2(BadPictOp);
|
|
|
|
CASESTRRET2(BadGlyphSet);
|
|
|
|
CASESTRRET2(BadGlyph);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (ps->glx_exists) {
|
|
|
|
o = ev->error_code - ps->glx_error;
|
|
|
|
switch (o) {
|
|
|
|
CASESTRRET2(GLX_BAD_SCREEN);
|
|
|
|
CASESTRRET2(GLX_BAD_ATTRIBUTE);
|
|
|
|
CASESTRRET2(GLX_NO_EXTENSION);
|
|
|
|
CASESTRRET2(GLX_BAD_VISUAL);
|
|
|
|
CASESTRRET2(GLX_BAD_CONTEXT);
|
|
|
|
CASESTRRET2(GLX_BAD_VALUE);
|
|
|
|
CASESTRRET2(GLX_BAD_ENUM);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-09-11 21:33:03 +08:00
|
|
|
switch (ev->error_code) {
|
2012-11-03 05:51:40 +08:00
|
|
|
CASESTRRET2(BadAccess);
|
|
|
|
CASESTRRET2(BadAlloc);
|
|
|
|
CASESTRRET2(BadAtom);
|
|
|
|
CASESTRRET2(BadColor);
|
|
|
|
CASESTRRET2(BadCursor);
|
|
|
|
CASESTRRET2(BadDrawable);
|
|
|
|
CASESTRRET2(BadFont);
|
|
|
|
CASESTRRET2(BadGC);
|
|
|
|
CASESTRRET2(BadIDChoice);
|
|
|
|
CASESTRRET2(BadImplementation);
|
|
|
|
CASESTRRET2(BadLength);
|
|
|
|
CASESTRRET2(BadMatch);
|
|
|
|
CASESTRRET2(BadName);
|
|
|
|
CASESTRRET2(BadPixmap);
|
|
|
|
CASESTRRET2(BadRequest);
|
|
|
|
CASESTRRET2(BadValue);
|
|
|
|
CASESTRRET2(BadWindow);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef CASESTRRET2
|
2012-09-11 21:33:03 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
print_timestamp(ps);
|
2013-03-15 23:16:23 +08:00
|
|
|
{
|
|
|
|
char buf[BUF_LEN] = "";
|
|
|
|
XGetErrorText(ps->dpy, ev->error_code, buf, BUF_LEN);
|
|
|
|
printf("error %d (%s) request %d minor %d serial %lu (\"%s\")\n",
|
|
|
|
ev->error_code, name, ev->request_code,
|
|
|
|
ev->minor_code, ev->serial, buf);
|
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
|
|
|
return 0;
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2003-11-20 00:12:15 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
expose_root(session_t *ps, XRectangle *rects, int nrects) {
|
|
|
|
XserverRegion region = XFixesCreateRegion(ps->dpy, rects, nrects);
|
|
|
|
add_damage(ps, region);
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
|
|
|
|
2012-12-07 22:38:10 +08:00
|
|
|
/**
|
|
|
|
* Get the value of a type-<code>Window</code> property of a window.
|
|
|
|
*
|
|
|
|
* @return the value if successful, 0 otherwise
|
|
|
|
*/
|
|
|
|
static Window
|
|
|
|
wid_get_prop_window(session_t *ps, Window wid, Atom aprop) {
|
|
|
|
// Get the attribute
|
|
|
|
Window p = None;
|
|
|
|
winprop_t prop = wid_get_prop(ps, wid, aprop, 1L, XA_WINDOW, 32);
|
|
|
|
|
|
|
|
// Return it
|
|
|
|
if (prop.nitems) {
|
|
|
|
p = *prop.data.p32;
|
|
|
|
}
|
|
|
|
|
|
|
|
free_winprop(&prop);
|
|
|
|
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
2012-12-12 12:34:56 +08:00
|
|
|
/**
|
|
|
|
* Update focused state of a window.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_update_focused(session_t *ps, win *w) {
|
|
|
|
bool focused_old = w->focused;
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (UNSET != w->focused_force) {
|
|
|
|
w->focused = w->focused_force;
|
|
|
|
}
|
|
|
|
else {
|
2013-09-18 21:50:57 +08:00
|
|
|
w->focused = win_is_focused_real(ps, w);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
|
|
|
// Use wintype_focus, and treat WM windows and override-redirected
|
|
|
|
// windows specially
|
|
|
|
if (ps->o.wintype_focus[w->window_type]
|
|
|
|
|| (ps->o.mark_wmwin_focused && w->wmwin)
|
|
|
|
|| (ps->o.mark_ovredir_focused
|
|
|
|
&& w->id == w->client_win && !w->wmwin)
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
|| win_match(ps, w, ps->o.focus_blacklist, &w->cache_fcblst))
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
w->focused = true;
|
|
|
|
|
|
|
|
// If window grouping detection is enabled, mark the window active if
|
|
|
|
// its group is
|
|
|
|
if (ps->o.track_leader && ps->active_leader
|
|
|
|
&& win_get_leader(ps, w) == ps->active_leader) {
|
|
|
|
w->focused = true;
|
|
|
|
}
|
2012-12-12 12:34:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (w->focused != focused_old)
|
|
|
|
w->flags |= WFLAG_OPCT_CHANGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set real focused state of a window.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_set_focused(session_t *ps, win *w, bool focused) {
|
|
|
|
// Unmapped windows will have their focused state reset on map
|
|
|
|
if (IsUnmapped == w->a.map_state)
|
|
|
|
return;
|
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
if (win_is_focused_real(ps, w) == focused) return;
|
2012-12-12 12:34:56 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
if (focused) {
|
|
|
|
if (ps->active_win)
|
|
|
|
win_set_focused(ps, ps->active_win, false);
|
|
|
|
ps->active_win = w;
|
|
|
|
}
|
|
|
|
else if (w == ps->active_win)
|
|
|
|
ps->active_win = NULL;
|
2012-12-12 12:34:56 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
assert(win_is_focused_real(ps, w) == focused);
|
2012-12-12 12:34:56 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
win_on_focus_change(ps, w);
|
|
|
|
}
|
2012-12-12 12:34:56 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
/**
|
|
|
|
* Handle window focus change.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_on_focus_change(session_t *ps, win *w) {
|
|
|
|
// If window grouping detection is enabled
|
|
|
|
if (ps->o.track_leader) {
|
|
|
|
Window leader = win_get_leader(ps, w);
|
2012-12-12 12:34:56 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
// If the window gets focused, replace the old active_leader
|
|
|
|
if (win_is_focused_real(ps, w) && leader != ps->active_leader) {
|
|
|
|
Window active_leader_old = ps->active_leader;
|
|
|
|
|
|
|
|
ps->active_leader = leader;
|
|
|
|
|
|
|
|
group_update_focused(ps, active_leader_old);
|
|
|
|
group_update_focused(ps, leader);
|
2012-12-12 12:34:56 +08:00
|
|
|
}
|
2013-09-18 21:50:57 +08:00
|
|
|
// If the group get unfocused, remove it from active_leader
|
|
|
|
else if (!win_is_focused_real(ps, w) && leader && leader == ps->active_leader
|
|
|
|
&& !group_is_focused(ps, leader)) {
|
|
|
|
ps->active_leader = None;
|
|
|
|
group_update_focused(ps, leader);
|
2012-12-12 12:34:56 +08:00
|
|
|
}
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
// The window itself must be updated anyway
|
|
|
|
win_update_focused(ps, w);
|
|
|
|
}
|
|
|
|
// Otherwise, only update the window itself
|
|
|
|
else {
|
|
|
|
win_update_focused(ps, w);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update everything related to conditions
|
|
|
|
win_on_factor_change(ps, w);
|
2013-03-30 11:46:32 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_DBUS
|
2013-09-18 21:50:57 +08:00
|
|
|
// Send D-Bus signal
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
if (win_is_focused_real(ps, w))
|
|
|
|
cdbus_ev_win_focusin(ps, w);
|
|
|
|
else
|
|
|
|
cdbus_ev_win_focusout(ps, w);
|
2012-12-12 12:34:56 +08:00
|
|
|
}
|
2013-09-18 21:50:57 +08:00
|
|
|
#endif
|
2012-12-12 12:34:56 +08:00
|
|
|
}
|
2013-09-18 21:50:57 +08:00
|
|
|
|
2012-12-12 12:01:51 +08:00
|
|
|
/**
|
|
|
|
* Update leader of a window.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_update_leader(session_t *ps, win *w) {
|
|
|
|
Window leader = None;
|
|
|
|
|
|
|
|
// Read the leader properties
|
|
|
|
if (ps->o.detect_transient && !leader)
|
|
|
|
leader = wid_get_prop_window(ps, w->client_win, ps->atom_transient);
|
|
|
|
|
|
|
|
if (ps->o.detect_client_leader && !leader)
|
|
|
|
leader = wid_get_prop_window(ps, w->client_win, ps->atom_client_leader);
|
|
|
|
|
|
|
|
win_set_leader(ps, w, leader);
|
2012-12-12 12:34:56 +08:00
|
|
|
|
|
|
|
#ifdef DEBUG_LEADER
|
|
|
|
printf_dbgf("(%#010lx): client %#010lx, leader %#010lx, cache %#010lx\n", w->id, w->client_win, w->leader, win_get_leader(ps, w));
|
|
|
|
#endif
|
2012-12-12 12:01:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set leader of a window.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
win_set_leader(session_t *ps, win *w, Window nleader) {
|
|
|
|
// If the leader changes
|
|
|
|
if (w->leader != nleader) {
|
|
|
|
Window cache_leader_old = win_get_leader(ps, w);
|
|
|
|
|
|
|
|
w->leader = nleader;
|
|
|
|
|
|
|
|
// Forcefully do this to deal with the case when a child window
|
|
|
|
// gets mapped before parent, or when the window is a waypoint
|
|
|
|
clear_cache_win_leaders(ps);
|
|
|
|
|
|
|
|
// Update the old and new window group and active_leader if the window
|
|
|
|
// could affect their state.
|
|
|
|
Window cache_leader = win_get_leader(ps, w);
|
2013-09-18 21:50:57 +08:00
|
|
|
if (win_is_focused_real(ps, w) && cache_leader_old != cache_leader) {
|
2012-12-12 12:01:51 +08:00
|
|
|
ps->active_leader = cache_leader;
|
|
|
|
|
|
|
|
group_update_focused(ps, cache_leader_old);
|
|
|
|
group_update_focused(ps, cache_leader);
|
|
|
|
}
|
|
|
|
// Otherwise, at most the window itself is affected
|
|
|
|
else {
|
|
|
|
win_update_focused(ps, w);
|
|
|
|
}
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
|
|
|
|
// Update everything related to conditions
|
|
|
|
win_on_factor_change(ps, w);
|
2012-12-12 12:01:51 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal function of win_get_leader().
|
|
|
|
*/
|
|
|
|
static Window
|
|
|
|
win_get_leader_raw(session_t *ps, win *w, int recursions) {
|
|
|
|
// Rebuild the cache if needed
|
|
|
|
if (!w->cache_leader && (w->client_win || w->leader)) {
|
|
|
|
// Leader defaults to client window
|
|
|
|
if (!(w->cache_leader = w->leader))
|
|
|
|
w->cache_leader = w->client_win;
|
|
|
|
|
|
|
|
// If the leader of this window isn't itself, look for its ancestors
|
|
|
|
if (w->cache_leader && w->cache_leader != w->client_win) {
|
|
|
|
win *wp = find_toplevel(ps, w->cache_leader);
|
|
|
|
if (wp) {
|
|
|
|
// Dead loop?
|
|
|
|
if (recursions > WIN_GET_LEADER_MAX_RECURSION)
|
|
|
|
return None;
|
|
|
|
|
|
|
|
w->cache_leader = win_get_leader_raw(ps, wp, recursions + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return w->cache_leader;
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Get the value of a text property of a window.
|
|
|
|
*/
|
2013-01-24 13:38:03 +08:00
|
|
|
bool
|
2012-11-19 09:46:07 +08:00
|
|
|
wid_get_text_prop(session_t *ps, Window wid, Atom prop,
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
char ***pstrlst, int *pnstr) {
|
2012-12-05 18:12:21 +08:00
|
|
|
XTextProperty text_prop = { NULL, None, 0, 0 };
|
2012-09-11 21:33:03 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!(XGetTextProperty(ps->dpy, wid, &text_prop, prop) && text_prop.value))
|
|
|
|
return false;
|
2012-09-13 13:58:05 +08:00
|
|
|
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
if (Success !=
|
2012-11-19 09:46:07 +08:00
|
|
|
XmbTextPropertyToTextList(ps->dpy, &text_prop, pstrlst, pnstr)
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|| !*pnstr) {
|
|
|
|
*pnstr = 0;
|
|
|
|
if (*pstrlst)
|
|
|
|
XFreeStringList(*pstrlst);
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(text_prop.value);
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(text_prop.value);
|
2012-11-19 09:46:07 +08:00
|
|
|
return true;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Get the name of a window from window ID.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
wid_get_name(session_t *ps, Window wid, char **name) {
|
2012-12-05 18:12:21 +08:00
|
|
|
XTextProperty text_prop = { NULL, None, 0, 0 };
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
char **strlst = NULL;
|
|
|
|
int nstr = 0;
|
|
|
|
|
2012-12-05 18:12:21 +08:00
|
|
|
if (!(wid_get_text_prop(ps, wid, ps->atom_name_ewmh, &strlst, &nstr))) {
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
#ifdef DEBUG_WINDATA
|
2012-12-05 12:43:34 +08:00
|
|
|
printf_dbgf("(%#010lx): _NET_WM_NAME unset, falling back to WM_NAME.\n", wid);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
#endif
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!(XGetWMName(ps->dpy, wid, &text_prop) && text_prop.value)) {
|
|
|
|
return false;
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-12-05 18:12:21 +08:00
|
|
|
if (Success !=
|
|
|
|
XmbTextPropertyToTextList(ps->dpy, &text_prop, &strlst, &nstr)
|
|
|
|
|| !nstr || !strlst) {
|
|
|
|
if (strlst)
|
|
|
|
XFreeStringList(strlst);
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(text_prop.value);
|
2012-12-05 18:12:21 +08:00
|
|
|
return false;
|
|
|
|
}
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(text_prop.value);
|
2012-09-11 21:33:03 +08:00
|
|
|
}
|
2012-12-05 18:12:21 +08:00
|
|
|
|
|
|
|
*name = mstrcpy(strlst[0]);
|
|
|
|
|
|
|
|
XFreeStringList(strlst);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the role of a window from window ID.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
wid_get_role(session_t *ps, Window wid, char **role) {
|
|
|
|
char **strlst = NULL;
|
|
|
|
int nstr = 0;
|
|
|
|
|
|
|
|
if (!wid_get_text_prop(ps, wid, ps->atom_role, &strlst, &nstr)) {
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
2012-12-05 18:12:21 +08:00
|
|
|
|
|
|
|
*role = mstrcpy(strlst[0]);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
|
|
|
XFreeStringList(strlst);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return true;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
2012-12-05 18:12:21 +08:00
|
|
|
* Retrieve a string property of a window and update its <code>win</code>
|
2012-11-19 09:46:07 +08:00
|
|
|
* structure.
|
|
|
|
*/
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
static int
|
2012-12-05 18:12:21 +08:00
|
|
|
win_get_prop_str(session_t *ps, win *w, char **tgt,
|
|
|
|
bool (*func_wid_get_prop_str)(session_t *ps, Window wid, char **tgt)) {
|
|
|
|
int ret = -1;
|
|
|
|
char *prop_old = *tgt;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
|
|
|
// Can't do anything if there's no client window
|
|
|
|
if (!w->client_win)
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-12-05 18:12:21 +08:00
|
|
|
// Get the property
|
|
|
|
ret = func_wid_get_prop_str(ps, w->client_win, tgt);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-12-05 18:12:21 +08:00
|
|
|
// Return -1 if func_wid_get_prop_str() failed, 0 if the property
|
|
|
|
// doesn't change, 1 if it changes
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
if (!ret)
|
|
|
|
ret = -1;
|
2012-12-05 18:12:21 +08:00
|
|
|
else if (prop_old && !strcmp(*tgt, prop_old))
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
ret = 0;
|
|
|
|
else
|
|
|
|
ret = 1;
|
|
|
|
|
2012-12-05 18:12:21 +08:00
|
|
|
// Keep the old property if there's no new one
|
|
|
|
if (*tgt != prop_old)
|
|
|
|
free(prop_old);
|
2012-09-13 13:58:05 +08:00
|
|
|
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
return ret;
|
2012-09-11 21:33:03 +08:00
|
|
|
}
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Retrieve the <code>WM_CLASS</code> of a window and update its
|
|
|
|
* <code>win</code> structure.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
win_get_class(session_t *ps, win *w) {
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
char **strlst = NULL;
|
|
|
|
int nstr = 0;
|
|
|
|
|
|
|
|
// Can't do anything if there's no client window
|
|
|
|
if (!w->client_win)
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
|
|
|
// Free and reset old strings
|
|
|
|
free(w->class_instance);
|
|
|
|
free(w->class_general);
|
|
|
|
w->class_instance = NULL;
|
|
|
|
w->class_general = NULL;
|
|
|
|
|
|
|
|
// Retrieve the property string list
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!wid_get_text_prop(ps, w->client_win, ps->atom_class, &strlst, &nstr))
|
|
|
|
return false;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
|
|
|
// Copy the strings if successful
|
|
|
|
w->class_instance = mstrcpy(strlst[0]);
|
|
|
|
|
|
|
|
if (nstr > 1)
|
|
|
|
w->class_general = mstrcpy(strlst[1]);
|
|
|
|
|
|
|
|
XFreeStringList(strlst);
|
|
|
|
|
|
|
|
#ifdef DEBUG_WINDATA
|
2012-12-05 12:43:34 +08:00
|
|
|
printf_dbgf("(%#010lx): client = %#010lx, "
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
"instance = \"%s\", general = \"%s\"\n",
|
|
|
|
w->id, w->client_win, w->class_instance, w->class_general);
|
2012-09-12 09:08:15 +08:00
|
|
|
#endif
|
2012-09-11 21:33:03 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return true;
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
|
|
|
|
2013-01-24 13:38:03 +08:00
|
|
|
/**
|
|
|
|
* Force a full-screen repaint.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
force_repaint(session_t *ps) {
|
|
|
|
assert(ps->screen_reg);
|
|
|
|
XserverRegion reg = None;
|
|
|
|
if (ps->screen_reg && (reg = copy_region(ps, ps->screen_reg))) {
|
|
|
|
ps->ev_received = true;
|
|
|
|
add_damage(ps, reg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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 20:20:27 +08:00
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
/** @name DBus hooks
|
|
|
|
*/
|
|
|
|
///@{
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set w->shadow_force of a window.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
win_set_shadow_force(session_t *ps, win *w, switch_t val) {
|
|
|
|
if (val != w->shadow_force) {
|
|
|
|
w->shadow_force = val;
|
|
|
|
win_determine_shadow(ps, w);
|
2013-05-20 18:04:40 +08:00
|
|
|
ps->ev_received = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set w->fade_force of a window.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
win_set_fade_force(session_t *ps, win *w, switch_t val) {
|
|
|
|
if (val != w->fade_force) {
|
|
|
|
w->fade_force = val;
|
|
|
|
win_determine_fade(ps, w);
|
|
|
|
ps->ev_received = true;
|
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 20:20:27 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set w->focused_force of a window.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
win_set_focused_force(session_t *ps, win *w, switch_t val) {
|
|
|
|
if (val != w->focused_force) {
|
|
|
|
w->focused_force = val;
|
|
|
|
win_update_focused(ps, w);
|
2013-05-20 18:04:40 +08:00
|
|
|
ps->ev_received = true;
|
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 20:20:27 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set w->invert_color_force of a window.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
win_set_invert_color_force(session_t *ps, win *w, switch_t val) {
|
|
|
|
if (val != w->invert_color_force) {
|
|
|
|
w->invert_color_force = val;
|
|
|
|
win_determine_invert_color(ps, w);
|
2013-05-20 18:04:40 +08:00
|
|
|
ps->ev_received = true;
|
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 20:20:27 +08:00
|
|
|
}
|
|
|
|
}
|
2013-03-10 18:45:54 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Enable focus tracking.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
opts_init_track_focus(session_t *ps) {
|
|
|
|
// Already tracking focus
|
|
|
|
if (ps->o.track_focus)
|
|
|
|
return;
|
|
|
|
|
|
|
|
ps->o.track_focus = true;
|
|
|
|
|
|
|
|
if (!ps->o.use_ewmh_active_win) {
|
|
|
|
// Start listening to FocusChange events
|
|
|
|
for (win *w = ps->list; w; w = w->next)
|
|
|
|
if (IsViewable == w->a.map_state)
|
|
|
|
XSelectInput(ps->dpy, w->id,
|
|
|
|
determine_evmask(ps, w->id, WIN_EVMODE_FRAME));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Recheck focus
|
|
|
|
recheck_focus(ps);
|
|
|
|
}
|
2013-05-20 18:04:40 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set no_fading_openclose option.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
opts_set_no_fading_openclose(session_t *ps, bool newval) {
|
|
|
|
if (newval != ps->o.no_fading_openclose) {
|
|
|
|
ps->o.no_fading_openclose = newval;
|
|
|
|
for (win *w = ps->list; w; w = w->next)
|
|
|
|
win_determine_fade(ps, w);
|
|
|
|
ps->ev_received = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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 20:20:27 +08:00
|
|
|
//!@}
|
|
|
|
#endif
|
|
|
|
|
2012-09-12 09:08:15 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
2003-11-24 07:20:42 +08:00
|
|
|
static int
|
2011-11-04 14:33:23 +08:00
|
|
|
ev_serial(XEvent *ev) {
|
2012-09-11 21:33:03 +08:00
|
|
|
if ((ev->type & 0x7f) != KeymapNotify) {
|
2011-11-04 14:33:23 +08:00
|
|
|
return ev->xany.serial;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
return NextRequest(ev->xany.display);
|
2003-11-24 07:20:42 +08:00
|
|
|
}
|
|
|
|
|
2012-11-03 05:51:40 +08:00
|
|
|
static const char *
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_name(session_t *ps, XEvent *ev) {
|
2011-11-04 17:18:10 +08:00
|
|
|
static char buf[128];
|
2011-11-04 14:33:23 +08:00
|
|
|
switch (ev->type & 0x7f) {
|
2012-11-03 05:51:40 +08:00
|
|
|
CASESTRRET(FocusIn);
|
|
|
|
CASESTRRET(FocusOut);
|
|
|
|
CASESTRRET(CreateNotify);
|
|
|
|
CASESTRRET(ConfigureNotify);
|
|
|
|
CASESTRRET(DestroyNotify);
|
|
|
|
CASESTRRET(MapNotify);
|
|
|
|
CASESTRRET(UnmapNotify);
|
|
|
|
CASESTRRET(ReparentNotify);
|
|
|
|
CASESTRRET(CirculateNotify);
|
|
|
|
CASESTRRET(Expose);
|
|
|
|
CASESTRRET(PropertyNotify);
|
|
|
|
CASESTRRET(ClientMessage);
|
2011-11-04 16:41:56 +08:00
|
|
|
default:
|
2013-09-04 22:00:51 +08:00
|
|
|
if (isdamagenotify(ps, ev))
|
2011-11-04 16:41:56 +08:00
|
|
|
return "Damage";
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->shape_exists && ev->type == ps->shape_event) {
|
2012-09-11 21:33:03 +08:00
|
|
|
return "ShapeNotify";
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
sprintf(buf, "Event %d", ev->type);
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
return buf;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2003-11-24 07:20:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static Window
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_window(session_t *ps, XEvent *ev) {
|
2011-11-04 14:33:23 +08:00
|
|
|
switch (ev->type) {
|
2012-09-11 21:33:03 +08:00
|
|
|
case FocusIn:
|
|
|
|
case FocusOut:
|
|
|
|
return ev->xfocus.window;
|
|
|
|
case CreateNotify:
|
|
|
|
return ev->xcreatewindow.window;
|
|
|
|
case ConfigureNotify:
|
|
|
|
return ev->xconfigure.window;
|
2012-09-19 20:49:16 +08:00
|
|
|
case DestroyNotify:
|
|
|
|
return ev->xdestroywindow.window;
|
2011-11-04 16:41:56 +08:00
|
|
|
case MapNotify:
|
|
|
|
return ev->xmap.window;
|
|
|
|
case UnmapNotify:
|
|
|
|
return ev->xunmap.window;
|
|
|
|
case ReparentNotify:
|
|
|
|
return ev->xreparent.window;
|
|
|
|
case CirculateNotify:
|
|
|
|
return ev->xcirculate.window;
|
2012-09-11 21:33:03 +08:00
|
|
|
case Expose:
|
|
|
|
return ev->xexpose.window;
|
|
|
|
case PropertyNotify:
|
|
|
|
return ev->xproperty.window;
|
2012-09-18 11:28:09 +08:00
|
|
|
case ClientMessage:
|
|
|
|
return ev->xclient.window;
|
2011-11-04 16:41:56 +08:00
|
|
|
default:
|
2013-09-04 22:00:51 +08:00
|
|
|
if (isdamagenotify(ps, ev)) {
|
2011-11-04 17:18:10 +08:00
|
|
|
return ((XDamageNotifyEvent *)ev)->drawable;
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->shape_exists && ev->type == ps->shape_event) {
|
2012-09-11 21:33:03 +08:00
|
|
|
return ((XShapeEvent *) ev)->window;
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
return 0;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2003-11-24 07:20:42 +08:00
|
|
|
}
|
2012-11-03 05:51:40 +08:00
|
|
|
|
|
|
|
static inline const char *
|
|
|
|
ev_focus_mode_name(XFocusChangeEvent* ev) {
|
|
|
|
switch (ev->mode) {
|
|
|
|
CASESTRRET(NotifyNormal);
|
|
|
|
CASESTRRET(NotifyWhileGrabbed);
|
|
|
|
CASESTRRET(NotifyGrab);
|
|
|
|
CASESTRRET(NotifyUngrab);
|
|
|
|
}
|
|
|
|
|
|
|
|
return "Unknown";
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline const char *
|
|
|
|
ev_focus_detail_name(XFocusChangeEvent* ev) {
|
|
|
|
switch (ev->detail) {
|
|
|
|
CASESTRRET(NotifyAncestor);
|
|
|
|
CASESTRRET(NotifyVirtual);
|
|
|
|
CASESTRRET(NotifyInferior);
|
|
|
|
CASESTRRET(NotifyNonlinear);
|
|
|
|
CASESTRRET(NotifyNonlinearVirtual);
|
|
|
|
CASESTRRET(NotifyPointer);
|
|
|
|
CASESTRRET(NotifyPointerRoot);
|
|
|
|
CASESTRRET(NotifyDetailNone);
|
|
|
|
}
|
|
|
|
|
|
|
|
return "Unknown";
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
ev_focus_report(XFocusChangeEvent* ev) {
|
|
|
|
printf(" { mode: %s, detail: %s }\n", ev_focus_mode_name(ev),
|
|
|
|
ev_focus_detail_name(ev));
|
|
|
|
}
|
|
|
|
|
2007-03-12 20:37:32 +08:00
|
|
|
#endif
|
2003-11-24 07:20:42 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Events ===
|
2012-02-09 17:37:46 +08:00
|
|
|
|
2012-11-03 22:02:07 +08:00
|
|
|
/**
|
|
|
|
* Determine whether we should respond to a <code>FocusIn/Out</code>
|
|
|
|
* event.
|
|
|
|
*/
|
2012-11-03 05:51:40 +08:00
|
|
|
inline static bool
|
|
|
|
ev_focus_accept(XFocusChangeEvent *ev) {
|
2013-09-18 21:50:57 +08:00
|
|
|
return NotifyNormal == ev->mode || NotifyUngrab == ev->mode;
|
2012-11-03 05:51:40 +08:00
|
|
|
}
|
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
static inline void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_focus_in(session_t *ps, XFocusChangeEvent *ev) {
|
2012-11-03 05:51:40 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
|
|
|
ev_focus_report(ev);
|
|
|
|
#endif
|
|
|
|
|
2012-11-03 22:02:07 +08:00
|
|
|
if (!ev_focus_accept(ev))
|
|
|
|
return;
|
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
win *w = find_win_all(ps, ev->window);
|
|
|
|
if (w)
|
|
|
|
win_set_focused(ps, w, true);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_focus_out(session_t *ps, XFocusChangeEvent *ev) {
|
2012-11-03 05:51:40 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
|
|
|
ev_focus_report(ev);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!ev_focus_accept(ev))
|
2012-02-09 17:37:46 +08:00
|
|
|
return;
|
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
win *w = find_win_all(ps, ev->window);
|
|
|
|
if (w)
|
|
|
|
win_set_focused(ps, w, false);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_create_notify(session_t *ps, XCreateWindowEvent *ev) {
|
|
|
|
assert(ev->parent == ps->root);
|
2012-11-21 09:15:49 +08:00
|
|
|
add_win(ps, ev->window, 0);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_configure_notify(session_t *ps, XConfigureEvent *ev) {
|
2012-09-12 09:08:15 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
2012-11-03 05:51:40 +08:00
|
|
|
printf(" { send_event: %d, "
|
2012-09-13 13:58:05 +08:00
|
|
|
" above: %#010lx, "
|
|
|
|
" override_redirect: %d }\n",
|
|
|
|
ev->send_event, ev->above, ev->override_redirect);
|
2012-09-11 21:33:03 +08:00
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
configure_win(ps, ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_destroy_notify(session_t *ps, XDestroyWindowEvent *ev) {
|
|
|
|
destroy_win(ps, ev->window);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_map_notify(session_t *ps, XMapEvent *ev) {
|
2012-11-21 09:15:49 +08:00
|
|
|
map_win(ps, ev->window);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_unmap_notify(session_t *ps, XUnmapEvent *ev) {
|
2013-01-29 09:57:04 +08:00
|
|
|
win *w = find_win(ps, ev->window);
|
|
|
|
|
|
|
|
if (w)
|
|
|
|
unmap_win(ps, w);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_reparent_notify(session_t *ps, XReparentEvent *ev) {
|
2013-03-03 21:53:08 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
|
|
|
printf_dbg(" { new_parent: %#010lx, override_redirect: %d }\n",
|
|
|
|
ev->parent, ev->override_redirect);
|
|
|
|
#endif
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ev->parent == ps->root) {
|
2012-11-21 09:15:49 +08:00
|
|
|
add_win(ps, ev->window, 0);
|
2012-02-09 17:37:46 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
destroy_win(ps, ev->window);
|
2012-12-07 22:38:10 +08:00
|
|
|
|
2012-09-13 22:30:18 +08:00
|
|
|
// Reset event mask in case something wrong happens
|
2012-11-19 09:46:07 +08:00
|
|
|
XSelectInput(ps->dpy, ev->window,
|
|
|
|
determine_evmask(ps, ev->window, WIN_EVMODE_UNKNOWN));
|
2012-12-07 22:38:10 +08:00
|
|
|
|
|
|
|
// Check if the window is an undetected client window
|
|
|
|
// Firstly, check if it's a known client window
|
|
|
|
if (!find_toplevel(ps, ev->window)) {
|
|
|
|
// If not, look for its frame window
|
|
|
|
win *w_top = find_toplevel2(ps, ev->parent);
|
2012-12-08 11:10:08 +08:00
|
|
|
// If found, and the client window has not been determined, or its
|
|
|
|
// frame may not have a correct client, continue
|
|
|
|
if (w_top && (!w_top->client_win
|
|
|
|
|| w_top->client_win == w_top->id)) {
|
2012-12-07 22:38:10 +08:00
|
|
|
// If it has WM_STATE, mark it the client window
|
|
|
|
if (wid_has_prop(ps, ev->window, ps->atom_client)) {
|
|
|
|
w_top->wmwin = false;
|
|
|
|
win_unmark_client(ps, w_top);
|
|
|
|
win_mark_client(ps, w_top, ev->window);
|
|
|
|
}
|
|
|
|
// Otherwise, watch for WM_STATE on it
|
|
|
|
else {
|
|
|
|
XSelectInput(ps->dpy, ev->window,
|
|
|
|
determine_evmask(ps, ev->window, WIN_EVMODE_UNKNOWN)
|
|
|
|
| PropertyChangeMask);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_circulate_notify(session_t *ps, XCirculateEvent *ev) {
|
|
|
|
circulate_win(ps, ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_expose(session_t *ps, XExposeEvent *ev) {
|
|
|
|
if (ev->window == ps->root || (ps->overlay && ev->window == ps->overlay)) {
|
2012-02-09 17:37:46 +08:00
|
|
|
int more = ev->count + 1;
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->n_expose == ps->size_expose) {
|
|
|
|
if (ps->expose_rects) {
|
|
|
|
ps->expose_rects = realloc(ps->expose_rects,
|
|
|
|
(ps->size_expose + more) * sizeof(XRectangle));
|
|
|
|
ps->size_expose += more;
|
2012-02-09 17:37:46 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->expose_rects = malloc(more * sizeof(XRectangle));
|
|
|
|
ps->size_expose = more;
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->expose_rects[ps->n_expose].x = ev->x;
|
|
|
|
ps->expose_rects[ps->n_expose].y = ev->y;
|
|
|
|
ps->expose_rects[ps->n_expose].width = ev->width;
|
|
|
|
ps->expose_rects[ps->n_expose].height = ev->height;
|
|
|
|
ps->n_expose++;
|
2012-02-09 17:37:46 +08:00
|
|
|
|
|
|
|
if (ev->count == 0) {
|
2012-11-19 09:46:07 +08:00
|
|
|
expose_root(ps, ps->expose_rects, ps->n_expose);
|
|
|
|
ps->n_expose = 0;
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-04 18:11:08 +08:00
|
|
|
/**
|
|
|
|
* Update current active window based on EWMH _NET_ACTIVE_WIN.
|
|
|
|
*
|
|
|
|
* Does not change anything if we fail to get the attribute or the window
|
|
|
|
* returned could not be found.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
update_ewmh_active_win(session_t *ps) {
|
2012-11-04 18:11:08 +08:00
|
|
|
// Search for the window
|
2013-09-18 21:50:57 +08:00
|
|
|
Window wid = wid_get_prop_window(ps, ps->root, ps->atom_ewmh_active_win);
|
|
|
|
win *w = find_win_all(ps, wid);
|
2012-11-04 18:11:08 +08:00
|
|
|
|
2013-09-18 21:50:57 +08:00
|
|
|
// Mark the window focused. No need to unfocus the previous one.
|
|
|
|
if (w) win_set_focused(ps, w, true);
|
2012-11-04 18:11:08 +08:00
|
|
|
}
|
|
|
|
|
2012-02-09 17:37:46 +08:00
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_property_notify(session_t *ps, XPropertyEvent *ev) {
|
2013-03-01 12:41:16 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
|
|
|
{
|
|
|
|
// Print out changed atom
|
|
|
|
char *name = XGetAtomName(ps->dpy, ev->atom);
|
|
|
|
printf_dbg(" { atom = %s }\n", name);
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(name);
|
2013-03-01 12:41:16 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->root == ev->window) {
|
|
|
|
if (ps->o.track_focus && ps->o.use_ewmh_active_win
|
|
|
|
&& ps->atom_ewmh_active_win == ev->atom) {
|
|
|
|
update_ewmh_active_win(ps);
|
2012-11-04 18:11:08 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
// Destroy the root "image" if the wallpaper probably changed
|
2012-11-19 09:46:07 +08:00
|
|
|
for (int p = 0; background_props_str[p]; p++) {
|
2013-01-09 20:25:01 +08:00
|
|
|
if (ev->atom == get_atom(ps, background_props_str[p])) {
|
2012-11-19 09:46:07 +08:00
|
|
|
root_damaged(ps);
|
2012-11-04 18:11:08 +08:00
|
|
|
break;
|
|
|
|
}
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
2012-11-04 18:11:08 +08:00
|
|
|
|
2012-10-24 10:09:59 +08:00
|
|
|
// Unconcerned about any other proprties on root window
|
|
|
|
return;
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
2012-12-07 22:38:10 +08:00
|
|
|
// If WM_STATE changes
|
|
|
|
if (ev->atom == ps->atom_client) {
|
|
|
|
// Check whether it could be a client window
|
|
|
|
if (!find_toplevel(ps, ev->window)) {
|
|
|
|
// Reset event mask anyway
|
|
|
|
XSelectInput(ps->dpy, ev->window,
|
|
|
|
determine_evmask(ps, ev->window, WIN_EVMODE_UNKNOWN));
|
|
|
|
|
|
|
|
win *w_top = find_toplevel2(ps, ev->window);
|
2012-12-10 10:31:24 +08:00
|
|
|
// Initialize client_win as early as possible
|
|
|
|
if (w_top && (!w_top->client_win || w_top->client_win == w_top->id)
|
2012-12-07 22:38:10 +08:00
|
|
|
&& wid_has_prop(ps, ev->window, ps->atom_client)) {
|
|
|
|
w_top->wmwin = false;
|
|
|
|
win_unmark_client(ps, w_top);
|
|
|
|
win_mark_client(ps, w_top, ev->window);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-15 11:07:49 +08:00
|
|
|
// If _NET_WM_WINDOW_TYPE changes... God knows why this would happen, but
|
|
|
|
// there are always some stupid applications. (#144)
|
|
|
|
if (ev->atom == ps->atom_win_type) {
|
|
|
|
win *w = NULL;
|
|
|
|
if ((w = find_toplevel(ps, ev->window)))
|
|
|
|
win_upd_wintype(ps, w);
|
|
|
|
}
|
|
|
|
|
2012-10-03 21:13:34 +08:00
|
|
|
// If _NET_WM_OPACITY changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ev->atom == ps->atom_opacity) {
|
2012-10-03 21:13:34 +08:00
|
|
|
win *w = NULL;
|
2012-11-19 09:46:07 +08:00
|
|
|
if ((w = find_win(ps, ev->window)))
|
|
|
|
w->opacity_prop = wid_get_opacity_prop(ps, w->id, OPAQUE);
|
|
|
|
else if (ps->o.detect_client_opacity
|
|
|
|
&& (w = find_toplevel(ps, ev->window)))
|
|
|
|
w->opacity_prop_client = wid_get_opacity_prop(ps, w->client_win,
|
2012-10-03 21:13:34 +08:00
|
|
|
OPAQUE);
|
2012-02-09 17:37:46 +08:00
|
|
|
if (w) {
|
2012-11-28 11:44:00 +08:00
|
|
|
w->flags |= WFLAG_OPCT_CHANGE;
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
// If frame extents property changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.frame_opacity && ev->atom == ps->atom_frame_extents) {
|
|
|
|
win *w = find_toplevel(ps, ev->window);
|
2012-02-09 17:37:46 +08:00
|
|
|
if (w) {
|
2012-11-19 09:46:07 +08:00
|
|
|
get_frame_extents(ps, w, ev->window);
|
2012-09-20 13:50:27 +08:00
|
|
|
// If frame extents change, the window needs repaint
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage_win(ps, w);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
|
|
|
// If name changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.track_wdata
|
|
|
|
&& (ps->atom_name == ev->atom || ps->atom_name_ewmh == ev->atom)) {
|
|
|
|
win *w = find_toplevel(ps, ev->window);
|
2012-11-28 11:44:00 +08:00
|
|
|
if (w && 1 == win_get_name(ps, w)) {
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
win_on_factor_change(ps, w);
|
2012-11-28 11:44:00 +08:00
|
|
|
}
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// If class changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.track_wdata && ps->atom_class == ev->atom) {
|
|
|
|
win *w = find_toplevel(ps, ev->window);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
if (w) {
|
2012-11-19 09:46:07 +08:00
|
|
|
win_get_class(ps, w);
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
win_on_factor_change(ps, w);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
}
|
|
|
|
}
|
2012-11-09 11:35:40 +08:00
|
|
|
|
2012-12-05 18:12:21 +08:00
|
|
|
// If role changes
|
|
|
|
if (ps->o.track_wdata && ps->atom_role == ev->atom) {
|
|
|
|
win *w = find_toplevel(ps, ev->window);
|
|
|
|
if (w && 1 == win_get_role(ps, w)) {
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
win_on_factor_change(ps, w);
|
2012-12-05 18:12:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-09 11:35:40 +08:00
|
|
|
// If _COMPTON_SHADOW changes
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.respect_prop_shadow && ps->atom_compton_shadow == ev->atom) {
|
|
|
|
win *w = find_win(ps, ev->window);
|
2012-11-09 11:35:40 +08:00
|
|
|
if (w)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
win_update_prop_shadow(ps, w);
|
2012-11-09 11:35:40 +08:00
|
|
|
}
|
2012-12-12 12:01:51 +08:00
|
|
|
|
|
|
|
// If a leader property changes
|
|
|
|
if ((ps->o.detect_transient && ps->atom_transient == ev->atom)
|
|
|
|
|| (ps->o.detect_client_leader && ps->atom_client_leader == ev->atom)) {
|
|
|
|
win *w = find_toplevel(ps, ev->window);
|
|
|
|
if (w) {
|
|
|
|
win_update_leader(ps, w);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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 20:20:27 +08:00
|
|
|
// Check for other atoms we are tracking
|
|
|
|
for (latom_t *platom = ps->track_atom_lst; platom; platom = platom->next) {
|
|
|
|
if (platom->atom == ev->atom) {
|
|
|
|
win *w = find_win(ps, ev->window);
|
|
|
|
if (!w)
|
|
|
|
w = find_toplevel(ps, ev->window);
|
|
|
|
if (w)
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
win_on_factor_change(ps, w);
|
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 20:20:27 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_damage_notify(session_t *ps, XDamageNotifyEvent *ev) {
|
|
|
|
damage_win(ps, ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
2012-09-13 13:58:05 +08:00
|
|
|
inline static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_shape_notify(session_t *ps, XShapeEvent *ev) {
|
|
|
|
win *w = find_win(ps, ev->window);
|
2012-10-31 08:54:09 +08:00
|
|
|
if (!w || IsUnmapped == w->a.map_state) return;
|
2012-09-11 21:33:03 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Empty border_size may indicated an
|
|
|
|
* unmapped/destroyed window, in which case
|
|
|
|
* seemingly BadRegion errors would be triggered
|
|
|
|
* if we attempt to rebuild border_size
|
|
|
|
*/
|
|
|
|
if (w->border_size) {
|
|
|
|
// Mark the old border_size as damaged
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage(ps, w->border_size);
|
2012-09-11 21:33:03 +08:00
|
|
|
|
2012-12-15 20:07:45 +08:00
|
|
|
w->border_size = border_size(ps, w, true);
|
2012-09-11 21:33:03 +08:00
|
|
|
|
|
|
|
// Mark the new border_size as damaged
|
2012-11-19 09:46:07 +08:00
|
|
|
add_damage(ps, copy_region(ps, w->border_size));
|
2012-09-11 21:33:03 +08:00
|
|
|
}
|
2012-10-01 10:34:40 +08:00
|
|
|
|
|
|
|
// Redo bounding shape detection and rounded corner detection
|
2012-11-19 09:46:07 +08:00
|
|
|
win_update_shape(ps, w);
|
2012-11-08 19:39:13 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
update_reg_ignore_expire(ps, w);
|
2012-09-11 21:33:03 +08:00
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
/**
|
|
|
|
* Handle ScreenChangeNotify events from X RandR extension.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-21 09:15:49 +08:00
|
|
|
ev_screen_change_notify(session_t *ps,
|
|
|
|
XRRScreenChangeNotifyEvent __attribute__((unused)) *ev) {
|
2013-08-28 21:47:16 +08:00
|
|
|
if (ps->o.xinerama_shadow_crop)
|
|
|
|
cxinerama_upd_scrs(ps);
|
|
|
|
|
|
|
|
if (ps->o.sw_opti && !ps->o.refresh_rate) {
|
2012-11-19 09:46:07 +08:00
|
|
|
update_refresh_rate(ps);
|
|
|
|
if (!ps->refresh_rate) {
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
fprintf(stderr, "ev_screen_change_notify(): Refresh rate detection "
|
2013-08-28 21:47:16 +08:00
|
|
|
"failed, --sw-opti disabled.");
|
|
|
|
ps->o.sw_opti = false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-14 21:34:51 +08:00
|
|
|
#if defined(DEBUG_EVENTS) || defined(DEBUG_RESTACK)
|
|
|
|
/**
|
|
|
|
* Get a window's name from window ID.
|
|
|
|
*/
|
|
|
|
static bool
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_window_name(session_t *ps, Window wid, char **name) {
|
2012-11-14 21:34:51 +08:00
|
|
|
bool to_free = false;
|
|
|
|
|
|
|
|
*name = "";
|
|
|
|
if (wid) {
|
|
|
|
*name = "(Failed to get title)";
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->root == wid)
|
2012-11-14 21:34:51 +08:00
|
|
|
*name = "(Root window)";
|
2012-11-19 09:46:07 +08:00
|
|
|
else if (ps->overlay == wid)
|
2012-11-14 21:34:51 +08:00
|
|
|
*name = "(Overlay)";
|
|
|
|
else {
|
2012-11-19 09:46:07 +08:00
|
|
|
win *w = find_win(ps, wid);
|
2012-11-14 21:34:51 +08:00
|
|
|
if (!w)
|
2012-11-19 09:46:07 +08:00
|
|
|
w = find_toplevel(ps, wid);
|
2012-11-14 21:34:51 +08:00
|
|
|
|
|
|
|
if (w && w->name)
|
|
|
|
*name = w->name;
|
|
|
|
else if (!(w && w->client_win
|
2012-11-19 09:46:07 +08:00
|
|
|
&& (to_free = wid_get_name(ps, w->client_win, name))))
|
|
|
|
to_free = wid_get_name(ps, wid, name);
|
2012-11-14 21:34:51 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return to_free;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_handle(session_t *ps, XEvent *ev) {
|
2012-02-09 17:37:46 +08:00
|
|
|
if ((ev->type & 0x7f) != KeymapNotify) {
|
2012-11-19 09:46:07 +08:00
|
|
|
discard_ignore(ps, ev->xany.serial);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
|
2012-09-12 09:08:15 +08:00
|
|
|
#ifdef DEBUG_EVENTS
|
2013-09-04 22:00:51 +08:00
|
|
|
if (!isdamagenotify(ps, ev)) {
|
2012-11-19 09:46:07 +08:00
|
|
|
Window wid = ev_window(ps, ev);
|
2012-11-14 21:34:51 +08:00
|
|
|
char *window_name = NULL;
|
2012-11-19 09:46:07 +08:00
|
|
|
bool to_free = false;
|
2012-11-14 21:34:51 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
to_free = ev_window_name(ps, wid, &window_name);
|
2012-09-13 13:58:05 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
print_timestamp(ps);
|
2012-09-11 21:33:03 +08:00
|
|
|
printf("event %10.10s serial %#010x window %#010lx \"%s\"\n",
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_name(ps, ev), ev_serial(ev), wid, window_name);
|
2012-09-13 13:58:05 +08:00
|
|
|
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
if (to_free) {
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(window_name);
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
window_name = NULL;
|
|
|
|
}
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2012-02-09 17:37:46 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
switch (ev->type) {
|
|
|
|
case FocusIn:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_focus_in(ps, (XFocusChangeEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case FocusOut:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_focus_out(ps, (XFocusChangeEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case CreateNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_create_notify(ps, (XCreateWindowEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case ConfigureNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_configure_notify(ps, (XConfigureEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case DestroyNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_destroy_notify(ps, (XDestroyWindowEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case MapNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_map_notify(ps, (XMapEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case UnmapNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_unmap_notify(ps, (XUnmapEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case ReparentNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_reparent_notify(ps, (XReparentEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case CirculateNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_circulate_notify(ps, (XCirculateEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case Expose:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_expose(ps, (XExposeEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
case PropertyNotify:
|
2012-11-19 09:46:07 +08:00
|
|
|
ev_property_notify(ps, (XPropertyEvent *)ev);
|
2012-02-09 17:37:46 +08:00
|
|
|
break;
|
|
|
|
default:
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->shape_exists && ev->type == ps->shape_event) {
|
|
|
|
ev_shape_notify(ps, (XShapeEvent *) ev);
|
2012-09-11 21:33:03 +08:00
|
|
|
break;
|
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->randr_exists && ev->type == (ps->randr_event + RRScreenChangeNotify)) {
|
|
|
|
ev_screen_change_notify(ps, (XRRScreenChangeNotifyEvent *) ev);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
break;
|
|
|
|
}
|
2013-09-04 22:00:51 +08:00
|
|
|
if (isdamagenotify(ps, ev)) {
|
|
|
|
ev_damage_notify(ps, (XDamageNotifyEvent *) ev);
|
|
|
|
break;
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// === Main ===
|
2012-02-09 17:37:46 +08:00
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
/**
|
|
|
|
* Print usage text and exit.
|
|
|
|
*/
|
2012-02-27 12:00:12 +08:00
|
|
|
static void
|
2013-05-12 18:21:16 +08:00
|
|
|
usage(int ret) {
|
2013-01-29 09:57:04 +08:00
|
|
|
#define WARNING_DISABLED " (DISABLED AT COMPILE TIME)"
|
|
|
|
#define WARNING
|
2012-11-21 09:15:49 +08:00
|
|
|
const static char *usage_text =
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
"compton (" COMPTON_VERSION ")\n"
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
"usage: compton [options]\n"
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
"Options:\n"
|
|
|
|
"\n"
|
2012-02-27 20:49:50 +08:00
|
|
|
"-d display\n"
|
|
|
|
" Which display should be managed.\n"
|
|
|
|
"-r radius\n"
|
|
|
|
" The blur radius for shadows. (default 12)\n"
|
|
|
|
"-o opacity\n"
|
|
|
|
" The translucency for shadows. (default .75)\n"
|
|
|
|
"-l left-offset\n"
|
|
|
|
" The left offset for shadows. (default -15)\n"
|
|
|
|
"-t top-offset\n"
|
|
|
|
" The top offset for shadows. (default -15)\n"
|
|
|
|
"-I fade-in-step\n"
|
|
|
|
" Opacity change between steps while fading in. (default 0.028)\n"
|
|
|
|
"-O fade-out-step\n"
|
|
|
|
" Opacity change between steps while fading out. (default 0.03)\n"
|
|
|
|
"-D fade-delta-time\n"
|
|
|
|
" The time between steps in a fade in milliseconds. (default 10)\n"
|
|
|
|
"-m opacity\n"
|
|
|
|
" The opacity for menus. (default 1.0)\n"
|
|
|
|
"-c\n"
|
|
|
|
" Enabled client-side shadows on windows.\n"
|
|
|
|
"-C\n"
|
|
|
|
" Avoid drawing shadows on dock/panel windows.\n"
|
|
|
|
"-z\n"
|
2012-03-18 00:29:01 +08:00
|
|
|
" Zero the part of the shadow's mask behind the window (experimental).\n"
|
2012-02-27 20:49:50 +08:00
|
|
|
"-f\n"
|
2012-09-26 21:40:48 +08:00
|
|
|
" Fade windows in/out when opening/closing and when opacity\n"
|
|
|
|
" changes, unless --no-fading-openclose is used.\n"
|
2012-02-27 20:49:50 +08:00
|
|
|
"-F\n"
|
2012-09-26 21:40:48 +08:00
|
|
|
" Equals -f. Deprecated.\n"
|
2012-02-27 20:49:50 +08:00
|
|
|
"-i opacity\n"
|
|
|
|
" Opacity of inactive windows. (0.1 - 1.0)\n"
|
|
|
|
"-e opacity\n"
|
|
|
|
" Opacity of window titlebars and borders. (0.1 - 1.0)\n"
|
|
|
|
"-G\n"
|
|
|
|
" Don't draw shadows on DND windows\n"
|
2012-10-22 21:20:43 +08:00
|
|
|
"-b\n"
|
2012-02-27 20:49:50 +08:00
|
|
|
" Daemonize process.\n"
|
|
|
|
"-S\n"
|
2012-09-11 21:57:50 +08:00
|
|
|
" Enable synchronous operation (for debugging).\n"
|
2012-09-25 10:19:20 +08:00
|
|
|
"--config path\n"
|
|
|
|
" Look for configuration file at the path.\n"
|
2012-09-11 21:57:50 +08:00
|
|
|
"--shadow-red value\n"
|
|
|
|
" Red color value of shadow (0.0 - 1.0, defaults to 0).\n"
|
|
|
|
"--shadow-green value\n"
|
|
|
|
" Green color value of shadow (0.0 - 1.0, defaults to 0).\n"
|
|
|
|
"--shadow-blue value\n"
|
|
|
|
" Blue color value of shadow (0.0 - 1.0, defaults to 0).\n"
|
2012-09-11 22:22:58 +08:00
|
|
|
"--inactive-opacity-override\n"
|
|
|
|
" Inactive opacity set by -i overrides value of _NET_WM_OPACITY.\n"
|
2012-09-12 10:52:52 +08:00
|
|
|
"--inactive-dim value\n"
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
" Dim inactive windows. (0.0 - 1.0, defaults to 0)\n"
|
2013-03-30 11:46:32 +08:00
|
|
|
"--active-opacity opacity\n"
|
|
|
|
" Default opacity for active windows. (0.0 - 1.0)\n"
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
"--mark-wmwin-focused\n"
|
|
|
|
" Try to detect WM windows and mark them as active.\n"
|
|
|
|
"--shadow-exclude condition\n"
|
|
|
|
" Exclude conditions for shadows.\n"
|
2013-04-21 22:30:22 +08:00
|
|
|
"--fade-exclude condition\n"
|
|
|
|
" Exclude conditions for fading.\n"
|
2012-09-26 19:48:36 +08:00
|
|
|
"--mark-ovredir-focused\n"
|
2012-11-03 22:02:07 +08:00
|
|
|
" Mark windows that have no WM frame as active.\n"
|
2012-09-26 21:40:48 +08:00
|
|
|
"--no-fading-openclose\n"
|
|
|
|
" Do not fade on window open/close.\n"
|
2012-10-01 10:34:40 +08:00
|
|
|
"--shadow-ignore-shaped\n"
|
|
|
|
" Do not paint shadows on shaped windows.\n"
|
|
|
|
"--detect-rounded-corners\n"
|
|
|
|
" Try to detect windows with rounded corners and don't consider\n"
|
|
|
|
" them shaped windows.\n"
|
2012-10-03 21:13:34 +08:00
|
|
|
"--detect-client-opacity\n"
|
|
|
|
" Detect _NET_WM_OPACITY on client windows, useful for window\n"
|
|
|
|
" managers not passing _NET_WM_OPACITY of client windows to frame\n"
|
|
|
|
" windows.\n"
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
"--refresh-rate val\n"
|
|
|
|
" Specify refresh rate of the screen. If not specified or 0, compton\n"
|
|
|
|
" will try detecting this with X RandR extension.\n"
|
|
|
|
"--vsync vsync-method\n"
|
2013-03-15 23:16:23 +08:00
|
|
|
" Set VSync method. There are up to 4 VSync methods currently available.\n"
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
" none = No VSync\n"
|
2013-01-29 09:57:04 +08:00
|
|
|
#undef WARNING
|
|
|
|
#ifndef CONFIG_VSYNC_DRM
|
|
|
|
#define WARNING WARNING_DISABLED
|
|
|
|
#else
|
|
|
|
#define WARNING
|
|
|
|
#endif
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
" drm = VSync with DRM_IOCTL_WAIT_VBLANK. May only work on some\n"
|
2013-03-15 23:16:23 +08:00
|
|
|
" drivers." WARNING "\n"
|
2013-01-29 09:57:04 +08:00
|
|
|
#undef WARNING
|
|
|
|
#ifndef CONFIG_VSYNC_OPENGL
|
|
|
|
#define WARNING WARNING_DISABLED
|
|
|
|
#else
|
|
|
|
#define WARNING
|
2013-01-29 00:08:34 +08:00
|
|
|
#endif
|
2013-04-25 09:27:14 +08:00
|
|
|
" opengl = Try to VSync with SGI_video_sync OpenGL extension. Only\n"
|
2013-03-15 23:16:23 +08:00
|
|
|
" work on some drivers." WARNING"\n"
|
2013-01-31 22:53:44 +08:00
|
|
|
" opengl-oml = Try to VSync with OML_sync_control OpenGL extension.\n"
|
|
|
|
" Only work on some drivers. Experimental." WARNING"\n"
|
2013-03-15 23:16:23 +08:00
|
|
|
" opengl-swc = Try to VSync with SGI_swap_control OpenGL extension.\n"
|
2013-03-16 22:54:43 +08:00
|
|
|
" Only work on some drivers. Works only with GLX backend.\n"
|
2013-03-15 23:16:23 +08:00
|
|
|
" Does not actually control paint timing, only buffer swap is\n"
|
|
|
|
" affected, so it doesn't have the effect of --sw-opti unlike\n"
|
2013-07-30 22:24:11 +08:00
|
|
|
" other methods." WARNING "\n"
|
2013-03-23 22:06:41 +08:00
|
|
|
" opengl-mswc = Try to VSync with MESA_swap_control OpenGL\n"
|
|
|
|
" extension. Basically the same as opengl-swc above, except the\n"
|
|
|
|
" extension we use." WARNING "\n"
|
2013-07-30 22:24:11 +08:00
|
|
|
"--vsync-aggressive\n"
|
|
|
|
" Attempt to send painting request before VBlank and do XFlush()\n"
|
|
|
|
" during VBlank. This switch may be lifted out at any moment.\n"
|
2012-10-13 18:46:59 +08:00
|
|
|
"--alpha-step val\n"
|
2013-07-30 22:24:11 +08:00
|
|
|
" X Render backend: Step for pregenerating alpha pictures. \n"
|
|
|
|
" 0.01 - 1.0. Defaults to 0.03.\n"
|
2012-10-23 13:42:20 +08:00
|
|
|
"--dbe\n"
|
|
|
|
" Enable DBE painting mode, intended to use with VSync to\n"
|
|
|
|
" (hopefully) eliminate tearing.\n"
|
2012-10-24 10:09:59 +08:00
|
|
|
"--paint-on-overlay\n"
|
|
|
|
" Painting on X Composite overlay window.\n"
|
2012-10-26 11:12:28 +08:00
|
|
|
"--sw-opti\n"
|
|
|
|
" Limit compton to repaint at most once every 1 / refresh_rate\n"
|
2013-07-30 22:24:11 +08:00
|
|
|
" second to boost performance.\n"
|
2012-11-04 18:11:08 +08:00
|
|
|
"--use-ewmh-active-win\n"
|
|
|
|
" Use _NET_WM_ACTIVE_WINDOW on the root window to determine which\n"
|
|
|
|
" window is focused instead of using FocusIn/Out events.\n"
|
2012-11-19 09:46:07 +08:00
|
|
|
"--respect-prop-shadow\n"
|
2012-11-09 11:35:40 +08:00
|
|
|
" Respect _COMPTON_SHADOW. This a prototype-level feature, which\n"
|
|
|
|
" you must not rely on.\n"
|
2012-11-09 21:44:02 +08:00
|
|
|
"--unredir-if-possible\n"
|
|
|
|
" Unredirect all windows if a full-screen opaque window is\n"
|
|
|
|
" detected, to maximize performance for full-screen windows.\n"
|
2013-09-04 22:00:51 +08:00
|
|
|
"--unredir-if-possible-delay ms\n"
|
|
|
|
" Delay before unredirecting the window, in milliseconds.\n"
|
|
|
|
" Defaults to 0.\n"
|
|
|
|
"--unredir-if-possible-exclude condition\n"
|
|
|
|
" Conditions of windows that shouldn't be considered full-screen\n"
|
|
|
|
" for unredirecting screen.\n"
|
2012-11-28 11:44:00 +08:00
|
|
|
"--focus-exclude condition\n"
|
|
|
|
" Specify a list of conditions of windows that should always be\n"
|
|
|
|
" considered focused.\n"
|
2012-12-05 12:43:34 +08:00
|
|
|
"--inactive-dim-fixed\n"
|
|
|
|
" Use fixed inactive dim value.\n"
|
2012-12-12 12:01:51 +08:00
|
|
|
"--detect-transient\n"
|
|
|
|
" Use WM_TRANSIENT_FOR to group windows, and consider windows in\n"
|
|
|
|
" the same group focused at the same time.\n"
|
|
|
|
"--detect-client-leader\n"
|
|
|
|
" Use WM_CLIENT_LEADER to group windows, and consider windows in\n"
|
|
|
|
" the same group focused at the same time. WM_TRANSIENT_FOR has\n"
|
|
|
|
" higher priority if --detect-transient is enabled, too.\n"
|
2012-12-14 20:32:46 +08:00
|
|
|
"--blur-background\n"
|
|
|
|
" Blur background of semi-transparent / ARGB windows. Bad in\n"
|
|
|
|
" performance. The switch name may change without prior\n"
|
|
|
|
" notifications.\n"
|
|
|
|
"--blur-background-frame\n"
|
|
|
|
" Blur background of windows when the window frame is not opaque.\n"
|
|
|
|
" Implies --blur-background. Bad in performance. The switch name\n"
|
|
|
|
" may change.\n"
|
2012-12-15 20:07:45 +08:00
|
|
|
"--blur-background-fixed\n"
|
|
|
|
" Use fixed blur strength instead of adjusting according to window\n"
|
|
|
|
" opacity.\n"
|
2013-04-25 22:23:35 +08:00
|
|
|
"--blur-kern matrix\n"
|
|
|
|
" Specify the blur convolution kernel, with the following format:\n"
|
|
|
|
" WIDTH,HEIGHT,ELE1,ELE2,ELE3,ELE4,ELE5...\n"
|
|
|
|
" The element in the center must not be included, it will be forever\n"
|
|
|
|
" 1.0 or changing based on opacity, depending on whether you have\n"
|
|
|
|
" --blur-background-fixed.\n"
|
|
|
|
" A 7x7 Guassian blur kernel looks like:\n"
|
|
|
|
" --blur-kern '7,7,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000102,0.003494,0.029143,0.059106,0.029143,0.003494,0.000102,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.001723,0.059106,0.493069,0.493069,0.059106,0.001723,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000102,0.003494,0.029143,0.059106,0.029143,0.003494,0.000102,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003'\n"
|
2013-05-20 18:04:40 +08:00
|
|
|
" Up to 4 blur kernels may be specified, separated with semicolon, for\n"
|
|
|
|
" multi-pass blur.\n"
|
2013-04-29 22:42:46 +08:00
|
|
|
" May also be one the predefined kernels: 3x3box (default), 5x5box,\n"
|
|
|
|
" 7x7box, 3x3gaussian, 5x5gaussian, 7x7gaussian, 9x9gaussian,\n"
|
|
|
|
" 11x11gaussian.\n"
|
2013-03-25 11:36:39 +08:00
|
|
|
"--blur-background-exclude condition\n"
|
|
|
|
" Exclude conditions for background blur.\n"
|
2013-04-27 11:43:11 +08:00
|
|
|
"--resize-damage integer\n"
|
|
|
|
" Resize damaged region by a specific number of pixels. A positive\n"
|
|
|
|
" value enlarges it while a negative one shrinks it. Useful for\n"
|
|
|
|
" fixing the line corruption issues of blur. May or may not\n"
|
|
|
|
" work with --glx-no-stencil. Shrinking doesn't function correctly.\n"
|
2013-01-12 22:21:35 +08:00
|
|
|
"--invert-color-include condition\n"
|
|
|
|
" Specify a list of conditions of windows that should be painted with\n"
|
|
|
|
" inverted color. Resource-hogging, and is not well tested.\n"
|
2013-05-21 09:18:41 +08:00
|
|
|
"--opacity-rule opacity:condition\n"
|
|
|
|
" Specify a list of opacity rules, in the format \"PERCENT:PATTERN\",\n"
|
|
|
|
" like \'50:name *= \"Firefox\"'. compton-trans is recommended over\n"
|
|
|
|
" this. Note we do not distinguish 100% and unset, and we don't make\n"
|
|
|
|
" any guarantee about possible conflicts with other programs that set\n"
|
|
|
|
" _NET_WM_WINDOW_OPACITY on frame or client windows.\n"
|
2013-06-09 17:06:35 +08:00
|
|
|
"--shadow-exclude-reg geometry\n"
|
|
|
|
" Specify a X geometry that describes the region in which shadow\n"
|
|
|
|
" should not be painted in, such as a dock window region.\n"
|
|
|
|
" Use --shadow-exclude-reg \'x10+0-0\', for example, if the 10 pixels\n"
|
|
|
|
" on the bottom of the screen should not have shadows painted on.\n"
|
2013-08-22 21:15:04 +08:00
|
|
|
#undef WARNING
|
|
|
|
#ifndef CONFIG_XINERAMA
|
|
|
|
#define WARNING WARNING_DISABLED
|
|
|
|
#else
|
|
|
|
#define WARNING
|
|
|
|
#endif
|
|
|
|
"--xinerama-shadow-crop\n"
|
|
|
|
" Crop shadow of a window fully on a particular Xinerama screen to the\n"
|
|
|
|
" screen." WARNING "\n"
|
2013-03-16 22:54:43 +08:00
|
|
|
"--backend backend\n"
|
|
|
|
" Choose backend. Possible choices are xrender and glx" WARNING ".\n"
|
2013-03-17 12:14:00 +08:00
|
|
|
"--glx-no-stencil\n"
|
2013-03-19 20:58:55 +08:00
|
|
|
" GLX backend: Avoid using stencil buffer. Might cause issues\n"
|
2013-04-06 20:21:38 +08:00
|
|
|
" when rendering transparent content. My tests show a 15% performance\n"
|
|
|
|
" boost.\n"
|
2013-03-19 20:58:55 +08:00
|
|
|
"--glx-copy-from-front\n"
|
|
|
|
" GLX backend: Copy unmodified regions from front buffer instead of\n"
|
2013-05-08 22:44:36 +08:00
|
|
|
" redrawing them all. My tests with nvidia-drivers show a 5% decrease\n"
|
|
|
|
" in performance when the whole screen is modified, but a 30% increase\n"
|
|
|
|
" when only 1/4 is. My tests on nouveau show terrible slowdown. Could\n"
|
|
|
|
" work with --glx-swap-method but not --glx-use-copysubbuffermesa.\n"
|
2013-03-21 13:05:56 +08:00
|
|
|
"--glx-use-copysubbuffermesa\n"
|
|
|
|
" GLX backend: Use MESA_copy_sub_buffer to do partial screen update.\n"
|
|
|
|
" My tests on nouveau shows a 200% performance boost when only 1/4 of\n"
|
|
|
|
" the screen is updated. May break VSync and is not available on some\n"
|
|
|
|
" drivers. Overrides --glx-copy-from-front.\n"
|
2013-04-05 21:05:19 +08:00
|
|
|
"--glx-no-rebind-pixmap\n"
|
|
|
|
" GLX backend: Avoid rebinding pixmap on window damage. Probably\n"
|
|
|
|
" could improve performance on rapid window content changes, but is\n"
|
|
|
|
" known to break things on some drivers.\n"
|
2013-04-26 14:01:20 +08:00
|
|
|
"--glx-swap-method undefined/copy/exchange/3/4/5/6/buffer-age\n"
|
2013-04-21 22:30:22 +08:00
|
|
|
" GLX backend: GLX buffer swap method we assume. Could be\n"
|
2013-04-26 14:01:20 +08:00
|
|
|
" undefined (0), copy (1), exchange (2), 3-6, or buffer-age (-1).\n"
|
|
|
|
" \"undefined\" is the slowest and the safest, and the default value.\n"
|
|
|
|
" 1 is fastest, but may fail on some drivers, 2-6 are gradually slower\n"
|
|
|
|
" but safer (6 is still faster than 0). -1 means auto-detect using\n"
|
|
|
|
" GLX_EXT_buffer_age, supported by some drivers. Useless with\n"
|
|
|
|
" --glx-use-copysubbuffermesa.\n"
|
2013-05-08 22:44:36 +08:00
|
|
|
"--glx-use-gpushader4\n"
|
|
|
|
" GLX backend: Use GL_EXT_gpu_shader4 for some optimization on blur\n"
|
|
|
|
" GLSL code. My tests on GTX 670 show no noticeable effect.\n"
|
2013-01-29 09:57:04 +08:00
|
|
|
#undef WARNING
|
|
|
|
#ifndef CONFIG_DBUS
|
|
|
|
#define WARNING WARNING_DISABLED
|
|
|
|
#else
|
|
|
|
#define WARNING
|
|
|
|
#endif
|
2013-01-24 13:38:03 +08:00
|
|
|
"--dbus\n"
|
|
|
|
" Enable remote control via D-Bus. See the D-BUS API section in the\n"
|
2013-03-19 20:58:55 +08:00
|
|
|
" man page for more details." WARNING "\n"
|
|
|
|
"--benchmark cycles\n"
|
|
|
|
" Benchmark mode. Repeatedly paint until reaching the specified cycles.\n"
|
|
|
|
"--benchmark-wid window-id\n"
|
|
|
|
" Specify window ID to repaint in benchmark mode. If omitted or is 0,\n"
|
|
|
|
" the whole screen is repainted.\n"
|
|
|
|
;
|
2013-05-12 18:21:16 +08:00
|
|
|
FILE *f = (ret ? stderr: stdout);
|
|
|
|
fputs(usage_text, f);
|
2013-01-29 09:57:04 +08:00
|
|
|
#undef WARNING
|
|
|
|
#undef WARNING_DISABLED
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-05-12 18:21:16 +08:00
|
|
|
exit(ret);
|
2004-06-27 13:08:33 +08:00
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
/**
|
|
|
|
* Register a window as symbol, and initialize GLX context if wanted.
|
|
|
|
*/
|
2013-01-30 13:41:08 +08:00
|
|
|
static bool
|
2013-03-01 12:41:16 +08:00
|
|
|
register_cm(session_t *ps) {
|
2013-01-31 22:53:44 +08:00
|
|
|
assert(!ps->reg_win);
|
|
|
|
|
2013-03-01 12:41:16 +08:00
|
|
|
ps->reg_win = XCreateSimpleWindow(ps->dpy, ps->root, 0, 0, 1, 1, 0,
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
None, None);
|
2006-09-07 01:04:47 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
if (!ps->reg_win) {
|
|
|
|
printf_errf("(): Failed to create window.");
|
|
|
|
return false;
|
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-01-31 22:53:44 +08:00
|
|
|
// Unredirect the window if it's redirected, just in case
|
|
|
|
if (ps->redirected)
|
|
|
|
XCompositeUnredirectWindow(ps->dpy, ps->reg_win, CompositeRedirectManual);
|
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
Xutf8SetWMProperties(ps->dpy, ps->reg_win, "xcompmgr", "xcompmgr",
|
|
|
|
NULL, 0, NULL, NULL, NULL);
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
{
|
|
|
|
unsigned len = strlen(REGISTER_PROP) + 2;
|
|
|
|
int s = ps->scr;
|
|
|
|
|
|
|
|
while (s >= 10) {
|
|
|
|
++len;
|
|
|
|
s /= 10;
|
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
char *buf = malloc(len);
|
|
|
|
snprintf(buf, len, REGISTER_PROP "%d", ps->scr);
|
|
|
|
buf[len - 1] = '\0';
|
|
|
|
XSetSelectionOwner(ps->dpy, get_atom(ps, buf), ps->reg_win, 0);
|
|
|
|
free(buf);
|
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
return true;
|
2005-10-07 08:08:02 +08:00
|
|
|
}
|
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
/**
|
|
|
|
* Reopen streams for logging.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
ostream_reopen(session_t *ps, const char *path) {
|
|
|
|
if (!path)
|
|
|
|
path = ps->o.logpath;
|
|
|
|
if (!path)
|
|
|
|
path = "/dev/null";
|
|
|
|
|
|
|
|
bool success = freopen(path, "a", stdout);
|
|
|
|
success = freopen(path, "a", stderr) && success;
|
|
|
|
if (!success)
|
|
|
|
printf_errfq(1, "(%s): freopen() failed.", path);
|
|
|
|
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Fork program to background and disable all I/O streams.
|
|
|
|
*/
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
static bool
|
2013-01-11 21:31:02 +08:00
|
|
|
fork_after(session_t *ps) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (getppid() == 1)
|
|
|
|
return true;
|
2012-02-27 12:00:12 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
// GLX context must be released and reattached on fork
|
|
|
|
if (ps->glx_context && !glXMakeCurrent(ps->dpy, None, NULL)) {
|
|
|
|
printf_errf("(): Failed to detach GLx context.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-02-27 12:00:12 +08:00
|
|
|
int pid = fork();
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (-1 == pid) {
|
|
|
|
printf_errf("(): fork() failed.");
|
|
|
|
return false;
|
2012-02-27 12:00:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (pid > 0) _exit(0);
|
|
|
|
|
|
|
|
setsid();
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (ps->glx_context
|
|
|
|
&& !glXMakeCurrent(ps->dpy, get_tgt_window(ps), ps->glx_context)) {
|
|
|
|
printf_errf("(): Failed to make GLX context current.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-11-04 19:14:21 +08:00
|
|
|
// Mainly to suppress the _FORTIFY_SOURCE warning
|
2012-11-09 11:35:40 +08:00
|
|
|
bool success = freopen("/dev/null", "r", stdin);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (!success) {
|
|
|
|
printf_errf("(): freopen() failed.");
|
|
|
|
return false;
|
|
|
|
}
|
2013-01-11 21:31:02 +08:00
|
|
|
success = ostream_reopen(ps, NULL);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
return success;
|
2012-02-27 12:00:12 +08:00
|
|
|
}
|
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
/**
|
|
|
|
* Parse a long number.
|
|
|
|
*/
|
|
|
|
static inline bool
|
|
|
|
parse_long(const char *s, long *dest) {
|
|
|
|
const char *endptr = NULL;
|
|
|
|
long val = strtol(s, (char **) &endptr, 0);
|
|
|
|
if (!endptr || endptr == s) {
|
|
|
|
printf_errf("(\"%s\"): Invalid number.", s);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
while (isspace(*endptr))
|
|
|
|
++endptr;
|
|
|
|
if (*endptr) {
|
|
|
|
printf_errf("(\"%s\"): Trailing characters.", s);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
*dest = val;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-04-25 22:23:35 +08:00
|
|
|
/**
|
|
|
|
* Parse a floating-point number in matrix.
|
|
|
|
*/
|
|
|
|
static inline const char *
|
|
|
|
parse_matrix_readnum(const char *src, double *dest) {
|
|
|
|
char *pc = NULL;
|
|
|
|
double val = strtod(src, &pc);
|
|
|
|
if (!pc || pc == src) {
|
|
|
|
printf_errf("(\"%s\"): No number found.", src);
|
|
|
|
return src;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (*pc && (isspace(*pc) || ',' == *pc))
|
|
|
|
++pc;
|
|
|
|
|
|
|
|
*dest = val;
|
|
|
|
|
|
|
|
return pc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse a matrix.
|
|
|
|
*/
|
|
|
|
static inline XFixed *
|
2013-05-20 18:04:40 +08:00
|
|
|
parse_matrix(session_t *ps, const char *src, const char **endptr) {
|
2013-04-25 22:23:35 +08:00
|
|
|
int wid = 0, hei = 0;
|
|
|
|
const char *pc = NULL;
|
|
|
|
XFixed *matrix = NULL;
|
|
|
|
|
|
|
|
// Get matrix width and height
|
|
|
|
{
|
|
|
|
double val = 0.0;
|
|
|
|
if (src == (pc = parse_matrix_readnum(src, &val)))
|
|
|
|
goto parse_matrix_err;
|
|
|
|
src = pc;
|
|
|
|
wid = val;
|
|
|
|
if (src == (pc = parse_matrix_readnum(src, &val)))
|
|
|
|
goto parse_matrix_err;
|
|
|
|
src = pc;
|
|
|
|
hei = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate matrix width and height
|
|
|
|
if (wid <= 0 || hei <= 0) {
|
|
|
|
printf_errf("(): Invalid matrix width/height.");
|
|
|
|
goto parse_matrix_err;
|
|
|
|
}
|
|
|
|
if (!(wid % 2 && hei % 2)) {
|
|
|
|
printf_errf("(): Width/height not odd.");
|
|
|
|
goto parse_matrix_err;
|
|
|
|
}
|
|
|
|
if (wid > 16 || hei > 16) {
|
|
|
|
printf_errf("(): Matrix width/height too large.");
|
|
|
|
goto parse_matrix_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Allocate memory
|
|
|
|
matrix = calloc(wid * hei + 2, sizeof(XFixed));
|
|
|
|
if (!matrix) {
|
|
|
|
printf_errf("(): Failed to allocate memory for matrix.");
|
|
|
|
goto parse_matrix_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read elements
|
|
|
|
{
|
|
|
|
int skip = hei / 2 * wid + wid / 2;
|
|
|
|
bool hasneg = false;
|
|
|
|
for (int i = 0; i < wid * hei; ++i) {
|
|
|
|
// Ignore the center element
|
|
|
|
if (i == skip) {
|
|
|
|
matrix[2 + i] = XDoubleToFixed(0);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
double val = 0;
|
|
|
|
if (src == (pc = parse_matrix_readnum(src, &val)))
|
|
|
|
goto parse_matrix_err;
|
|
|
|
src = pc;
|
|
|
|
if (val < 0) hasneg = true;
|
|
|
|
matrix[2 + i] = XDoubleToFixed(val);
|
|
|
|
}
|
|
|
|
if (BKEND_XRENDER == ps->o.backend && hasneg)
|
|
|
|
printf_errf("(): A convolution kernel with negative values "
|
|
|
|
"may not work properly under X Render backend.");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Detect trailing characters
|
2013-05-20 18:04:40 +08:00
|
|
|
for ( ;*pc && ';' != *pc; ++pc)
|
2013-04-25 22:23:35 +08:00
|
|
|
if (!isspace(*pc) && ',' != *pc) {
|
|
|
|
printf_errf("(): Trailing characters in matrix string.");
|
|
|
|
goto parse_matrix_err;
|
|
|
|
}
|
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
// Jump over spaces after ';'
|
|
|
|
if (';' == *pc) {
|
|
|
|
++pc;
|
|
|
|
while (*pc && isspace(*pc))
|
|
|
|
++pc;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Require an end of string if endptr is not provided, otherwise
|
|
|
|
// copy end pointer to endptr
|
|
|
|
if (endptr)
|
|
|
|
*endptr = pc;
|
|
|
|
else if (*pc) {
|
|
|
|
printf_errf("(): Only one matrix expected.");
|
|
|
|
goto parse_matrix_err;
|
|
|
|
}
|
|
|
|
|
2013-04-25 22:23:35 +08:00
|
|
|
// Fill in width and height
|
|
|
|
matrix[0] = XDoubleToFixed(wid);
|
|
|
|
matrix[1] = XDoubleToFixed(hei);
|
|
|
|
|
|
|
|
return matrix;
|
|
|
|
|
|
|
|
parse_matrix_err:
|
|
|
|
free(matrix);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-04-29 22:42:46 +08:00
|
|
|
/**
|
|
|
|
* Parse a convolution kernel.
|
|
|
|
*/
|
|
|
|
static inline XFixed *
|
2013-05-20 18:04:40 +08:00
|
|
|
parse_conv_kern(session_t *ps, const char *src, const char **endptr) {
|
|
|
|
return parse_matrix(ps, src, endptr);
|
|
|
|
}
|
|
|
|
|
2013-05-21 09:18:41 +08:00
|
|
|
/**
|
|
|
|
* Parse a list of convolution kernels.
|
|
|
|
*/
|
2013-05-20 18:04:40 +08:00
|
|
|
static bool
|
|
|
|
parse_conv_kern_lst(session_t *ps, const char *src, XFixed **dest, int max) {
|
2013-04-29 22:42:46 +08:00
|
|
|
static const struct {
|
|
|
|
const char *name;
|
|
|
|
const char *kern_str;
|
|
|
|
} CONV_KERN_PREDEF[] = {
|
|
|
|
{ "3x3box", "3,3,1,1,1,1,1,1,1,1," },
|
|
|
|
{ "5x5box", "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1," },
|
|
|
|
{ "7x7box", "7,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1," },
|
|
|
|
{ "3x3gaussian", "3,3,0.243117,0.493069,0.243117,0.493069,0.493069,0.243117,0.493069,0.243117," },
|
|
|
|
{ "5x5gaussian", "5,5,0.003493,0.029143,0.059106,0.029143,0.003493,0.029143,0.243117,0.493069,0.243117,0.029143,0.059106,0.493069,0.493069,0.059106,0.029143,0.243117,0.493069,0.243117,0.029143,0.003493,0.029143,0.059106,0.029143,0.003493," },
|
|
|
|
{ "7x7gaussian", "7,7,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000102,0.003493,0.029143,0.059106,0.029143,0.003493,0.000102,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.001723,0.059106,0.493069,0.493069,0.059106,0.001723,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000102,0.003493,0.029143,0.059106,0.029143,0.003493,0.000102,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003," },
|
|
|
|
{ "9x9gaussian", "9,9,0.000000,0.000000,0.000001,0.000006,0.000012,0.000006,0.000001,0.000000,0.000000,0.000000,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000000,0.000001,0.000102,0.003493,0.029143,0.059106,0.029143,0.003493,0.000102,0.000001,0.000006,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000006,0.000012,0.001723,0.059106,0.493069,0.493069,0.059106,0.001723,0.000012,0.000006,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000006,0.000001,0.000102,0.003493,0.029143,0.059106,0.029143,0.003493,0.000102,0.000001,0.000000,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000000,0.000000,0.000000,0.000001,0.000006,0.000012,0.000006,0.000001,0.000000,0.000000," },
|
|
|
|
{ "11x11gaussian", "11,11,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,0.000006,0.000012,0.000006,0.000001,0.000000,0.000000,0.000000,0.000000,0.000000,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000000,0.000000,0.000000,0.000001,0.000102,0.003493,0.029143,0.059106,0.029143,0.003493,0.000102,0.000001,0.000000,0.000000,0.000006,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000006,0.000000,0.000000,0.000012,0.001723,0.059106,0.493069,0.493069,0.059106,0.001723,0.000012,0.000000,0.000000,0.000006,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000006,0.000000,0.000000,0.000001,0.000102,0.003493,0.029143,0.059106,0.029143,0.003493,0.000102,0.000001,0.000000,0.000000,0.000000,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,0.000006,0.000012,0.000006,0.000001,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000," },
|
|
|
|
};
|
|
|
|
for (int i = 0;
|
|
|
|
i < sizeof(CONV_KERN_PREDEF) / sizeof(CONV_KERN_PREDEF[0]); ++i)
|
|
|
|
if (!strcmp(CONV_KERN_PREDEF[i].name, src))
|
2013-05-20 18:04:40 +08:00
|
|
|
return parse_conv_kern_lst(ps, CONV_KERN_PREDEF[i].kern_str, dest, max);
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
const char *pc = src;
|
|
|
|
|
|
|
|
// Free old kernels
|
|
|
|
for (i = 0; i < max; ++i) {
|
|
|
|
free(dest[i]);
|
|
|
|
dest[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Continue parsing until the end of source string
|
|
|
|
i = 0;
|
|
|
|
while (pc && *pc && i < max - 1) {
|
|
|
|
if (!(dest[i++] = parse_conv_kern(ps, pc, &pc)))
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*pc) {
|
|
|
|
printf_errf("(): Too many blur kernels!");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2013-04-29 22:42:46 +08:00
|
|
|
}
|
|
|
|
|
2013-06-09 17:06:35 +08:00
|
|
|
/**
|
|
|
|
* Parse a X geometry.
|
|
|
|
*/
|
|
|
|
static inline bool
|
|
|
|
parse_geometry(session_t *ps, const char *src, geometry_t *dest) {
|
|
|
|
geometry_t geom = { .wid = -1, .hei = -1, .x = -1, .y = -1 };
|
|
|
|
long val = 0L;
|
|
|
|
char *endptr = NULL;
|
|
|
|
|
|
|
|
#define T_STRIPSPACE() do { \
|
|
|
|
while (*src && isspace(*src)) ++src; \
|
|
|
|
if (!*src) goto parse_geometry_end; \
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
T_STRIPSPACE();
|
|
|
|
|
|
|
|
// Parse width
|
|
|
|
// Must be base 10, because "0x0..." may appear
|
|
|
|
if (!('+' == *src || '-' == *src)) {
|
|
|
|
val = strtol(src, &endptr, 10);
|
|
|
|
if (endptr && src != endptr) {
|
|
|
|
geom.wid = val;
|
|
|
|
assert(geom.wid >= 0);
|
|
|
|
src = endptr;
|
|
|
|
}
|
|
|
|
T_STRIPSPACE();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parse height
|
|
|
|
if ('x' == *src) {
|
|
|
|
++src;
|
|
|
|
val = strtol(src, &endptr, 10);
|
|
|
|
if (endptr && src != endptr) {
|
|
|
|
geom.hei = val;
|
|
|
|
if (geom.hei < 0) {
|
|
|
|
printf_errf("(\"%s\"): Invalid height.", src);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
src = endptr;
|
|
|
|
}
|
|
|
|
T_STRIPSPACE();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parse x
|
|
|
|
if ('+' == *src || '-' == *src) {
|
|
|
|
val = strtol(src, &endptr, 10);
|
|
|
|
if (endptr && src != endptr) {
|
|
|
|
geom.x = val;
|
|
|
|
if ('-' == *src && geom.x <= 0)
|
|
|
|
geom.x -= 2;
|
|
|
|
src = endptr;
|
|
|
|
}
|
|
|
|
T_STRIPSPACE();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parse y
|
|
|
|
if ('+' == *src || '-' == *src) {
|
|
|
|
val = strtol(src, &endptr, 10);
|
|
|
|
if (endptr && src != endptr) {
|
|
|
|
geom.y = val;
|
|
|
|
if ('-' == *src && geom.y <= 0)
|
|
|
|
geom.y -= 2;
|
|
|
|
src = endptr;
|
|
|
|
}
|
|
|
|
T_STRIPSPACE();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*src) {
|
|
|
|
printf_errf("(\"%s\"): Trailing characters.", src);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
parse_geometry_end:
|
|
|
|
*dest = geom;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-05-21 09:18:41 +08:00
|
|
|
/**
|
|
|
|
* Parse a list of opacity rules.
|
|
|
|
*/
|
|
|
|
static inline bool
|
|
|
|
parse_rule_opacity(session_t *ps, const char *src) {
|
|
|
|
// Find opacity value
|
|
|
|
char *endptr = NULL;
|
|
|
|
long val = strtol(src, &endptr, 0);
|
|
|
|
if (!endptr || endptr == src) {
|
|
|
|
printf_errf("(\"%s\"): No opacity specified?", src);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (val > 100 || val < 0) {
|
|
|
|
printf_errf("(\"%s\"): Opacity %ld invalid.", src, val);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Skip over spaces
|
|
|
|
while (*endptr && isspace(*endptr))
|
|
|
|
++endptr;
|
|
|
|
if (':' != *endptr) {
|
|
|
|
printf_errf("(\"%s\"): Opacity terminator not found.", src);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
++endptr;
|
|
|
|
|
|
|
|
// Parse pattern
|
|
|
|
// I hope 1-100 is acceptable for (void *)
|
|
|
|
return c2_parsed(ps, &ps->o.opacity_rules, endptr, (void *) val);
|
|
|
|
}
|
|
|
|
|
2013-05-09 21:47:09 +08:00
|
|
|
#ifdef CONFIG_LIBCONFIG
|
|
|
|
/**
|
|
|
|
* Get a file stream of the configuration file to read.
|
|
|
|
*
|
|
|
|
* Follows the XDG specification to search for the configuration file.
|
|
|
|
*/
|
|
|
|
static FILE *
|
|
|
|
open_config_file(char *cpath, char **ppath) {
|
|
|
|
const static char *config_filename = "/compton.conf";
|
|
|
|
const static char *config_filename_legacy = "/.compton.conf";
|
|
|
|
const static char *config_home_suffix = "/.config";
|
|
|
|
const static char *config_system_dir = "/etc/xdg";
|
|
|
|
|
|
|
|
char *dir = NULL, *home = NULL;
|
|
|
|
char *path = cpath;
|
|
|
|
FILE *f = NULL;
|
|
|
|
|
|
|
|
if (path) {
|
|
|
|
f = fopen(path, "r");
|
|
|
|
if (f && ppath)
|
|
|
|
*ppath = path;
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check user configuration file in $XDG_CONFIG_HOME firstly
|
|
|
|
if (!((dir = getenv("XDG_CONFIG_HOME")) && strlen(dir))) {
|
|
|
|
if (!((home = getenv("HOME")) && strlen(home)))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
path = mstrjoin3(home, config_home_suffix, config_filename);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
path = mstrjoin(dir, config_filename);
|
|
|
|
|
|
|
|
f = fopen(path, "r");
|
|
|
|
|
|
|
|
if (f && ppath)
|
|
|
|
*ppath = path;
|
|
|
|
else
|
|
|
|
free(path);
|
|
|
|
if (f)
|
|
|
|
return f;
|
|
|
|
|
|
|
|
// Then check user configuration file in $HOME
|
|
|
|
if ((home = getenv("HOME")) && strlen(home)) {
|
|
|
|
path = mstrjoin(home, config_filename_legacy);
|
|
|
|
f = fopen(path, "r");
|
|
|
|
if (f && ppath)
|
|
|
|
*ppath = path;
|
|
|
|
else
|
|
|
|
free(path);
|
|
|
|
if (f)
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check system configuration file in $XDG_CONFIG_DIRS at last
|
|
|
|
if ((dir = getenv("XDG_CONFIG_DIRS")) && strlen(dir)) {
|
|
|
|
char *part = strtok(dir, ":");
|
|
|
|
while (part) {
|
|
|
|
path = mstrjoin(part, config_filename);
|
|
|
|
f = fopen(path, "r");
|
|
|
|
if (f && ppath)
|
|
|
|
*ppath = path;
|
|
|
|
else
|
|
|
|
free(path);
|
|
|
|
if (f)
|
|
|
|
return f;
|
|
|
|
part = strtok(NULL, ":");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
path = mstrjoin(config_system_dir, config_filename);
|
|
|
|
f = fopen(path, "r");
|
|
|
|
if (f && ppath)
|
|
|
|
*ppath = path;
|
|
|
|
else
|
|
|
|
free(path);
|
|
|
|
if (f)
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-11-28 11:44:00 +08:00
|
|
|
/**
|
|
|
|
* Parse a condition list in configuration file.
|
|
|
|
*/
|
2013-04-25 22:23:35 +08:00
|
|
|
static inline void
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
parse_cfg_condlst(session_t *ps, const config_t *pcfg, c2_lptr_t **pcondlst,
|
2012-11-28 11:44:00 +08:00
|
|
|
const char *name) {
|
|
|
|
config_setting_t *setting = config_lookup(pcfg, name);
|
|
|
|
if (setting) {
|
|
|
|
// Parse an array of options
|
|
|
|
if (config_setting_is_array(setting)) {
|
|
|
|
int i = config_setting_length(setting);
|
|
|
|
while (i--) {
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
condlst_add(ps, pcondlst, config_setting_get_string_elem(setting, i));
|
2012-11-28 11:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// Treat it as a single pattern if it's a string
|
|
|
|
else if (CONFIG_TYPE_STRING == config_setting_type(setting)) {
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
condlst_add(ps, pcondlst, config_setting_get_string(setting));
|
2012-11-28 11:44:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
/**
|
|
|
|
* Parse a configuration file from default location.
|
|
|
|
*/
|
2012-02-09 17:37:46 +08:00
|
|
|
static void
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
|
2012-09-28 09:10:34 +08:00
|
|
|
char *path = NULL;
|
2012-09-25 10:19:20 +08:00
|
|
|
FILE *f;
|
|
|
|
config_t cfg;
|
|
|
|
int ival = 0;
|
|
|
|
double dval = 0.0;
|
2013-07-30 22:24:11 +08:00
|
|
|
// libconfig manages string memory itself, so no need to manually free
|
|
|
|
// anything
|
2012-10-26 11:12:28 +08:00
|
|
|
const char *sval = NULL;
|
2012-09-25 10:19:20 +08:00
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
f = open_config_file(ps->o.config_file, &path);
|
2012-09-25 10:19:20 +08:00
|
|
|
if (!f) {
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
if (ps->o.config_file) {
|
|
|
|
printf_errfq(1, "(): Failed to read configuration file \"%s\".",
|
|
|
|
ps->o.config_file);
|
|
|
|
free(ps->o.config_file);
|
|
|
|
ps->o.config_file = NULL;
|
|
|
|
}
|
2012-09-25 10:19:20 +08:00
|
|
|
return;
|
|
|
|
}
|
2012-02-09 17:37:46 +08:00
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
config_init(&cfg);
|
2012-09-28 09:10:34 +08:00
|
|
|
#ifndef CONFIG_LIBCONFIG_LEGACY
|
2012-11-21 09:15:49 +08:00
|
|
|
{
|
|
|
|
// dirname() could modify the original string, thus we must pass a
|
|
|
|
// copy
|
|
|
|
char *path2 = mstrcpy(path);
|
|
|
|
char *parent = dirname(path2);
|
|
|
|
|
|
|
|
if (parent)
|
|
|
|
config_set_include_dir(&cfg, parent);
|
|
|
|
|
|
|
|
free(path2);
|
|
|
|
}
|
2012-09-28 09:10:34 +08:00
|
|
|
#endif
|
2012-09-25 10:19:20 +08:00
|
|
|
|
|
|
|
if (CONFIG_FALSE == config_read(&cfg, f)) {
|
|
|
|
printf("Error when reading configuration file \"%s\", line %d: %s\n",
|
|
|
|
path, config_error_line(&cfg), config_error_text(&cfg));
|
|
|
|
config_destroy(&cfg);
|
|
|
|
free(path);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
config_set_auto_convert(&cfg, 1);
|
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
if (path != ps->o.config_file) {
|
|
|
|
free(ps->o.config_file);
|
|
|
|
ps->o.config_file = path;
|
|
|
|
}
|
2012-09-25 10:19:20 +08:00
|
|
|
|
|
|
|
// Get options from the configuration file. We don't do range checking
|
|
|
|
// right now. It will be done later
|
|
|
|
|
2012-09-26 18:54:35 +08:00
|
|
|
// -D (fade_delta)
|
2012-09-28 09:10:34 +08:00
|
|
|
if (lcfg_lookup_int(&cfg, "fade-delta", &ival))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.fade_delta = ival;
|
2012-09-26 18:54:35 +08:00
|
|
|
// -I (fade_in_step)
|
2012-09-25 10:19:20 +08:00
|
|
|
if (config_lookup_float(&cfg, "fade-in-step", &dval))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.fade_in_step = normalize_d(dval) * OPAQUE;
|
2012-09-26 18:54:35 +08:00
|
|
|
// -O (fade_out_step)
|
2012-09-25 10:19:20 +08:00
|
|
|
if (config_lookup_float(&cfg, "fade-out-step", &dval))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.fade_out_step = normalize_d(dval) * OPAQUE;
|
2012-09-26 18:54:35 +08:00
|
|
|
// -r (shadow_radius)
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_int(&cfg, "shadow-radius", &ps->o.shadow_radius);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -o (shadow_opacity)
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "shadow-opacity", &ps->o.shadow_opacity);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -l (shadow_offset_x)
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_int(&cfg, "shadow-offset-x", &ps->o.shadow_offset_x);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -t (shadow_offset_y)
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_int(&cfg, "shadow-offset-y", &ps->o.shadow_offset_y);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -i (inactive_opacity)
|
2012-09-25 10:19:20 +08:00
|
|
|
if (config_lookup_float(&cfg, "inactive-opacity", &dval))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.inactive_opacity = normalize_d(dval) * OPAQUE;
|
2013-03-30 11:46:32 +08:00
|
|
|
// --active_opacity
|
|
|
|
if (config_lookup_float(&cfg, "active-opacity", &dval))
|
|
|
|
ps->o.active_opacity = normalize_d(dval) * OPAQUE;
|
2012-09-26 18:54:35 +08:00
|
|
|
// -e (frame_opacity)
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "frame-opacity", &ps->o.frame_opacity);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -z (clear_shadow)
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "clear-shadow", &ps->o.clear_shadow);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -c (shadow_enable)
|
|
|
|
if (config_lookup_bool(&cfg, "shadow", &ival) && ival)
|
2012-11-19 09:46:07 +08:00
|
|
|
wintype_arr_enable(ps->o.wintype_shadow);
|
2012-09-26 18:54:35 +08:00
|
|
|
// -C (no_dock_shadow)
|
|
|
|
lcfg_lookup_bool(&cfg, "no-dock-shadow", &pcfgtmp->no_dock_shadow);
|
|
|
|
// -G (no_dnd_shadow)
|
|
|
|
lcfg_lookup_bool(&cfg, "no-dnd-shadow", &pcfgtmp->no_dnd_shadow);
|
|
|
|
// -m (menu_opacity)
|
|
|
|
config_lookup_float(&cfg, "menu-opacity", &pcfgtmp->menu_opacity);
|
|
|
|
// -f (fading_enable)
|
|
|
|
if (config_lookup_bool(&cfg, "fading", &ival) && ival)
|
2012-11-19 09:46:07 +08:00
|
|
|
wintype_arr_enable(ps->o.wintype_fade);
|
2012-09-26 21:40:48 +08:00
|
|
|
// --no-fading-open-close
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "no-fading-openclose", &ps->o.no_fading_openclose);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --shadow-red
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "shadow-red", &ps->o.shadow_red);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --shadow-green
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "shadow-green", &ps->o.shadow_green);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --shadow-blue
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "shadow-blue", &ps->o.shadow_blue);
|
2013-07-30 22:24:11 +08:00
|
|
|
// --shadow-exclude-reg
|
|
|
|
if (config_lookup_string(&cfg, "shadow-exclude-reg", &sval)
|
|
|
|
&& !parse_geometry(ps, sval, &ps->o.shadow_exclude_reg_geom))
|
|
|
|
exit(1);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --inactive-opacity-override
|
2012-09-26 18:54:35 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "inactive-opacity-override",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.inactive_opacity_override);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --inactive-dim
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "inactive-dim", &ps->o.inactive_dim);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --mark-wmwin-focused
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "mark-wmwin-focused", &ps->o.mark_wmwin_focused);
|
2012-09-26 19:48:36 +08:00
|
|
|
// --mark-ovredir-focused
|
|
|
|
lcfg_lookup_bool(&cfg, "mark-ovredir-focused",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.mark_ovredir_focused);
|
2012-10-01 10:34:40 +08:00
|
|
|
// --shadow-ignore-shaped
|
|
|
|
lcfg_lookup_bool(&cfg, "shadow-ignore-shaped",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.shadow_ignore_shaped);
|
2012-10-01 10:34:40 +08:00
|
|
|
// --detect-rounded-corners
|
|
|
|
lcfg_lookup_bool(&cfg, "detect-rounded-corners",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.detect_rounded_corners);
|
2013-08-26 22:00:53 +08:00
|
|
|
// --xinerama-shadow-crop
|
|
|
|
lcfg_lookup_bool(&cfg, "xinerama-shadow-crop",
|
|
|
|
&ps->o.xinerama_shadow_crop);
|
2012-10-03 21:13:34 +08:00
|
|
|
// --detect-client-opacity
|
|
|
|
lcfg_lookup_bool(&cfg, "detect-client-opacity",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.detect_client_opacity);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// --refresh-rate
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_int(&cfg, "refresh-rate", &ps->o.refresh_rate);
|
2012-10-26 11:12:28 +08:00
|
|
|
// --vsync
|
2013-01-31 22:53:44 +08:00
|
|
|
if (config_lookup_string(&cfg, "vsync", &sval) && !parse_vsync(ps, sval))
|
|
|
|
exit(1);
|
2013-03-16 22:54:43 +08:00
|
|
|
// --backend
|
|
|
|
if (config_lookup_string(&cfg, "backend", &sval) && !parse_backend(ps, sval))
|
|
|
|
exit(1);
|
2012-10-13 18:46:59 +08:00
|
|
|
// --alpha-step
|
2012-11-19 09:46:07 +08:00
|
|
|
config_lookup_float(&cfg, "alpha-step", &ps->o.alpha_step);
|
2012-10-27 21:46:01 +08:00
|
|
|
// --dbe
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "dbe", &ps->o.dbe);
|
2012-10-24 10:09:59 +08:00
|
|
|
// --paint-on-overlay
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "paint-on-overlay", &ps->o.paint_on_overlay);
|
2012-10-26 11:12:28 +08:00
|
|
|
// --sw-opti
|
2012-11-19 09:46:07 +08:00
|
|
|
lcfg_lookup_bool(&cfg, "sw-opti", &ps->o.sw_opti);
|
2012-11-04 18:11:08 +08:00
|
|
|
// --use-ewmh-active-win
|
|
|
|
lcfg_lookup_bool(&cfg, "use-ewmh-active-win",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.use_ewmh_active_win);
|
2012-11-14 21:34:51 +08:00
|
|
|
// --unredir-if-possible
|
|
|
|
lcfg_lookup_bool(&cfg, "unredir-if-possible",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.unredir_if_possible);
|
2013-09-24 20:41:50 +08:00
|
|
|
// --unredir-if-possible-delay
|
|
|
|
if (lcfg_lookup_int(&cfg, "unredir-if-possible-delay", &ival))
|
|
|
|
ps->o.unredir_if_possible_delay = ival;
|
2012-12-05 12:43:34 +08:00
|
|
|
// --inactive-dim-fixed
|
|
|
|
lcfg_lookup_bool(&cfg, "inactive-dim-fixed", &ps->o.inactive_dim_fixed);
|
2012-12-12 12:01:51 +08:00
|
|
|
// --detect-transient
|
|
|
|
lcfg_lookup_bool(&cfg, "detect-transient", &ps->o.detect_transient);
|
|
|
|
// --detect-client-leader
|
|
|
|
lcfg_lookup_bool(&cfg, "detect-client-leader",
|
|
|
|
&ps->o.detect_client_leader);
|
2012-09-25 10:19:20 +08:00
|
|
|
// --shadow-exclude
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.shadow_blacklist, "shadow-exclude");
|
2013-04-21 22:30:22 +08:00
|
|
|
// --fade-exclude
|
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.fade_blacklist, "fade-exclude");
|
2012-11-28 11:44:00 +08:00
|
|
|
// --focus-exclude
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.focus_blacklist, "focus-exclude");
|
2013-01-12 22:21:35 +08:00
|
|
|
// --invert-color-include
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.invert_color_list, "invert-color-include");
|
2013-03-23 22:06:41 +08:00
|
|
|
// --blur-background-exclude
|
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.blur_background_blacklist, "blur-background-exclude");
|
2013-07-30 22:24:11 +08:00
|
|
|
// --opacity-rule
|
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.opacity_rules, "opacity-rule");
|
2013-09-24 20:41:50 +08:00
|
|
|
// --unredir-if-possible-exclude
|
|
|
|
parse_cfg_condlst(ps, &cfg, &ps->o.unredir_if_possible_blacklist, "unredir-if-possible-exclude");
|
2012-12-14 20:32:46 +08:00
|
|
|
// --blur-background
|
|
|
|
lcfg_lookup_bool(&cfg, "blur-background", &ps->o.blur_background);
|
|
|
|
// --blur-background-frame
|
|
|
|
lcfg_lookup_bool(&cfg, "blur-background-frame",
|
|
|
|
&ps->o.blur_background_frame);
|
2012-12-15 20:07:45 +08:00
|
|
|
// --blur-background-fixed
|
|
|
|
lcfg_lookup_bool(&cfg, "blur-background-fixed",
|
|
|
|
&ps->o.blur_background_fixed);
|
2013-07-30 22:24:11 +08:00
|
|
|
// --blur-kern
|
|
|
|
if (config_lookup_string(&cfg, "blur-kern", &sval)
|
|
|
|
&& !parse_conv_kern_lst(ps, sval, ps->o.blur_kerns, MAX_BLUR_PASS))
|
|
|
|
exit(1);
|
|
|
|
// --resize-damage
|
|
|
|
config_lookup_int(&cfg, "resize-damage", &ps->o.resize_damage);
|
2013-04-21 22:30:22 +08:00
|
|
|
// --glx-no-stencil
|
|
|
|
lcfg_lookup_bool(&cfg, "glx-no-stencil", &ps->o.glx_no_stencil);
|
|
|
|
// --glx-copy-from-front
|
|
|
|
lcfg_lookup_bool(&cfg, "glx-copy-from-front", &ps->o.glx_copy_from_front);
|
|
|
|
// --glx-use-copysubbuffermesa
|
|
|
|
lcfg_lookup_bool(&cfg, "glx-use-copysubbuffermesa", &ps->o.glx_use_copysubbuffermesa);
|
|
|
|
// --glx-no-rebind-pixmap
|
|
|
|
lcfg_lookup_bool(&cfg, "glx-no-rebind-pixmap", &ps->o.glx_no_rebind_pixmap);
|
|
|
|
// --glx-swap-method
|
|
|
|
if (config_lookup_string(&cfg, "glx-swap-method", &sval)
|
|
|
|
&& !parse_glx_swap_method(ps, sval))
|
|
|
|
exit(1);
|
2013-07-30 22:24:11 +08:00
|
|
|
// --glx-use-gpushader4
|
|
|
|
lcfg_lookup_bool(&cfg, "glx-use-gpushader4", &ps->o.glx_use_gpushader4);
|
2012-09-25 21:04:10 +08:00
|
|
|
// Wintype settings
|
|
|
|
{
|
2012-11-19 09:46:07 +08:00
|
|
|
wintype_t i;
|
2012-09-25 21:04:10 +08:00
|
|
|
|
|
|
|
for (i = 0; i < NUM_WINTYPES; ++i) {
|
|
|
|
char *str = mstrjoin("wintypes.", WINTYPES[i]);
|
|
|
|
config_setting_t *setting = config_lookup(&cfg, str);
|
|
|
|
free(str);
|
|
|
|
if (setting) {
|
|
|
|
if (config_setting_lookup_bool(setting, "shadow", &ival))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.wintype_shadow[i] = (bool) ival;
|
2012-09-25 21:04:10 +08:00
|
|
|
if (config_setting_lookup_bool(setting, "fade", &ival))
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.wintype_fade[i] = (bool) ival;
|
2012-12-10 10:31:24 +08:00
|
|
|
if (config_setting_lookup_bool(setting, "focus", &ival))
|
|
|
|
ps->o.wintype_focus[i] = (bool) ival;
|
2012-09-25 21:04:10 +08:00
|
|
|
config_setting_lookup_float(setting, "opacity",
|
2012-11-19 09:46:07 +08:00
|
|
|
&ps->o.wintype_opacity[i]);
|
2012-09-25 10:19:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
config_destroy(&cfg);
|
2012-02-09 17:37:46 +08:00
|
|
|
}
|
2012-09-25 10:19:20 +08:00
|
|
|
#endif
|
2012-02-09 17:37:46 +08:00
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
/**
|
|
|
|
* Process arguments and configuration files.
|
|
|
|
*/
|
|
|
|
static void
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
const static char *shortopts = "D:I:O:d:r:o:m:l:t:i:e:hscnfFCaSzGb";
|
2012-09-25 10:19:20 +08:00
|
|
|
const static struct option longopts[] = {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
{ "help", no_argument, NULL, 'h' },
|
2012-09-25 10:19:20 +08:00
|
|
|
{ "config", required_argument, NULL, 256 },
|
2013-08-26 22:00:53 +08:00
|
|
|
{ "shadow-radius", required_argument, NULL, 'r' },
|
|
|
|
{ "shadow-opacity", required_argument, NULL, 'o' },
|
|
|
|
{ "shadow-offset-x", required_argument, NULL, 'l' },
|
|
|
|
{ "shadow-offset-y", required_argument, NULL, 't' },
|
|
|
|
{ "fade-in-step", required_argument, NULL, 'I' },
|
|
|
|
{ "fade-out-step", required_argument, NULL, 'O' },
|
|
|
|
{ "menu-opacity", required_argument, NULL, 'm' },
|
|
|
|
{ "shadow", no_argument, NULL, 'c' },
|
|
|
|
{ "no-dock-shadow", no_argument, NULL, 'C' },
|
|
|
|
{ "clear-shadow", no_argument, NULL, 'z' },
|
|
|
|
{ "fading", no_argument, NULL, 'f' },
|
|
|
|
{ "inactive-opacity", required_argument, NULL, 'i' },
|
|
|
|
{ "frame-opacity", required_argument, NULL, 'e' },
|
|
|
|
{ "no-dnd-shadow", no_argument, NULL, 'G' },
|
2012-09-25 10:19:20 +08:00
|
|
|
{ "shadow-red", required_argument, NULL, 257 },
|
|
|
|
{ "shadow-green", required_argument, NULL, 258 },
|
|
|
|
{ "shadow-blue", required_argument, NULL, 259 },
|
|
|
|
{ "inactive-opacity-override", no_argument, NULL, 260 },
|
|
|
|
{ "inactive-dim", required_argument, NULL, 261 },
|
|
|
|
{ "mark-wmwin-focused", no_argument, NULL, 262 },
|
|
|
|
{ "shadow-exclude", required_argument, NULL, 263 },
|
2012-09-26 19:48:36 +08:00
|
|
|
{ "mark-ovredir-focused", no_argument, NULL, 264 },
|
2012-09-26 21:40:48 +08:00
|
|
|
{ "no-fading-openclose", no_argument, NULL, 265 },
|
2012-10-01 10:34:40 +08:00
|
|
|
{ "shadow-ignore-shaped", no_argument, NULL, 266 },
|
|
|
|
{ "detect-rounded-corners", no_argument, NULL, 267 },
|
2012-10-03 21:13:34 +08:00
|
|
|
{ "detect-client-opacity", no_argument, NULL, 268 },
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
{ "refresh-rate", required_argument, NULL, 269 },
|
|
|
|
{ "vsync", required_argument, NULL, 270 },
|
2012-10-13 18:46:59 +08:00
|
|
|
{ "alpha-step", required_argument, NULL, 271 },
|
2012-10-23 13:42:20 +08:00
|
|
|
{ "dbe", no_argument, NULL, 272 },
|
2012-10-24 10:09:59 +08:00
|
|
|
{ "paint-on-overlay", no_argument, NULL, 273 },
|
2012-10-26 11:12:28 +08:00
|
|
|
{ "sw-opti", no_argument, NULL, 274 },
|
2012-11-01 10:43:15 +08:00
|
|
|
{ "vsync-aggressive", no_argument, NULL, 275 },
|
2012-11-04 18:11:08 +08:00
|
|
|
{ "use-ewmh-active-win", no_argument, NULL, 276 },
|
2012-11-19 09:46:07 +08:00
|
|
|
{ "respect-prop-shadow", no_argument, NULL, 277 },
|
2012-11-09 21:44:02 +08:00
|
|
|
{ "unredir-if-possible", no_argument, NULL, 278 },
|
2012-11-28 11:44:00 +08:00
|
|
|
{ "focus-exclude", required_argument, NULL, 279 },
|
2012-12-05 12:43:34 +08:00
|
|
|
{ "inactive-dim-fixed", no_argument, NULL, 280 },
|
2012-12-12 12:01:51 +08:00
|
|
|
{ "detect-transient", no_argument, NULL, 281 },
|
|
|
|
{ "detect-client-leader", no_argument, NULL, 282 },
|
2012-12-14 20:32:46 +08:00
|
|
|
{ "blur-background", no_argument, NULL, 283 },
|
|
|
|
{ "blur-background-frame", no_argument, NULL, 284 },
|
2012-12-15 20:07:45 +08:00
|
|
|
{ "blur-background-fixed", no_argument, NULL, 285 },
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
{ "dbus", no_argument, NULL, 286 },
|
2013-01-11 21:31:02 +08:00
|
|
|
{ "logpath", required_argument, NULL, 287 },
|
2013-01-12 22:21:35 +08:00
|
|
|
{ "invert-color-include", required_argument, NULL, 288 },
|
2013-03-15 23:16:23 +08:00
|
|
|
{ "opengl", no_argument, NULL, 289 },
|
2013-03-16 22:54:43 +08:00
|
|
|
{ "backend", required_argument, NULL, 290 },
|
2013-03-17 12:14:00 +08:00
|
|
|
{ "glx-no-stencil", no_argument, NULL, 291 },
|
2013-03-19 20:58:55 +08:00
|
|
|
{ "glx-copy-from-front", no_argument, NULL, 292 },
|
|
|
|
{ "benchmark", required_argument, NULL, 293 },
|
|
|
|
{ "benchmark-wid", required_argument, NULL, 294 },
|
2013-03-21 13:05:56 +08:00
|
|
|
{ "glx-use-copysubbuffermesa", no_argument, NULL, 295 },
|
2013-03-23 22:06:41 +08:00
|
|
|
{ "blur-background-exclude", required_argument, NULL, 296 },
|
2013-03-30 11:46:32 +08:00
|
|
|
{ "active-opacity", required_argument, NULL, 297 },
|
2013-04-05 21:05:19 +08:00
|
|
|
{ "glx-no-rebind-pixmap", no_argument, NULL, 298 },
|
2013-04-21 22:30:22 +08:00
|
|
|
{ "glx-swap-method", required_argument, NULL, 299 },
|
|
|
|
{ "fade-exclude", required_argument, NULL, 300 },
|
2013-04-25 22:23:35 +08:00
|
|
|
{ "blur-kern", required_argument, NULL, 301 },
|
2013-04-27 11:43:11 +08:00
|
|
|
{ "resize-damage", required_argument, NULL, 302 },
|
2013-05-08 22:44:36 +08:00
|
|
|
{ "glx-use-gpushader4", no_argument, NULL, 303 },
|
2013-05-21 09:18:41 +08:00
|
|
|
{ "opacity-rule", required_argument, NULL, 304 },
|
2013-06-09 17:06:35 +08:00
|
|
|
{ "shadow-exclude-reg", required_argument, NULL, 305 },
|
2013-06-19 19:36:48 +08:00
|
|
|
{ "paint-exclude", required_argument, NULL, 306 },
|
2013-08-22 21:15:04 +08:00
|
|
|
{ "xinerama-shadow-crop", no_argument, NULL, 307 },
|
2013-09-04 22:00:51 +08:00
|
|
|
{ "unredir-if-possible-exclude", required_argument, NULL, 308 },
|
|
|
|
{ "unredir-if-possible-delay", required_argument, NULL, 309 },
|
2012-09-11 23:11:23 +08:00
|
|
|
// Must terminate with a NULL entry
|
|
|
|
{ NULL, 0, NULL, 0 },
|
2012-09-11 21:57:50 +08:00
|
|
|
};
|
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
int o = 0, longopt_idx = -1, i = 0;
|
|
|
|
|
|
|
|
if (first_pass) {
|
|
|
|
// Pre-parse the commandline arguments to check for --config and invalid
|
|
|
|
// switches
|
|
|
|
// Must reset optind to 0 here in case we reread the commandline
|
|
|
|
// arguments
|
|
|
|
optind = 1;
|
|
|
|
while (-1 !=
|
|
|
|
(o = getopt_long(argc, argv, shortopts, longopts, &longopt_idx))) {
|
|
|
|
if (256 == o)
|
|
|
|
ps->o.config_file = mstrcpy(optarg);
|
|
|
|
else if ('d' == o)
|
|
|
|
ps->o.display = mstrcpy(optarg);
|
|
|
|
else if ('?' == o || ':' == o)
|
2013-05-12 18:21:16 +08:00
|
|
|
usage(1);
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
}
|
|
|
|
|
2013-03-01 12:41:16 +08:00
|
|
|
// Check for abundant positional arguments
|
|
|
|
if (optind < argc)
|
|
|
|
printf_errfq(1, "(): compton doesn't accept positional arguments.");
|
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-09-26 18:54:35 +08:00
|
|
|
struct options_tmp cfgtmp = {
|
2012-11-19 09:46:07 +08:00
|
|
|
.no_dock_shadow = false,
|
|
|
|
.no_dnd_shadow = false,
|
2012-09-26 18:54:35 +08:00
|
|
|
.menu_opacity = 1.0,
|
|
|
|
};
|
2012-11-19 09:46:07 +08:00
|
|
|
bool shadow_enable = false, fading_enable = false;
|
2012-09-27 22:30:16 +08:00
|
|
|
char *lc_numeric_old = mstrcpy(setlocale(LC_NUMERIC, NULL));
|
Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
PCRE) and 3 matching targets (window name, window class instance,
window general class). Not extensively tested, bugs to be expected.
It's slower for exact matching than nicklan's as it uses linear search
instead of hash table. Also, PCRE's JIT optimization may cause issues
on PaX kernels.
- Add dependency to libpcre. Could be made optional if we have a
graceful way to handle that in Makefile.
- Some matching functions are GNU extensions of glibc. So this version
may have troubles running on platforms not using glibc.
- Fix a bug that access freed memory blocks in set_fade_callcack() and
check_fade_fin(). valgrind found it out.
- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
windows (like notification windows) have WM_CLASS but not WM_STATE.
- Mark the extents as damaged if shadow state changed in
determine_shadow().
- Rewrite wid_get_name(). Code clean-up.
- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.
- As the matching system is ready, it should be rather easy to add other
kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
for (i = 0; i < NUM_WINTYPES; ++i) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.wintype_fade[i] = false;
|
|
|
|
ps->o.wintype_shadow[i] = false;
|
|
|
|
ps->o.wintype_opacity[i] = 1.0;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
|
|
|
|
2013-09-14 10:04:38 +08:00
|
|
|
// Enforce LC_NUMERIC locale "C" here to make sure dots are recognized
|
|
|
|
// instead of commas in atof().
|
|
|
|
setlocale(LC_NUMERIC, "C");
|
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
#ifdef CONFIG_LIBCONFIG
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
parse_config(ps, &cfgtmp);
|
2012-09-25 10:19:20 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Parse commandline arguments. Range checking will be done later.
|
2012-09-27 22:30:16 +08:00
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
optind = 1;
|
|
|
|
while (-1 !=
|
|
|
|
(o = getopt_long(argc, argv, shortopts, longopts, &longopt_idx))) {
|
2013-09-04 22:00:51 +08:00
|
|
|
long val = 0;
|
2011-11-04 14:33:23 +08:00
|
|
|
switch (o) {
|
2013-04-05 21:05:19 +08:00
|
|
|
#define P_CASEBOOL(idx, option) case idx: ps->o.option = true; break
|
2013-09-04 22:00:51 +08:00
|
|
|
#define P_CASELONG(idx, option) \
|
|
|
|
case idx: \
|
|
|
|
if (!parse_long(optarg, &val)) exit(1); \
|
|
|
|
ps->o.option = val; \
|
|
|
|
break
|
|
|
|
|
2012-09-11 21:57:50 +08:00
|
|
|
// Short options
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
case 'h':
|
2013-05-12 18:21:16 +08:00
|
|
|
usage(0);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
break;
|
2011-11-04 16:41:56 +08:00
|
|
|
case 'd':
|
|
|
|
break;
|
2013-09-04 22:00:51 +08:00
|
|
|
P_CASELONG('D', fade_delta);
|
2011-11-04 16:41:56 +08:00
|
|
|
case 'I':
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.fade_in_step = normalize_d(atof(optarg)) * OPAQUE;
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
|
|
|
case 'O':
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.fade_out_step = normalize_d(atof(optarg)) * OPAQUE;
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
2011-11-07 09:29:23 +08:00
|
|
|
case 'c':
|
2012-11-19 09:46:07 +08:00
|
|
|
shadow_enable = true;
|
2011-11-07 09:29:23 +08:00
|
|
|
break;
|
2011-11-04 16:41:56 +08:00
|
|
|
case 'C':
|
2012-11-19 09:46:07 +08:00
|
|
|
cfgtmp.no_dock_shadow = true;
|
2012-09-26 18:54:35 +08:00
|
|
|
break;
|
|
|
|
case 'G':
|
2012-11-19 09:46:07 +08:00
|
|
|
cfgtmp.no_dnd_shadow = true;
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
|
|
|
case 'm':
|
2012-09-26 18:54:35 +08:00
|
|
|
cfgtmp.menu_opacity = atof(optarg);
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
|
|
|
case 'f':
|
|
|
|
case 'F':
|
2012-11-19 09:46:07 +08:00
|
|
|
fading_enable = true;
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL('S', synchronize);
|
2013-09-04 22:00:51 +08:00
|
|
|
P_CASELONG('r', shadow_radius);
|
2011-11-04 16:41:56 +08:00
|
|
|
case 'o':
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.shadow_opacity = atof(optarg);
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
2013-09-04 22:00:51 +08:00
|
|
|
P_CASELONG('l', shadow_offset_x);
|
|
|
|
P_CASELONG('t', shadow_offset_y);
|
2011-11-05 01:02:17 +08:00
|
|
|
case 'i':
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.inactive_opacity = (normalize_d(atof(optarg)) * OPAQUE);
|
2011-11-05 01:02:17 +08:00
|
|
|
break;
|
2011-11-06 11:33:50 +08:00
|
|
|
case 'e':
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.frame_opacity = atof(optarg);
|
2011-11-06 10:39:58 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL('z', clear_shadow);
|
2011-11-04 16:41:56 +08:00
|
|
|
case 'n':
|
|
|
|
case 'a':
|
|
|
|
case 's':
|
2013-01-11 21:31:02 +08:00
|
|
|
printf_errfq(1, "(): -n, -a, and -s have been removed.");
|
2011-11-04 16:41:56 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL('b', fork_after_register);
|
2012-09-25 10:19:20 +08:00
|
|
|
// Long options
|
|
|
|
case 256:
|
|
|
|
// --config
|
|
|
|
break;
|
|
|
|
case 257:
|
|
|
|
// --shadow-red
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.shadow_red = atof(optarg);
|
2012-09-25 10:19:20 +08:00
|
|
|
break;
|
|
|
|
case 258:
|
|
|
|
// --shadow-green
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.shadow_green = atof(optarg);
|
2012-09-25 10:19:20 +08:00
|
|
|
break;
|
|
|
|
case 259:
|
|
|
|
// --shadow-blue
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.shadow_blue = atof(optarg);
|
2012-09-25 10:19:20 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(260, inactive_opacity_override);
|
2012-09-25 10:19:20 +08:00
|
|
|
case 261:
|
|
|
|
// --inactive-dim
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.inactive_dim = atof(optarg);
|
2012-09-25 10:19:20 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(262, mark_wmwin_focused);
|
2012-09-25 10:19:20 +08:00
|
|
|
case 263:
|
|
|
|
// --shadow-exclude
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
condlst_add(ps, &ps->o.shadow_blacklist, optarg);
|
2012-09-25 10:19:20 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(264, mark_ovredir_focused);
|
|
|
|
P_CASEBOOL(265, no_fading_openclose);
|
|
|
|
P_CASEBOOL(266, shadow_ignore_shaped);
|
|
|
|
P_CASEBOOL(267, detect_rounded_corners);
|
|
|
|
P_CASEBOOL(268, detect_client_opacity);
|
2013-09-04 22:00:51 +08:00
|
|
|
P_CASELONG(269, refresh_rate);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
case 270:
|
|
|
|
// --vsync
|
2013-01-31 22:53:44 +08:00
|
|
|
if (!parse_vsync(ps, optarg))
|
|
|
|
exit(1);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
break;
|
2012-10-13 18:46:59 +08:00
|
|
|
case 271:
|
|
|
|
// --alpha-step
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.alpha_step = atof(optarg);
|
2012-10-13 18:46:59 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(272, dbe);
|
|
|
|
P_CASEBOOL(273, paint_on_overlay);
|
|
|
|
P_CASEBOOL(274, sw_opti);
|
|
|
|
P_CASEBOOL(275, vsync_aggressive);
|
|
|
|
P_CASEBOOL(276, use_ewmh_active_win);
|
|
|
|
P_CASEBOOL(277, respect_prop_shadow);
|
|
|
|
P_CASEBOOL(278, unredir_if_possible);
|
2012-11-28 11:44:00 +08:00
|
|
|
case 279:
|
|
|
|
// --focus-exclude
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
condlst_add(ps, &ps->o.focus_blacklist, optarg);
|
2012-11-28 11:44:00 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(280, inactive_dim_fixed);
|
|
|
|
P_CASEBOOL(281, detect_transient);
|
|
|
|
P_CASEBOOL(282, detect_client_leader);
|
|
|
|
P_CASEBOOL(283, blur_background);
|
|
|
|
P_CASEBOOL(284, blur_background_frame);
|
|
|
|
P_CASEBOOL(285, blur_background_fixed);
|
|
|
|
P_CASEBOOL(286, dbus);
|
2013-01-11 21:31:02 +08:00
|
|
|
case 287:
|
|
|
|
// --logpath
|
|
|
|
ps->o.logpath = mstrcpy(optarg);
|
|
|
|
break;
|
2013-01-12 22:21:35 +08:00
|
|
|
case 288:
|
|
|
|
// --invert-color-include
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
condlst_add(ps, &ps->o.invert_color_list, optarg);
|
2013-01-12 22:21:35 +08:00
|
|
|
break;
|
2013-03-15 23:16:23 +08:00
|
|
|
case 289:
|
|
|
|
// --opengl
|
|
|
|
ps->o.backend = BKEND_GLX;
|
|
|
|
break;
|
2013-03-16 22:54:43 +08:00
|
|
|
case 290:
|
|
|
|
// --backend
|
|
|
|
if (!parse_backend(ps, optarg))
|
|
|
|
exit(1);
|
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(291, glx_no_stencil);
|
|
|
|
P_CASEBOOL(292, glx_copy_from_front);
|
2013-09-04 22:00:51 +08:00
|
|
|
P_CASELONG(293, benchmark);
|
2013-03-19 20:58:55 +08:00
|
|
|
case 294:
|
|
|
|
// --benchmark-wid
|
|
|
|
ps->o.benchmark_wid = strtol(optarg, NULL, 0);
|
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(295, glx_use_copysubbuffermesa);
|
2013-03-23 22:06:41 +08:00
|
|
|
case 296:
|
|
|
|
// --blur-background-exclude
|
|
|
|
condlst_add(ps, &ps->o.blur_background_blacklist, optarg);
|
|
|
|
break;
|
2013-03-30 11:46:32 +08:00
|
|
|
case 297:
|
|
|
|
// --active-opacity
|
|
|
|
ps->o.active_opacity = (normalize_d(atof(optarg)) * OPAQUE);
|
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
P_CASEBOOL(298, glx_no_rebind_pixmap);
|
2013-04-21 22:30:22 +08:00
|
|
|
case 299:
|
|
|
|
// --glx-swap-method
|
|
|
|
if (!parse_glx_swap_method(ps, optarg))
|
|
|
|
exit(1);
|
|
|
|
break;
|
|
|
|
case 300:
|
|
|
|
// --fade-exclude
|
|
|
|
condlst_add(ps, &ps->o.fade_blacklist, optarg);
|
|
|
|
break;
|
2013-04-25 22:23:35 +08:00
|
|
|
case 301:
|
|
|
|
// --blur-kern
|
2013-05-20 18:04:40 +08:00
|
|
|
if (!parse_conv_kern_lst(ps, optarg, ps->o.blur_kerns, MAX_BLUR_PASS))
|
2013-04-25 22:23:35 +08:00
|
|
|
exit(1);
|
2013-05-20 18:04:40 +08:00
|
|
|
break;
|
2013-09-04 22:00:51 +08:00
|
|
|
P_CASELONG(302, resize_damage);
|
2013-05-08 22:44:36 +08:00
|
|
|
P_CASEBOOL(303, glx_use_gpushader4);
|
2013-05-21 09:18:41 +08:00
|
|
|
case 304:
|
|
|
|
// --opacity-rule
|
|
|
|
if (!parse_rule_opacity(ps, optarg))
|
|
|
|
exit(1);
|
|
|
|
break;
|
2013-06-09 17:06:35 +08:00
|
|
|
case 305:
|
|
|
|
// --shadow-exclude-reg
|
|
|
|
if (!parse_geometry(ps, optarg, &ps->o.shadow_exclude_reg_geom))
|
|
|
|
exit(1);
|
|
|
|
break;
|
2013-06-19 19:36:48 +08:00
|
|
|
case 306:
|
|
|
|
// --paint-exclude
|
|
|
|
condlst_add(ps, &ps->o.paint_blacklist, optarg);
|
|
|
|
break;
|
2013-08-22 21:15:04 +08:00
|
|
|
P_CASEBOOL(307, xinerama_shadow_crop);
|
2013-09-04 22:00:51 +08:00
|
|
|
case 308:
|
|
|
|
// --unredir-if-possible-exclude
|
|
|
|
condlst_add(ps, &ps->o.unredir_if_possible_blacklist, optarg);
|
|
|
|
break;
|
|
|
|
P_CASELONG(309, unredir_if_possible_delay);
|
2011-11-04 16:41:56 +08:00
|
|
|
default:
|
2013-05-12 18:21:16 +08:00
|
|
|
usage(1);
|
2013-01-11 21:31:02 +08:00
|
|
|
break;
|
2013-04-05 21:05:19 +08:00
|
|
|
#undef P_CASEBOOL
|
2008-02-15 12:38:32 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
|
2012-09-27 22:30:16 +08:00
|
|
|
// Restore LC_NUMERIC
|
|
|
|
setlocale(LC_NUMERIC, lc_numeric_old);
|
|
|
|
free(lc_numeric_old);
|
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
// Range checking and option assignments
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.fade_delta = max_i(ps->o.fade_delta, 1);
|
|
|
|
ps->o.shadow_radius = max_i(ps->o.shadow_radius, 1);
|
|
|
|
ps->o.shadow_red = normalize_d(ps->o.shadow_red);
|
|
|
|
ps->o.shadow_green = normalize_d(ps->o.shadow_green);
|
|
|
|
ps->o.shadow_blue = normalize_d(ps->o.shadow_blue);
|
|
|
|
ps->o.inactive_dim = normalize_d(ps->o.inactive_dim);
|
|
|
|
ps->o.frame_opacity = normalize_d(ps->o.frame_opacity);
|
|
|
|
ps->o.shadow_opacity = normalize_d(ps->o.shadow_opacity);
|
2012-09-26 18:54:35 +08:00
|
|
|
cfgtmp.menu_opacity = normalize_d(cfgtmp.menu_opacity);
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.refresh_rate = normalize_i_range(ps->o.refresh_rate, 0, 300);
|
|
|
|
ps->o.alpha_step = normalize_d_range(ps->o.alpha_step, 0.01, 1.0);
|
|
|
|
if (OPAQUE == ps->o.inactive_opacity) {
|
|
|
|
ps->o.inactive_opacity = 0;
|
2012-09-26 18:54:35 +08:00
|
|
|
}
|
2013-03-30 11:46:32 +08:00
|
|
|
if (OPAQUE == ps->o.active_opacity) {
|
|
|
|
ps->o.active_opacity = 0;
|
|
|
|
}
|
2012-09-26 18:54:35 +08:00
|
|
|
if (shadow_enable)
|
2012-11-19 09:46:07 +08:00
|
|
|
wintype_arr_enable(ps->o.wintype_shadow);
|
|
|
|
ps->o.wintype_shadow[WINTYPE_DESKTOP] = false;
|
2012-09-26 18:54:35 +08:00
|
|
|
if (cfgtmp.no_dock_shadow)
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.wintype_shadow[WINTYPE_DOCK] = false;
|
2012-09-26 18:54:35 +08:00
|
|
|
if (cfgtmp.no_dnd_shadow)
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.wintype_shadow[WINTYPE_DND] = false;
|
2012-09-26 18:54:35 +08:00
|
|
|
if (fading_enable)
|
2012-11-19 09:46:07 +08:00
|
|
|
wintype_arr_enable(ps->o.wintype_fade);
|
2012-09-26 18:54:35 +08:00
|
|
|
if (1.0 != cfgtmp.menu_opacity) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.wintype_opacity[WINTYPE_DROPDOWN_MENU] = cfgtmp.menu_opacity;
|
|
|
|
ps->o.wintype_opacity[WINTYPE_POPUP_MENU] = cfgtmp.menu_opacity;
|
2012-02-27 12:00:12 +08:00
|
|
|
}
|
2012-02-27 00:35:17 +08:00
|
|
|
|
2012-12-14 20:32:46 +08:00
|
|
|
// --blur-background-frame implies --blur-background
|
|
|
|
if (ps->o.blur_background_frame)
|
|
|
|
ps->o.blur_background = true;
|
|
|
|
|
2012-09-25 10:19:20 +08:00
|
|
|
// Other variables determined by options
|
|
|
|
|
2012-09-13 11:47:31 +08:00
|
|
|
// Determine whether we need to track focus changes
|
2013-03-30 11:46:32 +08:00
|
|
|
if (ps->o.inactive_opacity || ps->o.active_opacity || ps->o.inactive_dim) {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.track_focus = true;
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-09-13 11:47:31 +08:00
|
|
|
|
2012-12-12 12:01:51 +08:00
|
|
|
// Determine whether we track window grouping
|
|
|
|
if (ps->o.detect_transient || ps->o.detect_client_leader) {
|
|
|
|
ps->o.track_leader = true;
|
|
|
|
}
|
|
|
|
|
2013-04-25 22:23:35 +08:00
|
|
|
// Fill default blur kernel
|
2013-05-20 18:04:40 +08:00
|
|
|
if (ps->o.blur_background && !ps->o.blur_kerns[0]) {
|
2013-04-25 22:23:35 +08:00
|
|
|
// Convolution filter parameter (box blur)
|
|
|
|
// gaussian or binomial filters are definitely superior, yet looks
|
|
|
|
// like they aren't supported as of xorg-server-1.13.0
|
|
|
|
const static XFixed convolution_blur[] = {
|
|
|
|
// Must convert to XFixed with XDoubleToFixed()
|
|
|
|
// Matrix size
|
2013-04-26 16:14:37 +08:00
|
|
|
XDoubleToFixed(3), XDoubleToFixed(3),
|
2013-04-25 22:23:35 +08:00
|
|
|
// Matrix
|
|
|
|
XDoubleToFixed(1), XDoubleToFixed(1), XDoubleToFixed(1),
|
|
|
|
XDoubleToFixed(1), XDoubleToFixed(1), XDoubleToFixed(1),
|
|
|
|
XDoubleToFixed(1), XDoubleToFixed(1), XDoubleToFixed(1),
|
|
|
|
};
|
2013-05-20 18:04:40 +08:00
|
|
|
ps->o.blur_kerns[0] = malloc(sizeof(convolution_blur));
|
|
|
|
if (!ps->o.blur_kerns[0]) {
|
2013-04-25 22:23:35 +08:00
|
|
|
printf_errf("(): Failed to allocate memory for convolution kernel.");
|
|
|
|
exit(1);
|
|
|
|
}
|
2013-05-20 18:04:40 +08:00
|
|
|
memcpy(ps->o.blur_kerns[0], &convolution_blur, sizeof(convolution_blur));
|
2013-04-25 22:23:35 +08:00
|
|
|
}
|
2013-06-09 17:06:35 +08:00
|
|
|
|
|
|
|
rebuild_shadow_exclude_reg(ps);
|
2013-07-30 22:24:11 +08:00
|
|
|
|
|
|
|
if (ps->o.resize_damage < 0)
|
|
|
|
printf_errf("(): Negative --resize-damage does not work correctly.");
|
2012-09-25 10:19:20 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Fetch all required atoms and save them to a session.
|
|
|
|
*/
|
2012-09-25 10:19:20 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
init_atoms(session_t *ps) {
|
2013-01-09 20:25:01 +08:00
|
|
|
ps->atom_opacity = get_atom(ps, "_NET_WM_WINDOW_OPACITY");
|
|
|
|
ps->atom_frame_extents = get_atom(ps, "_NET_FRAME_EXTENTS");
|
|
|
|
ps->atom_client = get_atom(ps, "WM_STATE");
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->atom_name = XA_WM_NAME;
|
2013-01-09 20:25:01 +08:00
|
|
|
ps->atom_name_ewmh = get_atom(ps, "_NET_WM_NAME");
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->atom_class = XA_WM_CLASS;
|
2013-01-09 20:25:01 +08:00
|
|
|
ps->atom_role = get_atom(ps, "WM_WINDOW_ROLE");
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->atom_transient = XA_WM_TRANSIENT_FOR;
|
2013-01-09 20:25:01 +08:00
|
|
|
ps->atom_client_leader = get_atom(ps, "WM_CLIENT_LEADER");
|
|
|
|
ps->atom_ewmh_active_win = get_atom(ps, "_NET_ACTIVE_WINDOW");
|
|
|
|
ps->atom_compton_shadow = get_atom(ps, "_COMPTON_SHADOW");
|
2012-11-19 09:46:07 +08:00
|
|
|
|
2013-01-09 20:25:01 +08:00
|
|
|
ps->atom_win_type = get_atom(ps, "_NET_WM_WINDOW_TYPE");
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->atoms_wintypes[WINTYPE_UNKNOWN] = 0;
|
2013-01-09 20:25:01 +08:00
|
|
|
ps->atoms_wintypes[WINTYPE_DESKTOP] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_DESKTOP");
|
|
|
|
ps->atoms_wintypes[WINTYPE_DOCK] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_DOCK");
|
|
|
|
ps->atoms_wintypes[WINTYPE_TOOLBAR] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_TOOLBAR");
|
|
|
|
ps->atoms_wintypes[WINTYPE_MENU] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_MENU");
|
|
|
|
ps->atoms_wintypes[WINTYPE_UTILITY] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_UTILITY");
|
|
|
|
ps->atoms_wintypes[WINTYPE_SPLASH] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_SPLASH");
|
|
|
|
ps->atoms_wintypes[WINTYPE_DIALOG] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_DIALOG");
|
|
|
|
ps->atoms_wintypes[WINTYPE_NORMAL] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_NORMAL");
|
|
|
|
ps->atoms_wintypes[WINTYPE_DROPDOWN_MENU] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU");
|
|
|
|
ps->atoms_wintypes[WINTYPE_POPUP_MENU] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_POPUP_MENU");
|
|
|
|
ps->atoms_wintypes[WINTYPE_TOOLTIP] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_TOOLTIP");
|
|
|
|
ps->atoms_wintypes[WINTYPE_NOTIFY] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_NOTIFICATION");
|
|
|
|
ps->atoms_wintypes[WINTYPE_COMBO] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_COMBO");
|
|
|
|
ps->atoms_wintypes[WINTYPE_DND] = get_atom(ps,
|
|
|
|
"_NET_WM_WINDOW_TYPE_DND");
|
2012-09-25 10:19:20 +08:00
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
/**
|
|
|
|
* Update refresh rate info with X Randr extension.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
update_refresh_rate(session_t *ps) {
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
XRRScreenConfiguration* randr_info;
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!(randr_info = XRRGetScreenInfo(ps->dpy, ps->root)))
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
return;
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->refresh_rate = XRRConfigCurrentRate(randr_info);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
|
|
|
XRRFreeScreenConfigInfo(randr_info);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->refresh_rate)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ps->refresh_intv = US_PER_SEC / ps->refresh_rate;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
else
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->refresh_intv = 0;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2012-10-26 11:12:28 +08:00
|
|
|
* Initialize refresh-rated based software optimization.
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
*
|
2012-11-19 09:46:07 +08:00
|
|
|
* @return true for success, false otherwise
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
*/
|
2012-11-19 09:46:07 +08:00
|
|
|
static bool
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
swopti_init(session_t *ps) {
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// Prepare refresh rate
|
|
|
|
// Check if user provides one
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->refresh_rate = ps->o.refresh_rate;
|
|
|
|
if (ps->refresh_rate)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ps->refresh_intv = US_PER_SEC / ps->refresh_rate;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
|
|
|
// Auto-detect refresh rate otherwise
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->refresh_rate && ps->randr_exists) {
|
|
|
|
update_refresh_rate(ps);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Turn off vsync_sw if we can't get the refresh rate
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->refresh_rate)
|
|
|
|
return false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return true;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
* Modify a struct timeval timeout value to render at a fixed pace.
|
2012-10-26 11:12:28 +08:00
|
|
|
*
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
* @param ps current session
|
|
|
|
* @param[in,out] ptv pointer to the timeout
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
*/
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
static void
|
|
|
|
swopti_handle_timeout(session_t *ps, struct timeval *ptv) {
|
|
|
|
if (!ptv)
|
|
|
|
return;
|
2012-10-26 11:12:28 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
// Get the microsecond offset of the time when the we reach the timeout
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// I don't think a 32-bit long could overflow here.
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
long offset = (ptv->tv_usec + get_time_timeval().tv_usec - ps->paint_tm_offset) % ps->refresh_intv;
|
|
|
|
if (offset < 0)
|
|
|
|
offset += ps->refresh_intv;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
assert(offset >= 0 && offset < ps->refresh_intv);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-10-26 11:12:28 +08:00
|
|
|
// If the target time is sufficiently close to a refresh time, don't add
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// an offset, to avoid certain blocking conditions.
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (offset < SWOPTI_TOLERANCE
|
|
|
|
|| offset > ps->refresh_intv - SWOPTI_TOLERANCE)
|
|
|
|
return;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-10-26 11:12:28 +08:00
|
|
|
// Add an offset so we wait until the next refresh after timeout
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ptv->tv_usec += ps->refresh_intv - offset;
|
|
|
|
if (ptv->tv_usec > US_PER_SEC) {
|
|
|
|
ptv->tv_usec -= US_PER_SEC;
|
|
|
|
++ptv->tv_sec;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
/**
|
|
|
|
* Initialize DRM VSync.
|
|
|
|
*
|
2012-11-19 09:46:07 +08:00
|
|
|
* @return true for success, false otherwise
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
*/
|
2012-11-19 09:46:07 +08:00
|
|
|
static bool
|
|
|
|
vsync_drm_init(session_t *ps) {
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#ifdef CONFIG_VSYNC_DRM
|
|
|
|
// Should we always open card0?
|
2013-01-31 22:53:44 +08:00
|
|
|
if (ps->drm_fd < 0 && (ps->drm_fd = open("/dev/dri/card0", O_RDWR)) < 0) {
|
2013-01-30 13:41:08 +08:00
|
|
|
printf_errf("(): Failed to open device.");
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (vsync_drm_wait(ps))
|
|
|
|
return false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
return true;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#else
|
2013-01-30 13:41:08 +08:00
|
|
|
printf_errf("(): Program not compiled with DRM VSync support.");
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef CONFIG_VSYNC_DRM
|
|
|
|
/**
|
|
|
|
* Wait for next VSync, DRM method.
|
|
|
|
*
|
|
|
|
* Stolen from: https://github.com/MythTV/mythtv/blob/master/mythtv/libs/libmythtv/vsync.cpp
|
|
|
|
*/
|
|
|
|
static int
|
2012-11-19 09:46:07 +08:00
|
|
|
vsync_drm_wait(session_t *ps) {
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
int ret = -1;
|
|
|
|
drm_wait_vblank_t vbl;
|
|
|
|
|
|
|
|
vbl.request.type = _DRM_VBLANK_RELATIVE,
|
|
|
|
vbl.request.sequence = 1;
|
|
|
|
|
|
|
|
do {
|
2012-11-19 09:46:07 +08:00
|
|
|
ret = ioctl(ps->drm_fd, DRM_IOCTL_WAIT_VBLANK, &vbl);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
vbl.request.type &= ~_DRM_VBLANK_RELATIVE;
|
|
|
|
} while (ret && errno == EINTR);
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
fprintf(stderr, "vsync_drm_wait(): VBlank ioctl did not work, "
|
|
|
|
"unimplemented in this drmver?\n");
|
|
|
|
|
|
|
|
return ret;
|
2012-11-19 09:46:07 +08:00
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize OpenGL VSync.
|
|
|
|
*
|
|
|
|
* Stolen from: http://git.tuxfamily.org/?p=ccm/cairocompmgr.git;a=commitdiff;h=efa4ceb97da501e8630ca7f12c99b1dce853c73e
|
|
|
|
* Possible original source: http://www.inb.uni-luebeck.de/~boehme/xvideo_sync.html
|
|
|
|
*
|
2012-11-19 09:46:07 +08:00
|
|
|
* @return true for success, false otherwise
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
*/
|
2012-11-19 09:46:07 +08:00
|
|
|
static bool
|
|
|
|
vsync_opengl_init(session_t *ps) {
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
2013-01-31 22:53:44 +08:00
|
|
|
if (!ensure_glx_context(ps))
|
|
|
|
return false;
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// Get video sync functions
|
2013-09-26 07:41:11 +08:00
|
|
|
if (!ps->glXGetVideoSyncSGI)
|
2013-01-31 22:53:44 +08:00
|
|
|
ps->glXGetVideoSyncSGI = (f_GetVideoSync)
|
2013-03-01 12:41:16 +08:00
|
|
|
glXGetProcAddress((const GLubyte *) "glXGetVideoSyncSGI");
|
2013-01-31 22:53:44 +08:00
|
|
|
if (!ps->glXWaitVideoSyncSGI)
|
|
|
|
ps->glXWaitVideoSyncSGI = (f_WaitVideoSync)
|
2013-03-01 12:41:16 +08:00
|
|
|
glXGetProcAddress((const GLubyte *) "glXWaitVideoSyncSGI");
|
2013-01-30 13:41:08 +08:00
|
|
|
if (!ps->glXWaitVideoSyncSGI || !ps->glXGetVideoSyncSGI) {
|
|
|
|
printf_errf("(): Failed to get glXWait/GetVideoSyncSGI function.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
#else
|
2013-01-31 22:53:44 +08:00
|
|
|
printf_errf("(): Program not compiled with OpenGL VSync support.");
|
2013-01-30 13:41:08 +08:00
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
vsync_opengl_oml_init(session_t *ps) {
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
2013-01-31 22:53:44 +08:00
|
|
|
if (!ensure_glx_context(ps))
|
|
|
|
return false;
|
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
// Get video sync functions
|
2013-01-31 22:53:44 +08:00
|
|
|
if (!ps->glXGetSyncValuesOML)
|
|
|
|
ps->glXGetSyncValuesOML = (f_GetSyncValuesOML)
|
|
|
|
glXGetProcAddress ((const GLubyte *) "glXGetSyncValuesOML");
|
|
|
|
if (!ps->glXWaitForMscOML)
|
|
|
|
ps->glXWaitForMscOML = (f_WaitForMscOML)
|
|
|
|
glXGetProcAddress ((const GLubyte *) "glXWaitForMscOML");
|
2013-01-30 13:41:08 +08:00
|
|
|
if (!ps->glXGetSyncValuesOML || !ps->glXWaitForMscOML) {
|
|
|
|
printf_errf("(): Failed to get OML_sync_control functions.");
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
return true;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#else
|
2013-01-31 22:53:44 +08:00
|
|
|
printf_errf("(): Program not compiled with OpenGL VSync support.");
|
2012-11-19 09:46:07 +08:00
|
|
|
return false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
static bool
|
|
|
|
vsync_opengl_swc_init(session_t *ps) {
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (!ensure_glx_context(ps))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (BKEND_GLX != ps->o.backend) {
|
|
|
|
printf_errf("(): I'm afraid glXSwapIntervalSGI wouldn't help if you are "
|
2013-03-16 22:54:43 +08:00
|
|
|
"not using GLX backend. You could try, nonetheless.");
|
2013-03-15 23:16:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get video sync functions
|
|
|
|
if (!ps->glXSwapIntervalProc)
|
|
|
|
ps->glXSwapIntervalProc = (f_SwapIntervalSGI)
|
|
|
|
glXGetProcAddress ((const GLubyte *) "glXSwapIntervalSGI");
|
|
|
|
if (!ps->glXSwapIntervalProc) {
|
|
|
|
printf_errf("(): Failed to get SGI_swap_control function.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
ps->glXSwapIntervalProc(1);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
#else
|
|
|
|
printf_errf("(): Program not compiled with OpenGL VSync support.");
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2013-03-23 22:06:41 +08:00
|
|
|
static bool
|
|
|
|
vsync_opengl_mswc_init(session_t *ps) {
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (!ensure_glx_context(ps))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (BKEND_GLX != ps->o.backend) {
|
|
|
|
printf_errf("(): I'm afraid glXSwapIntervalMESA wouldn't help if you are "
|
|
|
|
"not using GLX backend. You could try, nonetheless.");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get video sync functions
|
|
|
|
if (!ps->glXSwapIntervalMESAProc)
|
|
|
|
ps->glXSwapIntervalMESAProc = (f_SwapIntervalMESA)
|
|
|
|
glXGetProcAddress ((const GLubyte *) "glXSwapIntervalMESA");
|
|
|
|
if (!ps->glXSwapIntervalMESAProc) {
|
|
|
|
printf_errf("(): Failed to get MESA_swap_control function.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
ps->glXSwapIntervalMESAProc(1);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
#else
|
|
|
|
printf_errf("(): Program not compiled with OpenGL VSync support.");
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
/**
|
|
|
|
* Wait for next VSync, OpenGL method.
|
|
|
|
*/
|
2013-01-30 13:41:08 +08:00
|
|
|
static int
|
2012-11-19 09:46:07 +08:00
|
|
|
vsync_opengl_wait(session_t *ps) {
|
2013-01-30 13:41:08 +08:00
|
|
|
unsigned vblank_count = 0;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
ps->glXGetVideoSyncSGI(&vblank_count);
|
|
|
|
ps->glXWaitVideoSyncSGI(2, (vblank_count + 1) % 2, &vblank_count);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// I see some code calling glXSwapIntervalSGI(1) afterwards, is it required?
|
2013-01-30 13:41:08 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Wait for next VSync, OpenGL OML method.
|
|
|
|
*
|
|
|
|
* https://mail.gnome.org/archives/clutter-list/2012-November/msg00031.html
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
vsync_opengl_oml_wait(session_t *ps) {
|
|
|
|
int64_t ust = 0, msc = 0, sbc = 0;
|
|
|
|
|
|
|
|
ps->glXGetSyncValuesOML(ps->dpy, ps->reg_win, &ust, &msc, &sbc);
|
|
|
|
ps->glXWaitForMscOML(ps->dpy, ps->reg_win, 0, 2, (msc + 1) % 2,
|
|
|
|
&ust, &msc, &sbc);
|
|
|
|
|
|
|
|
return 0;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
2013-05-20 18:04:40 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
vsync_opengl_swc_deinit(session_t *ps) {
|
|
|
|
// The standard says it doesn't accept 0, but in fact it probably does
|
|
|
|
if (ps->glx_context && ps->glXSwapIntervalProc)
|
|
|
|
ps->glXSwapIntervalProc(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
vsync_opengl_mswc_deinit(session_t *ps) {
|
|
|
|
if (ps->glx_context && ps->glXSwapIntervalMESAProc)
|
|
|
|
ps->glXSwapIntervalMESAProc(0);
|
|
|
|
}
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
#endif
|
|
|
|
|
2013-01-31 22:53:44 +08:00
|
|
|
/**
|
|
|
|
* Initialize current VSync method.
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
vsync_init(session_t *ps) {
|
|
|
|
if (ps->o.vsync && VSYNC_FUNCS_INIT[ps->o.vsync]
|
|
|
|
&& !VSYNC_FUNCS_INIT[ps->o.vsync](ps)) {
|
|
|
|
ps->o.vsync = VSYNC_NONE;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
/**
|
2012-10-26 11:12:28 +08:00
|
|
|
* Wait for next VSync.
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
*/
|
2012-10-26 11:12:28 +08:00
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
vsync_wait(session_t *ps) {
|
2013-01-30 13:41:08 +08:00
|
|
|
if (!ps->o.vsync)
|
2012-10-26 11:12:28 +08:00
|
|
|
return;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
if (VSYNC_FUNCS_WAIT[ps->o.vsync])
|
|
|
|
VSYNC_FUNCS_WAIT[ps->o.vsync](ps);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
|
2013-05-20 18:04:40 +08:00
|
|
|
/**
|
|
|
|
* Deinitialize current VSync method.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
vsync_deinit(session_t *ps) {
|
|
|
|
if (ps->o.vsync && VSYNC_FUNCS_DEINIT[ps->o.vsync])
|
|
|
|
VSYNC_FUNCS_DEINIT[ps->o.vsync](ps);
|
|
|
|
ps->o.vsync = VSYNC_NONE;
|
|
|
|
}
|
|
|
|
|
2012-10-13 18:46:59 +08:00
|
|
|
/**
|
|
|
|
* Pregenerate alpha pictures.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
init_alpha_picts(session_t *ps) {
|
2012-10-13 18:46:59 +08:00
|
|
|
int i;
|
2012-11-21 09:15:49 +08:00
|
|
|
int num = round(1.0 / ps->o.alpha_step) + 1;
|
2012-10-13 18:46:59 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->alpha_picts = malloc(sizeof(Picture) * num);
|
2012-10-13 18:46:59 +08:00
|
|
|
|
|
|
|
for (i = 0; i < num; ++i) {
|
2012-11-19 09:46:07 +08:00
|
|
|
double o = i * ps->o.alpha_step;
|
|
|
|
if ((1.0 - o) > ps->o.alpha_step)
|
|
|
|
ps->alpha_picts[i] = solid_picture(ps, false, o, 0, 0, 0);
|
2012-10-13 18:46:59 +08:00
|
|
|
else
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->alpha_picts[i] = None;
|
2012-10-13 18:46:59 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-23 13:42:20 +08:00
|
|
|
/**
|
|
|
|
* Initialize double buffer.
|
|
|
|
*/
|
2013-01-30 13:41:08 +08:00
|
|
|
static bool
|
2012-11-19 09:46:07 +08:00
|
|
|
init_dbe(session_t *ps) {
|
|
|
|
if (!(ps->root_dbe = XdbeAllocateBackBufferName(ps->dpy,
|
|
|
|
(ps->o.paint_on_overlay ? ps->overlay: ps->root), XdbeCopied))) {
|
2013-01-30 13:41:08 +08:00
|
|
|
printf_errf("(): Failed to create double buffer. Double buffering "
|
|
|
|
"cannot work.");
|
|
|
|
return false;
|
2012-10-23 13:42:20 +08:00
|
|
|
}
|
2013-01-30 13:41:08 +08:00
|
|
|
|
|
|
|
return true;
|
2012-10-23 13:42:20 +08:00
|
|
|
}
|
|
|
|
|
2012-10-24 10:09:59 +08:00
|
|
|
/**
|
|
|
|
* Initialize X composite overlay window.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
init_overlay(session_t *ps) {
|
|
|
|
ps->overlay = XCompositeGetOverlayWindow(ps->dpy, ps->root);
|
|
|
|
if (ps->overlay) {
|
2012-10-24 10:09:59 +08:00
|
|
|
// Set window region of the overlay window, code stolen from
|
|
|
|
// compiz-0.8.8
|
2012-11-19 09:46:07 +08:00
|
|
|
XserverRegion region = XFixesCreateRegion(ps->dpy, NULL, 0);
|
|
|
|
XFixesSetWindowShapeRegion(ps->dpy, ps->overlay, ShapeBounding, 0, 0, 0);
|
|
|
|
XFixesSetWindowShapeRegion(ps->dpy, ps->overlay, ShapeInput, 0, 0, region);
|
|
|
|
XFixesDestroyRegion(ps->dpy, region);
|
2012-10-24 10:09:59 +08:00
|
|
|
|
2012-10-29 22:00:11 +08:00
|
|
|
// Listen to Expose events on the overlay
|
2012-11-19 09:46:07 +08:00
|
|
|
XSelectInput(ps->dpy, ps->overlay, ExposureMask);
|
2012-10-29 22:00:11 +08:00
|
|
|
|
2012-10-24 10:09:59 +08:00
|
|
|
// Retrieve DamageNotify on root window if we are painting on an
|
|
|
|
// overlay
|
2012-11-19 09:46:07 +08:00
|
|
|
// root_damage = XDamageCreate(ps->dpy, root, XDamageReportNonEmpty);
|
2013-09-12 21:23:20 +08:00
|
|
|
|
|
|
|
// Unmap overlay, firstly. But this typically does not work because
|
|
|
|
// the window isn't created yet.
|
|
|
|
// XUnmapWindow(ps->dpy, ps->overlay);
|
|
|
|
// XFlush(ps->dpy);
|
2012-10-24 10:09:59 +08:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
fprintf(stderr, "Cannot get X Composite overlay window. Falling "
|
|
|
|
"back to painting on root window.\n");
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->o.paint_on_overlay = false;
|
2012-10-24 10:09:59 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-14 20:32:46 +08:00
|
|
|
/**
|
2013-03-15 23:16:23 +08:00
|
|
|
* Query needed X Render / OpenGL filters to check for their existence.
|
2012-12-14 20:32:46 +08:00
|
|
|
*/
|
2013-03-15 23:16:23 +08:00
|
|
|
static bool
|
2012-12-14 20:32:46 +08:00
|
|
|
init_filters(session_t *ps) {
|
2013-03-15 23:16:23 +08:00
|
|
|
// Blur filter
|
2012-12-14 20:32:46 +08:00
|
|
|
if (ps->o.blur_background || ps->o.blur_background_frame) {
|
2013-03-15 23:16:23 +08:00
|
|
|
switch (ps->o.backend) {
|
|
|
|
case BKEND_XRENDER:
|
|
|
|
{
|
|
|
|
// Query filters
|
|
|
|
XFilters *pf = XRenderQueryFilters(ps->dpy, get_tgt_window(ps));
|
|
|
|
if (pf) {
|
|
|
|
for (int i = 0; i < pf->nfilter; ++i) {
|
|
|
|
// Convolution filter
|
|
|
|
if (!strcmp(pf->filter[i], XRFILTER_CONVOLUTION))
|
|
|
|
ps->xrfilter_convolution_exists = true;
|
|
|
|
}
|
|
|
|
}
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(pf);
|
2012-12-14 20:32:46 +08:00
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Turn features off if any required filter is not present
|
|
|
|
if (!ps->xrfilter_convolution_exists) {
|
|
|
|
printf_errf("(): X Render convolution filter unsupported by your X server. Background blur is not possible.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2013-03-16 22:54:43 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
2013-03-15 23:16:23 +08:00
|
|
|
case BKEND_GLX:
|
|
|
|
{
|
2013-03-16 22:54:43 +08:00
|
|
|
if (!glx_init_blur(ps))
|
|
|
|
return false;
|
2013-03-15 23:16:23 +08:00
|
|
|
}
|
2013-03-16 22:54:43 +08:00
|
|
|
#endif
|
2012-12-14 20:32:46 +08:00
|
|
|
}
|
|
|
|
}
|
2013-03-15 23:16:23 +08:00
|
|
|
|
|
|
|
return true;
|
2012-12-14 20:32:46 +08:00
|
|
|
}
|
|
|
|
|
2012-11-09 21:44:02 +08:00
|
|
|
/**
|
|
|
|
* Redirect all windows.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
redir_start(session_t *ps) {
|
|
|
|
if (!ps->redirected) {
|
2012-11-09 21:44:02 +08:00
|
|
|
#ifdef DEBUG_REDIR
|
2013-09-04 22:00:51 +08:00
|
|
|
print_timestamp(ps);
|
|
|
|
printf_dbgf("(): Screen redirected.\n");
|
2012-11-09 21:44:02 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Map overlay window. Done firstly according to this:
|
|
|
|
// https://bugzilla.gnome.org/show_bug.cgi?id=597014
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->overlay)
|
|
|
|
XMapWindow(ps->dpy, ps->overlay);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XCompositeRedirectSubwindows(ps->dpy, ps->root, CompositeRedirectManual);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2013-03-01 12:41:16 +08:00
|
|
|
/*
|
|
|
|
// Unredirect GL context window as this may have an effect on VSync:
|
2013-01-30 13:41:08 +08:00
|
|
|
// < http://dri.freedesktop.org/wiki/CompositeSwap >
|
|
|
|
XCompositeUnredirectWindow(ps->dpy, ps->reg_win, CompositeRedirectManual);
|
2013-03-01 12:41:16 +08:00
|
|
|
if (ps->o.paint_on_overlay && ps->overlay) {
|
|
|
|
XCompositeUnredirectWindow(ps->dpy, ps->overlay,
|
|
|
|
CompositeRedirectManual);
|
|
|
|
} */
|
2013-01-30 13:41:08 +08:00
|
|
|
|
2012-11-09 21:44:02 +08:00
|
|
|
// Must call XSync() here
|
2012-11-19 09:46:07 +08:00
|
|
|
XSync(ps->dpy, False);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->redirected = true;
|
2013-09-04 22:00:51 +08:00
|
|
|
|
|
|
|
// Repaint the whole screen
|
|
|
|
force_repaint(ps);
|
2012-11-09 21:44:02 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
/**
|
|
|
|
* Get the poll time.
|
|
|
|
*/
|
|
|
|
static time_ms_t
|
|
|
|
timeout_get_poll_time(session_t *ps) {
|
|
|
|
const time_ms_t now = get_time_ms();
|
|
|
|
time_ms_t wait = TIME_MS_MAX;
|
|
|
|
|
|
|
|
// Traverse throught the timeout linked list
|
|
|
|
for (timeout_t *ptmout = ps->tmout_lst; ptmout; ptmout = ptmout->next) {
|
|
|
|
if (ptmout->enabled) {
|
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 20:20:27 +08:00
|
|
|
time_ms_t newrun = timeout_get_newrun(ptmout);
|
2013-01-11 21:31:02 +08:00
|
|
|
if (newrun <= now) {
|
|
|
|
wait = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
time_ms_t newwait = newrun - now;
|
|
|
|
if (newwait < wait)
|
|
|
|
wait = newwait;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return wait;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Insert a new timeout.
|
|
|
|
*/
|
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 20:20:27 +08:00
|
|
|
timeout_t *
|
2013-01-11 21:31:02 +08:00
|
|
|
timeout_insert(session_t *ps, time_ms_t interval,
|
|
|
|
bool (*callback)(session_t *ps, timeout_t *ptmout), void *data) {
|
|
|
|
const static timeout_t tmout_def = {
|
|
|
|
.enabled = true,
|
|
|
|
.data = NULL,
|
|
|
|
.callback = NULL,
|
|
|
|
.firstrun = 0L,
|
|
|
|
.lastrun = 0L,
|
|
|
|
.interval = 0L,
|
|
|
|
};
|
|
|
|
|
|
|
|
const time_ms_t now = get_time_ms();
|
|
|
|
timeout_t *ptmout = malloc(sizeof(timeout_t));
|
|
|
|
if (!ptmout)
|
|
|
|
printf_errfq(1, "(): Failed to allocate memory for timeout.");
|
|
|
|
memcpy(ptmout, &tmout_def, sizeof(timeout_t));
|
|
|
|
|
|
|
|
ptmout->interval = interval;
|
|
|
|
ptmout->firstrun = now;
|
|
|
|
ptmout->lastrun = now;
|
|
|
|
ptmout->data = data;
|
|
|
|
ptmout->callback = callback;
|
|
|
|
ptmout->next = ps->tmout_lst;
|
|
|
|
ps->tmout_lst = ptmout;
|
|
|
|
|
|
|
|
return ptmout;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Drop a timeout.
|
|
|
|
*
|
|
|
|
* @return true if we have found the timeout and removed it, false
|
|
|
|
* otherwise
|
|
|
|
*/
|
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 20:20:27 +08:00
|
|
|
bool
|
2013-01-11 21:31:02 +08:00
|
|
|
timeout_drop(session_t *ps, timeout_t *prm) {
|
|
|
|
timeout_t **pplast = &ps->tmout_lst;
|
|
|
|
|
|
|
|
for (timeout_t *ptmout = ps->tmout_lst; ptmout;
|
|
|
|
pplast = &ptmout->next, ptmout = ptmout->next) {
|
|
|
|
if (prm == ptmout) {
|
|
|
|
*pplast = ptmout->next;
|
|
|
|
free(ptmout);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Clear all timeouts.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
timeout_clear(session_t *ps) {
|
|
|
|
timeout_t *ptmout = ps->tmout_lst;
|
|
|
|
timeout_t *next = NULL;
|
|
|
|
while (ptmout) {
|
|
|
|
next = ptmout->next;
|
|
|
|
free(ptmout);
|
|
|
|
ptmout = next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Run timeouts.
|
|
|
|
*
|
|
|
|
* @return true if we have ran a timeout, false otherwise
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
timeout_run(session_t *ps) {
|
|
|
|
const time_ms_t now = get_time_ms();
|
|
|
|
bool ret = false;
|
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 20:20:27 +08:00
|
|
|
timeout_t *pnext = NULL;
|
2013-01-11 21:31:02 +08: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 20:20:27 +08:00
|
|
|
for (timeout_t *ptmout = ps->tmout_lst; ptmout; ptmout = pnext) {
|
|
|
|
pnext = ptmout->next;
|
2013-01-11 21:31:02 +08:00
|
|
|
if (ptmout->enabled) {
|
|
|
|
const time_ms_t max = now +
|
|
|
|
(time_ms_t) (ptmout->interval * TIMEOUT_RUN_TOLERANCE);
|
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 20:20:27 +08:00
|
|
|
time_ms_t newrun = timeout_get_newrun(ptmout);
|
2013-01-11 21:31:02 +08:00
|
|
|
if (newrun <= max) {
|
|
|
|
ret = true;
|
|
|
|
timeout_invoke(ps, ptmout);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Invoke a timeout.
|
|
|
|
*/
|
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 20:20:27 +08:00
|
|
|
void
|
2013-01-11 21:31:02 +08:00
|
|
|
timeout_invoke(session_t *ps, timeout_t *ptmout) {
|
|
|
|
const time_ms_t now = get_time_ms();
|
|
|
|
ptmout->lastrun = now;
|
|
|
|
// Avoid modifying the timeout structure after running timeout, to
|
|
|
|
// make it possible to remove timeout in callback
|
|
|
|
if (ptmout->callback)
|
|
|
|
ptmout->callback(ps, ptmout);
|
|
|
|
}
|
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
/**
|
|
|
|
* Reset a timeout to initial state.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
timeout_reset(session_t *ps, timeout_t *ptmout) {
|
|
|
|
ptmout->firstrun = ptmout->lastrun = get_time_ms();
|
|
|
|
}
|
|
|
|
|
2012-11-09 21:44:02 +08:00
|
|
|
/**
|
|
|
|
* Unredirect all windows.
|
|
|
|
*/
|
|
|
|
static void
|
2012-11-19 09:46:07 +08:00
|
|
|
redir_stop(session_t *ps) {
|
|
|
|
if (ps->redirected) {
|
2012-11-09 21:44:02 +08:00
|
|
|
#ifdef DEBUG_REDIR
|
2013-09-04 22:00:51 +08:00
|
|
|
print_timestamp(ps);
|
|
|
|
printf_dbgf("(): Screen unredirected.\n");
|
2012-11-09 21:44:02 +08:00
|
|
|
#endif
|
|
|
|
// Destroy all Pictures as they expire once windows are unredirected
|
|
|
|
// If we don't destroy them here, looks like the resources are just
|
|
|
|
// kept inaccessible somehow
|
2013-03-15 23:16:23 +08:00
|
|
|
for (win *w = ps->list; w; w = w->next)
|
|
|
|
free_paint(ps, &w->paint);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XCompositeUnredirectSubwindows(ps->dpy, ps->root, CompositeRedirectManual);
|
2012-11-09 21:44:02 +08:00
|
|
|
// Unmap overlay window
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->overlay)
|
|
|
|
XUnmapWindow(ps->dpy, ps->overlay);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
|
|
|
// Must call XSync() here
|
2012-11-19 09:46:07 +08:00
|
|
|
XSync(ps->dpy, False);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->redirected = false;
|
2012-11-09 21:44:02 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-04 22:00:51 +08:00
|
|
|
/**
|
|
|
|
* Unredirection timeout callback.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
tmout_unredir_callback(session_t *ps, timeout_t *tmout) {
|
|
|
|
ps->tmout_unredir_hit = true;
|
|
|
|
tmout->enabled = false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
/**
|
|
|
|
* Main loop.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
mainloop(session_t *ps) {
|
2013-09-12 21:23:20 +08:00
|
|
|
// Don't miss timeouts even when we have a LOT of other events!
|
|
|
|
timeout_run(ps);
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
// Process existing events
|
2013-01-11 21:31:02 +08:00
|
|
|
// Sometimes poll() returns 1 but no events are actually read,
|
|
|
|
// causing XNextEvent() to block, I have no idea what's wrong, so we
|
|
|
|
// check for the number of events here.
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (XEventsQueued(ps->dpy, QueuedAfterReading)) {
|
2013-01-11 21:31:02 +08:00
|
|
|
XEvent ev = { };
|
|
|
|
|
|
|
|
XNextEvent(ps->dpy, &ev);
|
|
|
|
ev_handle(ps, &ev);
|
|
|
|
ps->ev_received = true;
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
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 20:20:27 +08:00
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
cdbus_loop(ps);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
if (ps->reset)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Calculate timeout
|
|
|
|
struct timeval *ptv = NULL;
|
|
|
|
{
|
|
|
|
// Consider ev_received firstly
|
2013-03-19 20:58:55 +08:00
|
|
|
if (ps->ev_received || ps->o.benchmark) {
|
2013-01-11 21:31:02 +08:00
|
|
|
ptv = malloc(sizeof(struct timeval));
|
|
|
|
ptv->tv_sec = 0L;
|
|
|
|
ptv->tv_usec = 0L;
|
|
|
|
}
|
|
|
|
// Then consider fading timeout
|
|
|
|
else if (!ps->idling) {
|
|
|
|
ptv = malloc(sizeof(struct timeval));
|
|
|
|
*ptv = ms_to_tv(fade_timeout(ps));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Software optimization is to be applied on timeouts that require
|
|
|
|
// immediate painting only
|
|
|
|
if (ptv && ps->o.sw_opti)
|
|
|
|
swopti_handle_timeout(ps, ptv);
|
|
|
|
|
|
|
|
// Don't continue looping for 0 timeout
|
|
|
|
if (ptv && timeval_isempty(ptv)) {
|
|
|
|
free(ptv);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
return false;
|
2013-01-11 21:31:02 +08:00
|
|
|
}
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
// Now consider the waiting time of other timeouts
|
|
|
|
time_ms_t tmout_ms = timeout_get_poll_time(ps);
|
|
|
|
if (tmout_ms < TIME_MS_MAX) {
|
|
|
|
if (!ptv) {
|
|
|
|
ptv = malloc(sizeof(struct timeval));
|
|
|
|
*ptv = ms_to_tv(tmout_ms);
|
|
|
|
}
|
|
|
|
else if (timeval_ms_cmp(ptv, tmout_ms) > 0) {
|
|
|
|
*ptv = ms_to_tv(tmout_ms);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Don't continue looping for 0 timeout
|
|
|
|
if (ptv && timeval_isempty(ptv)) {
|
|
|
|
free(ptv);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
// Polling
|
|
|
|
fds_poll(ps, ptv);
|
|
|
|
free(ptv);
|
|
|
|
ptv = NULL;
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-08-22 21:15:04 +08:00
|
|
|
static void
|
|
|
|
cxinerama_upd_scrs(session_t *ps) {
|
|
|
|
#ifdef CONFIG_XINERAMA
|
|
|
|
free_xinerama_info(ps);
|
|
|
|
|
|
|
|
if (!ps->o.xinerama_shadow_crop || !ps->xinerama_exists) return;
|
|
|
|
|
|
|
|
if (!XineramaIsActive(ps->dpy)) return;
|
|
|
|
|
|
|
|
ps->xinerama_scrs = XineramaQueryScreens(ps->dpy, &ps->xinerama_nscrs);
|
|
|
|
|
|
|
|
// Just in case the shit hits the fan...
|
|
|
|
if (!ps->xinerama_nscrs) {
|
|
|
|
cxfree(ps->xinerama_scrs);
|
|
|
|
ps->xinerama_scrs = NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ps->xinerama_scr_regs = allocchk(malloc(sizeof(XserverRegion *)
|
|
|
|
* ps->xinerama_nscrs));
|
|
|
|
for (int i = 0; i < ps->xinerama_nscrs; ++i) {
|
|
|
|
const XineramaScreenInfo * const s = &ps->xinerama_scrs[i];
|
|
|
|
XRectangle r = { .x = s->x_org, .y = s->y_org,
|
|
|
|
.width = s->width, .height = s->height };
|
|
|
|
ps->xinerama_scr_regs[i] = XFixesCreateRegion(ps->dpy, &r, 1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
/**
|
|
|
|
* Initialize a session.
|
|
|
|
*
|
|
|
|
* @param ps_old old session, from which the function will take the X
|
|
|
|
* connection, then free it
|
|
|
|
* @param argc number of commandline arguments
|
|
|
|
* @param argv commandline arguments
|
|
|
|
*/
|
|
|
|
static session_t *
|
|
|
|
session_init(session_t *ps_old, int argc, char **argv) {
|
|
|
|
const static session_t s_def = {
|
|
|
|
.dpy = NULL,
|
|
|
|
.scr = 0,
|
|
|
|
.vis = NULL,
|
|
|
|
.depth = 0,
|
|
|
|
.root = None,
|
|
|
|
.root_height = 0,
|
|
|
|
.root_width = 0,
|
|
|
|
// .root_damage = None,
|
|
|
|
.overlay = None,
|
2013-03-15 23:16:23 +08:00
|
|
|
.root_tile_fill = false,
|
|
|
|
.root_tile_paint = PAINT_INIT,
|
2012-11-19 09:46:07 +08:00
|
|
|
.screen_reg = None,
|
|
|
|
.tgt_picture = None,
|
|
|
|
.tgt_buffer = None,
|
|
|
|
.root_dbe = None,
|
|
|
|
.reg_win = None,
|
|
|
|
.o = {
|
2013-03-15 23:16:23 +08:00
|
|
|
.config_file = NULL,
|
2012-11-19 09:46:07 +08:00
|
|
|
.display = NULL,
|
2013-03-15 23:16:23 +08:00
|
|
|
.backend = BKEND_XRENDER,
|
2013-03-17 12:14:00 +08:00
|
|
|
.glx_no_stencil = false,
|
2013-03-19 20:58:55 +08:00
|
|
|
.glx_copy_from_front = false,
|
2012-11-19 09:46:07 +08:00
|
|
|
.mark_wmwin_focused = false,
|
|
|
|
.mark_ovredir_focused = false,
|
|
|
|
.fork_after_register = false,
|
|
|
|
.synchronize = false,
|
|
|
|
.detect_rounded_corners = false,
|
|
|
|
.paint_on_overlay = false,
|
2013-04-27 11:43:11 +08:00
|
|
|
.resize_damage = 0,
|
2012-11-19 09:46:07 +08:00
|
|
|
.unredir_if_possible = false,
|
2013-09-04 22:00:51 +08:00
|
|
|
.unredir_if_possible_blacklist = NULL,
|
|
|
|
.unredir_if_possible_delay = 0,
|
2013-07-26 12:52:16 +08:00
|
|
|
.redirected_force = UNSET,
|
2013-07-30 22:24:11 +08:00
|
|
|
.stoppaint_force = UNSET,
|
2013-01-11 21:31:02 +08:00
|
|
|
.dbus = false,
|
2013-03-19 20:58:55 +08:00
|
|
|
.benchmark = 0,
|
|
|
|
.benchmark_wid = None,
|
2013-01-11 21:31:02 +08:00
|
|
|
.logpath = NULL,
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
.refresh_rate = 0,
|
|
|
|
.sw_opti = false,
|
|
|
|
.vsync = VSYNC_NONE,
|
|
|
|
.dbe = false,
|
|
|
|
.vsync_aggressive = false,
|
|
|
|
|
|
|
|
.wintype_shadow = { false },
|
|
|
|
.shadow_red = 0.0,
|
|
|
|
.shadow_green = 0.0,
|
|
|
|
.shadow_blue = 0.0,
|
|
|
|
.shadow_radius = 12,
|
|
|
|
.shadow_offset_x = -15,
|
|
|
|
.shadow_offset_y = -15,
|
|
|
|
.shadow_opacity = .75,
|
|
|
|
.clear_shadow = false,
|
|
|
|
.shadow_blacklist = NULL,
|
|
|
|
.shadow_ignore_shaped = false,
|
|
|
|
.respect_prop_shadow = false,
|
2013-08-22 21:15:04 +08:00
|
|
|
.xinerama_shadow_crop = false,
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
.wintype_fade = { false },
|
|
|
|
.fade_in_step = 0.028 * OPAQUE,
|
|
|
|
.fade_out_step = 0.03 * OPAQUE,
|
|
|
|
.fade_delta = 10,
|
|
|
|
.no_fading_openclose = false,
|
|
|
|
.fade_blacklist = NULL,
|
|
|
|
|
|
|
|
.wintype_opacity = { 0.0 },
|
|
|
|
.inactive_opacity = 0,
|
|
|
|
.inactive_opacity_override = false,
|
2013-03-30 11:46:32 +08:00
|
|
|
.active_opacity = 0,
|
2012-11-19 09:46:07 +08:00
|
|
|
.frame_opacity = 0.0,
|
|
|
|
.detect_client_opacity = false,
|
|
|
|
.alpha_step = 0.03,
|
2013-01-12 22:21:35 +08:00
|
|
|
|
2012-12-14 20:32:46 +08:00
|
|
|
.blur_background = false,
|
|
|
|
.blur_background_frame = false,
|
2012-12-15 20:07:45 +08:00
|
|
|
.blur_background_fixed = false,
|
2013-03-23 22:06:41 +08:00
|
|
|
.blur_background_blacklist = NULL,
|
2013-05-20 18:04:40 +08:00
|
|
|
.blur_kerns = { NULL },
|
2013-01-12 22:21:35 +08:00
|
|
|
.inactive_dim = 0.0,
|
|
|
|
.inactive_dim_fixed = false,
|
|
|
|
.invert_color_list = NULL,
|
2013-05-21 09:18:41 +08:00
|
|
|
.opacity_rules = NULL,
|
2012-12-10 10:31:24 +08:00
|
|
|
|
|
|
|
.wintype_focus = { false },
|
2012-11-19 09:46:07 +08:00
|
|
|
.use_ewmh_active_win = false,
|
2012-11-28 11:44:00 +08:00
|
|
|
.focus_blacklist = NULL,
|
2012-12-12 12:01:51 +08:00
|
|
|
.detect_transient = false,
|
|
|
|
.detect_client_leader = false,
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
.track_focus = false,
|
|
|
|
.track_wdata = false,
|
2012-12-12 12:01:51 +08:00
|
|
|
.track_leader = false,
|
2012-11-19 09:46:07 +08:00
|
|
|
},
|
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
.pfds_read = NULL,
|
|
|
|
.pfds_write = NULL,
|
|
|
|
.pfds_except = NULL,
|
|
|
|
.nfds_max = 0,
|
|
|
|
.tmout_lst = NULL,
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
.all_damage = None,
|
2013-04-26 14:01:20 +08:00
|
|
|
.all_damage_last = { None },
|
2012-11-19 09:46:07 +08:00
|
|
|
.time_start = { 0, 0 },
|
|
|
|
.redirected = false,
|
|
|
|
.alpha_picts = NULL,
|
|
|
|
.reg_ignore_expire = false,
|
|
|
|
.idling = false,
|
2013-01-11 21:31:02 +08:00
|
|
|
.fade_time = 0L,
|
2012-11-19 09:46:07 +08:00
|
|
|
.ignore_head = NULL,
|
|
|
|
.ignore_tail = NULL,
|
|
|
|
.reset = false,
|
|
|
|
|
|
|
|
.expose_rects = NULL,
|
|
|
|
.size_expose = 0,
|
|
|
|
.n_expose = 0,
|
|
|
|
|
|
|
|
.list = NULL,
|
|
|
|
.active_win = NULL,
|
2012-12-12 12:01:51 +08:00
|
|
|
.active_leader = None,
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
.black_picture = None,
|
|
|
|
.cshadow_picture = None,
|
2013-01-12 22:21:35 +08:00
|
|
|
.white_picture = None,
|
2012-11-19 09:46:07 +08:00
|
|
|
.gaussian_map = NULL,
|
|
|
|
.cgsize = 0,
|
|
|
|
.shadow_corner = NULL,
|
|
|
|
.shadow_top = NULL,
|
|
|
|
|
|
|
|
.refresh_rate = 0,
|
|
|
|
.refresh_intv = 0UL,
|
|
|
|
.paint_tm_offset = 0L,
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#ifdef CONFIG_VSYNC_DRM
|
2013-01-31 22:53:44 +08:00
|
|
|
.drm_fd = -1,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
2012-11-19 09:46:07 +08:00
|
|
|
.glx_context = None,
|
2013-03-16 22:54:43 +08:00
|
|
|
.glx_has_texture_non_power_of_two = false,
|
2013-01-30 13:41:08 +08:00
|
|
|
.glXGetVideoSyncSGI = NULL,
|
|
|
|
.glXWaitVideoSyncSGI = NULL,
|
|
|
|
.glXGetSyncValuesOML = NULL,
|
|
|
|
.glXWaitForMscOML = NULL,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
.xfixes_event = 0,
|
|
|
|
.xfixes_error = 0,
|
|
|
|
.damage_event = 0,
|
|
|
|
.damage_error = 0,
|
|
|
|
.render_event = 0,
|
|
|
|
.render_error = 0,
|
|
|
|
.composite_event = 0,
|
|
|
|
.composite_error = 0,
|
|
|
|
.composite_opcode = 0,
|
|
|
|
.has_name_pixmap = false,
|
|
|
|
.shape_exists = false,
|
|
|
|
.shape_event = 0,
|
|
|
|
.shape_error = 0,
|
|
|
|
.randr_exists = 0,
|
|
|
|
.randr_event = 0,
|
|
|
|
.randr_error = 0,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
2012-11-19 09:46:07 +08:00
|
|
|
.glx_exists = false,
|
|
|
|
.glx_event = 0,
|
|
|
|
.glx_error = 0,
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
.dbe_exists = false,
|
2012-12-14 20:32:46 +08:00
|
|
|
.xrfilter_convolution_exists = false,
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
.atom_opacity = None,
|
|
|
|
.atom_frame_extents = None,
|
|
|
|
.atom_client = None,
|
|
|
|
.atom_name = None,
|
|
|
|
.atom_name_ewmh = None,
|
|
|
|
.atom_class = None,
|
2012-12-05 18:12:21 +08:00
|
|
|
.atom_role = None,
|
2012-11-19 09:46:07 +08:00
|
|
|
.atom_transient = None,
|
|
|
|
.atom_ewmh_active_win = None,
|
|
|
|
.atom_compton_shadow = None,
|
|
|
|
.atom_win_type = None,
|
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 20:20:27 +08:00
|
|
|
.atoms_wintypes = { 0 },
|
|
|
|
.track_atom_lst = NULL,
|
|
|
|
|
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
.dbus_conn = NULL,
|
|
|
|
.dbus_service = NULL,
|
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
};
|
2012-09-25 10:19:20 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// Allocate a session and copy default values into it
|
|
|
|
session_t *ps = malloc(sizeof(session_t));
|
|
|
|
memcpy(ps, &s_def, sizeof(session_t));
|
2013-05-20 18:04:40 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL_GLSL
|
|
|
|
for (int i = 0; i < MAX_BLUR_PASS; ++i) {
|
|
|
|
glx_blur_pass_t *ppass = &ps->glx_blur_passes[i];
|
|
|
|
ppass->unifm_factor_center = -1;
|
|
|
|
ppass->unifm_offset_x = -1;
|
|
|
|
ppass->unifm_offset_y = -1;
|
|
|
|
}
|
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
ps_g = ps;
|
|
|
|
ps->ignore_tail = &ps->ignore_head;
|
|
|
|
gettimeofday(&ps->time_start, NULL);
|
|
|
|
|
2012-12-10 10:31:24 +08:00
|
|
|
wintype_arr_enable(ps->o.wintype_focus);
|
|
|
|
ps->o.wintype_focus[WINTYPE_UNKNOWN] = false;
|
|
|
|
ps->o.wintype_focus[WINTYPE_NORMAL] = false;
|
|
|
|
ps->o.wintype_focus[WINTYPE_UTILITY] = false;
|
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
// First pass
|
|
|
|
get_cfg(ps, argc, argv, true);
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
// Inherit old Display if possible, primarily for resource leak checking
|
|
|
|
if (ps_old && ps_old->dpy)
|
|
|
|
ps->dpy = ps_old->dpy;
|
|
|
|
|
|
|
|
// Open Display
|
|
|
|
if (!ps->dpy) {
|
|
|
|
ps->dpy = XOpenDisplay(ps->o.display);
|
|
|
|
if (!ps->dpy) {
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
printf_errfq(1, "(): Can't open display.");
|
2012-11-19 09:46:07 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2008-02-15 12:38:32 +08:00
|
|
|
|
2011-11-04 14:33:23 +08:00
|
|
|
XSetErrorHandler(error);
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.synchronize) {
|
|
|
|
XSynchronize(ps->dpy, 1);
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->scr = DefaultScreen(ps->dpy);
|
|
|
|
ps->root = RootWindow(ps->dpy, ps->scr);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->vis = DefaultVisual(ps->dpy, ps->scr);
|
|
|
|
ps->depth = DefaultDepth(ps->dpy, ps->scr);
|
|
|
|
|
2013-06-09 17:06:35 +08:00
|
|
|
// Start listening to events on root earlier to catch all possible
|
|
|
|
// root geometry changes
|
|
|
|
XSelectInput(ps->dpy, ps->root,
|
|
|
|
SubstructureNotifyMask
|
|
|
|
| ExposureMask
|
|
|
|
| StructureNotifyMask
|
|
|
|
| PropertyChangeMask);
|
2013-09-12 21:23:20 +08:00
|
|
|
XFlush(ps->dpy);
|
2013-06-09 17:06:35 +08:00
|
|
|
|
|
|
|
ps->root_width = DisplayWidth(ps->dpy, ps->scr);
|
|
|
|
ps->root_height = DisplayHeight(ps->dpy, ps->scr);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!XRenderQueryExtension(ps->dpy,
|
|
|
|
&ps->render_event, &ps->render_error)) {
|
2011-11-04 14:33:23 +08:00
|
|
|
fprintf(stderr, "No render extension\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!XQueryExtension(ps->dpy, COMPOSITE_NAME, &ps->composite_opcode,
|
|
|
|
&ps->composite_event, &ps->composite_error)) {
|
2011-11-04 14:33:23 +08:00
|
|
|
fprintf(stderr, "No composite extension\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
{
|
|
|
|
int composite_major = 0, composite_minor = 0;
|
|
|
|
|
|
|
|
XCompositeQueryVersion(ps->dpy, &composite_major, &composite_minor);
|
2003-11-25 01:11:00 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (composite_major > 0 || composite_minor >= 2) {
|
|
|
|
ps->has_name_pixmap = true;
|
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
}
|
2004-06-27 12:48:37 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!XDamageQueryExtension(ps->dpy, &ps->damage_event, &ps->damage_error)) {
|
2011-11-04 14:33:23 +08:00
|
|
|
fprintf(stderr, "No damage extension\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!XFixesQueryExtension(ps->dpy, &ps->xfixes_event, &ps->xfixes_error)) {
|
2011-11-04 14:33:23 +08:00
|
|
|
fprintf(stderr, "No XFixes extension\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// Query X Shape
|
2012-11-19 09:46:07 +08:00
|
|
|
if (XShapeQueryExtension(ps->dpy, &ps->shape_event, &ps->shape_error)) {
|
|
|
|
ps->shape_exists = true;
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-09-11 21:33:03 +08:00
|
|
|
|
2013-06-09 17:06:35 +08:00
|
|
|
// Second pass
|
|
|
|
get_cfg(ps, argc, argv, false);
|
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// Query X RandR
|
2013-08-28 21:47:16 +08:00
|
|
|
if ((ps->o.sw_opti && !ps->o.refresh_rate) || ps->o.xinerama_shadow_crop) {
|
2012-11-19 09:46:07 +08:00
|
|
|
if (XRRQueryExtension(ps->dpy, &ps->randr_event, &ps->randr_error))
|
|
|
|
ps->randr_exists = true;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
else
|
2013-08-28 21:47:16 +08:00
|
|
|
printf_errf("(): No XRandR extension, automatic screen change "
|
2013-01-30 13:41:08 +08:00
|
|
|
"detection impossible.");
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
}
|
|
|
|
|
2012-10-23 13:42:20 +08:00
|
|
|
// Query X DBE extension
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.dbe) {
|
2012-10-23 13:42:20 +08:00
|
|
|
int dbe_ver_major = 0, dbe_ver_minor = 0;
|
2012-11-19 09:46:07 +08:00
|
|
|
if (XdbeQueryExtension(ps->dpy, &dbe_ver_major, &dbe_ver_minor))
|
2012-10-23 13:42:20 +08:00
|
|
|
if (dbe_ver_major >= 1)
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->dbe_exists = true;
|
2012-10-23 13:42:20 +08:00
|
|
|
else
|
|
|
|
fprintf(stderr, "DBE extension version too low. Double buffering "
|
|
|
|
"impossible.\n");
|
|
|
|
else {
|
|
|
|
fprintf(stderr, "No DBE extension. Double buffering impossible.\n");
|
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->dbe_exists)
|
|
|
|
ps->o.dbe = false;
|
2012-10-23 13:42:20 +08:00
|
|
|
}
|
|
|
|
|
2013-08-22 21:15:04 +08:00
|
|
|
// Query X Xinerama extension
|
|
|
|
if (ps->o.xinerama_shadow_crop) {
|
|
|
|
#ifdef CONFIG_XINERAMA
|
|
|
|
int xinerama_event = 0, xinerama_error = 0;
|
|
|
|
if (XineramaQueryExtension(ps->dpy, &xinerama_event, &xinerama_error))
|
|
|
|
ps->xinerama_exists = true;
|
|
|
|
#else
|
|
|
|
printf_errf("(): Xinerama support not compiled in.");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
rebuild_screen_reg(ps);
|
|
|
|
|
2013-03-12 09:43:14 +08:00
|
|
|
// Overlay must be initialized before double buffer, and before creation
|
|
|
|
// of OpenGL context.
|
|
|
|
if (ps->o.paint_on_overlay)
|
|
|
|
init_overlay(ps);
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Initialize DBE
|
|
|
|
if (ps->o.dbe && BKEND_GLX == ps->o.backend) {
|
2013-03-16 22:54:43 +08:00
|
|
|
printf_errf("(): DBE couldn't be used on GLX backend.");
|
2013-03-15 23:16:23 +08:00
|
|
|
ps->o.dbe = false;
|
|
|
|
}
|
|
|
|
|
2013-03-12 09:43:14 +08:00
|
|
|
if (ps->o.dbe && !init_dbe(ps))
|
|
|
|
exit(1);
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Initialize OpenGL as early as possible
|
|
|
|
if (BKEND_GLX == ps->o.backend) {
|
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
|
|
|
if (!glx_init(ps, true))
|
|
|
|
exit(1);
|
|
|
|
#else
|
2013-03-16 22:54:43 +08:00
|
|
|
printf_errfq(1, "(): GLX backend support not compiled in.");
|
2013-03-15 23:16:23 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2012-10-26 11:12:28 +08:00
|
|
|
// Initialize software optimization
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.sw_opti)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ps->o.sw_opti = swopti_init(ps);
|
2012-10-26 11:12:28 +08:00
|
|
|
|
2013-08-28 21:47:16 +08:00
|
|
|
// Monitor screen changes if vsync_sw is enabled and we are using
|
|
|
|
// an auto-detected refresh rate, or when Xinerama features are enabled
|
|
|
|
if (ps->randr_exists && ((ps->o.sw_opti && !ps->o.refresh_rate)
|
|
|
|
|| ps->o.xinerama_shadow_crop))
|
|
|
|
XRRSelectInput(ps->dpy, ps->root, RRScreenChangeNotifyMask);
|
|
|
|
|
2013-01-30 13:41:08 +08:00
|
|
|
// Initialize VSync
|
2013-01-31 22:53:44 +08:00
|
|
|
if (!vsync_init(ps))
|
2013-01-30 13:41:08 +08:00
|
|
|
exit(1);
|
2012-02-27 12:00:12 +08:00
|
|
|
|
2013-08-22 21:15:04 +08:00
|
|
|
cxinerama_upd_scrs(ps);
|
|
|
|
|
2013-01-31 22:53:44 +08:00
|
|
|
// Create registration window
|
2013-03-01 12:41:16 +08:00
|
|
|
if (!ps->reg_win && !register_cm(ps))
|
2013-01-31 22:53:44 +08:00
|
|
|
exit(1);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
init_atoms(ps);
|
|
|
|
init_alpha_picts(ps);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->gaussian_map = make_gaussian_map(ps->o.shadow_radius);
|
|
|
|
presum_gaussian(ps, ps->gaussian_map);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
{
|
|
|
|
XRenderPictureAttributes pa;
|
|
|
|
pa.subwindow_mode = IncludeInferiors;
|
2012-11-03 10:30:32 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->root_picture = XRenderCreatePicture(ps->dpy, ps->root,
|
|
|
|
XRenderFindVisualFormat(ps->dpy, ps->vis),
|
2012-10-24 10:09:59 +08:00
|
|
|
CPSubwindowMode, &pa);
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.paint_on_overlay) {
|
|
|
|
ps->tgt_picture = XRenderCreatePicture(ps->dpy, ps->overlay,
|
|
|
|
XRenderFindVisualFormat(ps->dpy, ps->vis),
|
|
|
|
CPSubwindowMode, &pa);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ps->tgt_picture = ps->root_picture;
|
|
|
|
}
|
2012-10-24 10:09:59 +08:00
|
|
|
}
|
2012-02-27 12:00:12 +08:00
|
|
|
|
2013-03-16 22:54:43 +08:00
|
|
|
// Initialize filters, must be preceded by OpenGL context creation
|
2013-03-15 23:16:23 +08:00
|
|
|
if (!init_filters(ps))
|
|
|
|
exit(1);
|
2012-12-14 20:32:46 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->black_picture = solid_picture(ps, true, 1, 0, 0, 0);
|
2013-01-12 22:21:35 +08:00
|
|
|
ps->white_picture = solid_picture(ps, true, 1, 1, 1, 1);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-09-11 21:57:50 +08:00
|
|
|
// Generates another Picture for shadows if the color is modified by
|
|
|
|
// user
|
2012-11-19 09:46:07 +08:00
|
|
|
if (!ps->o.shadow_red && !ps->o.shadow_green && !ps->o.shadow_blue) {
|
|
|
|
ps->cshadow_picture = ps->black_picture;
|
2012-09-13 13:58:05 +08:00
|
|
|
} else {
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->cshadow_picture = solid_picture(ps, true, 1,
|
|
|
|
ps->o.shadow_red, ps->o.shadow_green, ps->o.shadow_blue);
|
2012-09-13 13:58:05 +08:00
|
|
|
}
|
2012-09-11 21:57:50 +08:00
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
fds_insert(ps, ConnectionNumber(ps->dpy), POLLIN);
|
2013-09-04 22:00:51 +08:00
|
|
|
ps->tmout_unredir = timeout_insert(ps, ps->o.unredir_if_possible_delay,
|
|
|
|
tmout_unredir_callback, NULL);
|
|
|
|
ps->tmout_unredir->enabled = false;
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XGrabServer(ps->dpy);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
{
|
|
|
|
Window root_return, parent_return;
|
|
|
|
Window *children;
|
|
|
|
unsigned int nchildren;
|
|
|
|
|
|
|
|
XQueryTree(ps->dpy, ps->root, &root_return,
|
|
|
|
&parent_return, &children, &nchildren);
|
|
|
|
|
2012-11-21 09:15:49 +08:00
|
|
|
for (unsigned i = 0; i < nchildren; i++) {
|
|
|
|
add_win(ps, children[i], i ? children[i-1] : None);
|
2012-11-19 09:46:07 +08:00
|
|
|
}
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2013-04-05 21:05:19 +08:00
|
|
|
cxfree(children);
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
|
|
|
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps->o.track_focus) {
|
|
|
|
recheck_focus(ps);
|
2012-09-13 23:12:54 +08:00
|
|
|
}
|
2012-09-13 21:38:55 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
XUngrabServer(ps->dpy);
|
|
|
|
|
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 20:20:27 +08:00
|
|
|
// Initialize DBus
|
|
|
|
if (ps->o.dbus) {
|
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
cdbus_init(ps);
|
|
|
|
if (!ps->dbus_conn) {
|
|
|
|
cdbus_destroy(ps);
|
|
|
|
ps->o.dbus = false;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
printf_errfq(1, "(): DBus support not compiled in!");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
// Fork to background, if asked
|
|
|
|
if (ps->o.fork_after_register) {
|
2013-01-11 21:31:02 +08:00
|
|
|
if (!fork_after(ps)) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
session_destroy(ps);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// Free the old session
|
|
|
|
if (ps_old)
|
|
|
|
free(ps_old);
|
|
|
|
|
|
|
|
return ps;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroy a session.
|
|
|
|
*
|
|
|
|
* Does not close the X connection or free the <code>session_t</code>
|
|
|
|
* structure, though.
|
|
|
|
*
|
|
|
|
* @param ps session to destroy
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
session_destroy(session_t *ps) {
|
|
|
|
redir_stop(ps);
|
|
|
|
|
|
|
|
// Stop listening to events on root window
|
|
|
|
XSelectInput(ps->dpy, ps->root, 0);
|
2011-11-04 14:33:23 +08: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 20:20:27 +08:00
|
|
|
#ifdef CONFIG_DBUS
|
|
|
|
// Kill DBus connection
|
|
|
|
if (ps->o.dbus)
|
|
|
|
cdbus_destroy(ps);
|
|
|
|
|
|
|
|
free(ps->dbus_service);
|
|
|
|
#endif
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// Free window linked list
|
|
|
|
{
|
|
|
|
win *next = NULL;
|
|
|
|
for (win *w = ps->list; w; w = next) {
|
|
|
|
// Must be put here to avoid segfault
|
|
|
|
next = w->next;
|
2011-11-04 16:41:56 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (IsViewable == w->a.map_state && !w->destroyed)
|
|
|
|
win_ev_stop(ps, w);
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
free_win_res(ps, w);
|
|
|
|
free(w);
|
|
|
|
}
|
2012-10-21 20:44:24 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->list = NULL;
|
|
|
|
}
|
2012-11-08 19:39:13 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// Free alpha_picts
|
|
|
|
{
|
2012-11-21 09:15:49 +08:00
|
|
|
const int max = round(1.0 / ps->o.alpha_step) + 1;
|
2012-11-19 09:46:07 +08:00
|
|
|
for (int i = 0; i < max; ++i)
|
|
|
|
free_picture(ps, &ps->alpha_picts[i]);
|
|
|
|
free(ps->alpha_picts);
|
|
|
|
ps->alpha_picts = NULL;
|
|
|
|
}
|
|
|
|
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
#ifdef CONFIG_C2
|
2012-11-19 09:46:07 +08:00
|
|
|
// Free blacklists
|
|
|
|
free_wincondlst(&ps->o.shadow_blacklist);
|
|
|
|
free_wincondlst(&ps->o.fade_blacklist);
|
2013-01-12 22:21:35 +08:00
|
|
|
free_wincondlst(&ps->o.focus_blacklist);
|
|
|
|
free_wincondlst(&ps->o.invert_color_list);
|
2013-04-25 22:23:35 +08:00
|
|
|
free_wincondlst(&ps->o.blur_background_blacklist);
|
2013-05-21 09:18:41 +08:00
|
|
|
free_wincondlst(&ps->o.opacity_rules);
|
2013-06-19 19:36:48 +08:00
|
|
|
free_wincondlst(&ps->o.paint_blacklist);
|
2013-09-04 22:00:51 +08:00
|
|
|
free_wincondlst(&ps->o.unredir_if_possible_blacklist);
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Free tracked atom list
|
|
|
|
{
|
|
|
|
latom_t *next = NULL;
|
|
|
|
for (latom_t *this = ps->track_atom_lst; this; this = next) {
|
|
|
|
next = this->next;
|
|
|
|
free(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
ps->track_atom_lst = NULL;
|
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
// Free ignore linked list
|
|
|
|
{
|
|
|
|
ignore_t *next = NULL;
|
|
|
|
for (ignore_t *ign = ps->ignore_head; ign; ign = next) {
|
|
|
|
next = ign->next;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
free(ign);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reset head and tail
|
|
|
|
ps->ignore_head = NULL;
|
|
|
|
ps->ignore_tail = &ps->ignore_head;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Free cshadow_picture and black_picture
|
|
|
|
if (ps->cshadow_picture == ps->black_picture)
|
|
|
|
ps->cshadow_picture = None;
|
|
|
|
else
|
|
|
|
free_picture(ps, &ps->cshadow_picture);
|
|
|
|
|
|
|
|
free_picture(ps, &ps->black_picture);
|
2013-01-12 22:21:35 +08:00
|
|
|
free_picture(ps, &ps->white_picture);
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
// Free tgt_{buffer,picture} and root_picture
|
|
|
|
if (ps->tgt_buffer == ps->tgt_picture)
|
|
|
|
ps->tgt_buffer = None;
|
|
|
|
else
|
|
|
|
free_picture(ps, &ps->tgt_buffer);
|
|
|
|
|
|
|
|
if (ps->tgt_picture == ps->root_picture)
|
|
|
|
ps->tgt_picture = None;
|
|
|
|
else
|
|
|
|
free_picture(ps, &ps->tgt_picture);
|
|
|
|
|
|
|
|
free_picture(ps, &ps->root_picture);
|
|
|
|
|
|
|
|
// Free other X resources
|
2013-03-15 23:16:23 +08:00
|
|
|
free_root_tile(ps);
|
2012-11-19 09:46:07 +08:00
|
|
|
free_region(ps, &ps->screen_reg);
|
|
|
|
free_region(ps, &ps->all_damage);
|
2013-04-26 14:01:20 +08:00
|
|
|
for (int i = 0; i < CGLX_MAX_BUFFER_AGE; ++i)
|
|
|
|
free_region(ps, &ps->all_damage_last[i]);
|
2012-11-19 09:46:07 +08:00
|
|
|
free(ps->expose_rects);
|
|
|
|
free(ps->shadow_corner);
|
|
|
|
free(ps->shadow_top);
|
|
|
|
free(ps->gaussian_map);
|
|
|
|
free(ps->o.display);
|
2013-01-11 21:31:02 +08:00
|
|
|
free(ps->o.logpath);
|
Feature #16: Advanced window matching
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
2013-01-28 21:39:38 +08:00
|
|
|
free(ps->o.config_file);
|
2013-05-20 18:04:40 +08:00
|
|
|
for (int i = 0; i < MAX_BLUR_PASS; ++i) {
|
|
|
|
free(ps->o.blur_kerns[i]);
|
|
|
|
free(ps->blur_kerns_cache[i]);
|
|
|
|
}
|
2013-01-11 21:31:02 +08:00
|
|
|
free(ps->pfds_read);
|
|
|
|
free(ps->pfds_write);
|
|
|
|
free(ps->pfds_except);
|
2013-08-22 21:15:04 +08:00
|
|
|
free_xinerama_info(ps);
|
2012-11-19 09:46:07 +08:00
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#ifdef CONFIG_VSYNC_OPENGL
|
2013-03-15 23:16:23 +08:00
|
|
|
glx_destroy(ps);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
// Free double buffer
|
|
|
|
if (ps->root_dbe) {
|
|
|
|
XdbeDeallocateBackBufferName(ps->dpy, ps->root_dbe);
|
|
|
|
ps->root_dbe = None;
|
|
|
|
}
|
|
|
|
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#ifdef CONFIG_VSYNC_DRM
|
2012-11-19 09:46:07 +08:00
|
|
|
// Close file opened for DRM VSync
|
2013-01-31 22:53:44 +08:00
|
|
|
if (ps->drm_fd >= 0) {
|
2012-11-19 09:46:07 +08:00
|
|
|
close(ps->drm_fd);
|
2013-01-31 22:53:44 +08:00
|
|
|
ps->drm_fd = -1;
|
2012-11-19 09:46:07 +08:00
|
|
|
}
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
#endif
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
// Release overlay window
|
|
|
|
if (ps->overlay) {
|
|
|
|
XCompositeReleaseOverlayWindow(ps->dpy, ps->overlay);
|
|
|
|
ps->overlay = None;
|
|
|
|
}
|
|
|
|
|
2013-03-15 23:16:23 +08:00
|
|
|
// Free reg_win
|
|
|
|
if (ps->reg_win) {
|
|
|
|
XDestroyWindow(ps->dpy, ps->reg_win);
|
|
|
|
ps->reg_win = None;
|
|
|
|
}
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
// Flush all events
|
|
|
|
XSync(ps->dpy, True);
|
|
|
|
|
2013-01-11 21:31:02 +08:00
|
|
|
// Free timeouts
|
2013-09-04 22:00:51 +08:00
|
|
|
ps->tmout_unredir = NULL;
|
2013-01-11 21:31:02 +08:00
|
|
|
timeout_clear(ps);
|
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
if (ps == ps_g)
|
|
|
|
ps_g = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Do the actual work.
|
|
|
|
*
|
|
|
|
* @param ps current session
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
session_run(session_t *ps) {
|
|
|
|
win *t;
|
|
|
|
|
|
|
|
if (ps->o.sw_opti)
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ps->paint_tm_offset = get_time_timeval().tv_usec;
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
ps->reg_ignore_expire = true;
|
|
|
|
|
|
|
|
t = paint_preprocess(ps, ps->list);
|
|
|
|
|
|
|
|
if (ps->redirected)
|
2013-04-27 17:34:42 +08:00
|
|
|
paint_all(ps, None, None, t);
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2012-09-29 22:53:57 +08:00
|
|
|
// Initialize idling
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->idling = false;
|
2012-09-29 22:53:57 +08:00
|
|
|
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
// Main loop
|
2012-11-19 09:46:07 +08:00
|
|
|
while (!ps->reset) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
ps->ev_received = false;
|
|
|
|
|
|
|
|
while (mainloop(ps))
|
|
|
|
continue;
|
2011-11-04 14:33:23 +08:00
|
|
|
|
2013-03-19 20:58:55 +08:00
|
|
|
if (ps->o.benchmark) {
|
|
|
|
if (ps->o.benchmark_wid) {
|
|
|
|
win *w = find_win(ps, ps->o.benchmark_wid);
|
|
|
|
if (!w) {
|
|
|
|
printf_errf("(): Couldn't find specified benchmark window.");
|
|
|
|
session_destroy(ps);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
add_damage_win(ps, w);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
force_repaint(ps);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-29 22:53:57 +08:00
|
|
|
// idling will be turned off during paint_preprocess() if needed
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->idling = true;
|
2012-09-29 22:53:57 +08:00
|
|
|
|
2012-11-19 09:46:07 +08:00
|
|
|
t = paint_preprocess(ps, ps->list);
|
2013-09-04 22:00:51 +08:00
|
|
|
ps->tmout_unredir_hit = false;
|
Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
not too reliable, but at least you have something to fallback to),
"drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
"opengl" (using SGI_swap_control extension OpenGL, might work on more
drivers than the DRM method). "sw" and "opengl" are briefly tested,
"drm" received utterly no test (because I use the nVidia binary blob).
They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".
- Add --refresh-rate to let user specify a refresh rate for software
VSync, in case the automatic refresh rate detection does not work
well.
- Seemingly the automatic refresh rate detection using X RandR in
software VSync detects refresh rate incorrectly. Need further investigation.
- Fix a few bugs in fading timing.
- Add a workaround for client window detection on Fluxbox, as Fluxbox
(incorrectly?) sets the override-redirect flag upon all frame
windows.
- Software VSync adds dependency on librt (a part of glibc) for
nanosecond-level timing functions, and libXrandr for automatic refresh
rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
but does not link to libdrm; OpenGL VSync adds dependency on libGL.
- Print timing information on DEBUG_REPAINT.
2012-10-08 10:20:01 +08:00
|
|
|
|
2012-11-09 21:44:02 +08:00
|
|
|
// If the screen is unredirected, free all_damage to stop painting
|
2013-07-30 22:24:11 +08:00
|
|
|
if (!ps->redirected || ON == ps->o.stoppaint_force)
|
2012-11-19 09:46:07 +08:00
|
|
|
free_region(ps, &ps->all_damage);
|
2012-11-09 21:44:02 +08:00
|
|
|
|
2013-04-27 17:34:42 +08:00
|
|
|
XserverRegion all_damage_orig = None;
|
|
|
|
if (ps->o.resize_damage > 0)
|
|
|
|
all_damage_orig = copy_region(ps, ps->all_damage);
|
2013-04-27 11:43:11 +08:00
|
|
|
resize_region(ps, ps->all_damage, ps->o.resize_damage);
|
2013-04-06 20:21:38 +08:00
|
|
|
if (ps->all_damage && !is_region_empty(ps, ps->all_damage, NULL)) {
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
static int paint = 0;
|
2013-04-27 17:34:42 +08:00
|
|
|
paint_all(ps, ps->all_damage, all_damage_orig, t);
|
2012-11-19 09:46:07 +08:00
|
|
|
ps->reg_ignore_expire = false;
|
2011-11-04 14:33:23 +08:00
|
|
|
paint++;
|
2013-03-19 20:58:55 +08:00
|
|
|
if (ps->o.benchmark && paint >= ps->o.benchmark)
|
|
|
|
exit(0);
|
2012-11-19 09:46:07 +08:00
|
|
|
XSync(ps->dpy, False);
|
|
|
|
ps->all_damage = None;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2013-04-27 17:34:42 +08:00
|
|
|
free_region(ps, &all_damage_orig);
|
2013-01-11 21:31:02 +08:00
|
|
|
|
|
|
|
if (ps->idling)
|
|
|
|
ps->fade_time = 0L;
|
2011-11-04 14:33:23 +08:00
|
|
|
}
|
2003-11-09 15:08:23 +08:00
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Turn on the program reset flag.
|
|
|
|
*
|
|
|
|
* This will result in compton resetting itself after next paint.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
reset_enable(int __attribute__((unused)) signum) {
|
|
|
|
session_t * const ps = ps_g;
|
|
|
|
|
|
|
|
ps->reset = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The function that everybody knows.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
main(int argc, char **argv) {
|
|
|
|
// Set locale so window names with special characters are interpreted
|
|
|
|
// correctly
|
|
|
|
setlocale(LC_ALL, "");
|
|
|
|
|
|
|
|
// Set up SIGUSR1 signal handler to reset program
|
|
|
|
{
|
|
|
|
sigset_t block_mask;
|
|
|
|
sigemptyset(&block_mask);
|
|
|
|
const struct sigaction action= {
|
|
|
|
.sa_handler = reset_enable,
|
|
|
|
.sa_mask = block_mask,
|
|
|
|
.sa_flags = 0
|
|
|
|
};
|
|
|
|
sigaction(SIGUSR1, &action, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Main loop
|
|
|
|
session_t *ps_old = ps_g;
|
|
|
|
while (1) {
|
|
|
|
ps_g = session_init(ps_old, argc, argv);
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
if (!ps_g) {
|
2013-03-15 23:16:23 +08:00
|
|
|
printf_errf("(): Failed to create new session.");
|
Improvement #74: Use libevent for main loop
- Use libevent for main loop. I will explain the reasons in #56 later.
The preferred libevent version is 2.x, yet 1.4.x should work as well.
- As a result, compton now should build fine on *BSD. Thanks to
DachiChang for the FreeBSD build issue report.
- Another consequence is we now use microsecond-level timing all the
way. Nanosecond-level code will be dropped soon. Start using long
instead of unsigned long to represent time in milliseconds, as both
can't hold the full epoch time in ms, anyway, and a signed type
requires less care in subtraction. Wrap the epoch time in ms to 15
days.
- Fix broken NO_VSYNC_DRM and NO_VSYNC_OPENGL compile-time options.
- Use git revision number for versioning in Makefile, and other small
improvements.
- Reorganize struct _win. Drop unused w->damaged_sequence. w->damaged is
turned to bool.
- Add type and format to winprop_t, as preparation for the new condition
format.
- Add w->shadow_force and w->focus_force, to prepare for D-Bus support.
- Rename wid_get_prop() to wid_get_prop_adv() with more options. Add
wrapper function wid_get_prop().
- Add some extra helper functions, for D-Bus support later.
- Make some functions return a bool value to indicate if it's
successful.
- Modify add_win(), use a static const structure to initialize the new
struct _win.
- Add some helper macros, like printf_err(f)(q). Make some errors fatal.
- Rename some types, constants, and functions. Code clean-up.
- Check for time disorder in paint_preprocess() when calculating fading
steps.
- Rename evpoll() to swopti_handle_timeout(), and partially rewrite it.
- Make -h / --help legal.
- Known issue: compton segfaults on FreeBSD with nvidia-drivers, unless
NO_VSYNC_OPENGL is used. Will look into it later. Thamls to DachiChang
for reporting.
2013-01-08 08:50:58 +08:00
|
|
|
return 1;
|
|
|
|
}
|
2012-11-19 09:46:07 +08:00
|
|
|
session_run(ps_g);
|
|
|
|
ps_old = ps_g;
|
|
|
|
session_destroy(ps_g);
|
|
|
|
}
|
|
|
|
|
|
|
|
free(ps_g);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|