summaryrefslogtreecommitdiff
path: root/src/core/restart-helper.c
blob: 24664a9c96550fd790b06e561a9b5e02dc75d25a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

/*
 * restart-helper
 * 
 * Helper program during a restart
 *
 * To smoothly restart Mutter, we want to keep the composite
 * overlay window enabled during the restart. This is done by
 * spawning this program, which keeps a reference to the the composite
 * overlay window until Mutter picks it back up.
 */

/*
 * Copyright (C) 2014 Red Hat, Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#include "config.h"

#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xcomposite.h>

int
main (int    argc,
      char **argv)
{
  Display *display = XOpenDisplay (NULL);
  Window selection_window;
  XSetWindowAttributes xwa;
  unsigned long mask = 0;

  xwa.override_redirect = True;
  mask |= CWOverrideRedirect;


  XCompositeGetOverlayWindow (display, DefaultRootWindow (display));

  selection_window = XCreateWindow (display,
				    DefaultRootWindow (display),
				    -100, -100, 1, 1, 0,
				    0,
				    InputOnly,
				    DefaultVisual (display, DefaultScreen (display)),
				    mask, &xwa);

  XSetSelectionOwner (display,
		      XInternAtom (display, "_MUTTER_RESTART_HELPER", False),
		      selection_window,
		      CurrentTime);

  /* Mutter looks for an (arbitrary) line printed to stdout to know that
   * we have started and have a reference to the COW. XSync() so that
   * everything is set on the X server before Mutter starts restarting.
   */
  XSync (display, False);

  printf ("STARTED\n");
  fflush (stdout);

  while (True)
    {
      XEvent xev;

      XNextEvent (display, &xev);
      /* Mutter restarted and unset the selection to indicate that
       * it has a reference on the COW again */
      if (xev.xany.type == SelectionClear)
	return 0;
    }
}