- Fix a bug that window content and some borders are not rendered if the
window has no border on particular sides when -e (frame-opacity) is
enabled, introduced in 66d3f30978. Just as what I said in the commit
message of the commit, "bugs are to be expected". :-S
- Fix a potential segfault in win_match().
- Slightly update CPackConfig.cmake to add dependency to libdrm.
- Silence a FORTIFY_SOURCE warning. Thanks to @smlx for reporting.
- Add -O2 -D_FORTIFY_SOURCE=2 to default CFLAGS in Makefile.
- Use a cleaner way to resolve the writing-to-freed-memory issue
mentioned in last commit.
- Add support for using _NET_WM_ACTIVE_WINDOW to track focus (rather
than using FocusIn/Out events) as --use-ewmh-active-win.
- Add wid_get_attr() and use it in place of XGetWindowProperty() in
various places.
- Remove dpy parameter from find_win() and find_toplevel() as it's unused.
- Fix a writing-to-freed-memory issue in paint_preprocess().
- Change focus detection to filter FocusIn/Out events in an alternative
way. Could break things, and may be revoked in the future.
- Change --mark-ovredir-focused's semantics. Now it determines whether a
window is to be unconditionally focused by checking if its client
window is the window itself. This resolves a problem in window
managers that set frame windows to be override-redirected (Fluxbox and
i3?). Yes, I know it's bad to change semantics in this way.
- Fix a XserverRegion leak introduced in b78ab316fd. I hope this is the
reason of the slowdowns many users reported. Thanks to xrestop!
- Cache the screen region as a variable.
- Add debugging code for region allocation.
- Merge @daBrado's focus event debugging code. Thanks!
- Use macro to reduce code redundancy in various functions.
- Move focus event validation from ev_focus_out() to a separate
function.
- Add logic in ev_handle() to increase the chance of successful window
name detection if compton is not reading window names normally (i.e.
if there's no --shadow-exclude), when DEBUG_EVENTS is on.
- Correct design mistakes in win_get_region_noframe(). I must be
sleepwalking when I wrote that thing!
- Intersect border_size with window region rectangle because Openbox is
offering wrong window shapes larger than the window rectangle for shaped
windows. Shame on you, Openbox.
- Change logic in reg_ignore calculation as border_size is now
intersected with window rectangle and we don't need to do this here
again.
- Rewrite window painting with frame opacity part in win_paint_win() to
deal with absurd frame widths WM offers. Again, Openbox, this is your
fault.
- As I'm in a pretty bad state (continuously working on compton for 10+
hours without rest...), all these changes are not well tested, and
bugs are to be expected.
- Run XSync() before the final paint to catch VBlank better. Stolen from
Xfwm4 VSync patch.
- Add --vsync-aggressive that sends out the final painting request
earlier, simulating xfwm4 VSync patch. But this thing does have the
possibility of breaking VSync, I think...
- Change handling of ConfigureNotify to avoid freeing w->extents and
w->border_size if possible.
- Change logic in paint_prepreprocess() to use win_get_region() for
border_size generation instead of border_size() if the window is not
shaped to try to avoid some BadRegion error messages when a window
loses its border_size then is unmapped, about which Adys complained in
#25.
- Detect if w->border_size is None before using it in various places.
Practically the effect is pretty limited because
XFixesCreateRegionFromWindow() usually returns an invalid X ID instead
of None on error.
- Fix a bug that rounded corner detection could fail if the window size
is changed by a ConfigureNotify immediately.
- Try to reduce regenerations of reg_ignore. Highly experimental and
could lead to very obscure bugs. More testing needed.
- Introduce to_paint in struct _win to keep track of whether this window
was painted last time.
- Drop CAN_DO_USABLE support. Its usage looks pretty limited.
- Fix a bug that possibly causes rendering issues on frame width changes
if frame_opacity is enabled.
- Detect other borders (instead of only top border) when determining
frame opacity.
- Change the type of w->mode from int to an enumeration type.
- Ignore ShapeNotify if the window is not mapped, to avoid loss of
w->border_size in some cases, which breaks the fading out process of
shaped windows.
- Stop rendering a window if its picture is lost and it's unmapped, to
avoid a series of X errors and possible rendering problems.
- Minor change of code in configure_win() for a slight performance boost
in some cases.
- Discovered there are a lot of X errors that I basically cannot fix, caused by
the asynchronous nature of Xlib...
- Correct the position of the timestamps in DEBUG_REPAINT. This might
have negative effects for debugging X errors, though.
- In very rare circumstances, poll() to the X connection returns 1 but
no events are read out, causing XNextEvent() in the main loop to wait
infinitely until another event comes, typically affecting fading
process only, causing fading to appear somehow stopped. This commit
adds a (possible) fix.
- Listen to Expose events of the X Composite overlay window if we are
painting to it, to avoid making some parts of the screen blank when
switching out of X screen in --paint-on-overlay mode.
- Drop "fade_fin" member of struct _win, because it's pretty useless.
- Drop unused "root" parameter of expose_root(), move get_time_ms() to
compton.h, etc.
- Implement clear_shadow with painting region limitation instead of
calculation in shadow image, to make it work correctly on windows with
rounded corners, requested by funeral1988. This might cause more load
on CPU, but could mean less load for GPU. The original implementation
is kept but commented out.
- Code cleanup.
- Stop rendering InputOnly windows. In the past I've misunderstood the
whole thing, I guess, sorry. Thanks to garfilth and funeral1988 for
reporting and providing valuable information.
- Fix a possible segfault in DDEBUG_EVENTS.
- Add "dbe" as a configuration file option.
- Attempt to slightly reduce the rendering delay after VSync in non-DBE
mode. I don't think, however, that this would be greatly helpful for
the tearing issue.
- I realized I might have fundamentally misunderstood VSync. This commit
tries to fix the possible problem, or at least move the tearing line
close to the top of the screen.
- Software VSync is replaced by --sw-opti (software optimization), as
I guess it isn't possible at all to do VSync without driver support.
- Add "vsync" and "sw-opti" as configuration file options.
- Add support for painting on X Composite overlay window instead of root
window (--paint-on-overlay). I intended to use this to fix the
conflict between conky (own-window off) and compton, but it's
unsuccessful. Will have to ask somebody to figure out how to solve
this problem.
- Rename a few variables to avoid confusion.
- Slightly change how root window content (wallpaper) change is
detected.
- Slightly improve window name detection in DEBUG_EVENTS.
Add double buffering with X DBE extension in hope to get rid of the
tearing issue. Thanks to cairo-compmgr for providing hints. Could be
enabled with --dbe. Only very limited tests have been done, I don't know
if it actually solves the tearing issue. My estimation is it is harmful
for performance, but I found no clear evidence. Experimental, so no
configuration file option is available for it.
MONITOR_REPAINT is broken if --dbe is turned on, this is intended for
testing whether DBE is actually working.
Basically dropping support for HAS_NAME_PIXMAP = 0 because I don't think
there are many people using it, and I cannot maintain it. CAN_DO_USABLE
support is under evaluation.
Sort of reverts cdf7db750d, but implements in a different way. (Well,
maybe the pre-cdf7db750d way is actually better, if I'm willing to
sacrifice some precious code reusability.) Basically, trading CPU for
GPU, in an attempt to solve farseerfc and ichi-no-eda's problems. Highly
experimental, could be revoked at any moment.
Pregenerate alpha pictures to save time when painting. Add --alpha-step
to control the step of alpha picture generation (the opacity difference
between two consecutively generated alpha pictures).
- Fix a memory leak in register_cm().
- Print a warning message if argument of --vsync is invalid.
- Known bug: compton will probably freeze X if another compositing
window manager is running and --vsync opengl is enabled, with
nvidia-drivers-304.51. Probably an issue on the driver. I could see no
workaround.
- 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.
- Some WMs don't respect Keith Packard's proposal of
_NET_WM_WINDOW_OPACITY, and do not copy _NET_WM_OPACITY attribute of a
client window to its frame windows, thus cause opacity set by
non-override-redirect windows to have no effect. This commit adds
support for reading _NET_WM_OPACITY from client windows if running
with --detect-client-opacity. Thanks to pvanek for reporting.
- Change Makefile logic to determine options from 3 variables
(NO_LIBCONFIG, NO_REGEX_PCRE, NO_REGEX_PCRE_JIT) instead of CFG to
ensure compatibility when we add new options. CFG variable is no
longer been respected.
- Revert to WM_STATE for client window lookup, as WM_CLASS is
unreliable, either, but set the client window of an override-redirect
window to itself.
- Conform to EWMH to make assumptions about window types when
_NET_WM_WINDOW_TYPE is not available.
- Remove determine_wintype() and completely rely on client window for
window type detection.
- Optionally detect shaped windows using X Shape extension and disable
shadow on them with --shadow-ignore-shaped.
- Some windows are bounding-shaped just to support rounded corners, like
Chromium windows (when system titlebar is disabled in its settings).
Add --detect-rounded-corners to treat them as non-shaped windows (thus
enable shadow on them). The algorithm I use is not perfect and wrong
detection results are pretty possible to appear.
- Many windows don't use X Shape extensions to add shapes but use ARGB
background instead. These windows could only be blacklisted with
--shadow-blacklist.
- Rename a few functions. Code clean up.
Split w->shadow_pict to w->shadow_pict and w->shadow_alpha_pict, so that
the whole w->shadow_pict need not to be rebuild on shadow opacity
change. This greatly reduces CPU usage of compton when a window with
shadow is fading. (My test shows the CPU usage of compton process
dropped from 1.15% to 0.35% when constantly fading in and out a window.)
It uses a rather painful and slow method in shadow_picture() to get
around the limitation of PictStandardA8 to make colored shadows work. I
wonder if there's a better approach.
- Merge variables gsize and cgsize as they seemingly represent the same
thing.
- Fix compilation failure with <libpcre-8.20 and <libconfig-1.4. Tested
with libpcre-8.12 and libconfig-1.3.2, but not extensively tested.
libconfig-1.3* probably has more limitations on configuration file
syntax (enforces comma at the end of a setting?) and does not support
@include.
- Make it possible to turn off PCRE and libconfig support using
environment variable "CFG". Not well tested. CMake might provide a
better solution.
A locale using comma instead of dot in floating point values causes
unexpected behavior when parsing floating point commandline arguments.
This commits enforces LC_NUMERIC="C" during commandline argument parsing.
-F hasn't being working for long. This commit adds a switch
--no-fading-openclose (and a configuration file option of the same name)
to simulate the behavior when only -F is enabled, which disables fading
when opening/closing windows, and makes -F an alias for -f.
Attempt to fix the transparency issue of Firefox and Chromium location
bar dropdown window by marking override_redirect windows as active. This
may not work completely and could have other side effects. Experimental.
Enable by using --mark-ovredir-focused.
- Change some members of options_t. Clean up wrongly replaced option
names in comments. Rename "options" to "opts", to avoid breaking line
width too much, and to minimize typing as it's so frequently used.
:-)
- Let general options in commandline arguments override wintype-specific
options in a configuration file, which could be a more natural
behavior.
- Add support of window-type-specific options (fade, shadow, and
opacity) in configuration file parsing. Syntax shown in
compton.sample.conf.
- Replace wintype_name() with an array of window type names. Code
clean-up.
- Add support for parsing configuration files using libconfig.
(Dependency on libconfig could be made optional once we get some
better building system.) Few tests has been done, bugs to be expected.
compton searches for a configuration file mostly according to the XDG
standard. Firstly the configuration file requested by --config, then
$XDG_CONFIG_HOME/compton.conf (~/.config/compton.conf, usually), then
~/.compton.conf, then compton.conf under $XDG_DATA_DIRS (often
/etc/xdg/compton.conf). A sample configuration file is supplied as
compton.sample.conf. Configuration file syntax may change in the
future. Commandline switches has higher priority than configuration
file, except for --shadow-exclude. Use --config /dev/null to
temporarily disable configuration file.
- Fix a bug that causes windows to disappear or be partially rendered on
opacity changes.
- Fix a bug that causes some windows to ignore -i (inactive_opacity) and
--inactive-dim, caused by the default window type change in
a5d9955ca4.
- Fix two small memory leaks. valgrind detects another memory leak
possibly caused by XGetTextProperty(), probably a bug in libX11, I
couldn't fix that one.
- Use predefined atoms in Xatom.h to replace a few XInternAtom() calls.
- Let window type detection start with the client window if there's one,
in hope to enhance performance.
- Change get_wintype_prop() to fetch the property only once.
- Default to WINTYPE_UNKNOWN instead of WINTYPE_NORMAL if
_NET_WM_WINDOW_TYPE is missing.
- Fix a mistake in calc_opacity().
- Add some items to .gitignore.
- Fix a typo in usage().
- 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.
See chjj's comments on issue #39:
https://github.com/chjj/compton/issues/39#issuecomment-8533360
- Add a switch --mark-wmwin-focused that try to detect WM windows and
mark them active.
- Fix a bug that causes BadDrawable, etc. if a window is mapped then
immediately unmapped.
- Fix a bug in determine_evmask().
- Add a debug option DEBUG_CLIENTWIN.
- Force window repaint on window frame extent change.
- Code cleanup.
- Change fading mechanism for better modularity. Remove fade queue and
use members in struct _win to record fading data. In contrast to
previous commits, this one actually could make the program slower (but
very slightly, hardly noticeable if your CPU is anywhere close to AMD
K7). As this commit changes lots of things, bugs are to be expected.
- Currently -F does not do its job. -f actually equals -fF. (While in
the past -F equals nothing and -f is just -f.) A fix will be made
soon. I suppose it isn't hard.
- Add a preprocessor function paint_preprocess() and move all
preprocessing code in paint_all() to it.
- Add window flag support but currently unused.
- Add DamageNotify handling to ev_window().
- I'm considering removing HAS_NAME_WINDOW_PIXMAP = 0 support as I
couldn't see what it is good for. Nor do I know what CAN_DO_USABLE
does. Basically all my changes ignore these cases.
- Defer shadow picture generation to minimize interactions with X,
hoping to boost performance.
- Fix a rendering issue caused by clip_changed in configure_win().
Remove clip_changed altogether.
- Split generation of shadow picture from calculating its geometry.
- Cache width/height including borders in struct _win as it's frequently
used.
- Now compton paints windows from the lowest to the highest. Warning:
I'm not completely certain that the change won't introduce unexpected
glitches. This commit may be revoked in the future.
- Remove w->border_clip since it's no longer needed.
- Correct a mistake in find_toplevel2(). (clang --analyze found it out.)
- Change "func_name()" prototypes to "func_name(void)". If I remember
correctly, "func_name()" means you are remaining silent about this
function's parameters instead of stating it has no parameter in ANSI
C.
- Add timestamps to error messages.
- Suppress error messages caused by free_damage().
- Change how w->alpha_pict is generated, in hope to boost performance,
slightly, and as a step to eventually move handling code of most resources
used when painting to paint_preprocess().
- Remove alpha_pict parameter of shadow_picture() as it's not
necessary.
- Let window opacity affect frame opacity.
- Rename some members of struct _win.
- Add 4 helper free functions that free XserverRegion, Damage, Picture,
and Pixmap.
- Rename w->shadow to w->shadow_pict. Add a bool member w->shadow to
prepare for a future change.
More details on the issue report.
- Look up the client window of a WM frame when it's mapped instead of when
it's created, for better reliability.
- Fix a warning when building.
I found compton segfaults sometimes when starting from .xinitrc.
Debugging reveals my conky window was just reparented to a fvwm's
frame window before compton picked up a FocusOut event on this conky
window that has just been destroyed in the event queue. find_win()
call in ev_focus_in/out() returned a NULL pointer. When it tried to
use the pointer segfault happens.
- Add extra check to ev_focus_in/out() to stop the segfault.
- Reset window event mask on window reparenting to a non-root window to
minimize wrong events.
- More abstraction for determining window event mask.
Use find_toplevel() to find out the WM frame of a client window. I
didn't noticed it beforehand. Fallback to the old method as compton does
not always get correct client windows.
- Clean up find_client_win() a bit. A BFS search algorithm could be more
optimal yet it requires a queue implementation.
More information in the issue report.
- Let window opacity affect the opacity of its shadow and frames even if
-z is enabled.
- Check for the range of -o to eliminate potential segfault.
Take care of failure of XQueryTree() to prevent it from causing a
double-free crash. This usually happens when X is initializing and windows
are constantly changing.
- Change all #if DEBUG_XXX directives to #ifdef, thus making it
possible to directly enable debugging options with CFLAGS
(-DDEBUG_XXX).
- Print timestamp before event debugging messages.
More details in the bug report.
- Rewritten much of the opacity calculation, code cleanup.
- Commandline switch --inactive_opacity_override to restore the old
behavior in which inactive_opacity has higher priority than
_NET_WM_OPACITY.
- Use getopt_long() instead of getopt() for argument parsing, making
long options possible.
- Add support of colored shadows with 3 commandline switches.
More descriptions on issue #36.
- Listens ShapeNotify event to get around the Chromium window painting
issues.
- Adds dependency on X Shape extension.
- Adds a few functions for convenience, so a bit code clean up.
- Better event debug support, adds restack_win() debug.