PICOM(1)
๐ PICOM(1) ๐
okay bestie, listen up โ this is the manual page for picom, from the User Commands section. it's a whole icon, and we're gonna get through it together. no cap.
โจ NAME โจ
picom โ a compositor for X11 ๐ฆ
๐ธ SYNOPSIS ๐ธ
picom [OPTIONS]
๐ DESCRIPTION ๐
so picom is a compositor, right? and it's built on top of Dana Jansens' version of xcompmgr โ which, plot twist, was itself written by Keith Packard. the lore is real. ๐
it comes with some glow-ups over the original xcompmgr, like window frame opacity and inactive window transparency. it's giving upgrades. it's giving main character. ๐
๐ OPTIONS ๐
here's every single flag, bestie. buckle in, hydrate, we're going the whole way. ๐ง
-h,--helpโ get the usage text that's baked right into the program code. ngl, this might be more up-to-date than this man page itself, so it's worth a peek. ๐-r,--shadow-radius=RADIUSโ the blur radius for shadows, in pixels. (defaults to12)-o,--shadow-opacity=OPACITYโ how see-through the shadows are. (0.0-1.0, defaults to0.75)-l,--shadow-offset-x=OFFSETโ the left offset for shadows, in pixels. (defaults to-15)-t,--shadow-offset-y=OFFSETโ the top offset for shadows, in pixels. (defaults to-15)-I,--fade-in-step=OPACITY_STEPโ how much the opacity changes between steps while fading in. (0.01-1.0, defaults to0.028)-O,--fade-out-step=OPACITY_STEPโ how much the opacity changes between steps while fading out. (0.01-1.0, defaults to0.03)-D,--fade-delta=MILLISECONDSโ the time between steps in a fade step, in milliseconds. (> 0, defaults to10)-c,--shadowโ enables client-side shadows on windows. โ ๏ธ heads up though: desktop windows (the ones with_NET_WM_WINDOW_TYPE_DESKTOP) never get a shadow, unless you explicitly ask for it with thewintypesoption.-f,--fadingโ fade windows in and out when they open/close, and when opacity changes โ unless--no-fading-opencloseis used. โจ-i,--inactive-opacity=OPACITYโ the opacity of inactive windows. (0.1-1.0, defaults to1.0). using this option is discouraged, fr โ check the WINDOW RULES section for the recommended way to set window-specific opacity. ๐ซถ-e,--frame-opacity=OPACITYโ the opacity of window titlebars and borders. (0.1-1.0, disabled by default)-b,--daemonโ daemonize the process. it forks to the background after initialization. ๐โโ๏ธ๐จ this one can only be set from the command line โ setting it in the configuration file will have no effect. periodt.--log-levelโ set the log level. possible values are"TRACE","VERBOSE","DEBUG","INFO","WARN","ERROR", in increasing level of importance. case doesn't matter. if you're using the"TRACE"log level, it's better to log into a file using--log-file, since it can generate a huge stream of logs. ๐ญ like, a LOT.--log-fileโ set the log file. if--log-fileis never specified, logs get written tostderr. otherwise, logs get written to the given file โ though some of the early logs might still go tostderr. when setting this option from the config file, it's recommended to use an absolute path. ๐--show-all-xerrorsโ show all X errors (for debugging). ๐--config PATHโ look for the configuration file at the path. see the CONFIGURATION FILES section below for wherepicomlooks for a configuration file by default. use/dev/nullto avoid loading a configuration file entirely. ๐--write-pid-path PATHโ write the process ID to a file. it's recommended to use an absolute path.--plugins PATHโ specify plugins to load. plugins get searched in the current working directory first (unless it's specified in the config file, in which case this step is skipped), then in$XDG_CONFIG_HOME/picom/plugins, then in$XDG_CONFIG_DIRS/picom/plugins. if all of the above fail, the plugin name is passed directly to the dynamic loader. can be specified multiple times to load more than one plugin. ๐โจ--shadow-color STRINGโ color of shadow, as a hex string (e.g.#000000)--shadow-red VALUEโ red color value of shadow (0.0-1.0, defaults to0).--shadow-green VALUEโ green color value of shadow (0.0-1.0, defaults to0).--shadow-blue VALUEโ blue color value of shadow (0.0-1.0, defaults to0).--inactive-opacity-overrideโ let the inactive opacity set by-ioverride the_NET_WM_WINDOW_OPACITYvalues of windows. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific opacity. ๐ซถ--active-opacity OPACITYโ default opacity for active windows. (0.0-1.0, defaults to1.0). using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific opacity.--inactive-dim VALUEโ dim inactive windows. (0.0-1.0, defaults to0.0). using this option is discouraged, see the WINDOW RULES section for the recommended way to set window-specific dim levels.--corner-radius VALUEโ sets the radius of rounded window corners. when> 0, the compositor rounds the corners of windows. does not interact well with--transparent-clipping. (defaults to0). ๐--corner-radius-rules RADIUS:CONDITIONโ specify a list of corner radius rules. overrides the corner radii of matching windows. this option takes precedence over the--rounded-corners-excludeoption, and also overrides the default exclusion of fullscreen windows. the condition has the same format as--opacity-rule. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific corner radius.--rounded-corners-exclude CONDITIONโ exclude conditions for rounded corners. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific corner radius.--no-frame-pacingโ disable vsync-aware frame pacing. by default, the compositor tries to make sure it only renders once per vblank interval, and also makes the render happen as late as possible to minimize the latency from updates to the screen. however, this can sometimes cause stuttering, or even a lowered frame rate. ๐ญ this option can be used to disable frame pacing.--mark-wmwin-focusedโ try to detect WM windows (a non-override-redirect window with no child that hasWM_STATE) and mark them as active. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific rules.--mark-ovredir-focusedโ mark override-redirect windows that don't have a child window withWM_STATEas focused. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific rules.--no-fading-opencloseโ do not fade on window open/close. ๐ซ--no-fading-destroyed-argbโ do not fade destroyed ARGB windows with WM frame. this is a workaround for bugs in Openbox, Fluxbox, etc. ๐--shadow-ignore-shapedโ do not paint shadows on shaped windows. โ ๏ธ note: "shaped windows" here means windows setting their shape through the X Shape extension. those using an ARGB background are beyond our control. deprecated, see the WINDOW RULES section for the recommended way to set window-specific shadow.--detect-rounded-cornersโ try to detect windows with rounded corners and not consider them shaped windows. unfortunately the accuracy is not very high. ๐--detect-client-opacityโ detect_NET_WM_WINDOW_OPACITYon client windows. useful for window managers that don't pass_NET_WM_WINDOW_OPACITYof client windows to frame windows.--vsync,--no-vsyncโ enable/disable VSync. โก--use-ewmh-active-winโ use EWMH_NET_ACTIVE_WINDOWto determine the currently focused window, rather than listening to the'FocusIn'/'FocusOut'event. might be more accurate, provided that the WM supports it. ๐--unredir-if-possibleโ unredirect all windows in some cases. known to cause flickering when redirecting/unredirecting windows. currently, unredirecting is triggered by the following conditions:- if the top level window is taking up the entire screen. in a multi-monitor setup, this means ALL monitors. ๐ฅ๏ธ๐ฅ๏ธ
- if there is no window.
- if a window is fullscreen according to its WM hints. (can be disabled with
--no-ewmh-fullscreen). - if a window requests to bypass the compositor (
_NET_WM_BYPASS_COMPOSITOR). windows are also unredirected unconditionally when monitors are powered off, regardless of whether--unredir-if-possibleis set. ๐
--unredir-if-possible-delay MILLISECONDSโ delay before unredirecting the window, in milliseconds. defaults to0.--unredir-if-possible-exclude CONDITIONโ conditions of windows that shouldn't be considered full-screen for unredirecting the screen. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific unredirect.--shadow-exclude CONDITIONโ specify a list of conditions of windows that should have no shadow. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific shadow.--clip-shadow-above CONDITIONโ specify a list of conditions of windows that should have no shadow painted over them, like a dock window. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific shadow clipping.--fade-exclude CONDITIONโ specify a list of conditions of windows that should not be faded. using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific fading.--focus-exclude CONDITIONโ specify a list of conditions of windows that should always be considered focused. using this is discouraged, see the WINDOW RULES section for the recommended way for doing this.--inactive-dim-fixedโ use a fixed inactive dim value, instead of adjusting according to window opacity.--detect-transientโ useWM_TRANSIENT_FORto group windows, and consider windows in the same group focused at the same time. ๐ฏ--detect-client-leaderโ useWM_CLIENT_LEADERto group windows, and consider windows in the same group focused at the same time. this usually means windows from the same application will be considered focused or unfocused at the same time.WM_TRANSIENT_FORhas higher priority if--detect-transientis enabled, too.--blur-method,--blur-size,--blur-deviation,--blur-strengthโ parameters for background blurring. see the BLUR section for more information. ๐ซ๏ธ--blur-backgroundโ blur the background of semi-transparent / ARGB windows. bad for performance, with driver-dependent behavior. โ ๏ธ the name of the switch may change without prior notification.--blur-background-frameโ blur the background of windows when the window frame is not opaque. implies--blur-background. bad for performance, with driver-dependent behavior. the name may change. โ ๏ธ
--blur-background-fixedโ okay so this one uses a fixed blur strength for a window during fading. It only applies to the--fadingoption, and it's a no-op if you're using animation scripts. So if you're fading and want the blur to stay steady? This is your girl. โจ--blur-kern MATRIXโ bestie, this lets you specify the blur convolution kernel, and the format is literally:
WIDTH,HEIGHT,ELE1,ELE2,ELE3,ELE4,ELE5...
In other words, the matrix is a list of comma separated numbers. The first two numbers must be integers, and they specify the width and height of the matrix. They must be odd numbers. Then the following width * height - 1 numbers specify the numbers in the matrix, row by row, excluding the center element. ๐ง
The elements are finite floating point numbers. The decimal pointer has to be . (a period), and scientific notation is not supported. ๐
The element in the center will either be 1.0 or varying based on opacity, depending on whether you have --blur-background-fixed. Yet the automatic adjustment of blur factor may not work well with a custom blur kernel. ๐
A 7x7 Gaussian blur kernel (sigma = 0.84089642) looks like:
--blur-kern '7,7,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003,0.000102,0.003494,0.029143,0.059106,0.029143,0.003494,0.000102,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.001723,0.059106,0.493069,0.493069,0.059106,0.001723,0.000849,0.029143,0.243117,0.493069,0.243117,0.029143,0.000849,0.000102,0.003494,0.029143,0.059106,0.029143,0.003494,0.000102,0.000003,0.000102,0.000849,0.001723,0.000849,0.000102,0.000003'
May also be one of the predefined kernels: 3x3box (default), 5x5box, 7x7box, 3x3gaussian, 5x5gaussian, 7x7gaussian, 9x9gaussian, 11x11gaussian. All Gaussian kernels are generated with sigma = 0.84089642 . If you find yourself needing to generate custom blur kernels, you might want to try the new blur configuration (see the BLUR section). ๐
--blur-background-exclude CONDITIONโ this is where you exclude conditions for background blur. So if you don't want blur on certain windows, this is your vibe check. ๐ซ--invert-color-include CONDITIONโ specify a list of conditions of windows that should be painted with inverted color. But bestie, it's resource-hogging, and it's not well tested. Using this is discouraged, see the WINDOW RULES section for the recommended way to do this. So like, maybe don't? ๐--opacity-rule OPACITY:CONDITIONโ specify a list of opacity rules, in the formatPERCENT:PATTERN, like50:name *= "Firefox".picom-transis recommended over this. Note we don't make any guarantee about possible conflicts with other programs that set_NET_WM_WINDOW_OPACITYon frame or client windows. Using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific opacity. ๐--crop-shadow-to-monitorโ crop shadow of a window fully on a particular monitor to that monitor. This is currently implemented using the X RandR extension. So if you want shadows to stay in their lane, this is it. โ๏ธ--backend BACKENDโ specify the backend to use:xrenderorglx.xrenderis the default one. ๐xrenderโ performs all rendering operations with X Render extension. It is whatxcompmgruses, and is generally a safe fallback when you encounter rendering artifacts or instability. So like, reliable bestie. ๐ซถglx(OpenGL) โ performs all rendering operations with OpenGL. It is more friendly to some VSync methods, and has significantly superior performance on color inversion (--invert-color-include) or blur (--blur-background). It requires proper OpenGL 3.3 support from your driver and hardware. You may wish to look at the GLX performance optimization options below.--xrender-sync-fencemight be needed on some systems to avoid delay in changes of screen contents. ๐ฅ
--no-use-damageโ disable the use of damage information. This cause the whole screen to be redrawn every time, instead of the part of the screen has actually changed. Potentially degrades the performance, but might fix some artifacts. So it's a trade-off, bestie. ๐--xrender-sync-fenceโ use X Sync fence to sync clients' draw calls, to make sure all draw calls are finished before picom starts drawing. Needed on nvidia-drivers with GLX backend for some users. So if you're on NVIDIA and seeing delays, try this. โจ--force-win-blendโ force all windows to be painted with blending. Useful if you have a window shader that could turn opaque pixels transparent. So if your shader is doing too much, this is the fix. ๐--dbusโ enable remote control via D-Bus. See the D-BUS API section below for more details. So you can control picom from other apps, periodt. ๐--benchmark CYCLESโ benchmark mode. Repeatedly paint until reaching the specified cycles. So you can stress test and see those numbers. ๐ฅ--benchmark-wid WINDOW_IDโ specify window ID to repaint in benchmark mode. If omitted or is0, the whole screen is repainted. So if you want to benchmark just one window, here you go. ๐ช--no-ewmh-fullscreenโ do not use EWMH to detect fullscreen windows. Reverts to checking if a window is fullscreen based only on its size and coordinates. So it's like old school detection. ๐--max-brightnessโ dimming bright windows so their brightness doesn't exceed this set value. Brightness of a window is estimated by averaging all pixels in the window, so this could comes with a performance hit. Setting this to1.0disables this behaviour. Requires--use-damageto be disabled. (default:1.0) So if you have a bright window that's blinding you, this is the vibe. ๐--transparent-clippingโ make transparent windows clip other windows like non-transparent windows do, instead of blending on top of them. So they cut instead of blend. โ๏ธ--transparent-clipping-exclude CONDITIONโ specify a list of conditions of windows that should never have transparent clipping applied. Useful for screenshot tools, where you need to be able to see through transparent parts of the window. So screenshot besties, this is for you. ๐ธ--window-shader-fg SHADERโ specify GLSL fragment shader path for rendering window contents. Shader is searched first relative to the directory the configuration file is in, then in the usual places for a configuration file. See section SHADER INTERFACE below for more details on the interface. So custom shaders? We love. ๐จ--window-shader-fg-rule SHADER:CONDITIONโ specify GLSL fragment shader path for rendering window contents using patterns. Similar to--opacity-rule, arguments should be in the format ofSHADER:CONDITION, e.g."shader.frag:name = 'window'". Leading and trailing whitespaces inSHADERwill be trimmed. IfSHADERis"default", then the default shader will be used for the matching windows. (This also unfortunately means you can't use a shader file named"default"). Using this is discouraged, see the WINDOW RULES section for the recommended way to set window-specific shaders. So like, it works, but maybe don't? ๐--root-pixmap-shader SHADERโ specify GLSL fragment shader path for rendering the root pixmap. The root pixmap usually is your desktop wallpaper, though for some desktop environment this is not the case. Shader is searched first relative to the directory the configuration file is in, then in the usual places for a configuration file. See section SHADER INTERFACE below for more details on the interface. So you can shader your wallpaper? Iconic. ๐--dithered-presentโ use higher precision during rendering, and apply dither when presenting the rendered screen. Reduces banding artifacts, but might cause performance degradation. Only works with OpenGL. So if you hate banding and have OpenGL, this is your girl. ๐
๐ WINDOW RULES ๐
okay bestie, THIS is the good stuff. window rules let you set options that are specific to individual windows, so you can change how a window looks based on conditions it meets. yes there are other options that also kinda cover some window-rule functionality, but window rules are more flexible and way more powerful. and like, if you're making a fresh config file? the recommendation is literally to use window rules instead of those other options. no cap. ๐ซถ
here's the full list of options that window rules supersede:
--shadow-ignore-shaped-i--inactive-opacity=OPACITY--active-opacity OPACITY--inactive-opacity-override--inactive-dim VALUE--mark-wmwin-focused--mark-ovredir-focused--invert-color-include CONDITION--shadow-exclude CONDITION--fade-exclude CONDITION--focus-exclude CONDITION--rounded-corners-exclude CONDITION--blur-background-exclude CONDITION--opacity-rule OPACITY:CONDITION--corner-radius-rules RADIUS:CONDITION--window-shader-fg-rule SHADER:CONDITION--clip-shadow-above CONDITION
plus the wintypes configuration file option. ๐
if you use the window rules option, none of the above options will have any effect. and warning messages will be issued. periodt.
and when the window rules option is used, the compositor also behaves a little differently in certain cases. one such case: fullscreen windows will no longer have their rounded corners disabled by default. ๐ฑ (yes really, they're just gonna be round now, deal with it.)
if you're currently using some of those old options and you wanna switch to window rules, or if you just wanna keep the existing behavior, check out the Migrating old rules section below for how to convert them. ๐
โจ Syntax โจ
window rules are only available in the configuration file. to set them, you set the rules option in the config file to something like this:
rules = (
{ match = "focused"; opacity = 1; },
{ match = "name = 'firefox'"; shadow = true; },
# ... and so on
)
rules = ( ... ) sets the option to a list, which can contain multiple sub-items. for rules, each sub-item has to be a group (i.e. { key = value; ... }), and that group represents a condition plus a set of options to apply when the condition is met. these sub-items get matched in the order they appear in the configuration file, and options are applied as the conditions are matched. if the same option gets set multiple times, the last one takes effect. ๐
within each sub-item, these keys are available:
matchโ the condition string to match windows with. peep the FORMAT OF CONDITIONS section below for the syntax of condition strings. if you don't specify it, the rule will always match. ๐ฏshadowโ whether to draw shadow under the matching window.full-shadowโ controls whether shadow is drawn under the parts of the window that you normally won't be able to see. super useful when the window has transparent parts and you still want shadows in those areas. ๐ฆshadow-colorโ color of the shadow. same syntax as--shadow-color STRING.fadeโ whether to fade the matching window in/out when opening/closing it. when animations are used, this has no effect. this can only be used to disable fading animations enabled by option-f,--fading.opacityโ opacity of the matching window. (0.0-1.0). if not explicitly set by a rule, the opacity value from the window properties (e.g._NET_WM_WINDOW_OPACITY) will be used.blur-opacityโ opacity of the background blur. (0.0-1.0). if not explicitly set by a rule, this will be1.0. ignored ifblur-backgroundis not enabled. (yes the original says "Ignored by blur-background is not enabled", we all know what it meant ๐)dimโ dim level of the matching window. larger value means more dimming. (0.0-1.0).corner-radiusโ corner radius of the matching window in number of pixels.0means no corner rounding.blur-backgroundโ whether the background of the matching window should be blurred.invert-colorโ whether to invert the color of the matching window. ๐clip-shadow-aboveโ whether to prevent the matching window from being painted over by shadows.unredirโ whether the matching window should cause the compositor to unredirect the screen, and whether it should trigger the screen to be redirected again if it's currently unredirected. this could be a boolean value: iftrue, the screen will be unredirected if the matching window meets certain conditions; iffalse, it will never cause the screen to be unredirected. if the screen is currently unredirected, and there's no other window that will trigger unredirection, both of these choices will cause the screen to be redirected again. to control that behavior as well, you can setunredirto eitherpreferredโ such windows will not cause the screen to be redirected in this situation, and will behave liketrueotherwise โ orpassive, which not only won't cause redirection in this case, but also won't actively cause the screen to be unredirected. the last possible value for this option isforced, and any window having itsunredirset toforcedwill cause the screen to be unredirected unconditionally. the value of the_NET_WM_BYPASS_COMPOSITORproperty on the window will be considered iffunrediris not explicitly set by any rule.transparent-clippingโ whether to make the matching window clip other windows like opaque windows do, instead of blending on top of them. when applied to transparent windows, this means nothing will be painted under the transparent parts of the window, essentially cuts a hole in the screen. ๐ณ๏ธshaderโ GLSL fragment shader specification for rendering window contents. see the SHADER INTERFACE section below for more deets on the interface. this option can be a simple path to the shader file, but you can also specify extra options to the shader. currently the only extra options supported are macro defines. syntax:
shader = {
path = "path/to/shader.glsl";
defines = {
COLOR = "vec4(1.0, 0.0, 0.0, 1.0)";
};
};
this will prepend #define COLOR vec4(1.0, 0.0, 0.0, 1.0) to your shader (note the lack of double quotes). the value of a define MUST be a string, any string will be accepted and no sanitization is performed. ๐ญ
animationsโ define window-specific animation scripts. the format of this option is the same as the top-levelanimationsoption. you can find more info in the ANIMATIONS section. if animation scripts are defined in multiple matching rules, they will be merged together. if multiple matching rules contain animation scripts for the same trigger, the last one takes effect, same as other options. ๐ซ
๐ง Migrating old rules ๐ง
most of the rule options should map 1:1 to the new window rules. here's a list of the non-trivial ones and how to achieve the same effect with window rules. ๐ซถ
Inactive dimming and opacity
this includes options -i, --inactive-opacity=OPACITY, --inactive-dim VALUE, --active-opacity OPACITY, --inactive-opacity-override, --mark-wmwin-focused, and --mark-ovredir-focused. when using window rules, the compositor no longer has an "active window" concept, since it's easy to achieve with window rules. you can use match = "focused || group_focused" to match windows that would've been considered active with the old options. then you can set the opacity and dim level for matched windows accordingly. --mark-wmwin-focused and --mark-ovredir-focused can be achieved by adding || wmwin and || override_redirect to the match string, respectively. --inactive-opacity-override can be achieved by setting opacity-override = true. โจ
Note setting opacity explicitly with a rule will override the opacity value from the window properties (i.e._NET_WM_WINDOW_OPACITY), which is used by tools likepicom-transfor setting the opacity of a window. if you'd like to keep using tools likepicom-trans, you can choose to set the opacity only for windows without the opacity property by matching! _NET_WM_WINDOW_OPACITY. ๐
Active window
this includes option --focus-exclude CONDITION. this option was only used to influence what windows are considered active, to apply inactive opacity and dimming. since with window rules you no longer need the compositor to help you decide what's active and what's not (see above), this option is no longer needed. ๐
Rounded corners and fullscreen windows
rounded corners are no longer automatically disabled for fullscreen windows. if you want to disable rounded corners for fullscreen windows, you can use the following rule:
rules = (
{ match = "fullscreen"; corner-radius = 0; },
)
๐ธ and that's the migration tea, bestie. keep going, there's more where this came from ๐
๐ FORMAT OF CONDITIONS ๐
okay bestie, some options let you pass in a condition string to match specific windows, and honestly? it's giving tiny programming language. A condition string = one or more conditions glued together with logical operators. Iconic. Let's get into it ๐ซถ
The formal grammar for a condition looks like this:
Condition <- Term ('||' Term)*
Term <- Item ('&&' Item)*
Item <- '!'? Target '@'? ('[' Index ']')? (Operator Pattern)? | '(' Condition ')'
So concretely speaking, a condition is a sequence of one or more simple pattern-matching Items, joined by the logical operators && (and) and || (or). && has higher precedence than ||. Both operators are left-associative. Parentheses can be used to raise precedence. And if an Item has a leading negation operator (!), the result of the item gets negated. slay.
Inside an Item:
Target ๐ธ
is either a predefined target name, or the name of a window property to match.
The supported predefined targets are, no cap:
x,y,x2,y2โ window coordinates, going from the top-left corner of the window (x,y) to the bottom-right corner (x2,y2).width,heightโ size of the window.widthb,heightbโ likewidthandheight, but including the window border.border_widthโ width of the window border.fullscreenโ whether the window is fullscreen. If--no-ewmh-fullscreenis set, this is determined by the window size and position; otherwise, it's determined by the_NET_WM_STATE_FULLSCREENproperty.override_redirectโ whether the window is override-redirect.argbโ whether the window has an ARGB visual.focusedโ whether the window is focused.group_focusedโ whether the window is in the same window group as the focused window. This one needs--detect-transientor--detect-client-leader.wmwinโ whether the window looks like a WM window, i.e. it has no client window and isn't override-redirected.bounding_shapedโ whether the window has a bounding shape.rounded_cornersโ whether the window bounding shape only has rounded corners and is otherwise rectangular. This impliesbounding_shaped. Requires--detect-rounded-corners. And no, this has no relation to--corner-radius VALUE.window_typeโ window type, as defined by_NET_WM_WINDOW_TYPE. Name only, e.g.normalmeans_NET_WM_WINDOW_TYPE_NORMAL. Because a window can have multiple types, testing for equality succeeds if any of the window's types match.nameโ name of the window. This is either_NET_WM_NAMEor_WM_NAME.class_i,class_gโ instance and general class of the window. That's the first and second value of_WM_CLASS, respectively.roleโ window role. This is the value of_WM_WINDOW_ROLE.urgentโ whether the window is expecting immediate user action, as defined by the ICCCM. This only checks if the urgency bit is set inWM_HINTS. Interpretation of this bit varies among applications and window managers. Some of them also set_NET_WM_STATE_DEMANDS_ATTENTIONin_NET_WM_STATEto indicate urgency, so you might want to also check that (e.g._NET_WM_STATE@[*] = '_NET_WM_STATE_DEMANDS_ATTENTION').
Target can be followed by an optional @ if the window attribute should be looked up on the client window. Otherwise the frame window will be used.
Index โจ
is the index number of the property to look up. For example, [2] returns the third value of the property. If you don't specify it, the first value (index [0]) is used implicitly. Use the special value [*] to perform matching against all available property values using logical OR. None of the predefined targets have multiple values, so do not use this with them ๐
Operator and Pattern ๐
define how Target will be matched. They can be omitted together, in which case the existence of the window property is checked when Target is not a predefined target; for a predefined Target, omitting Operator and Pattern is equivalent to writing != 0.
Which operators are available changes depending on the type of Target being matched:
- if the target is a number, the operators are
=,>,<,>=,<=, plus their negation, obtained by prefixing the operator with!(e.g.!=,!>, etc.) - if the target is a string, the operators are
=(strict equal),*=(substring match),^=(starts with),%=(match with glob),~=(match with regex), plus their case-insensitive variants?=,*?=,^?=,%?=,~?=. String operators can be negated by prefixing the operator with!too (e.g.!=,!*=, etc.)
Pattern is either an integer or a string enclosed by single or double quotes. Python-3-style escape sequences are supported for strings. Boolean values are interpreted as integers, i.e. writing true is equivalent to 1, and false is 0.
Examples ๐
# If the window is focused
focused
focused = 1
# If the window is not override-redirected
!override_redirect
override_redirect = false
override_redirect != true
override_redirect != 1
# If the window is a menu
window_type *= "menu"
_NET_WM_WINDOW_TYPE@ *= "MENU"
# If the window is marked hidden: _NET_WM_STATE contains _NET_WM_STATE_HIDDEN
_NET_WM_STATE@[*] = "_NET_WM_STATE_HIDDEN"
# If the window is marked sticky: _NET_WM_STATE contains an atom that contains
# "sticky", ignore case
_NET_WM_STATE@[*] *?= "sticky"
# If the window name contains "Firefox", ignore case
name *?= "Firefox"
_NET_WM_NAME@ *?= "Firefox"
# If the window name ends with "Firefox"
name %= "*Firefox"
name ~= "Firefox$"
# If the window has a property _COMPTON_SHADOW with value 0, type CARDINAL,
# format 32, value 0, on its frame window
_COMPTON_SHADOW = 0
# If the third value of _NET_FRAME_EXTENTS is less than 20, or there's no
# _NET_FRAME_EXTENTS property on client window
_NET_FRAME_EXTENTS@[2] < 20 || !_NET_FRAME_EXTENTS@
# The pattern here will be parsed as "dd4"
name = "\x64\x64\o64"
# These two are equivalent
name = 'Firefox' || name = 'Chromium' && class_i = 'Navigator'
name = 'Firefox' || (name = 'Chromium' && class_i = 'Navigator')
๐ฆ ANIMATIONS ๐ฆ
picom supports fading animation when you open or close a window (yes bestie, the classic). On top of that, picom also has a very powerful animation script system, which can be used to animate many aspects of a window based on certain triggers. Animation scripts can be defined in your configuration file by setting the animations option. It's also possible to define animations per-window using the WINDOW RULES system, by setting the animations option in a rule. (Read the rest of this section first before you go there, fr fr.)
The basic syntax of the animations option is as follows:
animations = ({
triggers = [ ... ];
suppressions = [ ... ];
# more options follow
...
}, {
# another animation script
}, ...)
animations = ( ... ) sets animations to a list, which can contain multiple sub-items, and each item is an animation script. An animation script is a group containing multiple entries (i.e. { key = value; ... }). All animation scripts share some common options, like triggers and suppressions, and they also contain more options that either define the actual animation, or select an animation preset. periodt.
Common options โญ
triggersโ a list of triggers specifying when this animation should be started. Each trigger can have at most one animation script associated to it, otherwise the behavior is undefined, and a warning will be issued.
The valid triggers are:
openโ when a window is opened.closeโ when a window is closed.showโ when a minimized or iconified window is shown.hideโ when a window is minimized or iconified.increase-opacityโ when the opacity or the blur opacity of a window is increased. If the opacity and the blur opacity changed in different directions, the opacity change takes precedence.decrease-opacityโ when the opacity or the blur opacity of a window is decreased. If the opacity and the blur opacity changed in different directions, the opacity change takes precedence.size,positionโ when the size or position of a window is changed. If both changed, thesizetrigger has priority. (EXPERIMENTAL)colorโ when some color property of a window is changed. Right now this only includesshadow-color.geometryโ alias ofsize+position.
Warning โ thesizeandpositiontriggers are experimental. Using this means you accept the caveat that these animations will also trigger when you manually resize or move a window, like when you drag the window around with your mouse. ๐ญ
suppressionsโ which other animations should be suppressed when this animation is running. Normally, if another trigger is activated while an animation is already running, the animation in progress will be interrupted and the new animation will start. If you want to prevent this, you can set thesuppressionsoption to a list of triggers that should be suppressed. This is optional, and the default value for this is an empty list.
Presets ๐
Defining an animation is a bit involved, ngl. To make animations more approachable, without you having to learn the nitty-gritty details of the script system, picom provides a number of presets that you can use by just specifying a handful of options. ate, honestly.
To choose a preset, add a preset option to an animation script group, like this:
animations = ({
triggers = [ "close", "hide" ];
preset = "slide-out";
direction = "down";
...
}, ...)
Some presets have additional options that you can set to customize the animation. In this example, the slide-out preset has a direction option specifying the direction of the sliding animation.
Note ๐
Trying to explain an animation with just words is genuinely the hardest thing ever ๐ญ like, bestie, we have short video clips showing off every preset, but they cannot be squeezed into a manpage, that's not a thing manpages do. The web version of this doc over at https://picom.app though? That one does have the clips. Go look, it's giving cinema. ๐ฌ
The presets you get out of the box are:
slide-in,slide-outโ shows/hides the window with a sliding animation. Very demure, very smooth. โจdirectionโ the sliding direction, and the valid values areup,down,left,right.durationโ how long the animation takes, in seconds. (Can be fractional, so yes you can be extra about it.)
fly-in,fly-outโ shows/hides the window with a flying animation. Wings not included. ๐ฆdirectionโ the flying direction, valid values areup,down,left,right.durationโ duration of the animation in seconds.
appear,disappearโ shows/hides the window with a combo of scaling and fading. The classic. ๐scaleโ the scaling factor of the window;1.0means no scaling at all.durationโ duration of the animation in seconds.
geometry-changeโ animates the geometry (that's the size and position, bestie) change of the window. โจ
Warning โ this makes use of both the geometry trigger, and the saved-image-blend output variable. Both of these features are experimental and may not work as expected. Not me warning you twice, but like, I'm warning you twice. ๐
durationโ duration of the animation in seconds.
๐ Advanced ๐
If none of the presets are hitting, it is always possible to define your own animations. Putting it simply: an animation script is just a collection of variables, plus how their values should be computed. When they're running, animation scripts get evaluated once per frame, and then the values of some of those variables get used to animate the window. Periodt.
๐ Basic syntax ๐
To concretely show you what all that actually means, here's an example:
# this animation script does nothing to your windows by the way.
animations = ({
# common options, these are not part of the collection of variables
triggers = [ "open" ];
# variables
a = 10;
b = "a * 10";
c = "a + b";
d = {
curve = "cubic-bezier(0.25, 0.1, 0.25, 1.0)";
duration = 0.5;
delay = 0;
start = 0;
end = 1;
};
# more options follow
# ...
}, ...)
A variable can be defined as a number, an expression, or a timing function. In the example up there, a is defined to be a number (10), b is defined to be the result of the expression a * 10, and c is the same deal. And the way this slaps? An expression used to define one variable can refer to other variables in the same script. That's literally how you build complex animations. Where the variables are defined in the script does not matter, as long as no circular references exist. ๐
Note โ because variable names can contain dashes (-), minus signs in expressions must be surrounded by spaces. Soa - 10means a minus 10, whereasa-10is a variable nameda-10. Yes this trips people up, no I will not apologise for libconfig. ๐ญ
d is a timing function, which is a group with several options specifying its behavior. Timing functions are what drives an animation. And lowkey important: if no timing function is defined in an animation script, nothing will be animated and the animation will end instantly. Nothing. Zero. Nada. ๐
These options are valid for a timing function:
curveโ the type of the curve and its parameters. It can belinear, which takes no parameters and defines a linear curve; orcubic-bezier, which takes four parameters for the four control points of the cubic bezier curve; orsteps, which takes one or two parameters โ the first is the number of steps, the second is the "jumpterm", which can bejump-start,jump-end,jump-none, orjump-both. Thecurveoption is optional, and if it is not specified, thelinearcurve will be used.delayโ the number of seconds to wait before the value starts changing. Optional, defaults to0.durationโ the number of seconds it will take for the value to go fromstarttoendonce it starts changing. Mandatory. And it must be greater than0. No zero-second era allowed. ๐ซstartโ the start value of the variable. Mandatory.endโ the end value of the variable. Mandatory.
All options except curve can be set to expressions. Timing function options are not variables themselves.
Note โ if any ofdelay,duration,start, orendis defined with an expression, the expression will be evaluated only once, when the animation starts. After that, the values ofdelay,duration,start, andendare fixed for the whole duration of the animation. No take-backs.
The total duration of an animation is decided by the duration of the timing function with the longest duration. The animation ends when the longest timing function ends. And once an animation ends, its effects on the window get removed. Cleanup era. ๐งน
There is no restriction on what you can name your variables. Obviously they cannot conflict with the names of common options (triggers, suppressions, and preset), but other than that you can name them literally whatever you want, as long as libconfig allows it. Some variable names have special meanings though, as we'll see below. ๐
๐ Output variables ๐
So now you know how to write an animation script. But here's the tea: what we just wrote doesn't actually do anything to the window. ๐ซ To actually animate a window, we define a set of special variable names, and we're calling these "output variables". If you define variables with these names, their values get used to animate the window.
For example, if you define an animation script like this:
animations = ({
triggers = [ "open" ];
offset-x = {
duration = 2;
start = 0;
end = 100;
};
}, ...)
Then when a window opens, it will move 100 pixels to the right over the course of 2 seconds. Iconic behavior, honestly. ๐
Warning โ okay so yes, we did say you can name your variables whatever you want, but if some of them become output variables in the future, your animation script will behave unexpectedly. To dodge this whole situation, we reserve several classes of variable names which we will never use for special variables. These are: 1) any names that start with a single letter followed by a dash (e.g.a-,b-, etc.); 2) any names that start withvar-,tmp-, oruser-. If you need a non-output variable, use one of these names. Save yourself the heartbreak. ๐
Currently, these output variables are supported:
offset-x,offset-yโ the offset of the window in the X and Y direction, respectively. The window body gets moved by this amount. Note this does not affect the shadow, so if you define these but notshadow-offset-xorshadow-offset-y, the shadow will stay exactly where the window was without the animation. Awkward. ๐ฌshadow-offset-x,shadow-offset-yโ the offset of the shadow in the X and Y direction, respectively. The shadow gets moved by this amount. This offset applies after the window and the shadow have been scaled.opacityโ the opacity of the window. A number between0and1.blur-opacityโ the opacity of the blur behind the window. A number between0and1.shadow-opacityโ the opacity of the shadow. A number between0and1.shadow-red,shadow-green,shadow-blueโ the color of the shadow. Each component is specified separately, and each number is between0and1.scale-x,scale-y,shadow-scale-x,shadow-scale-yโ the scaling factor of the window and shadow in the X and Y direction, respectively.1.0means no scaling. The window body and the shadow are scaled independently. When they're scaled, the scale origin is the top-left corner of the window โ for both of them. Same corner, no favorites. ๐crop-x,crop-y,crop-width,crop-heightโ these four values combined define a rectangle on the screen. The window and its shadow get cropped to this rectangle. If not defined, the window and shadow won't be cropped at all.saved-image-blendโ when the window's geometry changes, its content will often change drastically, which creates a jarring discontinuity. This output variable lets you blend the window's content before and after the geometry change, and the before/after images get stretched appropriately to match the animation. That way you can smoothly animate geometry changes. This is a number between0and1.0means the saved image is not used, whereas1means you'll only see the saved image. (EXPERIMENTAL)
Warning โ the saved-image-blend variable is experimental. It might work incorrectly, cause visual artifacts, or slow down your system. You're welcome to open an issue on GitHub if you hit any problems, to help us improve it โ though resolution is not guaranteed. Fr fr, no promises. ๐
All coordinates are in pixels, and they're in the coordinate system of the screen. Sizes are also in pixels.
Important โ if an output variable name is not defined in your animation script, it takes the default value for whichever state the window is in. Specifically: if you don't define anopacityvariable in the animation script for the"close"or"hide"trigger, a closed window will, by default, have0opacity. So you'll just see it disappear instantly. Oftentimes you'll want to setopacityto1to make the window visible for the duration of the animation. Don't let it ghost you. ๐ป
๐ฆ Context variables ๐ฆ
So now you know how to animate a window. But bestie, this is still not powerful enough to support most of the animations you might want to define. For example: if you want your window to fly out the right side of your screen, the number of pixels it has to move depends on where it is on the screen, and on its width. For this last piece of the puzzle, we have context variables.
A context variable is a variable picom defines for you, and you can use them in expressions like any other variables. Their values reflect certain attributes of the window you are animating. ๐ช
โ ๏ธ Warning โ ๏ธ bestie, listen โ if you define your own variable with the same name as a context variable, your variable will shadow the context variable. And since more context variables can get added in the future, dodging this is honestly kind of hard. So same rule as output variables: if you need a temp variable, use one of the reserved names. periodt.
Right now, these are the context variables that exist:
window-x,window-yโ the coordinates of the top-left corner of the window. where the window's little corner lives ๐window-width,window-heightโ the size of the window.window-x-before,window-y-before,window-width-before,window-height-beforeโ the size and coordinates of the window from the previous frame. This is only meaningfully different from the normal window geometry variables inside animations triggered by the geometry trigger. ๐window-monitor-x,window-monitor-y,window-monitor-width,window-monitor-heightโ defines the rectangle which reflects the monitor the window is on. If the window is not fully contained in any monitor, the rectangle will reflect the entire virtual screen. no cap.window-raw-opacity-before,window-raw-opacityโ animation triggers are usually accompanied by a change in the window's opacity. Like, when a window is opened, its opacity changes from0to1. These two variables reflect the opacity of the window for the previous and current frame. They're useful if you wanna smoothly transition the window's opacity. โจwindow-blur-opacity-before,window-blur-opacityโ the blur opacity of the window for the previous and current frame.window-shadow-red,window-shadow-green,window-shadow-blue,window-shadow-red-before,window-shadow-green-before,window-shadow-blue-beforeโ color of the shadow before and after the shadow color change. (See notes below aboutwindow-*-beforevariables.
๐จ Important ๐จ all of thewindow-*-beforevariables get updated every single frame, and they reflect the state of the window in the previous frame. Which means they're only meaningful for a single frame, when an animation has just been triggered. Which means you should only use them to define thestart,end,duration, ordelayvalues of a timing function, because those values only get evaluated once, when the animation starts. iykyk ๐ซถ
๐ Share your animations ๐
If you've made an animation script that you think is, like, particularly cool? You are encouraged to share it with the community. Submit an issue or a pull request to picom on GitHub, and get a chance to have your animation included as one of the presets so everyone can use it. main character energy fr fr ๐
๐ SHADER INTERFACE ๐
This section describes the interface of a custom shader โ how picom uses it, and what parameters picom passes to the shader.
A custom shader is a GLSL fragment shader program, and you can use it to override the default way a window is rendered. Important: if a custom shader is used, the default picom effects (dimming, color inversion, etc.) will no longer be automatically applied. It would be the custom shader's responsibility to apply those effects. So don't come crying later ๐ญ
The interface between picom and a custom shader depends on which backend is being used. The xrender backend doesn't support shader at all. Here we describe the interface provided by the glx backend.
The shader must define a function, vec4 window_shader(), which is the entry point of the shader. The returned vec4 will be used to set gl_FragColor. A function, vec4 default_post_processing(vec4 c), is provided for applying the default picom effects to input color 'c'.
The following uniform/input variables are made available to the shader:
in vec2 texcoord; // texture coordinate of the fragment
uniform float opacity; // opacity of the window (0.0 - 1.0)
uniform float dim; // dimming factor of the window (0.0 - 1.0, higher means more dim)
uniform float corner_radius; // corner radius of the window (pixels)
uniform float border_width; // estimated border width of the window (pixels)
uniform bool invert_color; // whether to invert the color of the window
uniform sampler2D tex; // texture of the window
uniform vec2 effective_size; // effective dimensions of the texture (repeats pixels if larger than tex)
uniform sampler2D brightness; // estimated brightness of the window, 1x1 texture
uniform float max_brightness; // configured maximum brightness of the window (0.0 - 1.0)
uniform float time; // time in milliseconds, counting from an unspecified starting point
The default behavior of picom window rendering can be replicated by the following shader:
#version 330
in vec2 texcoord; // texture coordinate of the fragment
uniform sampler2D tex; // texture of the window
// Default window post-processing:
// 1) invert color
// 2) opacity / transparency
// 3) max-brightness clamping
// 4) rounded corners
vec4 default_post_processing(vec4 c);
// Default window shader:
// 1) fetch the specified pixel
// 2) apply default post-processing
vec4 window_shader() {
vec2 texsize = textureSize(tex, 0);
vec4 c = texture2D(tex, texcoord / texsize, 0);
return default_post_processing(c);
}
The interface is expected to be mostly stable. ๐ง
๐ CONFIGURATION FILES ๐
picom could read from a configuration file if libconfig support is compiled in. If --config is not used, picom will seek for a configuration file in $XDG_CONFIG_HOME/picom.conf (~/.config/picom.conf, usually), then $XDG_CONFIG_HOME/picom/picom.conf, then $XDG_CONFIG_DIRS/picom.conf (often /etc/xdg/picom.conf), then $XDG_CONFIG_DIRS/picom/picom.conf.
When the @include directive is used in the config file, picom will first search for the included file in the parent directory of picom.conf, then in $XDG_CONFIG_HOME/picom/include/, then in $XDG_CONFIG_DIRS/picom/include.
picom uses the general libconfig configuration file format. A sample configuration file is available as picom.sample.conf in the source tree. Most command line switches can be used as options in the configuration file as well โ for example, the --vsync option documented above can be set in the configuration file using vsync = . Command line options will always overwrite the settings in the configuration file. always. ๐
Some options can only be set in the configuration file. Such options include rules (see WINDOW RULES), animations (see ANIMATIONS), wintypes (see below).
Window-type-specific settings let you set window-specific options based on the window type. These settings are exposed only in the configuration file. The format of this option is as follows:
wintypes:
{
WINDOW_TYPE = { fade = BOOL; shadow = BOOL; opacity = FLOAT; focus = BOOL; blur-background = BOOL; full-shadow = BOOL; clip-shadow-above = BOOL; redir-ignore = BOOL; };
};
โ ๏ธ Warning โ using this is highly discouraged, see the WINDOW RULES section for the recommended way to set window-specific options.
๐จ Important ๐จ according to the window manager specification, a window can have multiple types. But because of the limitation of howwintypeswas implemented, if a window has multiple types, then for the purpose of applyingwintypesoptions, one of the window types will be chosen at random. Again, you are recommended to use WINDOW RULES instead. not me having trust issues with randomness ๐ญ
WINDOW_TYPE is one of the 15 window types defined in the EWMH standard: "unknown", "desktop", "dock", "toolbar", "menu", "utility", "splash", "dialog", "normal", "dropdown_menu", "popup_menu", "tooltip", "notification", "combo", and "dnd".
Following per window-type options are available:
fade,shadowโ controls window-type-specific shadow and fade settings.opacityโ controls default opacity of the window type.focusโ controls whether the window of this type is to be always considered focused. (By default, all window types except"normal"and"dialog"have this on.)blur-backgroundโ controls whether the window of this type will have its transparent background blurred.full-shadowโ controls whether shadow is drawn under the parts of the window that you normally won't be able to see. Useful when the window has parts of it transparent, and you want shadows in those areas.clip-shadow-aboveโ controls whether shadows that would have been drawn above the window should be clipped. Useful for dock windows that should have no shadow painted on top.redir-ignoreโ controls whether this type of windows should cause the screen to become redirected again after being unredirected. If you have--unredir-if-possibleset, and don't want a certain window to cause unnecessary screen redirection, you can set this totrue.
๐ฆ BLUR ๐ฆ
You can configure how the window background is blurred using a 'blur' section in your configuration file. Here's an example, bestie:
blur:
{
method = "gaussian";
size = 10;
deviation = 5.0;
};
Available options of the blur section are:
methodโ a string. Controls the blur method. Corresponds to the--blur-methodcommand line option. Available choices are:noneto disable blurring;gaussianfor gaussian blur;boxfor box blur;kernelfor convolution blur with a custom kernel;dual_kawasefor dual-filter kawase blur. (default:none)sizeโ an integer. The size of the blur kernel, required bygaussianandboxblur methods. For thekernelmethod, the size is included in the kernel. Corresponds to the--blur-sizecommand line option (default:3).deviationโ a floating point number. The standard deviation for thegaussianblur method. Corresponds to the--blur-deviationcommand line option (default:0.84089642).strengthโ an integer in the range0-20. The strength of thedual_kawaseblur method. Corresponds to the--blur-strengthcommand line option. If set to zero, the value requested by--blur-sizeis approximated (default:5).kernelโ a string. The kernel to use for thekernelblur method, specified in the same format as the--blur-kernoption. Corresponds to the--blur-kerncommand line option.
๐ SIGNALS ๐
- okay so bestie, when
picomcatches aSIGUSR1? it literally reinitializes itself ๐ that's the whole thing. that's the signal. it just gets back up, fixes its hair, and keeps going โจ
๐ฆ D-BUS API ๐ฆ
so you can also boss picom around via D-Bus messages ๐ all you gotta do is run picom with --dbus and then send your lil messages over to:
com.github.chjj.compton.<DISPLAY>
and <DISPLAY> is just the display that picom is using but here's the โจtwistโจ: every non-alphanumeric character in it gets transformed into underscores. so like, if you're on DISPLAY=:0.0, the name you want is com.github.chjj.compton._0_0 ๐ yes really, the colons and dots become underscores, that's the vibe
heads up bestie โ ๏ธ the D-Bus methods and signals are not yet stable, so they're undocumented right now. likeโฆ they're in their experimental era ๐
๐ธ EXAMPLES ๐ธ
here's the fun part, the actual commands, no cap: ๐
- turn OFF configuration file parsing entirely:
$ picom --config /dev/null
- run
picomwith client-side shadow AND fading: โจ
$ picom -cf
- same thing as above, but now we're making inactive windows 80% transparent, making frame 80% transparent, NOT fading on window open/close, and forking to the background: ๐ฆ
$ picom -bcf -i 0.8 -e 0.8 --no-fading-openclose
- draw WHITE shadows, iconic: ๐ค
$ picom -c --shadow-red 1 --shadow-green 1 --shadow-blue 1
- avoid drawing shadows on a wbar window: ๐
$ picom -c --shadow-exclude 'class_g = "wbar"'
- enable VSync with the GLX backend: ๐ฅ
$ picom --backend glx --vsync
๐ BUGS ๐
found a bug? bestie please tell someone ๐ญ submit bug reports here:
https://github.com/yshui/picom
and lowkey the most important one: out dated information in this man page is considered a bug. periodt. ๐
๐ RESOURCES ๐
Homepage: https://github.com/yshui/picom ๐
๐ซถ SEE ALSO ๐ซถ
go read these next, they're the friend group: ๐
๐ AUTHOR ๐
Yuxuan Shui ๐
okay that's the whole page bestie, you made it, i'm so proud of you ๐ฅนโจ๐
this one's from picom, dated 2026-02-07, and yeah it's PICOM(1) ๐ now go forth and composite, main character ๐
๐ฆ
๐ฆ where this page comes from
- fedora 43: picom 13-1.fc43 ยท MPL-2.0 AND MIT
- fedora 44: picom 13-1.fc44 ยท MPL-2.0 AND MIT
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms