Commit Graph

486 Commits

Author SHA1 Message Date
Richard Grenville e924976b28 Feature #16: _COMPTON_SHADOW window property support
- 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.
2012-11-09 11:41:21 +08:00
Richard Grenville b47205db08 Misc: Update CMakeLists.txt
Update CMakeLists.txt to support Asciidoc man page / HTML doc
generation, with various small changes.
2012-11-09 09:33:41 +08:00
Richard Grenville 59d6979612 Bug fix: compton-trans -s does not work
My silly mistake. :-)
2012-11-09 00:03:22 +08:00
Christopher Jeffrey c883cdec3e compton-trans: add error handling. better option parsing. 2012-11-08 09:21:57 -06:00
Richard Grenville 08ca5b4d1e Bug fix #62: Rewrite a part of compton-trans
Rewrite a part of compton-trans in order to provide more friendly
error messages, to support window title that contains spaces, and to
limit the number of xwininfo calls to a constant. Not much tests are
done, and I don't know bash well, so bugs could very well exist.
2012-11-08 22:37:31 +08:00
Richard Grenville 56ce896feb Bug fix: Shape update of opaque windows not handled correctly
- 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.
2012-11-08 19:45:39 +08:00
Richard Grenville 357bf94efc Bug fix: Window rendered incorrectly if has no border with -e
- 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.
2012-11-06 11:37:29 +08:00
Richard Grenville c76d0fc150 Misc: Asciidoc man page update
- Add man page for compton-trans in Asciidoc format.

- Add description of --use-ewmh-active-win to compton man page.
2012-11-05 18:06:31 +08:00
Richard Grenville b15d40ec09 Bug fix #61: Silence a warning
- 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.
2012-11-04 19:44:14 +08:00
Richard Grenville dc04a7d8ca Improvement: Add EWMH _NET_WM_ACTIVE_WINDOW support
- 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().
2012-11-04 18:45:39 +08:00
Richard Grenville e734655eef Improvement: Focus detection & --mark-ovredir-focused changes
- 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.
2012-11-03 22:15:51 +08:00
Richard Grenville 9fb62874c1 Bug fix: A XserverRegion leak
- 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.
2012-11-03 10:38:29 +08:00
Richard Grenville a0b0ff5d0a Misc: Code cleanup & debug code changes
- 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.
2012-11-03 05:51:40 +08:00
Richard Grenville 66d3f30978 Bug fix #17: Try to fix artifacts after animating/shading shaped wins in Openbox
- 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.
2012-11-01 19:12:55 +08:00
Richard Grenville 46dfd1a766 Misc: Add Asciidoc man pages
Add Asciidoc man pages. The old man page is still kept, and you need to
run "make docs" to generate the new man pages and a HTML version of it.
An Asciidoc man page for compton-trans is not added yet.
2012-11-01 12:47:15 +08:00
Richard Grenville fb2ca16cb8 Improvement: border_size & ConfigureNotify & VSync changes
- 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.
2012-11-01 11:44:38 +08:00
Richard Grenville 35c9e44de2 Improvement: Try to reduce reg_ignore regenerations
- 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.
2012-10-31 10:08:48 +08:00
Richard Grenville 56e181309e Misc: Small adjustments
- 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.
2012-10-30 18:37:49 +08:00
Richard Grenville 853d20ef56 Bug fix: Fading blocks in rare circumstances
- 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.
2012-10-29 22:00:11 +08:00
Richard Grenville 9b61999cae Merge branch 'master' into richardgv-dev
Merged the documentation changes. Program code unchanged.
2012-10-29 09:58:16 +08:00
Richard Grenville 40178702ef Improvement: Change clear_shadow implementation
- 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.
2012-10-28 17:02:07 +08:00
Richard Grenville f83ed19e14 Bug fix #57: Fix incorrect handling of InputOnly windows
- 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.
2012-10-27 21:52:26 +08:00
Christopher Jeffrey 239796abc6 fix examples in man page. 2012-10-26 06:18:49 -05:00
Richard Grenville 66e615775b Bug fix #7: Correct a possible issue in VSync
- 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.
2012-10-26 11:28:38 +08:00
Richard Grenville 049621bed7 Improvement: Add painting on overlay support
- 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.
2012-10-24 10:23:26 +08:00
Richard Grenville 5dd544d29d Improvement #7: Add double buffering
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.
2012-10-23 13:42:20 +08:00
Christopher Jeffrey 1ce58afb1d more man page changes 2012-10-22 12:02:08 -05:00
Christopher Jeffrey 7e1a7ee120 fix man page and various other documentation. 2012-10-22 08:20:43 -05:00
Christopher Jeffrey 9399db5377 update readme and man page. 2012-10-22 07:50:18 -05:00
Christopher Jeffrey 7ace6ca68d revert to c7ca345 2012-10-22 06:35:02 -05:00
Christopher Jeffrey b0766e09b6 v0.0.1 2012-10-22 03:04:19 -05:00
Richard Grenville fe2146f1a5 Misc: Drop support for old versions of libXcomposite
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.
2012-10-22 08:16:52 +08:00
Richard Grenville 6a95d49a87 Bug fix #55: Workaround for window type detection on Openbox menus
A small workaround for a small problem.
2012-10-21 21:21:38 +08:00
Richard Grenville b78ab316fd Improvement: Stop painting on regions of higher windows
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.
2012-10-21 20:49:34 +08:00
Richard Grenville 07e4420ab4 Improvement: Pregenerate alpha pictures
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).
2012-10-13 19:11:25 +08:00
Richard Grenville 72ea4b5f47 Misc: Code clean-up
- 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.
2012-10-10 21:17:48 +08:00
Richard Grenville b59e592588 Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
  not too reliable, but at least you have something to fallback to),
  "drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
  "opengl" (using SGI_swap_control extension OpenGL, might work on more
  drivers than the DRM method). "sw" and "opengl" are briefly tested,
  "drm" received utterly no test (because I use the nVidia binary blob).
  They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".

