Skip to content

Commit 3187ffb

Browse files
committed
gui-agent: switch to automatic composition mode, fix in-vm screenshots
For in-vm screenshots (including screen sharing etc) to work, window composition buffers needs to be rendered back to root window. Using "automatic" composition mode does that. Since it may have noticeable performance impact, add an option to disable it. Fixes QubesOS/qubes-issues#4351
1 parent b6de187 commit 3187ffb

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

gui-agent/vmside.c

+18-4
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ struct _global_handles {
8686
unsigned int clipboard_data_len;
8787
int log_level;
8888
int sync_all_modifiers;
89+
int composite_redirect_automatic;
8990
};
9091

9192
struct window_data {
@@ -1943,11 +1944,12 @@ void handle_guid_disconnect()
19431944

19441945
void usage()
19451946
{
1946-
fprintf(stderr, "Usage: qubes_gui [-v] [-q] [-h]\n");
1947+
fprintf(stderr, "Usage: qubes_gui [options]\n");
19471948
fprintf(stderr, " -v increase log verbosity\n");
19481949
fprintf(stderr, " -q decrease log verbosity\n");
19491950
fprintf(stderr, " -m sync all modifiers before key event (default)\n");
19501951
fprintf(stderr, " -M sync only Caps Lock key event\n");
1952+
fprintf(stderr, " -c turn off composite \"redirect automatic\" mode\n");
19511953
fprintf(stderr, " -h print this message\n");
19521954
fprintf(stderr, "\n");
19531955
fprintf(stderr, "Log levels:\n");
@@ -1963,7 +1965,8 @@ void parse_args(Ghandles * g, int argc, char **argv)
19631965
// defaults
19641966
g->log_level = 0;
19651967
g->sync_all_modifiers = 1;
1966-
while ((opt = getopt(argc, argv, "qvhmM")) != -1) {
1968+
g->composite_redirect_automatic = 1;
1969+
while ((opt = getopt(argc, argv, "qvchmM")) != -1) {
19671970
switch (opt) {
19681971
case 'q':
19691972
g->log_level--;
@@ -1977,6 +1980,9 @@ void parse_args(Ghandles * g, int argc, char **argv)
19771980
case 'M':
19781981
g->sync_all_modifiers = 0;
19791982
break;
1983+
case 'c':
1984+
g->composite_redirect_automatic = 0;
1985+
break;
19801986
case 'h':
19811987
usage();
19821988
exit(0);
@@ -2013,11 +2019,19 @@ int main(int argc, char **argv)
20132019
mkghandles(&g);
20142020
ghandles_for_vchan_reinitialize = &g;
20152021
parse_args(&g, argc, argv);
2022+
/* Turn on Composite for all children of root window. This way X server
2023+
* keeps separate buffers for each (root child) window.
2024+
* There are two modes:
2025+
* - manual - this way only off-screen buffers are maintained
2026+
* - automatic - in addition to manual, widows are rendered back to the
2027+
* root window
2028+
*/
20162029
for (i = 0; i < ScreenCount(g.display); i++)
20172030
XCompositeRedirectSubwindows(g.display,
20182031
RootWindow(g.display, i),
2019-
// CompositeRedirectAutomatic);
2020-
CompositeRedirectManual);
2032+
(g.composite_redirect_automatic ?
2033+
CompositeRedirectAutomatic :
2034+
CompositeRedirectManual));
20212035
for (i = 0; i < ScreenCount(g.display); i++)
20222036
XSelectInput(g.display, RootWindow(g.display, i),
20232037
SubstructureNotifyMask);

0 commit comments

Comments
 (0)