Skip to content

Commit b46deb5

Browse files
committed
Improvement #41: Enable/disable redirection through D-Bus
- Add "redirected_force" to D-Bus opts_get to forcefully redirect/unredirect windows. - Add D-Bus method "repaint", to, namely, repaint the screen.
1 parent b1e0ef8 commit b46deb5

File tree

4 files changed

+39
-11
lines changed

4 files changed

+39
-11
lines changed

dbus-examples/cdbus-driver.sh

+10
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,13 @@ dbus-send --print-reply --dest="$service" "$object" "${interface}.opts_get" stri
5151
sleep 3
5252
dbus-send --print-reply --dest="$service" "$object" "${interface}.reset"
5353

54+
# Undirect window
55+
sleep 3
56+
dbus-send --print-reply --dest="$service" "$object" "${interface}.opts_set" string:redirected_force uint16:0
57+
58+
# Revert back to auto
59+
sleep 3
60+
dbus-send --print-reply --dest="$service" "$object" "${interface}.opts_set" string:redirected_force uint16:2
61+
62+
# Force repaint
63+
dbus-send --print-reply --dest="$service" "$object" "${interface}.repaint"

src/common.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,8 @@ typedef struct {
460460
/// Whether to unredirect all windows if a full-screen opaque window
461461
/// is detected.
462462
bool unredir_if_possible;
463+
/// Forced redirection setting through D-Bus.
464+
switch_t redirected_force;
463465
/// Whether to enable D-Bus support.
464466
bool dbus;
465467
/// Path to log file.
@@ -647,9 +649,6 @@ typedef struct {
647649
XserverRegion all_damage_last[CGLX_MAX_BUFFER_AGE];
648650
/// Whether all windows are currently redirected.
649651
bool redirected;
650-
/// Whether there's a highest full-screen window, and all windows could
651-
/// be unredirected.
652-
bool unredir_possible;
653652
/// Pre-generated alpha pictures.
654653
Picture *alpha_picts;
655654
/// Whether all reg_ignore of windows should expire in this paint.

src/compton.c

+9-8
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ get_alpha_pict_o(session_t *ps, opacity_t o) {
10761076
static win *
10771077
paint_preprocess(session_t *ps, win *list) {
10781078
// Initialize unredir_possible
1079-
ps->unredir_possible = false;
1079+
bool unredir_possible = false;
10801080

10811081
win *w;
10821082
win *t = NULL, *next = NULL;
@@ -1229,13 +1229,13 @@ paint_preprocess(session_t *ps, win *list) {
12291229

12301230
last_reg_ignore = w->reg_ignore;
12311231

1232-
if (is_highest && to_paint) {
1232+
if (ps->o.unredir_if_possible && is_highest && to_paint) {
12331233
is_highest = false;
12341234
// Disable unredirection for multi-screen setups
12351235
if (WMODE_SOLID == w->mode
12361236
&& (!w->frame_opacity || !win_has_frame(w))
12371237
&& win_is_fullscreen(ps, w))
1238-
ps->unredir_possible = true;
1238+
unredir_possible = true;
12391239
}
12401240

12411241
// Reset flags
@@ -1259,12 +1259,13 @@ paint_preprocess(session_t *ps, win *list) {
12591259
}
12601260

12611261
// If possible, unredirect all windows and stop painting
1262-
if (ps->o.unredir_if_possible && ps->unredir_possible) {
1262+
if (UNSET != ps->o.redirected_force)
1263+
unredir_possible = !ps->o.redirected_force;
1264+
1265+
if (unredir_possible)
12631266
redir_stop(ps);
1264-
}
1265-
else {
1267+
else
12661268
redir_start(ps);
1267-
}
12681269

12691270
return t;
12701271
}
@@ -6365,6 +6366,7 @@ session_init(session_t *ps_old, int argc, char **argv) {
63656366
.paint_on_overlay = false,
63666367
.resize_damage = 0,
63676368
.unredir_if_possible = false,
6369+
.redirected_force = UNSET,
63686370
.dbus = false,
63696371
.benchmark = 0,
63706372
.benchmark_wid = None,
@@ -6435,7 +6437,6 @@ session_init(session_t *ps_old, int argc, char **argv) {
64356437
.all_damage_last = { None },
64366438
.time_start = { 0, 0 },
64376439
.redirected = false,
6438-
.unredir_possible = false,
64396440
.alpha_picts = NULL,
64406441
.reg_ignore_expire = false,
64416442
.idling = false,

src/dbus.c

+18
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,12 @@ cdbus_process(session_t *ps, DBusMessage *msg) {
582582
cdbus_reply_bool(ps, msg, true);
583583
success = true;
584584
}
585+
else if (cdbus_m_ismethod("repaint")) {
586+
force_repaint(ps);
587+
if (!dbus_message_get_no_reply(msg))
588+
cdbus_reply_bool(ps, msg, true);
589+
success = true;
590+
}
585591
else if (cdbus_m_ismethod("list_win")) {
586592
success = cdbus_process_list_win(ps, msg);
587593
}
@@ -892,6 +898,7 @@ cdbus_process_opts_get(session_t *ps, DBusMessage *msg) {
892898
cdbus_m_opts_get_do(detect_rounded_corners, cdbus_reply_bool);
893899
cdbus_m_opts_get_do(paint_on_overlay, cdbus_reply_bool);
894900
cdbus_m_opts_get_do(unredir_if_possible, cdbus_reply_bool);
901+
cdbus_m_opts_get_do(redirected_force, cdbus_reply_enum);
895902
cdbus_m_opts_get_do(logpath, cdbus_reply_string);
896903
cdbus_m_opts_get_do(synchronize, cdbus_reply_bool);
897904

@@ -1064,6 +1071,16 @@ cdbus_process_opts_set(session_t *ps, DBusMessage *msg) {
10641071
return true;
10651072
}
10661073

1074+
// redirected_force
1075+
if (!strcmp("redirected_force", target)) {
1076+
cdbus_enum_t val = UNSET;
1077+
if (!cdbus_msg_get_arg(msg, 1, CDBUS_TYPE_ENUM, &val))
1078+
return false;
1079+
ps->o.redirected_force = val;
1080+
force_repaint(ps);
1081+
goto cdbus_process_opts_set_success;
1082+
}
1083+
10671084
#undef cdbus_m_opts_set_do
10681085

10691086
printf_errf("(): " CDBUS_ERROR_BADTGT_S, target);
@@ -1117,6 +1134,7 @@ cdbus_process_introspect(session_t *ps, DBusMessage *msg) {
11171134
" <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n"
11181135
" </signal>\n"
11191136
" <method name='reset' />\n"
1137+
" <method name='repaint' />\n"
11201138
" </interface>\n"
11211139
"</node>\n";
11221140

0 commit comments

Comments
 (0)