aboutsummaryrefslogtreecommitdiff
path: root/src/config.h
diff options
context:
space:
mode:
authorallusive-dev <[email protected]>2023-09-19 17:47:33 +1000
committerallusive-dev <[email protected]>2023-09-19 17:47:33 +1000
commita93aba600b1c5d019b680b9f4ff3fa85d5d43a60 (patch)
tree77f8152222655657472a70e0bfa413a0495dd555 /src/config.h
parentreset (diff)
downloadcompfy-a93aba600b1c5d019b680b9f4ff3fa85d5d43a60.tar.xz
compfy-a93aba600b1c5d019b680b9f4ff3fa85d5d43a60.zip
Fixed broken files/code and other errors
Diffstat (limited to 'src/config.h')
-rw-r--r--src/config.h380
1 files changed, 380 insertions, 0 deletions
diff --git a/src/config.h b/src/config.h
new file mode 100644
index 0000000..a22d222
--- /dev/null
+++ b/src/config.h
@@ -0,0 +1,380 @@
+// SPDX-License-Identifier: MIT
+// Copyright (c) 2011-2013, Christopher Jeffrey
+// Copyright (c) 2013 Richard Grenville <[email protected]>
+// Copyright (c) 2018 Yuxuan Shui <[email protected]>
+#pragma once
+
+/// Common functions and definitions for configuration parsing
+/// Used for command line arguments and config files
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xcb/render.h> // for xcb_render_fixed_t, XXX
+#include <xcb/xcb.h>
+#include <xcb/xfixes.h>
+
+#ifdef CONFIG_LIBCONFIG
+#include <libconfig.h>
+#endif
+
+#include "compiler.h"
+#include "kernel.h"
+#include "log.h"
+#include "region.h"
+#include "types.h"
+#include "win_defs.h"
+
+typedef struct session session_t;
+
+/// @brief Possible backends
+enum backend {
+ BKEND_XRENDER,
+ BKEND_GLX,
+ BKEND_XR_GLX_HYBRID,
+ BKEND_DUMMY,
+ NUM_BKEND,
+};
+
+enum open_window_animation {
+ OPEN_WINDOW_ANIMATION_NONE = 0,
+ OPEN_WINDOW_ANIMATION_AUTO,
+ OPEN_WINDOW_ANIMATION_FLYIN,
+ OPEN_WINDOW_ANIMATION_ZOOM,
+ OPEN_WINDOW_ANIMATION_SLIDE_UP,
+ OPEN_WINDOW_ANIMATION_SLIDE_DOWN,
+ OPEN_WINDOW_ANIMATION_SLIDE_LEFT,
+ OPEN_WINDOW_ANIMATION_SLIDE_RIGHT,
+ OPEN_WINDOW_ANIMATION_SLIDE_IN,
+ OPEN_WINDOW_ANIMATION_SLIDE_OUT,
+ OPEN_WINDOW_ANIMATION_INVALID,
+};
+
+typedef struct win_option_mask {
+ bool shadow : 1;
+ bool fade : 1;
+ bool focus : 1;
+ bool blur_background : 1;
+ bool full_shadow : 1;
+ bool redir_ignore : 1;
+ bool opacity : 1;
+ bool clip_shadow_above : 1;
+ enum open_window_animation animation;
+ enum open_window_animation animation_unmap;
+ enum open_window_animation animation_workspace_in;
+ enum open_window_animation animation_workspace_out;
+} win_option_mask_t;
+
+typedef struct win_option {
+ bool shadow;
+ bool fade;
+ bool focus;
+ bool blur_background;
+ bool full_shadow;
+ bool redir_ignore;
+ double opacity;
+ bool clip_shadow_above;
+ enum open_window_animation animation;
+ enum open_window_animation animation_unmap;
+ enum open_window_animation animation_workspace_in;
+ enum open_window_animation animation_workspace_out;
+} win_option_t;
+
+enum blur_method {
+ BLUR_METHOD_NONE = 0,
+ BLUR_METHOD_KERNEL,
+ BLUR_METHOD_BOX,
+ BLUR_METHOD_GAUSSIAN,
+ BLUR_METHOD_DUAL_KAWASE,
+ BLUR_METHOD_INVALID,
+};
+
+typedef struct _c2_lptr c2_lptr_t;
+
+/// Structure representing all options.
+typedef struct options {
+ // === Debugging ===
+ bool monitor_repaint;
+ bool print_diagnostics;
+ /// Render to a separate window instead of taking over the screen
+ bool debug_mode;
+ // === General ===
+ /// Use the experimental new backends?
+ bool experimental_backends;
+ /// Path to write PID to.
+ char *write_pid_path;
+ /// The backend in use.
+ enum backend backend;
+ /// Whether to sync X drawing with X Sync fence to avoid certain delay
+ /// issues with GLX backend.
+ bool xrender_sync_fence;
+ /// Whether to avoid using stencil buffer under GLX backend. Might be
+ /// unsafe.
+ bool glx_no_stencil;
+ /// Whether to avoid rebinding pixmap on window damage.
+ bool glx_no_rebind_pixmap;
+ /// Custom fragment shader for painting windows, as a string.
+ char *glx_fshader_win_str;
+ /// Whether to detect rounded corners.
+ bool detect_rounded_corners;
+ /// Force painting of window content with blending.
+ bool force_win_blend;
+ /// Resize damage for a specific number of pixels.
+ int resize_damage;
+ /// Whether to unredirect all windows if a full-screen opaque window
+ /// is detected.
+ bool unredir_if_possible;
+ /// List of conditions of windows to ignore as a full-screen window
+ /// when determining if a window could be unredirected.
+ c2_lptr_t *unredir_if_possible_blacklist;
+ /// Delay before unredirecting screen, in milliseconds.
+ long unredir_if_possible_delay;
+ /// Forced redirection setting through D-Bus.
+ switch_t redirected_force;
+ /// Whether to stop painting. Controlled through D-Bus.
+ switch_t stoppaint_force;
+ /// Whether to enable D-Bus support.
+ bool dbus;
+ /// Path to log file.
+ char *logpath;
+ /// Number of cycles to paint in benchmark mode. 0 for disabled.
+ int benchmark;
+ /// Window to constantly repaint in benchmark mode. 0 for full-screen.
+ xcb_window_t benchmark_wid;
+ /// A list of conditions of windows not to paint.
+ c2_lptr_t *paint_blacklist;
+ /// Whether to show all X errors.
+ bool show_all_xerrors;
+ /// Whether to avoid acquiring X Selection.
+ bool no_x_selection;
+ /// Window type option override.
+ win_option_t wintype_option[NUM_WINTYPES];
+
+ // === VSync & software optimization ===
+ /// User-specified refresh rate.
+ int refresh_rate;
+ /// Whether to enable refresh-rate-based software optimization.
+ bool sw_opti;
+ /// VSync method to use;
+ bool vsync;
+ /// Whether to use glFinish() instead of glFlush() for (possibly) better
+ /// VSync yet probably higher CPU usage.
+ bool vsync_use_glfinish;
+ /// Whether use damage information to help limit the area to paint
+ bool use_damage;
+
+ // === Shadow ===
+ /// Red, green and blue tone of the shadow.
+ double shadow_red, shadow_green, shadow_blue;
+ int shadow_radius;
+ int shadow_offset_x, shadow_offset_y;
+ double shadow_opacity;
+ /// argument string to shadow-exclude-reg option
+ char *shadow_exclude_reg_str;
+ /// Shadow blacklist. A linked list of conditions.
+ c2_lptr_t *shadow_blacklist;
+ /// Whether bounding-shaped window should be ignored.
+ bool shadow_ignore_shaped;
+ /// Whether to crop shadow to the very Xinerama screen.
+ bool xinerama_shadow_crop;
+ /// Don't draw shadow over these windows. A linked list of conditions.
+ c2_lptr_t *shadow_clip_list;
+
+ // === Fading ===
+ /// How much to fade in in a single fading step.
+ double fade_in_step;
+ /// How much to fade out in a single fading step.
+ double fade_out_step;
+ /// Fading time delta. In milliseconds.
+ int fade_delta;
+ /// Whether to disable fading on window open/close.
+ bool no_fading_openclose;
+ /// Whether to disable fading on ARGB managed destroyed windows.
+ bool no_fading_destroyed_argb;
+ /// Fading blacklist. A linked list of conditions.
+ c2_lptr_t *fade_blacklist;
+
+ // === Animations ===
+ /// Whether to do window animations
+ bool animations;
+ /// Which animation to run when opening a window
+ enum open_window_animation animation_for_open_window;
+ /// Which animation to run when opening a transient window
+ enum open_window_animation animation_for_transient_window;
+ /// Which animation to run when unmapping (e.g. minimizing) a window
+ enum open_window_animation animation_for_unmap_window;
+ /// Which animation to run when switching workspace
+ /// IMPORTANT: will only work if window manager updates
+ /// _NET_CURRENT_DESKTOP before doing the hide/show of windows
+ enum open_window_animation animation_for_workspace_switch_in;
+ enum open_window_animation animation_for_workspace_switch_out;
+ /// Spring stiffness for animation
+ double animation_stiffness;
+ /// Window mass for animation
+ double animation_window_mass;
+ /// Animation dampening
+ double animation_dampening;
+ /// Animation delta. In milliseconds.
+ double animation_delta;
+ /// Whether to force animations to not miss a beat
+ bool animation_force_steps;
+ /// Whether to clamp animations
+ bool animation_clamping;
+ /// TODO: window animation blacklist
+ /// TODO: open/close animations
+
+ // === Opacity ===
+ /// Default opacity for inactive windows.
+ /// 32-bit integer with the format of _NET_WM_OPACITY.
+ double inactive_opacity;
+ /// Default opacity for inactive windows.
+ double active_opacity;
+ /// Whether inactive_opacity overrides the opacity set by window
+ /// attributes.
+ bool inactive_opacity_override;
+ /// Frame opacity. Relative to window opacity, also affects shadow
+ /// opacity.
+ double frame_opacity;
+ /// Whether to detect _NET_WM_OPACITY on client windows. Used on window
+ /// managers that don't pass _NET_WM_OPACITY to frame windows.
+ bool detect_client_opacity;
+
+ // === Other window processing ===
+ /// Blur method for background of semi-transparent windows
+ enum blur_method blur_method;
+ // Size of the blur kernel
+ int blur_radius;
+ // Standard deviation for the gaussian blur
+ double blur_deviation;
+ // Strength of the dual_kawase blur
+ int blur_strength;
+ /// Whether to blur background when the window frame is not opaque.
+ /// Implies blur_background.
+ bool blur_background_frame;
+ /// Whether to use fixed blur strength instead of adjusting according
+ /// to window opacity.
+ bool blur_background_fixed;
+ /// Background blur blacklist. A linked list of conditions.
+ c2_lptr_t *blur_background_blacklist;
+ /// Blur convolution kernel.
+ struct conv **blur_kerns;
+ /// Number of convolution kernels
+ int blur_kernel_count;
+ /// How much to dim an inactive window. 0.0 - 1.0, 0 to disable.
+ double inactive_dim;
+ /// Whether to use fixed inactive dim opacity, instead of deciding
+ /// based on window opacity.
+ bool inactive_dim_fixed;
+ /// Conditions of windows to have inverted colors.
+ c2_lptr_t *invert_color_list;
+ /// Rules to change window opacity.
+ c2_lptr_t *opacity_rules;
+ /// Limit window brightness
+ double max_brightness;
+ // Radius of rounded window corners
+ int corner_radius;
+ /// Rounded corners blacklist. A linked list of conditions.
+ c2_lptr_t *rounded_corners_blacklist;
+
+ // === Focus related ===
+ /// Whether to try to detect WM windows and mark them as focused.
+ bool mark_wmwin_focused;
+ /// Whether to mark override-redirect windows as focused.
+ bool mark_ovredir_focused;
+ /// Whether to use EWMH _NET_ACTIVE_WINDOW to find active window.
+ bool use_ewmh_active_win;
+ /// A list of windows always to be considered focused.
+ c2_lptr_t *focus_blacklist;
+ /// Whether to do window grouping with <code>WM_TRANSIENT_FOR</code>.
+ bool detect_transient;
+ /// Whether to do window grouping with <code>WM_CLIENT_LEADER</code>.
+ bool detect_client_leader;
+
+ // === Calculated ===
+ /// Whether we need to track window leaders.
+ bool track_leader;
+
+ // Don't use EWMH to detect fullscreen applications
+ bool no_ewmh_fullscreen;
+
+ // Make transparent windows clip other windows, instead of blending on top of
+ // them
+ bool transparent_clipping;
+} options_t;
+
+extern const char *const BACKEND_STRS[NUM_BKEND + 1];
+
+bool must_use parse_long(const char *, long *);
+bool must_use parse_int(const char *, int *);
+struct conv **must_use parse_blur_kern_lst(const char *, bool *hasneg, int *count);
+bool must_use parse_geometry(session_t *, const char *, region_t *);
+bool must_use parse_rule_opacity(c2_lptr_t **, const char *);
+enum blur_method must_use parse_blur_method(const char *src);
+enum open_window_animation must_use parse_open_window_animation(const char *src);
+
+/**
+ * Add a pattern to a condition linked list.
+ */
+bool condlst_add(c2_lptr_t **, const char *);
+
+#ifdef CONFIG_LIBCONFIG
+/// Parse a configuration file
+/// Returns the actually config_file name used, allocated on heap
+/// Outputs:
+/// shadow_enable = whether shaodw is enabled globally
+/// fading_enable = whether fading is enabled globally
+/// win_option_mask = whether option overrides for specific window type is set for given
+/// options
+/// hasneg = whether the convolution kernel has negative values
+char *
+parse_config_libconfig(options_t *, const char *config_file, bool *shadow_enable,
+ bool *fading_enable, bool *hasneg, win_option_mask_t *winopt_mask);
+#endif
+
+void set_default_winopts(options_t *, win_option_mask_t *, bool shadow_enable,
+ bool fading_enable, bool blur_enable);
+/// Parse a configuration file is that is enabled, also initialize the winopt_mask with
+/// default values
+/// Outputs and returns:
+/// same as parse_config_libconfig
+char *parse_config(options_t *, const char *config_file, bool *shadow_enable,
+ bool *fading_enable, bool *hasneg, win_option_mask_t *winopt_mask);
+
+/**
+ * Parse a backend option argument.
+ */
+static inline attr_pure enum backend parse_backend(const char *str) {
+ for (enum backend i = 0; BACKEND_STRS[i]; ++i) {
+ if (!strcasecmp(str, BACKEND_STRS[i])) {
+ return i;
+ }
+ }
+ // Keep compatibility with an old revision containing a spelling mistake...
+ if (!strcasecmp(str, "xr_glx_hybird")) {
+ log_warn("backend xr_glx_hybird should be xr_glx_hybrid, the misspelt "
+ "version will be removed soon.");
+ return BKEND_XR_GLX_HYBRID;
+ }
+ // cju wants to use dashes
+ if (!strcasecmp(str, "xr-glx-hybrid")) {
+ log_warn("backend xr-glx-hybrid should be xr_glx_hybrid, the alternative "
+ "version will be removed soon.");
+ return BKEND_XR_GLX_HYBRID;
+ }
+ log_error("Invalid backend argument: %s", str);
+ return NUM_BKEND;
+}
+
+/**
+ * Parse a VSync option argument.
+ */
+static inline bool parse_vsync(const char *str) {
+ if (strcmp(str, "no") == 0 || strcmp(str, "none") == 0 ||
+ strcmp(str, "false") == 0 || strcmp(str, "nah") == 0) {
+ return false;
+ }
+ return true;
+}
+
+// vim: set noet sw=8 ts=8 :