Add required functionality for use with TDE

pull/2/head
Timothy Pearson 12 years ago
parent 6e4f45f875
commit fbd3a27d6e

@ -35,10 +35,10 @@ typedef struct _c2_l c2_l_t;
/// Pointer to a condition tree. /// Pointer to a condition tree.
typedef struct { typedef struct {
bool isbranch : 1; bool isbranch : 1;
union { // union {
c2_b_t *b; c2_b_t *b;
c2_l_t *l; c2_l_t *l;
}; // };
} c2_ptr_t; } c2_ptr_t;
/// Initializer for c2_ptr_t. /// Initializer for c2_ptr_t.

@ -4,6 +4,7 @@
* Based on `xcompmgr` - Copyright (c) 2003, Keith Packard * Based on `xcompmgr` - Copyright (c) 2003, Keith Packard
* *
* Copyright (c) 2011-2013, Christopher Jeffrey * Copyright (c) 2011-2013, Christopher Jeffrey
* Copyright (c) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
* See LICENSE for more information. * See LICENSE for more information.
* *
*/ */
@ -60,6 +61,11 @@
// Whether to enable GLX Sync support. // Whether to enable GLX Sync support.
// #define CONFIG_GLX_XSYNC 1 // #define CONFIG_GLX_XSYNC 1
// TDE specific options
// #define USE_ENV_HOME 1
#define WRITE_PID_FILE 1
#define _TDE_COMP_MGR_VERSION_ 3.00
#if !defined(CONFIG_C2) && defined(DEBUG_C2) #if !defined(CONFIG_C2) && defined(DEBUG_C2)
#error Cannot enable c2 debugging without c2 support. #error Cannot enable c2 debugging without c2 support.
#endif #endif
@ -599,7 +605,7 @@ typedef struct _options_t {
c2_lptr_t *shadow_blacklist; c2_lptr_t *shadow_blacklist;
/// Whether bounding-shaped window should be ignored. /// Whether bounding-shaped window should be ignored.
bool shadow_ignore_shaped; bool shadow_ignore_shaped;
/// Whether to respect _COMPTON_SHADOW. /// Whether to respect _TDE_WM_WINDOW_SHADOW.
bool respect_prop_shadow; bool respect_prop_shadow;
/// Whether to crop shadow to the very Xinerama screen. /// Whether to crop shadow to the very Xinerama screen.
bool xinerama_shadow_crop; bool xinerama_shadow_crop;
@ -615,6 +621,8 @@ typedef struct _options_t {
time_ms_t fade_delta; time_ms_t fade_delta;
/// Whether to disable fading on window open/close. /// Whether to disable fading on window open/close.
bool no_fading_openclose; bool no_fading_openclose;
/// Whether to disable fading on opacity change
bool no_fading_opacitychange;
/// Fading blacklist. A linked list of conditions. /// Fading blacklist. A linked list of conditions.
c2_lptr_t *fade_blacklist; c2_lptr_t *fade_blacklist;
@ -967,10 +975,14 @@ typedef struct _session_t {
Atom atom_client_leader; Atom atom_client_leader;
/// Atom of property <code>_NET_ACTIVE_WINDOW</code>. /// Atom of property <code>_NET_ACTIVE_WINDOW</code>.
Atom atom_ewmh_active_win; Atom atom_ewmh_active_win;
/// Atom of property <code>_COMPTON_SHADOW</code>. /// Atom of property <code>_TDE_WM_WINDOW_SHADOW</code>.
Atom atom_compton_shadow; Atom atom_compton_shadow;
/// Atom of property <code>_NET_WM_WINDOW_TYPE</code>. /// Atom of property <code>_NET_WM_WINDOW_TYPE</code>.
Atom atom_win_type; Atom atom_win_type;
/// Atom of property <code>_KDE_TRANSPARENT_TO_BLACK</code>.
Atom atom_win_type_tde_transparent_to_black;
/// Atom of property <code>_KDE_TRANSPARENT_TO_DESKTOP</code>.
Atom atom_win_type_tde_transparent_to_desktop;
/// Array of atoms of all possible window types. /// Array of atoms of all possible window types.
Atom atoms_wintypes[NUM_WINTYPES]; Atom atoms_wintypes[NUM_WINTYPES];
/// Linked list of additional atoms to track. /// Linked list of additional atoms to track.
@ -1132,9 +1144,11 @@ typedef struct _win {
int shadow_width; int shadow_width;
/// Height of shadow. Affected by window size and commandline argument. /// Height of shadow. Affected by window size and commandline argument.
int shadow_height; int shadow_height;
/// Relative size of shadow.
int shadow_size;
/// Picture to render shadow. Affected by window size. /// Picture to render shadow. Affected by window size.
paint_t shadow_paint; paint_t shadow_paint;
/// The value of _COMPTON_SHADOW attribute of the window. Below 0 for /// The value of _TDE_WM_WINDOW_SHADOW attribute of the window. Below 0 for
/// none. /// none.
long prop_shadow; long prop_shadow;
@ -1151,6 +1165,12 @@ typedef struct _win {
/// Whether to blur window background. /// Whether to blur window background.
bool blur_background; bool blur_background;
/// Whether to show black background
bool show_black_background;
/// Whether to show desktop background
bool show_root_tile;
#ifdef CONFIG_VSYNC_OPENGL_GLSL #ifdef CONFIG_VSYNC_OPENGL_GLSL
/// Textures and FBO background blur use. /// Textures and FBO background blur use.
glx_blur_cache_t glx_blur_cache; glx_blur_cache_t glx_blur_cache;
@ -2094,6 +2114,10 @@ glx_render(session_t *ps, const glx_texture_t *ptex,
double opacity, bool neg, double opacity, bool neg,
XserverRegion reg_tgt, const reg_data_t *pcache_reg); XserverRegion reg_tgt, const reg_data_t *pcache_reg);
bool
glx_render_specified_color(session_t *ps, int color, int dx, int dy, int width, int height, int z,
XserverRegion reg_tgt, const reg_data_t *pcache_reg);
void void
glx_swap_copysubbuffermesa(session_t *ps, XserverRegion reg); glx_swap_copysubbuffermesa(session_t *ps, XserverRegion reg);
@ -2320,6 +2344,9 @@ opts_init_track_focus(session_t *ps);
void void
opts_set_no_fading_openclose(session_t *ps, bool newval); opts_set_no_fading_openclose(session_t *ps, bool newval);
void
opts_set_no_fading_opacitychange(session_t *ps, bool newval);
//!@} //!@}
#endif #endif

@ -4,6 +4,7 @@
* Based on `xcompmgr` - Copyright (c) 2003, Keith Packard * Based on `xcompmgr` - Copyright (c) 2003, Keith Packard
* *
* Copyright (c) 2011-2013, Christopher Jeffrey * Copyright (c) 2011-2013, Christopher Jeffrey
* Copyright (c) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
* See LICENSE for more information. * See LICENSE for more information.
* *
*/ */
@ -94,6 +95,140 @@ const static char *background_props_str[] = {
/// have a pointer to current session passed in. /// have a pointer to current session passed in.
session_t *ps_g = NULL; session_t *ps_g = NULL;
// === Execution control ===
struct sigaction usr_action;
sigset_t block_mask;
int my_exit_code = 3;
void write_pid_file(pid_t pid)
{
#ifdef WRITE_PID_FILE
#ifdef USE_ENV_HOME
const char *home = getenv("HOME");
#else
const char *home;
struct passwd *p;
p = getpwuid(getuid());
if (p)
home = p->pw_dir;
else
home = getenv("HOME");
#endif
const char *filename;
const char *configfile = "/.compton-tde.pid";
int n = strlen(home)+strlen(configfile)+1;
filename = (char*)malloc(n*sizeof(char));
memset(filename,0,n);
strcat(filename, home);
strcat(filename, configfile);
printf("writing '%s' as pidfile\n\n", filename);
/* now that we did all that by way of introduction...write the file! */
FILE *pFile;
char buffer[255];
sprintf(buffer, "%d", pid);
pFile = fopen(filename, "w");
if (pFile) {
fwrite(buffer,1,strlen(buffer), pFile);
fclose(pFile);
}
free(filename);
filename = NULL;
#endif
}
void delete_pid_file()
{
#ifdef WRITE_PID_FILE
#ifdef USE_ENV_HOME
const char *home = getenv("HOME");
#else
const char *home;
struct passwd *p;
p = getpwuid(getuid());
if (p)
home = p->pw_dir;
else
home = getenv("HOME");
#endif
const char *filename;
const char *configfile = "/.compton-tde.pid";
int n = strlen(home)+strlen(configfile)+1;
filename = (char*)malloc(n*sizeof(char));
memset(filename,0,n);
strcat(filename, home);
strcat(filename, configfile);
printf("deleting '%s' as pidfile\n\n", filename);
/* now that we did all that by way of introduction...delete the file! */
unlink(filename);
free(filename);
filename = NULL;
#endif
#if WORK_AROUND_FGLRX
if ((my_exit_code == 3) && (restartOnSigterm)) {
printf("compton-tde lost connection to X server, restarting...\n"); fflush(stdout);
sleep(1);
char me[2048];
int chars = readlink("/proc/self/exe", me, sizeof(me));
me[chars] = 0;
me[2047] = 0;
execl(me, basename(me), (char*)NULL);
}
#endif
}
void handle_siguser (int sig)
{
int uidnum;
if (sig == SIGTERM) {
my_exit_code=0;
delete_pid_file();
exit(0);
}
if (sig == SIGUSR1) {
char newuid[1024];
#ifndef NDEBUG
printf("Enter the new user ID:\n"); fflush(stdout);
#endif
char *eof;
newuid[0] = '\0';
newuid[sizeof(newuid)-1] = '\0';
eof = fgets(newuid, sizeof(newuid), stdin);
uidnum = atoi(newuid);
#ifndef NDEBUG
printf("Setting compton-tde process uid to %d...\n", uidnum); fflush(stdout);
#endif
my_exit_code=4;
delete_pid_file();
my_exit_code=3;
setuid(uidnum);
write_pid_file(getpid());
}
else {
uidnum = getuid();
}
if ((sig == SIGUSR1) || (sig == SIGUSR2)) {
get_cfg(ps_g, 0, 0, false); /* reload the configuration file */
/* set background/shadow picture using the new settings */
ps_g->cshadow_picture = solid_picture(ps_g, true, 1, ps_g->o.shadow_red, ps_g->o.shadow_green, ps_g->o.shadow_blue);
/* regenerate shadows using the new settings */
init_alpha_picts(ps_g);
init_filters(ps_g);
}
}
// === Fading === // === Fading ===
/** /**
@ -800,6 +935,12 @@ recheck_focus(session_t *ps) {
return NULL; return NULL;
} }
static Bool
determine_window_transparent_to_black(const session_t *ps, Window w);
static Bool
determine_window_transparent_to_desktop(const session_t *ps, Window w);
static bool static bool
get_root_tile(session_t *ps) { get_root_tile(session_t *ps) {
/* /*
@ -1890,6 +2031,45 @@ paint_all(session_t *ps, XserverRegion region, XserverRegion region_real, win *t
reg_data_t cache_reg = REG_DATA_INIT; reg_data_t cache_reg = REG_DATA_INIT;
if (!is_region_empty(ps, reg_paint, &cache_reg)) { if (!is_region_empty(ps, reg_paint, &cache_reg)) {
set_tgt_clip(ps, reg_paint, &cache_reg); set_tgt_clip(ps, reg_paint, &cache_reg);
/* Here we redraw the background of the transparent window if we want
to do anything special (i.e. anything other than showing the
windows and desktop prestacked behind of the window).
For example, if you want to blur the background or show another
background pixmap entirely here is the place to do it; simply
draw the new background onto ps->tgt_buffer.pict before continuing! */
switch (ps->o.backend) {
case BKEND_XRENDER:
case BKEND_XR_GLX_HYBRID:
{
if (w->show_root_tile) {
XRenderComposite (ps->dpy, PictOpSrc, ps->root_tile_paint.pict, None, ps->tgt_buffer.pict,
w->a.x, w->a.y, w->a.x, w->a.y,
w->a.x, w->a.y, w->widthb, w->heightb);
}
else if (w->show_black_background) {
XRenderComposite (ps->dpy, PictOpSrc, ps->black_picture, None, ps->tgt_buffer.pict,
w->a.x, w->a.y, w->a.x, w->a.y,
w->a.x, w->a.y, w->widthb, w->heightb);
}
break;
}
#ifdef CONFIG_VSYNC_OPENGL
case BKEND_GLX:
{
if (w->show_root_tile) {
glx_render(ps, ps->root_tile_paint.ptex, w->a.x, w->a.y, w->a.x, w->a.y, w->widthb, w->heightb,
ps->glx_z, 1.0, false, reg_paint, &cache_reg);
}
else if (w->show_black_background) {
glx_render_specified_color(ps, 0, w->a.x, w->a.y, w->widthb, w->heightb,
ps->glx_z, reg_paint, &cache_reg);
}
break;
}
#endif
}
// Blur window background // Blur window background
if (w->blur_background && (WMODE_SOLID != w->mode if (w->blur_background && (WMODE_SOLID != w->mode
|| (ps->o.blur_background_frame && w->frame_opacity))) { || (ps->o.blur_background_frame && w->frame_opacity))) {
@ -2131,6 +2311,11 @@ map_win(session_t *ps, Window id) {
// Make sure the XSelectInput() requests are sent // Make sure the XSelectInput() requests are sent
XFlush(ps->dpy); XFlush(ps->dpy);
/* This needs to be here since we don't get PropertyNotify when unmapped */
w->opacity = wid_get_opacity_prop(ps, w->id, OPAQUE);
w->show_root_tile = determine_window_transparent_to_desktop(ps, id);
w->show_black_background = determine_window_transparent_to_black(ps, id);
// Update window mode here to check for ARGB windows // Update window mode here to check for ARGB windows
win_determine_mode(ps, w); win_determine_mode(ps, w);
@ -2165,7 +2350,7 @@ map_win(session_t *ps, Window id) {
win_update_opacity_prop(ps, w); win_update_opacity_prop(ps, w);
w->flags |= WFLAG_OPCT_CHANGE; w->flags |= WFLAG_OPCT_CHANGE;
// Check for _COMPTON_SHADOW // Check for _TDE_WM_WINDOW_SHADOW
if (ps->o.respect_prop_shadow) if (ps->o.respect_prop_shadow)
win_update_prop_shadow_raw(ps, w); win_update_prop_shadow_raw(ps, w);
@ -2283,6 +2468,125 @@ get_opacity_percent(win *w) {
return ((double) w->opacity) / OPAQUE; return ((double) w->opacity) / OPAQUE;
} }
static Bool
get_window_transparent_to_desktop(const session_t *ps, Window w)
{
Atom actual;
int format;
unsigned long n, left;
unsigned char *data;
int result = XGetWindowProperty (ps->dpy, w, ps->atom_win_type_tde_transparent_to_desktop, 0L, 1L, False,
XA_ATOM, &actual, &format,
&n, &left, &data);
if (result == Success && data != None && format == 32 )
{
Atom a;
a = *(long*)data;
XFree ( (void *) data);
return True;
}
return False;
}
static Bool
get_window_transparent_to_black(const session_t *ps, Window w)
{
Atom actual;
int format;
unsigned long n, left;
unsigned char *data;
int result = XGetWindowProperty (ps->dpy, w, ps->atom_win_type_tde_transparent_to_black, 0L, 1L, False,
XA_ATOM, &actual, &format,
&n, &left, &data);
if (result == Success && data != None && format == 32 )
{
Atom a;
a = *(long*)data;
XFree ( (void *) data);
return True;
}
return False;
}
static Bool
determine_window_transparent_to_desktop (const session_t *ps, Window w)
{
Window root_return, parent_return;
Window *children = NULL;
unsigned int nchildren, i;
Bool type;
type = get_window_transparent_to_desktop (ps, w);
if (type == True) {
return True;
}
if (!XQueryTree (ps->dpy, w, &root_return, &parent_return, &children,
&nchildren))
{
/* XQueryTree failed. */
if (children)
XFree ((void *)children);
return False;
}
for (i = 0;i < nchildren;i++)
{
type = determine_window_transparent_to_desktop (ps, children[i]);
if (type == True)
return True;
}
if (children)
XFree ((void *)children);
return False;
}
static Bool
determine_window_transparent_to_black (const session_t *ps, Window w)
{
Window root_return, parent_return;
Window *children = NULL;
unsigned int nchildren, i;
Bool type;
Bool ret = False;
type = get_window_transparent_to_black (ps, w);
if (type == True) {
return True;
}
if (!XQueryTree (ps->dpy, w, &root_return, &parent_return, &children,
&nchildren))
{
/* XQueryTree failed. */
if (children) {
XFree ((void *)children);
}
return False;
}
for (i = 0;i < nchildren;i++)
{
type = determine_window_transparent_to_black (ps, children[i]);
if (type == True) {
ret = True;
break;
}
}
if (children) {
XFree ((void *)children);
}
return ret;
}
static void static void
win_determine_mode(session_t *ps, win *w) { win_determine_mode(session_t *ps, win *w) {
winmode_t mode = WMODE_SOLID; winmode_t mode = WMODE_SOLID;
@ -2375,7 +2679,8 @@ win_determine_fade(session_t *ps, win *w) {
if (UNSET != w->fade_force) if (UNSET != w->fade_force)
w->fade = w->fade_force; w->fade = w->fade_force;
else if ((ps->o.no_fading_openclose && w->in_openclose) else if ((ps->o.no_fading_openclose && w->in_openclose)
|| win_match(ps, w, ps->o.fade_blacklist, &w->cache_fblst)) || win_match(ps, w, ps->o.fade_blacklist, &w->cache_fblst)
|| (ps->o.no_fading_opacitychange && (!w->in_openclose)))
w->fade = false; w->fade = false;
else else
w->fade = ps->o.wintype_fade[w->window_type]; w->fade = ps->o.wintype_fade[w->window_type];
@ -2416,7 +2721,7 @@ win_update_shape(session_t *ps, win *w) {
} }
/** /**
* Reread _COMPTON_SHADOW property from a window. * Reread _TDE_WM_WINDOW_SHADOW property from a window.
* *
* The property must be set on the outermost window, usually the WM frame. * The property must be set on the outermost window, usually the WM frame.
*/ */
@ -2436,7 +2741,7 @@ win_update_prop_shadow_raw(session_t *ps, win *w) {
} }
/** /**
* Reread _COMPTON_SHADOW property from a window and update related * Reread _TDE_WM_WINDOW_SHADOW property from a window and update related
* things. * things.
*/ */
static void static void
@ -2621,8 +2926,8 @@ calc_win_size(session_t *ps, win *w) {
*/ */
static void static void
calc_shadow_geometry(session_t *ps, win *w) { calc_shadow_geometry(session_t *ps, win *w) {
w->shadow_dx = ps->o.shadow_offset_x; w->shadow_dx = ps->o.shadow_offset_x * w->shadow_size;
w->shadow_dy = ps->o.shadow_offset_y; w->shadow_dy = ps->o.shadow_offset_y * w->shadow_size;
w->shadow_width = w->widthb + ps->gaussian_map->size; w->shadow_width = w->widthb + ps->gaussian_map->size;
w->shadow_height = w->heightb + ps->gaussian_map->size; w->shadow_height = w->heightb + ps->gaussian_map->size;
} }
@ -2828,6 +3133,7 @@ add_win(session_t *ps, Window id, Window prev) {
.shadow_dy = 0, .shadow_dy = 0,
.shadow_width = 0, .shadow_width = 0,
.shadow_height = 0, .shadow_height = 0,
.shadow_size = 100,
.shadow_paint = PAINT_INIT, .shadow_paint = PAINT_INIT,
.prop_shadow = -1, .prop_shadow = -1,
@ -2837,6 +3143,9 @@ add_win(session_t *ps, Window id, Window prev) {
.invert_color_force = UNSET, .invert_color_force = UNSET,
.blur_background = false, .blur_background = false,
.show_black_background = false,
.show_root_tile = false,
}; };
// Reject overlay window and already added windows // Reject overlay window and already added windows
@ -3772,6 +4081,19 @@ opts_set_no_fading_openclose(session_t *ps, bool newval) {
} }
} }
/**
* Set no_fading_opacitychange option.
*/
void
opts_set_no_fading_opacitychange(session_t *ps, bool newval) {
if (newval != ps->o.no_fading_opacitychange) {
ps->o.no_fading_opacitychange = newval;
for (win *w = ps->list; w; w = w->next)
win_determine_fade(ps, w);
ps->ev_received = true;
}
}
//!@} //!@}
#endif #endif
@ -4160,7 +4482,7 @@ ev_property_notify(session_t *ps, XPropertyEvent *ev) {
} }
} }
// If _COMPTON_SHADOW changes // If _TDE_WM_WINDOW_SHADOW changes
if (ps->o.respect_prop_shadow && ps->atom_compton_shadow == ev->atom) { if (ps->o.respect_prop_shadow && ps->atom_compton_shadow == ev->atom) {
win *w = find_win(ps, ev->window); win *w = find_win(ps, ev->window);
if (w) if (w)
@ -4401,6 +4723,8 @@ usage(int ret) {
" Daemonize process.\n" " Daemonize process.\n"
"-S\n" "-S\n"
" Enable synchronous operation (for debugging).\n" " Enable synchronous operation (for debugging).\n"
"-v\n"
" Print version Number and exit\\n"
"--config path\n" "--config path\n"
" Look for configuration file at the path.\n" " Look for configuration file at the path.\n"
"--write-pid-path path\n" "--write-pid-path path\n"
@ -4427,6 +4751,8 @@ usage(int ret) {
" Mark windows that have no WM frame as active.\n" " Mark windows that have no WM frame as active.\n"
"--no-fading-openclose\n" "--no-fading-openclose\n"
" Do not fade on window open/close.\n" " Do not fade on window open/close.\n"
"--no-fading-opacitychange\n"
" Do not fade on window opacity change.\n"
"--shadow-ignore-shaped\n" "--shadow-ignore-shaped\n"
" Do not paint shadows on shaped windows.\n" " Do not paint shadows on shaped windows.\n"
"--detect-rounded-corners\n" "--detect-rounded-corners\n"
@ -4486,7 +4812,7 @@ usage(int ret) {
" Use _NET_WM_ACTIVE_WINDOW on the root window to determine which\n" " Use _NET_WM_ACTIVE_WINDOW on the root window to determine which\n"
" window is focused instead of using FocusIn/Out events.\n" " window is focused instead of using FocusIn/Out events.\n"
"--respect-prop-shadow\n" "--respect-prop-shadow\n"
" Respect _COMPTON_SHADOW. This a prototype-level feature, which\n" " Respect _TDE_WM_WINDOW_SHADOW. This a prototype-level feature, which\n"
" you must not rely on.\n" " you must not rely on.\n"
"--unredir-if-possible\n" "--unredir-if-possible\n"
" Unredirect all windows if a full-screen opaque window is\n" " Unredirect all windows if a full-screen opaque window is\n"
@ -4685,10 +5011,18 @@ register_cm(session_t *ps) {
s /= 10; s /= 10;
} }
Window w;
Atom a;
static char net_wm_cm[] = "_NET_WM_CM_Sxx";
snprintf (net_wm_cm, sizeof (net_wm_cm), "_NET_WM_CM_S%d", ps->scr);
a = XInternAtom (ps->dpy, net_wm_cm, False);
char *buf = malloc(len); char *buf = malloc(len);
snprintf(buf, len, REGISTER_PROP "%d", ps->scr); snprintf(buf, len, REGISTER_PROP "%d", ps->scr);
buf[len - 1] = '\0'; buf[len - 1] = '\0';
XSetSelectionOwner(ps->dpy, get_atom(ps, buf), ps->reg_win, 0); // setting this causes compton to abort on TDE login
// XSetSelectionOwner(ps->dpy, get_atom(ps, buf), ps->reg_win, 0);
free(buf); free(buf);
} }
@ -5090,8 +5424,8 @@ parse_rule_opacity(session_t *ps, const char *src) {
*/ */
static FILE * static FILE *
open_config_file(char *cpath, char **ppath) { open_config_file(char *cpath, char **ppath) {
const static char *config_filename = "/compton.conf"; const static char *config_filename = "/compton-tde.conf";
const static char *config_filename_legacy = "/.compton.conf"; const static char *config_filename_legacy = "/.compton-tde.conf";
const static char *config_home_suffix = "/.config"; const static char *config_home_suffix = "/.config";
const static char *config_system_dir = "/etc/xdg"; const static char *config_system_dir = "/etc/xdg";
@ -5307,6 +5641,8 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
wintype_arr_enable(ps->o.wintype_fade); wintype_arr_enable(ps->o.wintype_fade);
// --no-fading-open-close // --no-fading-open-close
lcfg_lookup_bool(&cfg, "no-fading-openclose", &ps->o.no_fading_openclose); lcfg_lookup_bool(&cfg, "no-fading-openclose", &ps->o.no_fading_openclose);
// --no-fading-opacitychange
lcfg_lookup_bool(&cfg, "no-fading-opacitychange", &ps->o.no_fading_opacitychange);
// --shadow-red // --shadow-red
config_lookup_float(&cfg, "shadow-red", &ps->o.shadow_red); config_lookup_float(&cfg, "shadow-red", &ps->o.shadow_red);
// --shadow-green // --shadow-green
@ -5439,6 +5775,10 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
} }
config_destroy(&cfg); config_destroy(&cfg);
// Adjust shadow offsets
ps->o.shadow_offset_x = ((-ps->o.shadow_radius * 7 / 5) - ps->o.shadow_offset_x * ps->o.shadow_radius / 100);
ps->o.shadow_offset_y = ((-ps->o.shadow_radius * 7 / 5) - ps->o.shadow_offset_y * ps->o.shadow_radius / 100);
} }
#endif #endif
@ -5447,7 +5787,7 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
*/ */
static void static void
get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) { get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
const static char *shortopts = "D:I:O:d:r:o:m:l:t:i:e:hscnfFCaSzGb"; const static char *shortopts = "D:I:O:d:r:o:m:l:t:i:e:hvscnfFCaSzGb";
const static struct option longopts[] = { const static struct option longopts[] = {
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "config", required_argument, NULL, 256 }, { "config", required_argument, NULL, 256 },
@ -5522,6 +5862,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
{ "vsync-use-glfinish", no_argument, NULL, 311 }, { "vsync-use-glfinish", no_argument, NULL, 311 },
{ "xrender-sync", no_argument, NULL, 312 }, { "xrender-sync", no_argument, NULL, 312 },
{ "xrender-sync-fence", no_argument, NULL, 313 }, { "xrender-sync-fence", no_argument, NULL, 313 },
{ "no-fading-opacitychange", no_argument, NULL, 314 },
// Must terminate with a NULL entry // Must terminate with a NULL entry
{ NULL, 0, NULL, 0 }, { NULL, 0, NULL, 0 },
}; };
@ -5593,6 +5934,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
case 'h': case 'h':
usage(0); usage(0);
break; break;
case 'v': fprintf (stderr, "%s v%-3.2f\n", argv[0], _TDE_COMP_MGR_VERSION_); my_exit_code=0; exit (0);
case 'd': case 'd':
case 'S': case 'S':
break; break;
@ -5774,6 +6116,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
P_CASEBOOL(311, vsync_use_glfinish); P_CASEBOOL(311, vsync_use_glfinish);
P_CASEBOOL(312, xrender_sync); P_CASEBOOL(312, xrender_sync);
P_CASEBOOL(313, xrender_sync_fence); P_CASEBOOL(313, xrender_sync_fence);
P_CASEBOOL(314, no_fading_opacitychange);
default: default:
usage(1); usage(1);
break; break;
@ -5879,7 +6222,7 @@ init_atoms(session_t *ps) {
ps->atom_transient = XA_WM_TRANSIENT_FOR; ps->atom_transient = XA_WM_TRANSIENT_FOR;
ps->atom_client_leader = get_atom(ps, "WM_CLIENT_LEADER"); ps->atom_client_leader = get_atom(ps, "WM_CLIENT_LEADER");
ps->atom_ewmh_active_win = get_atom(ps, "_NET_ACTIVE_WINDOW"); ps->atom_ewmh_active_win = get_atom(ps, "_NET_ACTIVE_WINDOW");
ps->atom_compton_shadow = get_atom(ps, "_COMPTON_SHADOW"); ps->atom_compton_shadow = get_atom(ps, "_TDE_WM_WINDOW_SHADOW");
ps->atom_win_type = get_atom(ps, "_NET_WM_WINDOW_TYPE"); ps->atom_win_type = get_atom(ps, "_NET_WM_WINDOW_TYPE");
ps->atoms_wintypes[WINTYPE_UNKNOWN] = 0; ps->atoms_wintypes[WINTYPE_UNKNOWN] = 0;
@ -5911,6 +6254,9 @@ init_atoms(session_t *ps) {
"_NET_WM_WINDOW_TYPE_COMBO"); "_NET_WM_WINDOW_TYPE_COMBO");
ps->atoms_wintypes[WINTYPE_DND] = get_atom(ps, ps->atoms_wintypes[WINTYPE_DND] = get_atom(ps,
"_NET_WM_WINDOW_TYPE_DND"); "_NET_WM_WINDOW_TYPE_DND");
ps->atom_win_type_tde_transparent_to_black = get_atom(ps, "_TDE_TRANSPARENT_TO_BLACK");
ps->atom_win_type_tde_transparent_to_desktop = get_atom(ps, "_TDE_TRANSPARENT_TO_DESKTOP");
} }
/** /**
@ -6754,6 +7100,7 @@ session_init(session_t *ps_old, int argc, char **argv) {
.fade_out_step = 0.03 * OPAQUE, .fade_out_step = 0.03 * OPAQUE,
.fade_delta = 10, .fade_delta = 10,
.no_fading_openclose = false, .no_fading_openclose = false,
.no_fading_opacitychange = false,
.fade_blacklist = NULL, .fade_blacklist = NULL,
.wintype_opacity = { 0.0 }, .wintype_opacity = { 0.0 },
@ -6871,6 +7218,8 @@ session_init(session_t *ps_old, int argc, char **argv) {
.atom_ewmh_active_win = None, .atom_ewmh_active_win = None,
.atom_compton_shadow = None, .atom_compton_shadow = None,
.atom_win_type = None, .atom_win_type = None,
.atom_win_type_tde_transparent_to_black = None,
.atom_win_type_tde_transparent_to_desktop = None,
.atoms_wintypes = { 0 }, .atoms_wintypes = { 0 },
.track_atom_lst = NULL, .track_atom_lst = NULL,
@ -7098,6 +7447,8 @@ session_init(session_t *ps_old, int argc, char **argv) {
cxinerama_upd_scrs(ps); cxinerama_upd_scrs(ps);
fprintf(stderr, "Started\n");
// Create registration window // Create registration window
if (!ps->reg_win && !register_cm(ps)) if (!ps->reg_win && !register_cm(ps))
exit(1); exit(1);
@ -7470,17 +7821,14 @@ main(int argc, char **argv) {
// correctly // correctly
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
// Set up SIGUSR1 signal handler to reset program // Initialize signal handlers
{ sigfillset(&block_mask);
sigset_t block_mask; usr_action.sa_handler = handle_siguser;
sigemptyset(&block_mask); usr_action.sa_mask = block_mask;
const struct sigaction action= { usr_action.sa_flags = 0;
.sa_handler = reset_enable, sigaction(SIGUSR1, &usr_action, NULL);
.sa_mask = block_mask, sigaction(SIGUSR2, &usr_action, NULL);
.sa_flags = 0 sigaction(SIGTERM, &usr_action, NULL);
};
sigaction(SIGUSR1, &action, NULL);
}
// Main loop // Main loop
session_t *ps_old = ps_g; session_t *ps_old = ps_g;
@ -7490,6 +7838,11 @@ main(int argc, char **argv) {
printf_errf("(): Failed to create new session."); printf_errf("(): Failed to create new session.");
return 1; return 1;
} }
/* Under no circumstances should these two lines EVER be moved earlier in main() than this point */
atexit(delete_pid_file);
write_pid_file(getpid());
session_run(ps_g); session_run(ps_g);
ps_old = ps_g; ps_old = ps_g;
session_destroy(ps_g); session_destroy(ps_g);

@ -17,6 +17,9 @@
#include <locale.h> #include <locale.h>
#include <signal.h> #include <signal.h>
#include <sys/types.h>
#include <pwd.h>
#ifdef CONFIG_VSYNC_DRM #ifdef CONFIG_VSYNC_DRM
#include <fcntl.h> #include <fcntl.h>
// We references some definitions in drm.h, which could also be found in // We references some definitions in drm.h, which could also be found in
@ -754,6 +757,9 @@ unmap_win(session_t *ps, win *w);
static opacity_t static opacity_t
wid_get_opacity_prop(session_t *ps, Window wid, opacity_t def); wid_get_opacity_prop(session_t *ps, Window wid, opacity_t def);
static bool
init_filters(session_t *ps);
/** /**
* Reread opacity property of a window. * Reread opacity property of a window.
*/ */

@ -4,6 +4,7 @@
* Based on `xcompmgr` - Copyright (c) 2003, Keith Packard * Based on `xcompmgr` - Copyright (c) 2003, Keith Packard
* *
* Copyright (c) 2011-2013, Christopher Jeffrey * Copyright (c) 2011-2013, Christopher Jeffrey
* Copyright (c) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
* See LICENSE for more information. * See LICENSE for more information.
* *
*/ */
@ -1508,6 +1509,41 @@ glx_render(session_t *ps, const glx_texture_t *ptex,
return true; return true;
} }
/**
* @brief Render a region with a specified color.
*/
bool
glx_render_specified_color(session_t *ps, int color, int dx, int dy, int width, int height, int z,
XserverRegion reg_tgt, const reg_data_t *pcache_reg) {
glColor4f(color,
color,
color,
1.0f
);
{
P_PAINTREG_START();
{
GLint rdx = crect.x;
GLint rdy = ps->root_height - crect.y;
GLint rdxe = rdx + crect.width;
GLint rdye = rdy - crect.height;
glVertex3i(rdx, rdy, z);
glVertex3i(rdxe, rdy, z);
glVertex3i(rdxe, rdye, z);
glVertex3i(rdx, rdye, z);
}
P_PAINTREG_END();
}
glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
glx_check_err(ps);
return true;
}
/** /**
* Render a region with color. * Render a region with color.
*/ */

Loading…
Cancel
Save