- Add --refresh-rate to let user specify a refresh rate for software
  VSync, in case the automatic refresh rate detection does not work
  well.

- Seemingly the automatic refresh rate detection using X RandR in
  software VSync detects refresh rate incorrectly. Need further investigation.

- Fix a few bugs in fading timing.

- Add a workaround for client window detection on Fluxbox, as Fluxbox
  (incorrectly?) sets the override-redirect flag upon all frame
  windows.

- Software VSync adds dependency on librt (a part of glibc) for
  nanosecond-level timing functions, and libXrandr for automatic refresh
  rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
  but does not link to libdrm; OpenGL VSync adds dependency on libGL.

- Print timing information on DEBUG_REPAINT.
2012-10-08 10:36:28 +08:00
Richard Grenville 1306b1591f Improvement: Support reading _NET_WM_OPACITY from client windows
- 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.
2012-10-03 21:21:43 +08:00
Richard Grenville b8f3d22a32 Misc: #49: Add CMake support
Add CMakeLists.txt to support building with CMake, as @pvanek requests.
The old Makefile system and CPackConfig.cmake are still usable. (Of
course, make sure you don't overwrite them by executing cmake.) There
must be a bunch of bugs in CMakeLists.txt. :-) Let chjj decide which one
he will choose, here I keep both.
2012-10-03 13:34:54 +08:00
Richard Grenville ff50322b27 Misc: #49: Add CPack configuration
Add CPackConfig.cmake for generating binary packages (.tar.bz2, .deb,
.rpm) automatically. Pretty ugly, but mostly working.
CPackSourceConfig.cmake isn't ready yet.
2012-10-02 22:01:22 +08:00
Richard Grenville f95093358e Improvement: Change in client window lookup & wintype detection
- 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.
2012-10-02 21:46:37 +08:00
Christopher Jeffrey c7ca3454ee Merge branch 'richardgv-dev' 2012-09-30 22:57:46 -05:00
Richard Grenville 2f0417cd74 Feature: #27: Detect shaped windows and disable shadow on them
- 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.
2012-10-01 10:41:51 +08:00
Richard Grenville 8d7d6405b6 Improvement: Wait infinitely for events when idling
Wait infinitely for events when idling, instead of always calling
paint_preprocess(), to reduce CPU usage in the case. Thanks to valr for
help.
2012-09-29 22:53:57 +08:00
Richard Grenville 5a3dfbc064 Improvement: Split shadow_pict to shadow_pict & shadow_alpha_pict
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.
2012-09-29 13:21:39 +08:00
Christopher Jeffrey 7c1838cfd8 Merge commit '69513d6'
Conflicts:
	src/compton.c
	src/compton.h
2012-09-28 12:22:25 -05:00
Richard Grenville 9139d038c2 Bug fix: #48: Compilation failure with old libconfig/libpcre
- 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.
2012-09-28 09:19:53 +08:00
Richard Grenville 69513d6231 Bug fix: Issue #47: Locale cause problems with float arguments
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.
2012-09-27 22:30:16 +08:00
Richard Grenville 75ebe94bb6 Feature: --no-fading-openclose to partially simulate -F
-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.
2012-09-26 21:47:32 +08:00
Richard Grenville 8c0379180b Bug fix: Issue #46: Optionally mark override-redirect windows as active
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.
2012-09-26 19:48:36 +08:00