This way we don't need to update the bounding region after window moves.
Also add some comments about the coordinate systems in compton.
Also change a few function that takes a `bool global` parameter to
always return region in local coordinates.
win_rounded_corners is called by win_updated_bounding_shape, so there is
no need for the former to call the later.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
With libX11, the library calls an I/O error handler if the connection to
the server breaks. The default I/O error handler prints an error message
and calls exit(). This can be seen when running a "pre-xcb" compton
against Xephyr and then closing the Xephyr window:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":1"
after 241 requests (241 known processed) with 0 events remaining.
The current compton would just continue running. After this commit, it
instead exits with this message:
handle_queued_x_events(): X11 server connection broke (error 1)
Signed-off-by: Uli Schlachter <psychon@znc.in>
Xlib uses unsigned long for XIDs, but xcb always uses uint32_t. Thus,
this needs the format string for uint32_t now.
Signed-off-by: Uli Schlachter <psychon@znc.in>
IANAL, but I think I am allowed to add missing copyright notices for
someone else. And I did my best job using git history to figure out who
wrote which functions. So I hope everything is fine.
Bugs:
* There seems to be a noticeable frame loss when window
is being opened/closed. But the same problem also exists
in master/next, so this is not a regression.
* Using --sw-opti and --benchmark at the same time causing
compton to draw more frequently than permitted by the
arguments. That is because the sleep interval calculation
is flawed. Not really a regression either.
Verified still working:
* Usual painting
* Fade
* Benchmark mode
* --sw-opti (with or without benchmark mode)
* DBus
* Unredir delay
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Re-did the painting logic, and document it.
It is unclear to me what is the previous painting logic. But the current
one is basically this:
1. Go through all windows top to bottom, and put visible windows (not
unmapped, opacity > 0, etc) into a linked list, from bottom to top
2. Accumulate a region of ignore on each window, which is basically the
region of screen that is obscured by all the windows above current
one.
3. Paint all the visible windows from bottom to top. Subtract the region
of ignore from the painting region. If we need to paint shadow, we
subtract the body of the window from the shadow painting region too,
because we don't want shadow behind the window.
4. region of ignore is invalidated when window stack change, an
window on top moved or changed shape, when window changed between
opaque and transparent, etc.
Notes:
It is unclear whether all the different shapes of a window (extents,
noframe, border, bounding shape, etc) are calculated correctly or not.
It is unclear if window shape related events are handled correctly or
not. Need more testing.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Change `win *` to `win **`, because a window could be freed by the
callback, so we can set `*w` to NULL to communicate that.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Also remove some debug function calls (there are better tools for opengl
debugging now). Also remove copysubbuffermesa
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Instead use win_has_alpha to check for alpha channel, window mode is
reserved for determine if the window is possibly transparent.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
The existing mechanism with set_ignore_next() is (IMHO) ugly and also
does not work with XCB requests. This commit adds a new function
set_ignore_cookie() and fixes callers that were converted to XCB to use
this new function instead.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Errors for requests sent via Xlib that expect a reply are handled via
XSetErrorHandler(), which sets up a callback function that Xlib calls.
Errors for requests that do not expect a reply or for errors caused via
unchecked XCB requests show up as events of type 0 in the event handling
function.
Before this commit, errors were ignored here. This commit changes the
code so that the errors are printed instead.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Note that this adds an include for Xfixes.h, because that header is
still needed and was previously included through Xcomposite.h.
Signed-off-by: Uli Schlachter <psychon@znc.in>
The X11 server's answer is not \0-terminated, so xcb_str_name() also
does not provide a \0-terminated pointer.
Signed-off-by: Uli Schlachter <psychon@znc.in>
No functional changes intended. The new xcb_damage_query_version() was
previously done by XDamageQueryExtension() internally.
Signed-off-by: Uli Schlachter <psychon@znc.in>
If an X event is received at a very specific point in time, it can trigger
a race condition in Xlib. Said event will be read, but Xlib will
nonetheless be completely unaware of the event.
This cause compton to sometimes block on select() while there are events
ready to be processed. If the event is a damage report, screen freeze
will happen until some other event is received.
The proper fix is to switch to xcb for event handling, thus avoid this
problem entirely.
There seems to be a race between DamageAdd (what the client uses
to report damage to Xserver) and DamageSubtract (what compton uses
to clear the reported damage, so it can receive new ones). I am not
sure how to confirm this. But this (terrible) workaround seems to
solve this problem.
* Move code around
* Remove unneeded forward declaration
* Rename win->damaged to win->ever_damaged, to be less confusing
* Expose debug functions even when DEBUG is not enabled. Compiler
would remove the dead code for us anyway.
* Some code cleanup
Also move static function prototypes out of compton.h. Seems like the
previous developers didn't know what header files are for.
Seems to have bugs after the split.
Before becoming the selection owner for _NET_WM_CM_Sn, compton will now check if
that selection is already owned (which means that another composite manager is
already running). If this check fails, startup will be refused. This behaviour
is required by EWMH / ICCCM.
Because this should catch all composite managers, the error message that was
used before when another manager is already running is reworded to mention that
the other manager does not follow EWMH.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Under extreme race conditions (window A close at the same time as window
B create), there can be multiple windows with same id in compton's window
list. If at this point window B closes itself as well, finish_destroy_win
might destroy a different window as what's passed to destroy_callback.
This can be a problem because someone can still hold a reference to that
window (e.g. 't' in paint_preprocess), and there's no way to clear that
reference. If finish_destroy_win always destroy the same window passed
to destroy_callback, this will not be a problem.
- Remove the const function attribute from get_time_*(), since the
functions they call that actually get the time probably access global
variables or have other behaviors unacceptable for const functions.
- Change the const function attribute on win_has_frame() to pure, as it
accesses memory its parameter points to, which is invalid for a const
function.
Bug fix: Select the larger of the X window border width and
_NET_FRAME_EXTENTS, instead of adding them together, when determining
the frame extents. (Supposedly) more EWMH compliant, as EWMH
_NET_FRAME_EXTENTS should include the X window border width already. We
did not choose to completely rely on _NET_FRAME_EXTENTS to remove the
need to keep track of whether there is a _NET_FRAME_EXTENTS, and
(hopefully) take care of some cases when it is wrong. The commit should
fix awesomeWM/awesome#425. Thanks to psychon for the information. (#302)
The commit fixes the bug in win_get_region_noframe() that the X window
border width is not considered when determining the width/height of the
window without frame, as well.
- Add margin_t, a structure that represents margins around a rectangle.
- Store frame extents of a window with margin_t, replacing the 4
fields ({left,right,top,bottom}_width) in struct _win.
- Add two helper macros, cmemzero() and cmemzero_one(), that zero out a
block of memory.
Fix the bug that --active-opacity state does not change
on `--focus-exclude`-ed windows correctly, since win_update_focused()
enables the WFLAG_OPCT_CHANGE flag on a window only if w->focused
changes, while --active-opacity depends on the output of
win_is_focused_real() instead of w->focused, which could be changed even
if w->focused does not change (e.g. when the window is
`--focus-exclude`-ed).
Always redirect std{out,err} if --logpath is specified, instead of only
redirect after fork, to correct the inconsistent behavior of --logpath
when getppid() returns 1. (#263)
- Add disabled-at-compile-time note in usage text with NO_LIBCONFIG.
- Fix the incorrect disabled-at-compile-time note for --backend.
- Move position of the disabled-at-compile-time note of --dbus
slightly.
- Fix the bug that --no-fading-openclose doesn not work when fading out
by writing w->fade_last as well in win_determine_fade().
- Write w->fade_last for applying w->fade_force, as well.
- Reformat usage text by adding a blank line between descriptions of
two switches. (#215)
- Update documentation for a bit. Correct some wrong statements and
clarify some others.
- Add glx_take_screenshot() for taking a screenshot. With ImageMagick
the output data could be viewed in this way:
display -size [SCREEN-WIDTH]x[SCREEN-HEIGHT] -depth 8 -flip
rgb:[PATH]
(#204)
- Add D-Bus command `opts_get string:paint_on_overlay_id` to get X
Composite overlay window ID. (#204)
- Code cleanup.
- Separate GLX parts from session_t into glx_session_t.
- Add --rererdir-on-root-change and --glx-reinit-on-root-change, as
possible solutions for #217. Thanks to jlindgren90 for reporting.
- Add --glx-fshader-win, which specifies a custom fragment shader for
painting windows. compton-default-fshader-win.glsl is the shader with
default behavior, and compton-fake-transparency-fshader-win.glsl
provides a template of fake transparency. (#183)
- Add --force-win-blend to force all windows to be painted with
blending.
- Add --no-fading-destroyed-argb, as a workaround of bugs in some WMs.
(#193)
Add `bounding_shape` and `rounded_corners` as condition match target.
Deprecate --shadow-ignore-shaped. Add rounded-corners detection to
win_is_fullscreen(). Slightly modify win_rounded_corners() logic. Thanks
to tdryer for reporting. (#191)
- Try to avoid evaluating conditions after window unmap/destruction.
Unfortunately, frequently this doesn't work due to the asynchronous
nature of X.
- Add _GTK_FRAME_EXTENTS exclusion rules to compton.sample.conf. Thanks
to memeplex, hexchain, and others for info. (#189)
- Add debugging option --show-all-xerrors, and other debugging changes.
Doc update.
- Add --xrender-sync{,-fence} to deal with redraw lag issue on GLX
backend. --xrender-sync-fence requires a sufficiently new xorg-server
and libXext. NO_XSYNC=1 may be used to disable it at compile time.
Thanks to tchebb for reporting and everybody else for testing. (#181)
- A bit code clean-up. Replace a few XSync() with XFlush() to minimize
the latency.
- Add "xr-glx-hybrid" as an alias of "xr_glx_hybrid". (#163)
- Clear damage history in expose_root() and when root window size
changes. Unfortunately this doesn't fix#181.
- Add new backend "xr_glx_hybird", which uses X Render for all
compositing but GLX on the last step of rendering to screen. This
makes GLX-backend-specific VSync methods usable while may avoid
certain bugs with GLX backend. The idea comes from ali1234.
Experimental.
- GLX backend: Stop using or rendering to depth buffer.
- Use glFinish() instead of glFlush() before VSync. It probably uses
more CPU but could be more reliable than glFlush().
- Add --write-pid-path to write process ID to a file, to help
determining compton's process ID when -b is used.
- Add a few extra targets to query through D-Bus opts_get (version, pid,
etc.) and through win_get, primarily for debugging.
- Add helper macros likely(), unlikely(), cmalloc(), ccalloc(),
crealloc().
- Change w->opacity_set to opacity_t. Determine display_repr in
session_init(), etc.
Possible fix for a very rare timing issue in focus detection. Compton
may fail to detect the currently focused window, when a window newly
mapped gets focused, we failed to listen to events and get FocusIn from
it in time, and a series of focus change events before it happens stay
in the event queue and puzzled compton. My choice is to force focus
recheck on all focus-related events. More roundtrips to X, but not
necessarily worse performance, due to the high cost of focus flipping
especially when there's a lot of conditions. Thanks to SlackBox for
reporting. (#153)
- Fix a bug that --opacity-rule misbehaves with a value higher than 50%
on 32-bit systems. Thanks to mrinx for reporting. (#149)
- Fix a bug that opacity-rule in configuration file does not work.
- Rewrite focus detection logic. Remove w->focused_real and use
ps->active_win to identify focused window uniformly. Use a more
expensive way to filter FocusIn/Out events to improve reliability.
Only limited tests are done, and bugs are likely to be introduced.
(#99)
- Known issue: Under fvwm, compton sometimes does not consistently
report the window input gets sent to. But there's something wrong in
that case: XGetInputFocus() shows the root window is focused but
another window is receiving input.
- Possible fix for high CPU usage with a low --unredir-possible-delay.
Thanks to Feltzer for reporting. (#140)
- Rewrite some parts to (hopefully) increase performance, especially
with --unredir-if-possible.
- Known issue: With GTX 670 and x11-drivers/nvidia-drivers-325.15, and
compton --unredir-if-possible --config /dev/null, if you send a
SIGUSR1 to compton when a full-screen solid window is there, in which
case compton either redirects then immediately unredirects the screen,
or just don't redirect it altogether, X freezes after compton
unredirects the screen. Requests sent by other X clients are not
responded until compton is killed, which indicates the possibility of
a bug in X. Attaching to X process shows X is on ./os/waitFor.c.
Backend does not matter. --paint-on-overlay fixes the issue somehow.
compton-git-v0.1_beta1-5-g4600f43-2013-08-28 doesn't exhibit the
issue, but it's probably timing-related.
- Add --unredir-if-possible-exclude, to exclude certain windows when
evaluating --unredir-if-possible. (#140)
- Add --unredir-if-possible-delay, to add some delay before
unredirecting screen. (#138, #140)
- Code clean-up.
- Add stoppaint_force option, controlled via D-Bus, to stop painting
completely, which may look better than unredirecting the screen,
sometimes. (#41)
- Add x2, y2 matching targets.
- Update documentation.
- Fix OpenGL 3.0 compatibility by changing glFramebufferTexture() to
glFramebufferTexture2D(). Thanks to danfe for suggestion!
- Add notification about DocBook toolchina dependencies. Thanks to
danfe. (#121)
- Add --paint-exclude to prevent certain windows from being painted, for
debugging purposes.
- Add predefined matching target "x", "y", "width", "height", "widthb",
"heightb", "border_width", and "fullscreen".
- Fix bug #119, wrong man page install dir in CMake configuration.
Thanks to sstewartgallus for reporting.
- Add --shadow-exclude-reg, which excludes certain regions on the screen
to have shadows painted in. (#116)
- Adjust session initialization order. Now X root and screen info and
basic X extensions are available in configuration parsing step.
- Add --opacity-rule, which sets opacity based on conditions, as
requested by zabbal. (#113)
- Add a data field for each condition.
- Correct the FAQ link in README.md. Silly me.
- Code clean-up.
- Add multipass blur support. Note GLX Framebuffer support is required.
My benchmark shows multipass blur brings 5% performance boost for X
Render backend (3x3box). On GLX backend it brings 10% performance
boost for 5x5box but negatively affects performance for 3x3box. Thanks
to jrfonseca for advice. (#107)
- GLX backend: Cache blur texture for each window, for a 12% performance
boost.
- Add D-Bus fading control. Thanks to yulan6248 for testing. (#112)
- Fix FAQ link in README.md. Thanks to lorenzos for report. (#111)
- Correctly deinitialize VSync on on-the-fly VSync method switch.
- X Render backend: Normalize blur kernel.
- Code clean-up.
- Known issue: Linear corruption on border of a window may appear with X
Render multi-pass blur. Possible to fix but probably not worthwhile.
- GLX backend: Add DEBUG_GLX_MARK, to add GL marks around functions with
glStringMarkerGREMEDY(), and mark frame termination with
glFrameTerminatorGREMEDY().
- Print output of `compton -h` to stdout. (#110)
- GLX backend: Strip out elements with factor 0 in GLSL blur code.
Thanks to jrfonseca for guides. (#107)
- Fix GL_TEXTURE_RECTANGLE support. Thanks to amonakov for guides.
(#107)
- Enhance --glx-copy-from-front to improve performance and make it work
with --glx-swap-method, copied from kwin patch. Thanks to bwat47 for
info. (#107)
- Add texture2Doffset() support in blur GLSL shader. Thanks to amonakov
for advice. No visible benefit here, though. (#107)
- Only limited tests are done and I'm super sleepy. Bugs expected
- Fix --resize-damage. I forgot to shrink the painting region back when
actually copying to destination.
- Include extra pixels around the blur texture to avoid some possible
small issues, if --resize-damage is positive.
- Known issue: Line artifacts may still appear with --dbe (X Render
backend) or --glx-swap-method (GLX backend). I doubt if there's way to
fix this without very inefficient mechanisms.
- Add --resize-damage to enlarge/shrink repaint region by a specific
number of pixels, used for solving the line corruption issue with
blur. Thanks to Nuck and jerri in #104 for reporting.
- Fix the memory leak of blur shader string.
- Add blur convolution kernel customization, --blur-kern. The format is
a bit tricky so be sure to read the description in `compton -h`. Not
much tests received.
- GLX backend: Tolerate missing GLSL uniforms for strangely shaped
convolution kernel.
- Fix a memory leak that blur-background blacklist is not freed.
- GLX backend: Add --glx-swap-method, to reduce painting region if the
driver uses exchange or copy buffer swaps. Untested.
- Add --fade-exclude, to disable fading on specific windows based on
some conditions. Untested.
- Expose GLX backend options through configuration file. Add fetching of
GLX backend options through D-Bus.
- Use NULL pointer instead of element count to delimit string arrays in
parse_vsync()/parse_backend()/parse_glx_swap_method().
- Add documentation about "wintypes" section in configuration file.
- GLX backend: Fix broken dim and blur with --glx-no-stencil when
dealing with shaped windows.
- GLX backend: Cache region contents and do a local region intersection
instead of using XFixesIntersectRegion(). Drastic reduction in CPU
usage for --glx-no-stencil. Now --glx-no-stencil substantially
outperforms (~15%) normal mode.
- Use macros to reuse paint-in-region code in opengl.c . Add new type
"reg_data_t" to store XserverRegion cache.
- Cache region contents in is_region_empty(), mostly useful only for GLX
backend to save one roundtrip to X.
- GLX backend: Add --glx-no-rebind-pixmap, which prevents rebinding of
GLX texture to pixmap on content change. It doesn't work on some
drivers, but it saves some CPU on those where it does.
- Wrap XFree() with a new function cxfree() since its man page claims
NULL pointers are not acceptable (although in fact it does...).
- Use macro to save some code in get_cfg(). Code clean-up.
- GLX backend: Fix broken --inactive-dim.
- GLX backend: Fix bugs when inverting colors of windows. Thanks to
madsy and neure for help.
- GLX backend: Lift `glx_no_stencil` restriction from glx_init_blur().
It still probably won't work, but the user can try.
- XRender backend: Use XRenderFillRectangles() instead of
XRenderComposite() to do dimming.
- Add --blur-background-exclude. (#98)
- Add `opengl-mswc` VSync, which uses MESA_swap_control instead of
SGI_swap_control. I don't expect it to perform better than
SGI_swap_control, though.
- Update CMakeLists.txt .
- Add a few targets for D-Bus `win_get`. Misc changes.
- Known issue: Apparently I've forgotten implementing --inactive-dim on
GLX backend... Silly me.
- GLX backend: Add --glx-use-copysubbuffermesa, to use
MESA_copy_sub_buffer to do partial screen update. Huge performance
boost on mesa drivers for partial screen updates, but does not work
for nvidia-drivers and may break VSync. Automagically overrides
--glx-copy-from-front.
- Add rect_is_fullscreen() to reuse code. Misc changes.
- GLX backend: Add blur background support using a GLSL shader. Only
tested with nvidia-drivers-313.26. Known to cause quite some decrease
in performance (~10%?).
- Detach shaders in glx_create_program(). Misc changes.
- GLX backend: Add --glx-copy-front, which copies all unmodified regions
from front buffer to back buffer instead of redrawing the whole
screen. Unfortunately, probably because glCopyPixels() isn't usually
well-optimized on graphic cards, this option appears very unstable in
its effect: Over 20% boost in performance when only 1/4 of the screen
is modified, but 10% decrease when the whole screen is. Thus, not
enabled by default.
- GLX backend: Add glx_blur_dst(), to prepare for the background blur
feature. It currently is capable to modify background in the desired
way, but the core blur shader is absent. glConvolution2D() seemingly
relies entirely on CPU and has horrifying performance. I've hesitating
about whether I should use ARB assembly language or GLSL for the
shader.
- GLX backend: Invert y-axis GL matrix. It's upside-down previously
because that's what dcompmgr uses. Seemingly a "normal" y-axis is
required for glCopyPixels() to operate correctly.
- GLX backend: Fix some GLX_TEXTURE_RECTANGLE compatibility issues.
Still, not actually tested.
- Add benchmark mode (--benchmark & --benchmark-wid).
- Misc changes.
- GLX backend: Use GL_SCISSOR_TEST instead of STENCIL_TEST if there's
only one rectangle in glx_set_clip(). Profiling with gDebugger shows a
10% performance improvement.
- Add .desktop installation rules. (#97)
- GLX backend: Fix a bug that ARGB windows / shadows are rendered too
dark. Thanks to derhass in FreeNode/##opengl for help.
- GLX backend: Fix a problem that during window resize the content looks
jittering, by letting compton fetch pixmap sizes with XGetGeometry()
instead of relying on window width/height, which could be inaccurate
during window resize. Negative effect on performance. Thanks to M4he
for reporting. (#7)
- Add .desktop file. Thanks to quequotion for providing it. (#97)
- Avoid checking presence of window pixmap, because they may not exist
with very old X Composite implementations.
- Add workaround for a strange window restack issue when compton
receieves a ConfigureNotify with non-existent new above window.
- Add debugging function hexdump(). Extra sanity checks on various
places.
- GLX backend: Fix a bug that window content does not get updated on
VirtualBox, by rebinding texture when window content changes. This may
have a negative effect on performance.
- GLX backend: Add --glx-no-stencil to restore the old clipping method,
just in case.
- GLX backend: Apply stricter checks on texture-pixmap binding.
- GLX backend: Fix a bug that glx_set_clip() behaves incorrectly when
None is passed in.
- GLX backend: Use glEnable()/glDisable() to toggle stencil tests, in
hope to increase performance.
- Move window pixmap/picture fetching to win_paint_win(), in hope to
increase performance.
- Intersect shadow painting region with its bounding rectangle, in hope
to increase performance.
- Fix a bug that glx_bind_pixmap() doesn't work with mesa drivers.
Thanks to Janhouse and mkraemer for reporting. (#7)
- Use stencil buffer to attempt to eliminate potential double-paint
issue in glx_render(). X Fixes doesn't guarantee the rectangles in a
region do not overlap, and this may cause some regions to be painted
twice, which would be a problem if we are painting transparent things.
Now the target window must have a stencil buffer. Compiz uses its own
region implementation to deal with this, but as a lightweight
compositor we can't really do the same. It may have a positive or
negative effort over performance. Callgrind result indicates basically
no change in performance, but this may or may not be true.
- Correctly distinguish GL extensions and GLX extensions. Sorry. :-D
- Handle screen size. Thanks to tsmithe for reporting. (#7)
- Rename OpenGL backend to GLX backend, because, we might have a EGL
backend someday.
- Add configuration file option `backend` to specify backend. Add
`backend` to D-Bus `opts_get`.
- Add OpenGL shader compilation code, but currently unused.
- Minor adjustments.
- Known issue: Window content doesn't get updated in VirtualBox,
probably because its OpenGL implementation requires constant rebinding
of texture. But that's really slow...
- Known issue: Blur feature is still unimplemented in GLX backend.
- Add experimental OpenGL backend (--opengl). --blur-background is
currently not possible with this backend, because I'm still trying to
find a proper way to do blur with OpenGL. Flipping backend on-the-fly
is really hard, so it isn't supported right now. No configuration file
option exists to enable this, because it isn't stable enough.
- Add `opengl-swc` VSync method that uses SGI_swap_control to control
buffer swap, with OpenGL backend. (#7)
- Fix a potential read-from-freed-memory issue in paint_all().
- Correctly reattach GLX context after fork.
- Dump error text in error(). Add GLX error code handling.
- Code clean-up.
- Known issues: Region operations take a lot of time in glx_render().
I'm hesitating about what to do.
- Create OpenGL context only after initializing overlay, which fixes a
bug that --paint-on-overlay does not work with OpenGL VSync. Thanks to
tsmithe for reporting. (#7)
- Fix an assertion failure that occurs when a window is reparented to
the root window then immediately to another window. Thanks to smlx for
reporting.
- Add extra debugging info for ReparentNotify.
- #91: Use pkg-config to find drm.h to avoid issues on FreeBSD. Thanks
to hun7err for pointing out and providing patch.
- #89: Add default shadow exclusion rule for notify-osd. Thanks to
DanielRS.
- Check for abundant positional arguments.
- Use paint target window (root window / overlay window) instead of
ps->reg_win to create GLXContext. (May have negative effects on OpenGL
VSync.) Add new OpenGL helpers functions, to prepare for the new
OpenGL backend.
- Dump more info of a PropertyNotify with DEBUG_EVENTS.
- Add on-the-fly VSync option modification via D-Bus, as requested by
kunitoki (#80). Expose parse_vsync(), create vsync_init() and
ensure_glx_context().
- Change default value of ps->drm_fd to -1.
- Update Makefile. Change the install/uninstall rules and add doc
installation, requested by hasufell in #85.
- Mark window not damaged in map_win(). It helps in reducing flickering
with inverted window color, but I'm not completely sure if it's safe.
- Avoid modifying w->invert_color when window is unmapped.
- Update documentation. Thanks to hasufell for pointing out.
- Add "vsync-oml" VSync method, using GLX_OML_sync_control. Untested,
because it's not supported by my driver.
- Unredirect ps->reg_win, because DRI wiki says it's related to the
behavior of OpenGL VSync extensions.
- Add glFlush() and glXWaitX() calls, in hope they are slightly helpful
for VSync.
- Change a few functions to make error handling more graceful. Make some
errors fatal. Code clean-up.
- Add unused function make_text_prop().
- Try to improve the performance of color inversion by applying clipping
region during color inversion. (#75)
- Validate pixmap on window unmap/destruction. Probably slightly helpful
for #52.
- Change the design of unmap_win() and destroy_win(), a bit.
- Add warning message to help messages about features disabled at
compile time, instead of dropping their description completely. (#85)
- Silence some warnings. Code clean-up.
- 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.
- Fix a bug that root window is not repainted on wallpaper change unless
an Expose X event is received. Seemingly, if there's no mapped window
on a screen, X will not send an Expose event when the wallpaper
changes. Thanks to baskerville for reporting.
- Fix a X Pixmap leak when there's no existing wallpaper pixmap found.
- Fix a bug in mstrncpy() that null character is not added to the end of
the copied string.
- Make VSYNC_STRS public, for use in src/dbus.c. Adjust the type of
WINTYPES array. Add NUM_VSYNC.
- Add more targets for various D-Bus methods. Add "bad_target" D-Bus
error. Improve error handling. Add more helper functions to append
arguments to a D-Bus message. Add Introspect method to D-Bus
introspection reply.
- Add public declarations of things in the new condition format code to
common.h. Move definitions of some inline functions from compton.h to
common.h. Make some functions public. Move wid_get_prop_adv() to
compton.c. The primary code files of the new format src/c2.{c,h} will
be published when ready.
- Add support for dumping version string in Makefile (make version), to
make snapshot generation easier.
- Add repeated inclusion protection to common.h.
- Update documentation.
- Use gsed instead of sed in dbus-examples/cdbus-driver.sh if possible,
as some BSD systems does not come with GNU sed by default. Thanks to
DaChiChang for reporting.
- Code clean-up. Small type changes in register_cm() to silence
warnings. Quit on failure in parse_vsync(). Apply stricter checks in
force_repaint().
- 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.
- 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.