summaryrefslogtreecommitdiffstats
path: root/Should-set-RestartStyleHint-to-RestartIfRunning-when.patch
blob: c674d13261168d2d769b66a4122baedfb7cd5fd6 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
From a3de65d5d1861f755ced7cad291fbbd4f1b8ef51 Mon Sep 17 00:00:00 2001
From: Owen W. Taylor <otaylor@fishsoup.net>
Date: Sat, 22 Aug 2009 15:00:57 -0400
Subject: [PATCH] Should set RestartStyleHint to RestartIfRunning when replaced

This reverts most of commit abbd057eb967e6ab462ffe305f41b2b04d417b25;

 - It's fine to call meta_session_shutdown() after the display
   is closed, since it's talking over the ICE connection
 - We should not call warn_about_lame_clients_and_finish_interact()
   unless we are interacting with the window manager in a session
   save.

However, the part of abbd057 that fixed accessing freed memory was
fixing a real problem; this patches does the same thing in a simpler
way by fixing an obvious type in meta_display_close() where it was
NULL'ing out the local variable 'display' rather than the global
variable 'the_display' and adding keeping the check in meta_finalize()
that was added in abbd057.

The order of calling meta_session_shutdown() and
calling meta_display_close() is reverted back to the old order to
make it clear that it's OK if the display way already closed previously.

http://bugzilla.gnome.org/show_bug.cgi?id=588119
---
 src/core/display-private.h |    2 +-
 src/core/display.c         |   16 ++++------------
 src/core/main.c            |    5 ++---
 src/core/session.c         |    8 --------
 4 files changed, 7 insertions(+), 24 deletions(-)

diff --git a/src/core/display-private.h b/src/core/display-private.h
index 19287f3..9c8ebc6 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -329,7 +329,7 @@ MetaScreen*   meta_display_screen_for_xwindow  (MetaDisplay *display,
 void          meta_display_grab                (MetaDisplay *display);
 void          meta_display_ungrab              (MetaDisplay *display);
 
-void          meta_display_unmanage_screen     (MetaDisplay **display,
+void          meta_display_unmanage_screen     (MetaDisplay *display,
                                                 MetaScreen  *screen,
                                                 guint32      timestamp);
 
diff --git a/src/core/display.c b/src/core/display.c
index 55c374a..8e35a35 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -926,7 +926,7 @@ meta_display_close (MetaDisplay *display,
     meta_compositor_destroy (display->compositor);
   
   g_free (display);
-  display = NULL;
+  the_display = NULL;
 
   meta_quit (META_EXIT_SUCCESS);
 }
@@ -4762,13 +4762,10 @@ process_selection_clear (MetaDisplay   *display,
       meta_verbose ("Got selection clear for screen %d on display %s\n",
                     screen->number, display->name);
       
-      meta_display_unmanage_screen (&display, 
+      meta_display_unmanage_screen (display, 
                                     screen,
                                     event->xselectionclear.time);
 
-      if (!display)
-        the_display = NULL;
-
       /* display and screen may both be invalid memory... */
       
       return;
@@ -4790,12 +4787,10 @@ process_selection_clear (MetaDisplay   *display,
 }
 
 void
-meta_display_unmanage_screen (MetaDisplay **displayp,
+meta_display_unmanage_screen (MetaDisplay *display,
                               MetaScreen  *screen,
                               guint32      timestamp)
 {
-  MetaDisplay *display = *displayp;
-
   meta_verbose ("Unmanaging screen %d on display %s\n",
                 screen->number, display->name);
   
@@ -4805,10 +4800,7 @@ meta_display_unmanage_screen (MetaDisplay **displayp,
   display->screens = g_slist_remove (display->screens, screen);
 
   if (display->screens == NULL)
-    {
-      meta_display_close (display, timestamp);
-      *displayp = NULL;
-    }
+    meta_display_close (display, timestamp);
 }
 
 void
diff --git a/src/core/main.c b/src/core/main.c
index a36a396..44d317e 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -361,12 +361,11 @@ static void
 meta_finalize (void)
 {
   MetaDisplay *display = meta_get_display();
-
-  meta_session_shutdown ();
-
   if (display)
     meta_display_close (display,
                         CurrentTime); /* I doubt correct timestamps matter here */
+
+  meta_session_shutdown ();
 }
 
 static void
diff --git a/src/core/session.c b/src/core/session.c
index 7e3b389..0d69350 100644
--- a/src/core/session.c
+++ b/src/core/session.c
@@ -376,14 +376,6 @@ meta_session_shutdown (void)
   SmProp *props[1];
   char hint = SmRestartIfRunning;
 
-  if (!meta_get_display ())
-    {
-      meta_verbose ("Cannot close session because there is no display");
-      return;
-    }
-
-  warn_about_lame_clients_and_finish_interact (FALSE);
-
   if (session_connection == NULL)
     return;
   
-- 
1.6.4