- 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).
- Fix a small bug that breaks --invert-color-include if no other
blacklists are present. Thanks to MaskRay and xiaq for reporting.
- Disable --unredir-if-possible for multi-screen setups.
- Fix a bug that causes --no-fading-openclose to have no effect in some
cases. Add w->in_openclose to keep track of window open/close state.
- Add window color inversion (--invert-color-include). It means 2-3
times extra painting, so performance issues are likely to appear. I
hope I could find a faster way to invert colors.
- Rename some functions.
- Fix update of some window properties after window type/data change.
Hopefully this will be helpful for #73.
- Split win_build_picture() from win_blur_background().
- Correct memory leak of ps->focus_blacklist during reinitialization.
- Add win_upd_t and win_upd_run(), to reduce duplicate window property
updates. But is unused right now.
- Limited tests are done overall. Bugs to be expected.
- Back to using select() for main loop. Thus we are not longer relying
on libevent.
- Add generic timeout system (untested) to prepare for D-Bus support.
- Drop troff man pages. Revise Makefile to improve documentation
building, fix double LDFLAGS inclusion, and re-add -lrt. This turns
asciidoc into a build time dependency.
- Change fading time calculation.
- Add --logpath and ostream_reopen() for debugging with -b.
- Drop unused lceil_ntimes() and other helper functions.
- Only very limited tests are done. Bugs to be expected.
- (Hopefully) fix all incorrect handling of w->a.border_width in compton
(#77). Thanks to baskerville for reporting.
- Attempt to fix #73 by correcting a mistake that window data is fetched
from the wrong function. Thanks to zakkak.
- Add git commit/tag detection to Makefile for automatic versioning.
- Change -lGL linking order, to fix a segmentation fault caused by
something in nvidia-drivers under FreeBSD, mentioned in #74. Thanks
for the report from DachiChang.
- Link to -levent_core instead of -levent in Makefile. We might move to
libev soon, though.
- Increase SWOPTI_TOLERANCE to handle the extraordinary delay of
kqueue() under FreeBSD. Thanks for DachiChang's report.
- Add helper function dump_drawable() for debugging.
- Replace XInternAtom() calls with get_atom().
- Remove -lrt as it's unneeded.
- 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.
- Remove the region expansion design in win_blur_background(). I must be
sleep-walking when I wrote that!
- Improve performance of blurring when a window is opaque but its frame
is transparent.
- Adjust blur strength according to window opacity.
--blur-background-fixed restores the old behavior.
- Add "use_offset" parameter to a few functions for convenience. Code
clean-up.
- Add window background blur support (--blur-background &
--blur-background-frame), with X Render convolution filter.
The performance sucks. The performance when the window is opaque but
frame is transparent could be improved, but there are two possible
ways and I'm hesitating.
- Known issue: The blurring effect looks very ungraceful during fading.
I could partially fix the problem, but it probably isn't easy to fix
it completely.
- Move some long functions to ./src/compton.c .
- Fix a small potential issue in win_set_focused() when a window with
neither leader nor client window is focused.
- Add DEBUG_LEADER.
- Add auxiliary window detection (--detect-transient &
--detect-client-leader). Thanks to SmilingHorse for inspiring me. The
implementation is not too speed-efficient, and bugs are to be
expected.
- Known issue: auxiliary window detection may not work too well with
windows that are never mapped, for example as client leader.
- Add "focus" to the wintypes settings in compton.conf, to mark windows
of certain window types to be always focused. Replaces the ugly
is_normal_win().
- Add a ON/OFF/UNSET switch_t type, but it's unused currently.
- Mark client_win if the window client detection hasn't been performed
when we detect WM_STATE's presence in ev_property_notify(), for
performance.
- Attempt to fix client window detection when WM_STATE property is not
yet set when the window is mapped. Thanks to kinclma1 for reporting.
- Apply stricter checks for whether window is mapped in
determine_evmask() and win_mark_client().
- Note I'm not in the best state today (bad cold & sleep-deprived). This
commit is likely to introduce bugs.
- Attempt to fix client window detection failures happening when compton
searches for client window before it's ready.
- Fix build failure with <libpcre-8.20. Thanks to @pvanek for reporting
in #51.
- Move client window detection to a new function win_recheck_client().
- Add win_unmark_client(), which unmarks a client window.
- Rename a few functions.
- Split fetching of values of type-Window properties to a new function
wid_get_prop_window().
- Add extra safety checks and assert calls to various functions, to
expose potential bugs.
- Fix a memory leak that w->role is not freed on window destruction.
- Add support of matching WM_WINDOW_ROLE value. Thanks to Vladimir A.
Pavlov!
- Thanks to Vladimir A. Pavlov for reporting the issues caused by
missing client window, fixed in the last commit!
- Fix a memory leak in wid_get_text_prop() and wid_get_name(). Xlib
documentation did not mention how to free the value XGetTextProperty()
returns, so my fix could lead to troubles.
- Set focus out in unmap_win(), and add w->leader, to prepare for
subsidiary window detection.
- Abstract update of a single string window property to
win_get_prop_str().
- Change wid_get_name() to rely on wid_get_text_prop() as much as
possible.
- Correct a typo in win_get_prop_str() that could cause unnecessary
update of shadow state and window focus.
- Make inactive_dim opacity change according to window opacity by
default, so it looks better when fading. --inactive-dim-fixed restores
the old behavior.
- Make client window default to the window itself. Add w->wmwin to
represent whether the window looks like a WM window instead. A side
effect is, the window type of WM windows are changed from unknown to
normal, making it necessary to use --mark-wmwin-active to avoid
considering them unfocused.
- Add check of PointerRoot to recheck_focus() to avoid BadWindow errors
when the root window is focused.
- Add a few macros to simplify debugging code.
- Add DEBUG_FRAME.
- Add --focus-exclude, which should be used with a list of conditions to
set certain windows to always be considered focused.
- Change focus determination process, with a newly added w->focused_real
that reflects whether the window is actually focused, while w->focused
represents whether compton considers it focused. The primary
difference is now when a window considered focused because of
--mark-wmwin-focused or --mark-ovredir-focused receives a FocusOut
event, it's still considered focused by compton.
- Change opacity target and dim state calculation so that it's done at
most once every paint.
- Split window opacity property fetching from calc_opacity() to a new
function win_update_opacity_prop().
- Silence a warning in wid_get_prop_wintype().
- Rename a few functions. Code clean-up.
- My time is very limited currently, few tests are done, so this commit
may very well introduce bugs.
- Known issue: Dim picture opacity does not change based on window
opacity, causing somehow annoying effects when a window fades off.
- Fix a bug that causes wrong focus detection result in Awesome and
maybe other window managers, when --use-ewmh-active-win is enabled and
_NET_ACTIVE_WINDOW changes before the newly-focused window is mapped.
- Fix a typo that causes more than one window to stay focused after a
window destruction with --use-ewmh-active-win.
- Fix a bug that find_clientwin() incorrectly returns a window when
window ID 0 is passed to it.
- Check for window ID 0 in update_ewmh_active_win().
- Create a session_t structure, to get rid of most global variables and
let information pass in/out mostly through parameters. Huge changes,
so bugs may very well appear. I'm worried about resource leakages, in
particular.
- Add gcc attributes on various functions.
- Add Doxygen configuration.
- Replace much Xlib Bool with C99 bool.
- Add and adjust some comments.
- Drop unused parameters from some functions.
- Cache default Visual and Depth, mainly to shorten code.
- Rename some types, variables, and functions.
- Add win_ev_stop() and set_ignore_next() for convenience.
- Modify wid_get_prop_wintype() and wid_get_opacity_prop() to use
wid_get_prop().
- Rename --respect-attr-shadow to --respect-prop-shadow.
- Fix a memory leak in --respect-prop-shadow.
- Many other small changes.
- Optionally unredirect windows when there's a fullscreen opaque window on
the top of the stack (--unredir-if-possible). Experimental. Known
issues:
* Screen flickers when redirecting/unredirecting windows.
--paint-on-overlay seemingly minimizes it (Thanks for hints from
mutter), but still noticeable.
* It probably does not play well with vdpau in some cases.
- A debug option DEBUG_REDIR is added.
- Fix a bug that reg_ignore are not expired when a CirculateNotify is
received.
- Add extra safe guards in some places, which could be bad for
performance.
- Remove some abundant code.
- Add support for reading _COMPTON_SHADOW property from windows
(--respect-attr-shadow). Presently the only defined behavior is, if
_COMPTON_SHADOW is set on the highest ancestor below root window of a
window (usually the WM frame), it's format is 32-bit, type is CADINAL,
value is 0, the window will not get a shadow. The format and behavior
could change in the future without prior notification.
- Fix an issue in fork_after() that may cause some streams to remain
open. My mistake.
- Attempt to reduce determine_shadow() calls from map_win() by
separating some raw handler functions out.
- Fix a bug that causes rendering issues if a opaque window changes
shape.
- Remove abundant handling code in paint_preprocess() when generating
border_size as border_size() is no longer relying on
XFixesCreateRegionFromWindow() right now by default.
- Add extra code to print backtrace in DEBUG_ALLOC_REG.
- Move initialization of fade_time closer to first paint.
- 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.