diff --git a/src/common.h b/src/common.h
index 8680d71..88f51f8 100644
--- a/src/common.h
+++ b/src/common.h
@@ -167,7 +167,9 @@
#include "xrescheck.h"
#endif
+// FIXME This list of includes should get shorter
#include "types.h"
+#include "win.h"
#include "x.h"
#include "region.h"
@@ -224,34 +226,8 @@
typedef long time_ms_t;
typedef struct _c2_lptr c2_lptr_t;
-typedef enum {
- WINTYPE_UNKNOWN,
- WINTYPE_DESKTOP,
- WINTYPE_DOCK,
- WINTYPE_TOOLBAR,
- WINTYPE_MENU,
- WINTYPE_UTILITY,
- WINTYPE_SPLASH,
- WINTYPE_DIALOG,
- WINTYPE_NORMAL,
- WINTYPE_DROPDOWN_MENU,
- WINTYPE_POPUP_MENU,
- WINTYPE_TOOLTIP,
- WINTYPE_NOTIFY,
- WINTYPE_COMBO,
- WINTYPE_DND,
- NUM_WINTYPES
-} wintype_t;
-
// Or use cmemzero().
-/// Enumeration type of window painting mode.
-typedef enum {
- WMODE_TRANS, // The window body is (potentially) transparent
- WMODE_FRAME_TRANS, // The window body is opaque, but the frame is not
- WMODE_SOLID, // The window is opaque including the frame
-} winmode_t;
-
/// Structure representing needed window updates.
typedef struct {
bool shadow : 1;
@@ -428,17 +404,6 @@ typedef struct {
GLint unifm_factor_center;
} glx_blur_pass_t;
-typedef struct {
- /// Framebuffer used for blurring.
- GLuint fbo;
- /// Textures used for blurring.
- GLuint textures[2];
- /// Width of the textures.
- int width;
- /// Height of the textures.
- int height;
-} glx_blur_cache_t;
-
typedef struct {
/// GLSL program.
GLuint prog;
@@ -462,12 +427,6 @@ typedef struct {
typedef uint32_t glx_prog_main_t;
#endif
-typedef struct {
- xcb_pixmap_t pixmap;
- xcb_render_picture_t pict;
- glx_texture_t *ptex;
-} paint_t;
-
#define PAINT_INIT { .pixmap = None, .pict = None }
typedef struct conv {
@@ -483,7 +442,6 @@ typedef struct _latom {
#define REG_DATA_INIT { NULL, 0 }
-typedef struct win win;
typedef struct ev_session_timer ev_session_timer;
typedef struct ev_session_idle ev_session_idle;
typedef struct ev_session_prepare ev_session_prepare;
@@ -1004,201 +962,6 @@ typedef struct session {
#endif
} session_t;
-/**
- * About coordinate systems
- *
- * In general, X is the horizontal axis, Y is the vertical axis.
- * X goes from left to right, Y goes downwards.
- *
- * Global: the origin is the top left corner of the Xorg screen.
- * Local: the origin is the top left corner of the window, including border.
- */
-
-/// Structure representing a top-level window compton manages.
-struct win {
- /// Pointer to the next lower window in window stack.
- win *next;
- /// Pointer to the next higher window to paint.
- win *prev_trans;
-
- // Core members
- /// ID of the top-level frame window.
- Window id;
- /// Window attributes.
- xcb_get_window_attributes_reply_t a;
- xcb_get_geometry_reply_t g;
-#ifdef CONFIG_XINERAMA
- /// Xinerama screen this window is on.
- int xinerama_scr;
-#endif
- /// Window visual pict format;
- xcb_render_pictforminfo_t *pictfmt;
- /// Window painting mode.
- winmode_t mode;
- /// Whether the window has been damaged at least once.
- bool ever_damaged;
-#ifdef CONFIG_XSYNC
- /// X Sync fence of drawable.
- XSyncFence fence;
-#endif
- /// Whether the window was damaged after last paint.
- bool pixmap_damaged;
- /// Damage of the window.
- xcb_damage_damage_t damage;
- /// Paint info of the window.
- paint_t paint;
- /// Bounding shape of the window. In local coordinates.
- /// See above about coordinate systems.
- region_t bounding_shape;
- /// Window flags. Definitions above.
- int_fast16_t flags;
- /// Whether there's a pending ConfigureNotify
happening
- /// when the window is unmapped.
- bool need_configure;
- /// Queued ConfigureNotify
when the window is unmapped.
- xcb_configure_notify_event_t queue_configure;
- /// The region of screen that will be obscured when windows above is painted.
- /// We use this to reduce the pixels that needed to be paint when painting
- /// this window and anything underneath. Depends on window frame
- /// opacity state, window geometry, window mapped/unmapped state,
- /// window mode of the windows above. DOES NOT INCLUDE the body of THIS WINDOW.
- /// NULL means reg_ignore has not been calculated for this window.
- rc_region_t *reg_ignore;
- /// Whether the reg_ignore of all windows beneath this window are valid
- bool reg_ignore_valid;
- /// Cached width/height of the window including border.
- int widthb, heightb;
- /// Whether the window has been destroyed.
- bool destroyed;
- /// Whether the window is bounding-shaped.
- bool bounding_shaped;
- /// Whether the window just have rounded corners.
- bool rounded_corners;
- /// Whether this window is to be painted.
- bool to_paint;
- /// Whether the window is painting excluded.
- bool paint_excluded;
- /// Whether the window is unredirect-if-possible excluded.
- bool unredir_if_possible_excluded;
- /// Whether this window is in open/close state.
- bool in_openclose;
-
- // Client window related members
- /// ID of the top-level client window of the window.
- Window client_win;
- /// Type of the window.
- wintype_t window_type;
- /// Whether it looks like a WM window. We consider a window WM window if
- /// it does not have a decedent with WM_STATE and it is not override-
- /// redirected itself.
- bool wmwin;
- /// Leader window ID of the window.
- Window leader;
- /// Cached topmost window ID of the window.
- Window cache_leader;
-
- // Focus-related members
- /// Whether the window is to be considered focused.
- bool focused;
- /// Override value of window focus state. Set by D-Bus method calls.
- switch_t focused_force;
-
- // Blacklist related members
- /// Name of the window.
- char *name;
- /// Window instance class of the window.
- char *class_instance;
- /// Window general class of the window.
- char *class_general;
- /// WM_WINDOW_ROLE
value of the window.
- char *role;
- const c2_lptr_t *cache_sblst;
- const c2_lptr_t *cache_fblst;
- const c2_lptr_t *cache_fcblst;
- const c2_lptr_t *cache_ivclst;
- const c2_lptr_t *cache_bbblst;
- const c2_lptr_t *cache_oparule;
- const c2_lptr_t *cache_pblst;
- const c2_lptr_t *cache_uipblst;
-
- // Opacity-related members
- /// Current window opacity.
- opacity_t opacity;
- /// Target window opacity.
- opacity_t opacity_tgt;
- /// true if window (or client window, for broken window managers
- /// not transferring client window's _NET_WM_OPACITY value) has opacity prop
- bool has_opacity_prop;
- /// Cached value of opacity window attribute.
- opacity_t opacity_prop;
- /// true if opacity is set by some rules
- bool opacity_is_set;
- /// Last window opacity value we set.
- opacity_t opacity_set;
-
- // Fading-related members
- /// Do not fade if it's false. Change on window type change.
- /// Used by fading blacklist in the future.
- bool fade;
- /// Fade state on last paint.
- bool fade_last;
- /// Override value of window fade state. Set by D-Bus method calls.
- switch_t fade_force;
- /// Callback to be called after fading completed.
- void (*fade_callback) (session_t *ps, win **w);
-
- // Frame-opacity-related members
- /// Current window frame opacity. Affected by window opacity.
- double frame_opacity;
- /// Frame extents. Acquired from _NET_FRAME_EXTENTS.
- margin_t frame_extents;
-
- // Shadow-related members
- /// Whether a window has shadow. Calculated.
- bool shadow;
- /// Shadow state on last paint.
- bool shadow_last;
- /// Override value of window shadow state. Set by D-Bus method calls.
- switch_t shadow_force;
- /// Opacity of the shadow. Affected by window opacity and frame opacity.
- double shadow_opacity;
- /// X offset of shadow. Affected by commandline argument.
- int shadow_dx;
- /// Y offset of shadow. Affected by commandline argument.
- int shadow_dy;
- /// Width of shadow. Affected by window size and commandline argument.
- int shadow_width;
- /// Height of shadow. Affected by window size and commandline argument.
- int shadow_height;
- /// Picture to render shadow. Affected by window size.
- paint_t shadow_paint;
- /// The value of _COMPTON_SHADOW attribute of the window. Below 0 for
- /// none.
- long prop_shadow;
-
- // Dim-related members
- /// Whether the window is to be dimmed.
- bool dim;
-
- /// Whether to invert window color.
- bool invert_color;
- /// Color inversion state on last paint.
- bool invert_color_last;
- /// Override value of window color inversion state. Set by D-Bus method
- /// calls.
- switch_t invert_color_force;
-
- /// Whether to blur window background.
- bool blur_background;
- /// Background state on last paint.
- bool blur_background_last;
-
-#ifdef CONFIG_OPENGL
- /// Textures and FBO background blur use.
- glx_blur_cache_t glx_blur_cache;
-#endif
-};
-
/// Temporary structure used for communication between
/// get_cfg()
and parse_config()
.
struct options_tmp {
diff --git a/src/compton.h b/src/compton.h
index af51b80..040e495 100644
--- a/src/compton.h
+++ b/src/compton.h
@@ -30,6 +30,7 @@
#include "opengl.h" // XXX clean up
#endif
#include "common.h"
+#include "win.h"
#include "x.h"
#include "c2.h"
@@ -321,30 +322,6 @@ win_ev_stop(session_t *ps, win *w) {
}
}
-/**
- * Check whether a window has WM frames.
- */
-static inline bool __attribute__((pure))
-win_has_frame(const win *w) {
- return w->g.border_width
- || w->frame_extents.top || w->frame_extents.left
- || w->frame_extents.right || w->frame_extents.bottom;
-}
-
-/**
- * Calculate the extents of the frame of the given window based on EWMH
- * _NET_FRAME_EXTENTS and the X window border width.
- */
-static inline margin_t __attribute__((pure))
-win_calc_frame_extents(session_t *ps, const win *w) {
- margin_t result = w->frame_extents;
- result.top = max_i(result.top, w->g.border_width);
- result.left = max_i(result.left, w->g.border_width);
- result.bottom = max_i(result.bottom, w->g.border_width);
- result.right = max_i(result.right, w->g.border_width);
- return result;
-}
-
/**
* Dump an drawable's info.
*/
diff --git a/src/dbus.c b/src/dbus.c
index 0d84b19..5824ab2 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -10,6 +10,7 @@
*/
#include "dbus.h"
+#include "win.h"
static DBusHandlerResult
cdbus_process(DBusConnection *conn, DBusMessage *m, void *);
diff --git a/src/types.h b/src/types.h
index 58d198c..1c6114f 100644
--- a/src/types.h
+++ b/src/types.h
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2018 Yuxuan Shui
+#pragma once
+
/// Some common types
#include
diff --git a/src/win.h b/src/win.h
index 42b0cc0..63b8df4 100644
--- a/src/win.h
+++ b/src/win.h
@@ -1,15 +1,269 @@
-#pragma once
-#include
-#include
// SPDX-License-Identifier: MIT
// Copyright (c) 2011-2013, Christopher Jeffrey
// Copyright (c) 2013 Richard Grenville
+#pragma once
+#include
+#include
+#ifdef CONFIG_XSYNC
+#include
+#endif
+#include
+
+// FIXME shouldn't need this
+#ifdef CONFIG_OPENGL
+#include
+#endif
#include "x.h"
+#include "types.h"
+#include "c2.h"
+#include "utils.h"
typedef struct session session_t;
-typedef struct win win;
+typedef struct _glx_texture glx_texture_t;
+// FIXME not the best place for this type
+typedef struct {
+ xcb_pixmap_t pixmap;
+ xcb_render_picture_t pict;
+ glx_texture_t *ptex;
+} paint_t;
+
+// FIXME this type should be in opengl.h
+// it is very unideal for it to be here
+typedef struct {
+ /// Framebuffer used for blurring.
+ GLuint fbo;
+ /// Textures used for blurring.
+ GLuint textures[2];
+ /// Width of the textures.
+ int width;
+ /// Height of the textures.
+ int height;
+} glx_blur_cache_t;
+
+typedef enum {
+ WINTYPE_UNKNOWN,
+ WINTYPE_DESKTOP,
+ WINTYPE_DOCK,
+ WINTYPE_TOOLBAR,
+ WINTYPE_MENU,
+ WINTYPE_UTILITY,
+ WINTYPE_SPLASH,
+ WINTYPE_DIALOG,
+ WINTYPE_NORMAL,
+ WINTYPE_DROPDOWN_MENU,
+ WINTYPE_POPUP_MENU,
+ WINTYPE_TOOLTIP,
+ WINTYPE_NOTIFY,
+ WINTYPE_COMBO,
+ WINTYPE_DND,
+ NUM_WINTYPES
+} wintype_t;
+
+/// Enumeration type of window painting mode.
+typedef enum {
+ WMODE_TRANS, // The window body is (potentially) transparent
+ WMODE_FRAME_TRANS, // The window body is opaque, but the frame is not
+ WMODE_SOLID, // The window is opaque including the frame
+} winmode_t;
+
+/**
+ * About coordinate systems
+ *
+ * In general, X is the horizontal axis, Y is the vertical axis.
+ * X goes from left to right, Y goes downwards.
+ *
+ * Global: the origin is the top left corner of the Xorg screen.
+ * Local: the origin is the top left corner of the window, including border.
+ */
+
+/// Structure representing a top-level window compton manages.
+typedef struct win win;
+struct win {
+ /// Pointer to the next lower window in window stack.
+ win *next;
+ /// Pointer to the next higher window to paint.
+ win *prev_trans;
+
+ // Core members
+ /// ID of the top-level frame window.
+ Window id;
+ /// Window attributes.
+ xcb_get_window_attributes_reply_t a;
+ xcb_get_geometry_reply_t g;
+#ifdef CONFIG_XINERAMA
+ /// Xinerama screen this window is on.
+ int xinerama_scr;
+#endif
+ /// Window visual pict format;
+ xcb_render_pictforminfo_t *pictfmt;
+ /// Window painting mode.
+ winmode_t mode;
+ /// Whether the window has been damaged at least once.
+ bool ever_damaged;
+#ifdef CONFIG_XSYNC
+ /// X Sync fence of drawable.
+ XSyncFence fence;
+#endif
+ /// Whether the window was damaged after last paint.
+ bool pixmap_damaged;
+ /// Damage of the window.
+ xcb_damage_damage_t damage;
+ /// Paint info of the window.
+ paint_t paint;
+
+ /// Bounding shape of the window. In local coordinates.
+ /// See above about coordinate systems.
+ region_t bounding_shape;
+ /// Window flags. Definitions above.
+ int_fast16_t flags;
+ /// Whether there's a pending ConfigureNotify
happening
+ /// when the window is unmapped.
+ bool need_configure;
+ /// Queued ConfigureNotify
when the window is unmapped.
+ xcb_configure_notify_event_t queue_configure;
+ /// The region of screen that will be obscured when windows above is painted.
+ /// We use this to reduce the pixels that needed to be paint when painting
+ /// this window and anything underneath. Depends on window frame
+ /// opacity state, window geometry, window mapped/unmapped state,
+ /// window mode of the windows above. DOES NOT INCLUDE the body of THIS WINDOW.
+ /// NULL means reg_ignore has not been calculated for this window.
+ rc_region_t *reg_ignore;
+ /// Whether the reg_ignore of all windows beneath this window are valid
+ bool reg_ignore_valid;
+ /// Cached width/height of the window including border.
+ int widthb, heightb;
+ /// Whether the window has been destroyed.
+ bool destroyed;
+ /// Whether the window is bounding-shaped.
+ bool bounding_shaped;
+ /// Whether the window just have rounded corners.
+ bool rounded_corners;
+ /// Whether this window is to be painted.
+ bool to_paint;
+ /// Whether the window is painting excluded.
+ bool paint_excluded;
+ /// Whether the window is unredirect-if-possible excluded.
+ bool unredir_if_possible_excluded;
+ /// Whether this window is in open/close state.
+ bool in_openclose;
+
+ // Client window related members
+ /// ID of the top-level client window of the window.
+ Window client_win;
+ /// Type of the window.
+ wintype_t window_type;
+ /// Whether it looks like a WM window. We consider a window WM window if
+ /// it does not have a decedent with WM_STATE and it is not override-
+ /// redirected itself.
+ bool wmwin;
+ /// Leader window ID of the window.
+ Window leader;
+ /// Cached topmost window ID of the window.
+ Window cache_leader;
+
+ // Focus-related members
+ /// Whether the window is to be considered focused.
+ bool focused;
+ /// Override value of window focus state. Set by D-Bus method calls.
+ switch_t focused_force;
+
+ // Blacklist related members
+ /// Name of the window.
+ char *name;
+ /// Window instance class of the window.
+ char *class_instance;
+ /// Window general class of the window.
+ char *class_general;
+ /// WM_WINDOW_ROLE
value of the window.
+ char *role;
+ const c2_lptr_t *cache_sblst;
+ const c2_lptr_t *cache_fblst;
+ const c2_lptr_t *cache_fcblst;
+ const c2_lptr_t *cache_ivclst;
+ const c2_lptr_t *cache_bbblst;
+ const c2_lptr_t *cache_oparule;
+ const c2_lptr_t *cache_pblst;
+ const c2_lptr_t *cache_uipblst;
+
+ // Opacity-related members
+ /// Current window opacity.
+ opacity_t opacity;
+ /// Target window opacity.
+ opacity_t opacity_tgt;
+ /// true if window (or client window, for broken window managers
+ /// not transferring client window's _NET_WM_OPACITY value) has opacity prop
+ bool has_opacity_prop;
+ /// Cached value of opacity window attribute.
+ opacity_t opacity_prop;
+ /// true if opacity is set by some rules
+ bool opacity_is_set;
+ /// Last window opacity value we set.
+ opacity_t opacity_set;
+
+ // Fading-related members
+ /// Do not fade if it's false. Change on window type change.
+ /// Used by fading blacklist in the future.
+ bool fade;
+ /// Fade state on last paint.
+ bool fade_last;
+ /// Override value of window fade state. Set by D-Bus method calls.
+ switch_t fade_force;
+ /// Callback to be called after fading completed.
+ void (*fade_callback) (session_t *ps, win **w);
+
+ // Frame-opacity-related members
+ /// Current window frame opacity. Affected by window opacity.
+ double frame_opacity;
+ /// Frame extents. Acquired from _NET_FRAME_EXTENTS.
+ margin_t frame_extents;
+
+ // Shadow-related members
+ /// Whether a window has shadow. Calculated.
+ bool shadow;
+ /// Shadow state on last paint.
+ bool shadow_last;
+ /// Override value of window shadow state. Set by D-Bus method calls.
+ switch_t shadow_force;
+ /// Opacity of the shadow. Affected by window opacity and frame opacity.
+ double shadow_opacity;
+ /// X offset of shadow. Affected by commandline argument.
+ int shadow_dx;
+ /// Y offset of shadow. Affected by commandline argument.
+ int shadow_dy;
+ /// Width of shadow. Affected by window size and commandline argument.
+ int shadow_width;
+ /// Height of shadow. Affected by window size and commandline argument.
+ int shadow_height;
+ /// Picture to render shadow. Affected by window size.
+ paint_t shadow_paint;
+ /// The value of _COMPTON_SHADOW attribute of the window. Below 0 for
+ /// none.
+ long prop_shadow;
+
+ // Dim-related members
+ /// Whether the window is to be dimmed.
+ bool dim;
+
+ /// Whether to invert window color.
+ bool invert_color;
+ /// Color inversion state on last paint.
+ bool invert_color_last;
+ /// Override value of window color inversion state. Set by D-Bus method
+ /// calls.
+ switch_t invert_color_force;
+
+ /// Whether to blur window background.
+ bool blur_background;
+ /// Background state on last paint.
+ bool blur_background_last;
+
+#ifdef CONFIG_OPENGL
+ /// Textures and FBO background blur use.
+ glx_blur_cache_t glx_blur_cache;
+#endif
+};
int win_get_name(session_t *ps, win *w);
int win_get_role(session_t *ps, win *w);
@@ -107,3 +361,27 @@ win_get_bounding_shape_global_by_val(win *w) {
pixman_region32_translate(&ret, w->g.x, w->g.y);
return ret;
}
+
+/**
+ * Calculate the extents of the frame of the given window based on EWMH
+ * _NET_FRAME_EXTENTS and the X window border width.
+ */
+static inline margin_t __attribute__((pure))
+win_calc_frame_extents(session_t *ps, const win *w) {
+ margin_t result = w->frame_extents;
+ result.top = max_i(result.top, w->g.border_width);
+ result.left = max_i(result.left, w->g.border_width);
+ result.bottom = max_i(result.bottom, w->g.border_width);
+ result.right = max_i(result.right, w->g.border_width);
+ return result;
+}
+
+/**
+ * Check whether a window has WM frames.
+ */
+static inline bool __attribute__((pure))
+win_has_frame(const win *w) {
+ return w->g.border_width
+ || w->frame_extents.top || w->frame_extents.left
+ || w->frame_extents.right || w->frame_extents.bottom;
+}