~ubuntu-branches/ubuntu/dapper/kdebase/dapper-updates

« back to all changes in this revision

Viewing changes to debian/patches/kubuntu_58_kwin_branch.diff

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2006-04-14 15:35:56 UTC
  • Revision ID: james.westby@ubuntu.com-20060414153556-7gn8mkklo60v15pc
Tags: 4:3.5.2-0ubuntu8
Add kubuntu_58_kwin_branch.diff fixes crash on alt-tab and 
focus policies

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
diff -urN tag/kwin/activation.cpp kwin/activation.cpp
 
2
--- kdebase/kwin/activation.cpp 2006-04-14 15:33:17.000000000 +0000
 
3
+++ kdebase/kwin/activation.cpp 2006-04-14 15:29:53.000000000 +0000
 
4
@@ -231,7 +231,7 @@
 
5
         last_active_client = active_client;
 
6
     if ( active_client ) 
 
7
         {
 
8
-        updateFocusChains( active_client, true ); // make it first in focus chain
 
9
+        updateFocusChains( active_client, FocusChainMakeFirst );
 
10
         active_client->demandAttention( false );
 
11
         }
 
12
     pending_take_activity = NULL;
 
13
diff -urN tag/kwin/client.cpp kwin/client.cpp
 
14
--- kdebase/kwin/client.cpp     2006-04-14 15:33:17.000000000 +0000
 
15
+++ kdebase/kwin/client.cpp     2006-04-14 15:29:53.000000000 +0000
 
16
@@ -578,7 +578,7 @@
 
17
     updateAllowedActions();
 
18
     workspace()->updateMinimizedOfTransients( this );
 
19
     updateWindowRules();
 
20
-    workspace()->updateFocusChains( this, false ); // make it last in the focus chain
 
21
+    workspace()->updateFocusChains( this, Workspace::FocusChainMakeLast );
 
22
     }
 
23
 
 
24
 void Client::unminimize( bool avoid_animation )
 
25
@@ -895,7 +895,16 @@
 
26
         }
 
27
     if( show )
 
28
         {
 
29
-        if( workspace()->showingDesktop())
 
30
+        bool belongs_to_desktop = false;
 
31
+        for( ClientList::ConstIterator it = group()->members().begin();
 
32
+             it != group()->members().end();
 
33
+             ++it )
 
34
+            if( (*it)->isDesktop())
 
35
+                {
 
36
+                belongs_to_desktop = true;
 
37
+                break;
 
38
+                }
 
39
+        if( !belongs_to_desktop && workspace()->showingDesktop())
 
40
             workspace()->resetShowingDesktop( true );
 
41
         if( isShade())
 
42
             setMappingState( IconicState );
 
43
@@ -1149,7 +1158,8 @@
 
44
     info->setState( b?NET::SkipTaskbar:0, NET::SkipTaskbar );
 
45
     updateWindowRules();
 
46
     if( was_wants_tab_focus != wantsTabFocus())
 
47
-        workspace()->updateFocusChains( this, isActive());
 
48
+        workspace()->updateFocusChains( this,
 
49
+            isActive() ? Workspace::FocusChainMakeFirst : Workspace::FocusChainUpdate );
 
50
     }
 
51
 
 
52
 void Client::setSkipPager( bool b )
 
53
@@ -1191,7 +1201,7 @@
 
54
         }
 
55
     if( decoration != NULL )
 
56
         decoration->desktopChange();
 
57
-    workspace()->updateFocusChains( this, true );
 
58
+    workspace()->updateFocusChains( this, Workspace::FocusChainMakeFirst );
 
59
     updateVisibility();
 
60
     updateWindowRules();
 
61
     }
 
62
diff -urN tag/kwin/clients/b2/b2client.cpp kwin/clients/b2/b2client.cpp
 
63
--- kdebase/kwin/clients/b2/b2client.cpp        2006-04-14 15:33:13.000000000 +0000
 
64
+++ kdebase/kwin/clients/b2/b2client.cpp        2006-04-14 15:29:39.000000000 +0000
 
65
@@ -530,7 +530,7 @@
 
66
     if (drawSmallBorders && (maximizeMode() & MaximizeVertical)) {
 
67
        return false;
 
68
     } else {
 
69
-       return do_draw_handle & resizable;
 
70
+       return do_draw_handle && resizable;
 
71
     }
 
72
 }
 
73
 
 
74
diff -urN tag/kwin/clients/default/kdedefault.cpp kwin/clients/default/kdedefault.cpp
 
75
--- kdebase/kwin/clients/default/kdedefault.cpp 2006-04-14 15:33:14.000000000 +0000
 
76
+++ kdebase/kwin/clients/default/kdedefault.cpp 2006-04-14 15:29:40.000000000 +0000
 
77
@@ -808,7 +808,7 @@
 
78
                case LM_ExplicitButtonSpacer:
 
79
                        if ( !isToolWindow() )
 
80
                                return borderWidth/2;
 
81
-
 
82
+                       // fall though
 
83
                default:
 
84
                        return KCommonDecoration::layoutMetric(lm, respectWindowState, btn);
 
85
        }
 
86
diff -urN tag/kwin/events.cpp kwin/events.cpp
 
87
--- kdebase/kwin/events.cpp     2006-04-14 15:33:17.000000000 +0000
 
88
+++ kdebase/kwin/events.cpp     2006-04-14 15:29:53.000000000 +0000
 
89
@@ -370,7 +370,7 @@
 
90
             if( c )
 
91
                 {
 
92
                 c->windowEvent( e );
 
93
-                updateFocusChains( c, true );
 
94
+                updateFocusChains( c, FocusChainUpdate );
 
95
                 return true;
 
96
                 }
 
97
             break;
 
98
@@ -402,15 +402,15 @@
 
99
             if ( e->xconfigurerequest.parent == root ) 
 
100
                 {
 
101
                 XWindowChanges wc;
 
102
-                unsigned int value_mask = 0;
 
103
-                wc.border_width = 0;
 
104
+                wc.border_width = e->xconfigurerequest.border_width;
 
105
                 wc.x = e->xconfigurerequest.x;
 
106
                 wc.y = e->xconfigurerequest.y;
 
107
                 wc.width = e->xconfigurerequest.width;
 
108
                 wc.height = e->xconfigurerequest.height;
 
109
                 wc.sibling = None;
 
110
                 wc.stack_mode = Above;
 
111
-                value_mask = e->xconfigurerequest.value_mask | CWBorderWidth;
 
112
+                unsigned int value_mask = e->xconfigurerequest.value_mask
 
113
+                    & ( CWX | CWY | CWWidth | CWHeight | CWBorderWidth );
 
114
                 XConfigureWindow( qt_xdisplay(), e->xconfigurerequest.window, value_mask, &wc );
 
115
                 return true;
 
116
                 }
 
117
diff -urN tag/kwin/eventsrc kwin/eventsrc
 
118
--- kdebase/kwin/eventsrc       2006-04-14 15:33:17.000000000 +0000
 
119
+++ kdebase/kwin/eventsrc       2006-04-14 15:29:53.000000000 +0000
 
120
@@ -1207,6 +1207,7 @@
 
121
 Name[fy]=Gean nei buroblêd 9
 
122
 Name[ga]=Téigh go Deasc 9
 
123
 Name[gl]=Ir ao Escritório 9
 
124
+Name[he]=מעבר לשולחן עבודה 9
 
125
 Name[hu]=Váltás a 9. asztalra
 
126
 Name[is]=Birta skjáborð 9
 
127
 Name[it]=Va al desktop 9
 
128
@@ -1256,6 +1257,7 @@
 
129
 Comment[fy]=Firtueel buroblêd njoggen is selektearre
 
130
 Comment[ga]=Roghnaíodh deasc fhíorúil a naoi
 
131
 Comment[gl]=Selecciona-se o escritório virtual número nove
 
132
+Comment[he]=שולחן העבודה הווירטואלי תשע נבחר
 
133
 Comment[hu]=A 9. asztal kiválasztva
 
134
 Comment[is]=Sýndarskjáborð níu er virkt
 
135
 Comment[it]=Il desktop virtuale nove viene selezionato.
 
136
@@ -1307,6 +1309,7 @@
 
137
 Name[fy]=Gean nei buroblêd 10
 
138
 Name[ga]=Téigh go Deasc 10
 
139
 Name[gl]=Ir ao Escritório 10
 
140
+Name[he]=מעבר לשולחן עבודה 10
 
141
 Name[hu]=Váltás a 10. asztalra
 
142
 Name[is]=Birta skjáborð 10
 
143
 Name[it]=Va al desktop 10
 
144
@@ -1356,6 +1359,7 @@
 
145
 Comment[fy]=Firtueel buroblêd tsien is selektearre
 
146
 Comment[ga]=Roghnaíodh deasc fhíorúil a deich
 
147
 Comment[gl]=Escolle-se o escritório virtual número dez
 
148
+Comment[he]=שולחן העבודה הווירטואלי עשר נבחר
 
149
 Comment[hu]=A 10. asztal kiválasztva
 
150
 Comment[is]=Sýndarskjáborð tíu er virkt
 
151
 Comment[it]=Il desktop virtuale dieci viene selezionato.
 
152
@@ -1408,6 +1412,7 @@
 
153
 Name[fy]=Gean nei buroblêd 11
 
154
 Name[ga]=Téigh go Deasc 11
 
155
 Name[gl]=Ir ao Escritório 11
 
156
+Name[he]=מעבר לשולחן עבודה 11
 
157
 Name[hu]=Váltás a 11. asztalra
 
158
 Name[is]=Birta skjáborð 11
 
159
 Name[it]=Va al desktop 11
 
160
@@ -1457,6 +1462,7 @@
 
161
 Comment[fy]=Firtueel buroblêd alve is selektearre
 
162
 Comment[ga]=Roghnaíodh deasc fhíorúil a haon déag
 
163
 Comment[gl]=Escolle-se o escritório virtual número once
 
164
+Comment[he]=שולחן העבודה הווירטואלי אחד־עשרה נבחר
 
165
 Comment[hu]=A 11. asztal kiválasztva
 
166
 Comment[is]=Sýndarskjáborð ellefu er virkt
 
167
 Comment[it]=Il desktop virtuale undici viene selezionato.
 
168
@@ -1509,6 +1515,7 @@
 
169
 Name[fy]=Gean nei buroblêd 12
 
170
 Name[ga]=Téigh go Deasc 12
 
171
 Name[gl]=Ir ao Escritório 12
 
172
+Name[he]=1מעבר לשולחן עבודה 2
 
173
 Name[hu]=Váltás a 12. asztalra
 
174
 Name[is]=Birta skjáborð 12
 
175
 Name[it]=Va al desktop 12
 
176
@@ -1558,6 +1565,7 @@
 
177
 Comment[fy]=Firtueel buroblêd tolve is selektearre
 
178
 Comment[ga]=Roghnaíodh deasc fhíorúil a dó dhéag
 
179
 Comment[gl]=Escolle-se o escritório virtual número doze
 
180
+Comment[he]=שולחן העבודה הווירטואלי שתיים־עשרה נבחר
 
181
 Comment[hu]=A 12. asztal kiválasztva
 
182
 Comment[is]=Sýndarskjáborð tólf er virkt
 
183
 Comment[it]=Il desktop virtuale dodici viene selezionato.
 
184
@@ -1609,6 +1617,7 @@
 
185
 Name[fy]=Gean nei buroblêd 13
 
186
 Name[ga]=Téigh go Deasc 13
 
187
 Name[gl]=Ir ao Escritório 13
 
188
+Name[he]=מעבר לשולחן עבודה 13
 
189
 Name[hu]=Váltás a 13. asztalra
 
190
 Name[is]=Birta skjáborð 13
 
191
 Name[it]=Va al desktop 13
 
192
@@ -1658,6 +1667,7 @@
 
193
 Comment[fy]=Firtueel buroblêd trettjin is selektearre
 
194
 Comment[ga]=Roghnaíodh deasc fhíorúil a trí déag
 
195
 Comment[gl]=Escolle-se o escritório virtual número Trece
 
196
+Comment[he]=שולחן העבודה הווירטואלי שלוש־עשרה נבחר
 
197
 Comment[hu]=A 13. asztal kiválasztva
 
198
 Comment[is]=Sýndarskjáborð þrettán er virkt
 
199
 Comment[it]=Il desktop virtuale tredici viene selezionato.
 
200
@@ -1710,6 +1720,7 @@
 
201
 Name[fy]=Gean nei buroblêd 14
 
202
 Name[ga]=Téigh go Deasc 14
 
203
 Name[gl]=Ir ao Escritório 14
 
204
+Name[he]=1מעבר לשולחן עבודה 4
 
205
 Name[hu]=Váltás a 14. asztalra
 
206
 Name[is]=Birta skjáborð 14
 
207
 Name[it]=Va al desktop 14
 
208
@@ -1759,6 +1770,7 @@
 
209
 Comment[fy]=Firtueel buroblêd fjirtjin is selektearre
 
210
 Comment[ga]=Roghnaíodh deasc fhíorúil a ceathair déag
 
211
 Comment[gl]=Escolle-se o escritório virtual número catorce
 
212
+Comment[he]=שולחן העבודה הווירטואלי ארבע־עשרה נבחר
 
213
 Comment[hu]=A 14. asztal kiválasztva
 
214
 Comment[is]=Sýndarskjáborð fjórtán er virkt
 
215
 Comment[it]=Il desktop virtuale quattordici viene selezionato.
 
216
@@ -1811,6 +1823,7 @@
 
217
 Name[fy]=Gean nei buroblêd 15
 
218
 Name[ga]=Téigh go Deasc 15
 
219
 Name[gl]=Ir ao Escritório 15
 
220
+Name[he]=מעבר לשולחן עבודה 15
 
221
 Name[hu]=Váltás a 15. asztalra
 
222
 Name[is]=Birta skjáborð 15
 
223
 Name[it]=Va al desktop 15
 
224
@@ -1860,6 +1873,7 @@
 
225
 Comment[fy]=Firtueel buroblêd fyftjin is selektearre
 
226
 Comment[ga]=Roghnaíodh deasc fhíorúil a cúig déag
 
227
 Comment[gl]=Escolle-se o escritório virtual número quince
 
228
+Comment[he]=שולחן העבודה הווירטואלי חמש־עשרה נבחר
 
229
 Comment[hu]=A 15. asztal kiválasztva
 
230
 Comment[is]=Sýndarskjáborð fimmtán er virkt
 
231
 Comment[it]=Il desktop virtuale quindici viene selezionato.
 
232
@@ -1912,10 +1926,11 @@
 
233
 Name[fy]=Gean nei buroblêd 16
 
234
 Name[ga]=Téigh go Deasc 16
 
235
 Name[gl]=Ir ao Escritório 16
 
236
+Name[he]=מעבר לשולחן עבודה 16
 
237
 Name[hu]=Váltás a 16. asztalra
 
238
 Name[is]=Birta skjáborð 16
 
239
 Name[it]=Va al desktop 16
 
240
-Name[ja]=デスクトップ 15 に変更
 
241
+Name[ja]=デスクトップ 16 に変更
 
242
 Name[km]=ប្ដូរ​ទៅ​ផ្ទៃតុ ១៦
 
243
 Name[lt]=Pereiti į 16 darbastalį
 
244
 Name[mk]=Кон површина 16
 
245
@@ -1961,6 +1976,7 @@
 
246
 Comment[fy]=Firtueel buroblêd sechstjin is selektearre
 
247
 Comment[ga]=Roghnaíodh deasc fhíorúil a sé déag
 
248
 Comment[gl]=Escolle-se o escritório virtual número dezaseis
 
249
+Comment[he]=שולחן העבודה הווירטואלי שש־עשרה נבחר
 
250
 Comment[hu]=A 16. asztal kiválasztva
 
251
 Comment[is]=Sýndarskjáborð sextán er virkt
 
252
 Comment[it]=Il desktop virtuale sedici viene selezionato.
 
253
@@ -2013,6 +2029,7 @@
 
254
 Name[fy]=Gean nei buroblêd 17
 
255
 Name[ga]=Téigh go Deasc 17
 
256
 Name[gl]=Ir ao Escritório 17
 
257
+Name[he]=1מעבר לשולחן עבודה 7
 
258
 Name[hu]=Váltás a 17. asztalra
 
259
 Name[is]=Birta skjáborð 17
 
260
 Name[it]=Va al desktop 17
 
261
@@ -2062,6 +2079,7 @@
 
262
 Comment[fy]=Firtueel buroblêd santjin is selektearre
 
263
 Comment[ga]=Roghnaíodh deasc fhíorúil a seacht déag
 
264
 Comment[gl]=Escolle-se o escritório virtual número dezasete
 
265
+Comment[he]=שולחן העבודה הווירטואלי שבע־עשרה נבחר
 
266
 Comment[hu]=A 17. asztal kiválasztva
 
267
 Comment[is]=Sýndarskjáborð sautján er virkt
 
268
 Comment[it]=Il desktop virtuale diciassette viene selezionato.
 
269
@@ -2114,6 +2132,7 @@
 
270
 Name[fy]=Gean nei buroblêd 18
 
271
 Name[ga]=Téigh go Deasc 18
 
272
 Name[gl]=Ir ao Escritório 18
 
273
+Name[he]=מעבר לשולחן עבודה 18
 
274
 Name[hu]=Váltás a 18. asztalra
 
275
 Name[is]=Birta skjáborð 18
 
276
 Name[it]=Va al desktop 18
 
277
@@ -2163,6 +2182,7 @@
 
278
 Comment[fy]=Firtueel buroblêd achtjin is selektearre
 
279
 Comment[ga]=Roghnaíodh deasc fhíorúil a hocht déag
 
280
 Comment[gl]=Escolle-se o escritório virtual número dezaoito
 
281
+Comment[he]=שולחן העבודה הווירטואלי שמונה־עשרה נבחר
 
282
 Comment[hu]=A 18. asztal kiválasztva
 
283
 Comment[is]=Sýndarskjáborð átján er virkt
 
284
 Comment[it]=Il desktop virtuale diciotto viene selezionato.
 
285
@@ -2215,6 +2235,7 @@
 
286
 Name[fy]=Gean nei buroblêd 19
 
287
 Name[ga]=Téigh go Deasc 19
 
288
 Name[gl]=Ir ao Escritório 19
 
289
+Name[he]=מעבר לשולחן עבודה 19
 
290
 Name[hu]=Váltás az 19. asztalra
 
291
 Name[is]=Birta skjáborð 19
 
292
 Name[it]=Va al desktop 19
 
293
@@ -2264,6 +2285,7 @@
 
294
 Comment[fy]=Firtueel buroblêd njoggentjin is selektearre
 
295
 Comment[ga]=Roghnaíodh deasc fhíorúil a naoi déag
 
296
 Comment[gl]=Escolle-se o escritório virtual número dezanove
 
297
+Comment[he]=שולחן העבודה הווירטואלי תשע־עשרה נבחר
 
298
 Comment[hu]=A 19. asztal kiválasztva
 
299
 Comment[is]=Sýndarskjáborð nítján er virkt
 
300
 Comment[it]=Il desktop virtuale diciannove viene selezionato.
 
301
@@ -2316,6 +2338,7 @@
 
302
 Name[fy]=Gean nei buroblêd 20
 
303
 Name[ga]=Téigh go Deasc 20
 
304
 Name[gl]=Ir ao Escritório 20
 
305
+Name[he]=מעבר לשולחן עבודה 20
 
306
 Name[hu]=Váltás a 20. asztalra
 
307
 Name[is]=Birta skjáborð 20
 
308
 Name[it]=Va al desktop 20
 
309
@@ -2365,6 +2388,7 @@
 
310
 Comment[fy]=Firtueel buroblêd twintich is selektearre
 
311
 Comment[ga]=Roghnaíodh deasc fhíorúil fiche
 
312
 Comment[gl]=Escolle-se o escritório virtual número vinte
 
313
+Comment[he]=שולחן העבודה הווירטואלי עשרים נבחר
 
314
 Comment[hu]=A 20. asztal kiválasztva
 
315
 Comment[is]=Sýndarskjáborð tuttugu er virkt
 
316
 Comment[it]=Il desktop virtuale venti viene selezionato.
 
317
@@ -4781,6 +4805,7 @@
 
318
 Name[fi]=Ikkuna nykyisellä työpöydällä kaipaa huomiota
 
319
 Name[fr]=La fenêtre sur le bureau courant demande votre attention
 
320
 Name[fy]=Finster op hjoeddeiske buroblêd freget om oandacht
 
321
+Name[he]=חלון בשולחן עבודה נוכחי דורש תשומת לב
 
322
 Name[hu]=Egy ablak az aktuális asztalon beavatkozást igényel
 
323
 Name[is]=Gluggi á núverandi skjáborði krefst athygli
 
324
 Name[it]=Finestra sul desktop attivo richiede l'attenzione
 
325
@@ -4823,6 +4848,7 @@
 
326
 Comment[fi]=Ikkuna nykyisellä virtuaalityöpöydällä kaipaa huomiota
 
327
 Comment[fr]=Une fenêtre du bureau virtuel actuel demande votre attention
 
328
 Comment[fy]=In finster op it hjoeddeiske firtuele buroblêd freget om oandacht
 
329
+Comment[he]=חלון בשולחן עבודה נוכחי דורש תשומת לב
 
330
 Comment[hu]=Egy ablak az aktuális asztalon beavatkozást igényel
 
331
 Comment[is]=Gluggi á núverandi sýndarskjáborði krefst athygli
 
332
 Comment[it]=Una finestra sul desktop virtuale corrente sta richiedendo l'attenzione
 
333
@@ -4868,6 +4894,7 @@
 
334
 Name[fr]=Une fenêtre sur un autre bureau demande votre attention
 
335
 Name[fy]=Finster op oar buroblêd freget om oandacht
 
336
 Name[gl]=Unha Fiestra en Outro Escritório Requere Atenzón
 
337
+Name[he]=חלון בשולחן עבודה אחר דורש תשומת לב
 
338
 Name[hu]=Egy ablak beavatkozást igényel (másik asztalon)
 
339
 Name[is]=Gluggi á öðru skjáborði krefst athygli
 
340
 Name[it]=Finestra su altro desktop richiede l'attenzione
 
341
@@ -4910,6 +4937,7 @@
 
342
 Comment[fr]=Une fenêtre sur un bureau virtuel inactif demande l'attention
 
343
 Comment[fy]=In finster op in ynaktyf firtueel buroblêd freget om oandacht
 
344
 Comment[gl]=Unha fiestra nun escritório virtual inactivo requere atenzón
 
345
+Comment[he]=חלון בשולחן עבודה אחר דורש תשומת לב
 
346
 Comment[hu]=Egy ablak beavatkozást igényel egy másik asztalon
 
347
 Comment[is]=Gluggi á óvirku sýndarskjáborði krefst athygli
 
348
 Comment[it]=Una finestra un desktop virtuale diverso da quello corrente sta richiedendo l'attenzione
 
349
diff -urN tag/kwin/geometry.cpp kwin/geometry.cpp
 
350
--- kdebase/kwin/geometry.cpp   2006-04-14 15:33:17.000000000 +0000
 
351
+++ kdebase/kwin/geometry.cpp   2006-04-14 15:29:53.000000000 +0000
 
352
@@ -1281,7 +1281,21 @@
 
353
         { // update to match restrictions
 
354
         QSize new_size = adjustedSize();
 
355
         if( new_size != size() && !isFullScreen())
 
356
+            {
 
357
+            QRect orig_geometry = geometry();
 
358
             resizeWithChecks( new_size );
 
359
+            if( ( !isSpecialWindow() || isToolbar()) && !isFullScreen())
 
360
+                {
 
361
+                // try to keep the window in its xinerama screen if possible,
 
362
+                // if that fails at least keep it visible somewhere
 
363
+                QRect area = workspace()->clientArea( MovementArea, this );
 
364
+                if( area.contains( orig_geometry ))
 
365
+                    keepInArea( area );
 
366
+                area = workspace()->clientArea( WorkArea, this );
 
367
+                if( area.contains( orig_geometry ))
 
368
+                    keepInArea( area );
 
369
+                }
 
370
+            }
 
371
         }
 
372
     updateAllowedActions(); // affects isResizeable()
 
373
     }
 
374
@@ -1840,7 +1854,7 @@
 
375
 
 
376
     // maximing one way and unmaximizing the other way shouldn't happen
 
377
     Q_ASSERT( !( vertical && horizontal )
 
378
-        || (( max_mode & MaximizeVertical != 0 ) == ( max_mode & MaximizeHorizontal != 0 )));
 
379
+        || ((( max_mode & MaximizeVertical ) != 0 ) == (( max_mode & MaximizeHorizontal ) != 0 )));
 
380
 
 
381
     QRect clientArea = workspace()->clientArea( MaximizeArea, this );
 
382
 
 
383
diff -urN tag/kwin/kcmkwin/kwindecoration/kwindecoration.desktop kwin/kcmkwin/kwindecoration/kwindecoration.desktop
 
384
--- kdebase/kwin/kcmkwin/kwindecoration/kwindecoration.desktop  2006-04-14 15:33:14.000000000 +0000
 
385
+++ kdebase/kwin/kcmkwin/kwindecoration/kwindecoration.desktop  2006-04-14 15:29:44.000000000 +0000
 
386
@@ -164,7 +164,7 @@
 
387
 Keywords[fa]=kwin,window,manager,border,style,theme,look,feel,layout,button,handle,edge,kwm,decoration،طرح‌بندی
 
388
 Keywords[fi]=kwin,ikkuna,ikkunaohjelma,ikkunoinnin hallintaohjelma,tausta,tyyli,teema,ulkonäkö,tuntuma,ulkoasu,painike,kahva,kulma,kwm,kehys
 
389
 Keywords[fr]=kwin,fenêtre,gestionnaire,bordure,style,thème,apparence,ergonomie,disposition,bouton,poignée,bord,kwm,décoration
 
390
-Keywords[fy]=kwin,window,manager,rand,stijl,theme,tema,look,uiterlijk,gedrag,feel, layout,opmaak,button,knoppen,handle,rand,kwm,decoratie,windowmanager,venster,vensterbeheerFinster,râne, kader, styl tema,uterlik,gedrach,
 
391
+Keywords[fy]=kwin,window,manager,rand,stijl,theme,tema,look,uiterlijk,gedrag,feel,layout,opmaak,button,knoppen,handle,rand,kwm,decoratie,windowmanager,venster,vensterbeheer,finster,râne,kader,styltema,uterlik,gedrach,finsterbehear
 
392
 Keywords[ga]=kwin,fuinneog,bainisteoir,imlíne,stíl,téama,leagan amach,cnaipe,hanla,ciumhais,kwm,maisiúchán
 
393
 Keywords[gl]=kwin,fiestra,xestor,beira,estilo,tema,aparéncia,formato,botón,xestión,esquina,kwm,decorazón
 
394
 Keywords[he]=מנהל חלונות,חלונות,מנהל,גבול,מסגרת,סגנון,ערכה,ערכת נושא,מראה,תחושה,פריסה,תצוגה,כפתור,ידית,קצה,קישוט, kwin,window,manager,border,style,theme,look,feel,layout,button,handle,  edge,kwm,decoration
 
395
diff -urN tag/kwin/kcmkwin/kwinoptions/windows.cpp kwin/kcmkwin/kwinoptions/windows.cpp
 
396
--- kdebase/kwin/kcmkwin/kwinoptions/windows.cpp        2006-04-14 15:33:15.000000000 +0000
 
397
+++ kdebase/kwin/kcmkwin/kwinoptions/windows.cpp        2006-04-14 15:29:47.000000000 +0000
 
398
@@ -228,6 +228,7 @@
 
399
                  " is pressed, with no popup widget.  In addition, the previously"
 
400
                  " activated window will be sent to the back in this mode.");
 
401
     QWhatsThis::add( altTabPopup, wtstr );
 
402
+    connect(focusCombo, SIGNAL(activated(int)), this, SLOT(updateAltTabMode()));
 
403
 
 
404
     traverseAll = new QCheckBox( i18n( "&Traverse windows on all desktops" ), kbdBox );
 
405
     kLay->addWidget( traverseAll );
 
406
@@ -279,6 +280,13 @@
 
407
 
 
408
     // this will disable/hide the auto raise delay widget if focus==click
 
409
     setAutoRaiseEnabled();
 
410
+    updateAltTabMode();
 
411
+}
 
412
+
 
413
+void KFocusConfig::updateAltTabMode()
 
414
+{
 
415
+    // not KDE-style Alt+Tab with unreasonable focus policies
 
416
+    altTabPopup->setEnabled( focusCombo->currentItem() == 0 || focusCombo->currentItem() == 1 );
 
417
 }
 
418
 
 
419
 void KFocusConfig::setAutoRaiseInterval(int tb)
 
420
@@ -900,7 +908,6 @@
 
421
     BrdrSnap->setSpecialValueText( i18n("none") );
 
422
     BrdrSnap->setRange( 0, MAX_BRDR_SNAP);
 
423
     BrdrSnap->setLabel(i18n("&Border snap zone:"));
 
424
-    BrdrSnap->setSuffix(i18n(" pixels"));
 
425
     BrdrSnap->setSteps(1,10);
 
426
     QWhatsThis::add( BrdrSnap, i18n("Here you can set the snap zone for screen borders, i.e."
 
427
                                     " the 'strength' of the magnetic field which will make windows snap to the border when"
 
428
@@ -910,7 +917,6 @@
 
429
     WndwSnap->setSpecialValueText( i18n("none") );
 
430
     WndwSnap->setRange( 0, MAX_WNDW_SNAP);
 
431
     WndwSnap->setLabel(i18n("&Window snap zone:"));
 
432
-    WndwSnap->setSuffix( i18n(" pixels"));
 
433
     BrdrSnap->setSteps(1,10);
 
434
     QWhatsThis::add( WndwSnap, i18n("Here you can set the snap zone for windows, i.e."
 
435
                                     " the 'strength' of the magnetic field which will make windows snap to each other when"
 
436
@@ -935,8 +941,14 @@
 
437
     connect( moveResizeMaximized, SIGNAL(toggled(bool)), SLOT(changed()));
 
438
     connect( placementCombo, SIGNAL(activated(int)), SLOT(changed()));
 
439
     connect( BrdrSnap, SIGNAL(valueChanged(int)), SLOT(changed()));
 
440
+    connect( BrdrSnap, SIGNAL(valueChanged(int)), SLOT(slotBrdrSnapChanged(int)));
 
441
     connect( WndwSnap, SIGNAL(valueChanged(int)), SLOT(changed()));
 
442
+    connect( WndwSnap, SIGNAL(valueChanged(int)), SLOT(slotWndwSnapChanged(int)));
 
443
     connect( OverlapSnap, SIGNAL(clicked()), SLOT(changed()));
 
444
+
 
445
+    // To get suffix to BrdrSnap and WndwSnap inputs with default values.
 
446
+    slotBrdrSnapChanged(BrdrSnap->value());
 
447
+    slotWndwSnapChanged(WndwSnap->value());
 
448
 }
 
449
 
 
450
 int KMovingConfig::getMove()
 
451
@@ -1007,6 +1019,14 @@
 
452
     moveResizeMaximized->setChecked(a);
 
453
 }
 
454
 
 
455
+void KMovingConfig::slotBrdrSnapChanged(int value) {
 
456
+    BrdrSnap->setSuffix(i18n(" pixel", " pixels", value));
 
457
+}
 
458
+
 
459
+void KMovingConfig::slotWndwSnapChanged(int value) {
 
460
+    WndwSnap->setSuffix(i18n(" pixel", " pixels", value));
 
461
+}
 
462
+
 
463
 void KMovingConfig::load( void )
 
464
 {
 
465
     QString key;
 
466
diff -urN tag/kwin/kcmkwin/kwinoptions/windows.h kwin/kcmkwin/kwinoptions/windows.h
 
467
--- kdebase/kwin/kcmkwin/kwinoptions/windows.h  2006-04-14 15:33:15.000000000 +0000
 
468
+++ kdebase/kwin/kcmkwin/kwinoptions/windows.h  2006-04-14 15:29:47.000000000 +0000
 
469
@@ -85,6 +85,7 @@
 
470
   void autoRaiseOnTog(bool);//CT 23Oct1998
 
471
   void delayFocusOnTog(bool);
 
472
   void clickRaiseOnTog(bool);
 
473
+  void updateAltTabMode();
 
474
        void changed() { emit KCModule::changed(true); }
 
475
 
 
476
 
 
477
@@ -138,6 +139,8 @@
 
478
   void setMinimizeAnim( bool );
 
479
   void setMinimizeAnimSpeed( int );
 
480
        void changed() { emit KCModule::changed(true); }
 
481
+  void slotBrdrSnapChanged( int );
 
482
+  void slotWndwSnapChanged( int );
 
483
 
 
484
 private:
 
485
   int getMove( void );
 
486
diff -urN tag/kwin/kcmkwin/kwinrules/main.cpp kwin/kcmkwin/kwinrules/main.cpp
 
487
--- kdebase/kwin/kcmkwin/kwinrules/main.cpp     2006-04-14 15:33:15.000000000 +0000
 
488
+++ kdebase/kwin/kcmkwin/kwinrules/main.cpp     2006-04-14 15:29:45.000000000 +0000
 
489
@@ -119,8 +119,8 @@
 
490
             if( rule->types != NET::AllTypesMask )
 
491
                 {
 
492
                 int bits = 0;
 
493
-                for( int bit = 1;
 
494
-                     bit < 1 << 31;
 
495
+                for( unsigned int bit = 1;
 
496
+                     bit < 1U << 31;
 
497
                      bit <<= 1 )
 
498
                     if( rule->types & bit )
 
499
                         ++bits;
 
500
diff -urN tag/kwin/kompmgr/kompmgr.c kwin/kompmgr/kompmgr.c
 
501
--- kdebase/kwin/kompmgr/kompmgr.c      2006-04-14 15:33:17.000000000 +0000
 
502
+++ kdebase/kwin/kompmgr/kompmgr.c      2006-04-14 15:29:52.000000000 +0000
 
503
@@ -1,5 +1,5 @@
 
504
 /*
 
505
- * $Id: kompmgr.c 511474 2006-02-20 01:12:52Z danimo $
 
506
+ * $Id: kompmgr.c 528927 2006-04-12 05:27:31Z rohanpm $
 
507
  *
 
508
  * Copyright © 2003 Keith Packard
 
509
  *
 
510
@@ -201,7 +201,7 @@
 
511
 typedef enum _compMode {
 
512
     CompSimple,                /* looks like a regular X server */
 
513
     CompServerShadows, /* use window alpha for shadow; sharp, but precise */
 
514
-    CompClientShadows, /* use window extents for shadow, blurred */
 
515
+    CompClientShadows  /* use window extents for shadow, blurred */
 
516
 } CompMode;
 
517
 
 
518
 static void
 
519
@@ -2878,7 +2878,16 @@
 
520
                                                                        break;*/ /*skip if opacity does not change*/
 
521
                                                                if (fadeTrans)
 
522
                                                                {
 
523
-                                                                   set_fade (dpy, w, w->opacity*1.0/OPAQUE, (tmp*1.0)/OPAQUE, fade_out_step, 0, False, True, True, False);
 
524
+                                                                       static double start, finish, step;
 
525
+                                                                       start = w->opacity*1.0/OPAQUE;
 
526
+                                                                       finish = (tmp*1.0)/OPAQUE;
 
527
+                                                                       
 
528
+                                                                       if ( start > finish )
 
529
+                                                                               step = fade_out_step;
 
530
+                                                                       else
 
531
+                                                                               step = fade_in_step;
 
532
+                                                                       
 
533
+                                                                   set_fade (dpy, w, start, finish, step, 0, False, True, True, False);
 
534
                                     break;
 
535
                                     }
 
536
                                 else
 
537
diff -urN tag/kwin/layers.cpp kwin/layers.cpp
 
538
--- kdebase/kwin/layers.cpp     2006-04-14 15:33:17.000000000 +0000
 
539
+++ kdebase/kwin/layers.cpp     2006-04-14 15:29:53.000000000 +0000
 
540
@@ -100,7 +100,7 @@
 
541
     {
 
542
     if( block_stacking_updates > 0 )
 
543
         {
 
544
-        blocked_propagating_new_clients |= propagate_new_clients;
 
545
+        blocked_propagating_new_clients = blocked_propagating_new_clients || propagate_new_clients;
 
546
         return;
 
547
         }
 
548
     ClientList new_stacking_order = constrainedStackingOrder();
 
549
@@ -441,6 +441,21 @@
 
550
                 }
 
551
             }
 
552
        }
 
553
+    // the same for global_focus_chain
 
554
+    if( c->wantsTabFocus() && global_focus_chain.contains( active_client ))
 
555
+        {
 
556
+        global_focus_chain.remove( c );
 
557
+        for( ClientList::Iterator it = global_focus_chain.fromLast();
 
558
+             it != global_focus_chain.end();
 
559
+             --it )
 
560
+            {
 
561
+            if( Client::belongToSameApplication( active_client, *it ))
 
562
+                {
 
563
+                global_focus_chain.insert( it, c );
 
564
+                break;
 
565
+                }
 
566
+            }
 
567
+       }
 
568
     updateStackingOrder();
 
569
     }
 
570
 
 
571
diff -urN tag/kwin/manage.cpp kwin/manage.cpp
 
572
--- kdebase/kwin/manage.cpp     2006-04-14 15:33:17.000000000 +0000
 
573
+++ kdebase/kwin/manage.cpp     2006-04-14 15:29:53.000000000 +0000
 
574
@@ -455,7 +455,16 @@
 
575
         if( !isOnCurrentDesktop() && !isMapped && !session && ( allow || workspace()->sessionSaving()))
 
576
             workspace()->setCurrentDesktop( desktop());
 
577
 
 
578
-        if( workspace()->showingDesktop())
 
579
+        bool belongs_to_desktop = false;
 
580
+        for( ClientList::ConstIterator it = group()->members().begin();
 
581
+             it != group()->members().end();
 
582
+             ++it )
 
583
+            if( (*it)->isDesktop())
 
584
+                {
 
585
+                belongs_to_desktop = true;
 
586
+                break;
 
587
+                }
 
588
+        if( !belongs_to_desktop && workspace()->showingDesktop())
 
589
             workspace()->resetShowingDesktop( false );
 
590
 
 
591
         if( isOnCurrentDesktop() && !isMapped && !allow )
 
592
diff -urN tag/kwin/popupinfo.cpp kwin/popupinfo.cpp
 
593
--- kdebase/kwin/popupinfo.cpp  2006-04-14 15:33:17.000000000 +0000
 
594
+++ kdebase/kwin/popupinfo.cpp  2006-04-14 15:29:53.000000000 +0000
 
595
@@ -38,6 +38,7 @@
 
596
     : QWidget( 0, name )
 
597
     {
 
598
     m_infoString = "";
 
599
+    m_shown = false;
 
600
     reset();
 
601
     reconfigure();
 
602
     connect(&m_delayedHideTimer, SIGNAL(timeout()), this, SLOT(hide()));
 
603
diff -urN tag/kwin/tabbox.cpp kwin/tabbox.cpp
 
604
--- kdebase/kwin/tabbox.cpp     2006-04-14 15:33:17.000000000 +0000
 
605
+++ kdebase/kwin/tabbox.cpp     2006-04-14 15:29:53.000000000 +0000
 
606
@@ -763,7 +763,7 @@
 
607
         return;
 
608
     if ( tab_grab || control_grab )
 
609
         return;
 
610
-    if ( options->altTabStyle == Options::CDE )
 
611
+    if ( options->altTabStyle == Options::CDE || !options->focusPolicyIsReasonable())
 
612
         {
 
613
         //XUngrabKeyboard(qt_xdisplay(), qt_x_time); // need that because of accelerator raw mode
 
614
         // CDE style raise / lower
 
615
@@ -789,7 +789,7 @@
 
616
         return;
 
617
     if( tab_grab || control_grab )
 
618
         return;
 
619
-    if ( options->altTabStyle == Options::CDE )
 
620
+    if ( options->altTabStyle == Options::CDE || !options->focusPolicyIsReasonable())
 
621
         {
 
622
         // CDE style raise / lower
 
623
         CDEWalkThroughWindows( false );
 
624
@@ -926,7 +926,23 @@
 
625
 
 
626
 void Workspace::CDEWalkThroughWindows( bool forward )
 
627
     {
 
628
-    Client* c = activeClient();
 
629
+    Client* c = NULL;
 
630
+// this function find the first suitable client for unreasonable focus
 
631
+// policies - the topmost one, with some exceptions (can't be keepabove/below,
 
632
+// otherwise it gets stuck on them)
 
633
+    Q_ASSERT( block_stacking_updates == 0 );
 
634
+    for( ClientList::ConstIterator it = stacking_order.fromLast();
 
635
+         it != stacking_order.end();
 
636
+         --it )
 
637
+        {
 
638
+        if ( (*it)->isOnCurrentDesktop() && !(*it)->isSpecialWindow()
 
639
+            && (*it)->isShown( false ) && (*it)->wantsTabFocus()
 
640
+            && !(*it)->keepAbove() && !(*it)->keepBelow())
 
641
+            {
 
642
+            c = *it;
 
643
+            break;
 
644
+            }
 
645
+        }
 
646
     Client* nc = c;
 
647
     bool options_traverse_all;
 
648
         {
 
649
@@ -952,7 +968,7 @@
 
650
             }
 
651
         } while (nc && nc != c &&
 
652
             (( !options_traverse_all && !nc->isOnDesktop(currentDesktop())) ||
 
653
-             nc->isMinimized() || !nc->wantsTabFocus() ) );
 
654
+             nc->isMinimized() || !nc->wantsTabFocus() || nc->keepAbove() || nc->keepBelow() ) );
 
655
     if (nc)
 
656
         {
 
657
         if (c && c != nc)
 
658
@@ -1152,14 +1168,13 @@
 
659
 */
 
660
 Client* Workspace::nextFocusChainClient( Client* c ) const
 
661
     {
 
662
-    int desktop = c->isOnAllDesktops() ? currentDesktop() : c->desktop();
 
663
-    if ( focus_chain[desktop].isEmpty() )
 
664
+    if ( global_focus_chain.isEmpty() )
 
665
         return 0;
 
666
-    ClientList::ConstIterator it = focus_chain[desktop].find( c );
 
667
-    if ( it == focus_chain[desktop].end() )
 
668
-        return focus_chain[desktop].last();
 
669
-    if ( it == focus_chain[desktop].begin() )
 
670
-        return focus_chain[desktop].last();
 
671
+    ClientList::ConstIterator it = global_focus_chain.find( c );
 
672
+    if ( it == global_focus_chain.end() )
 
673
+        return global_focus_chain.last();
 
674
+    if ( it == global_focus_chain.begin() )
 
675
+        return global_focus_chain.last();
 
676
     --it;
 
677
     return *it;
 
678
     }
 
679
@@ -1170,15 +1185,14 @@
 
680
 */
 
681
 Client* Workspace::previousFocusChainClient( Client* c ) const
 
682
     {
 
683
-    int desktop = c->isOnAllDesktops() ? currentDesktop() : c->desktop();
 
684
-    if ( focus_chain[desktop].isEmpty() )
 
685
+    if ( global_focus_chain.isEmpty() )
 
686
         return 0;
 
687
-    ClientList::ConstIterator it = focus_chain[desktop].find( c );
 
688
-    if ( it == focus_chain[desktop].end() )
 
689
-        return focus_chain[desktop].first();
 
690
+    ClientList::ConstIterator it = global_focus_chain.find( c );
 
691
+    if ( it == global_focus_chain.end() )
 
692
+        return global_focus_chain.first();
 
693
     ++it;
 
694
-    if ( it == focus_chain[desktop].end() )
 
695
-        return focus_chain[desktop].first();
 
696
+    if ( it == global_focus_chain.end() )
 
697
+        return global_focus_chain.first();
 
698
     return *it;
 
699
     }
 
700
 
 
701
diff -urN tag/kwin/useractions.cpp kwin/useractions.cpp
 
702
--- kdebase/kwin/useractions.cpp        2006-04-14 15:33:17.000000000 +0000
 
703
+++ kdebase/kwin/useractions.cpp        2006-04-14 15:29:53.000000000 +0000
 
704
@@ -391,6 +391,7 @@
 
705
             break;
 
706
         case Options::RestoreOp:
 
707
             c->maximize( Client::MaximizeRestore );
 
708
+            break;
 
709
         case Options::MinimizeOp:
 
710
             c->minimize();
 
711
             break;
 
712
@@ -471,7 +472,7 @@
 
713
             cancelShadeHover();
 
714
             break;
 
715
         case Options::MouseOperationsMenu:
 
716
-            if ( isActive() & options->clickRaise )
 
717
+            if ( isActive() && options->clickRaise )
 
718
                 autoRaise();
 
719
             workspace()->showWindowMenu( globalPos, this );
 
720
             break;
 
721
diff -urN tag/kwin/utils.cpp kwin/utils.cpp
 
722
--- kdebase/kwin/utils.cpp      2006-04-14 15:33:17.000000000 +0000
 
723
+++ kdebase/kwin/utils.cpp      2006-04-14 15:29:53.000000000 +0000
 
724
@@ -309,9 +309,12 @@
 
725
         hostnamebuf[sizeof(hostnamebuf)-1] = 0;
 
726
         if (host == hostnamebuf)
 
727
             return true;
 
728
-        char *dot = strchr(hostnamebuf, '.');
 
729
-        if (dot && !(*dot = 0) && host == hostnamebuf)
 
730
-            return true;
 
731
+        if( char *dot = strchr(hostnamebuf, '.'))
 
732
+            {
 
733
+            *dot = '\0';
 
734
+            if( host == hostnamebuf )
 
735
+                return true;
 
736
+            }
 
737
         }
 
738
     return false;
 
739
     }
 
740
diff -urN tag/kwin/utils.h kwin/utils.h
 
741
--- kdebase/kwin/utils.h        2006-04-14 15:33:17.000000000 +0000
 
742
+++ kdebase/kwin/utils.h        2006-04-14 15:29:53.000000000 +0000
 
743
@@ -232,15 +232,13 @@
 
744
 inline
 
745
 int timestampCompare( Time time1, Time time2 ) // like strcmp()
 
746
     {
 
747
-    if( time1 == time2 )
 
748
-        return 0;
 
749
-    return ( time1 - time2 ) < 1000000000 ? 1 : -1; // time1 > time2 -> 1, handle wrapping
 
750
+    return NET::timestampCompare( time1, time2 );
 
751
     }
 
752
 
 
753
 inline
 
754
 Time timestampDiff( Time time1, Time time2 ) // returns time2 - time1
 
755
-    { // no need to handle wrapping?
 
756
-    return time2 - time1;
 
757
+    {
 
758
+    return NET::timestampDiff( time1, time2 );
 
759
     }
 
760
 
 
761
 bool isLocalMachine( const QCString& host );
 
762
diff -urN tag/kwin/workspace.cpp kwin/workspace.cpp
 
763
--- kdebase/kwin/workspace.cpp  2006-04-14 15:33:17.000000000 +0000
 
764
+++ kdebase/kwin/workspace.cpp  2006-04-14 15:29:53.000000000 +0000
 
765
@@ -512,7 +512,7 @@
 
766
         }
 
767
     else
 
768
         {
 
769
-        updateFocusChains( c, true );
 
770
+        updateFocusChains( c, FocusChainUpdate ); // add to focus chain if not already there
 
771
         clients.append( c );
 
772
         }
 
773
     if( !unconstrained_stacking_order.contains( c ))
 
774
@@ -564,6 +564,7 @@
 
775
          i <= numberOfDesktops();
 
776
          ++i )
 
777
         focus_chain[ i ].remove( c );
 
778
+    global_focus_chain.remove( c );
 
779
     attention_chain.remove( c );
 
780
     if( c->isTopMenu())
 
781
         removeTopMenu( c );
 
782
@@ -590,7 +591,7 @@
 
783
     updateClientArea();
 
784
     }
 
785
 
 
786
-void Workspace::updateFocusChains( Client* c, bool make_first )
 
787
+void Workspace::updateFocusChains( Client* c, FocusChainChange change )
 
788
     {
 
789
     if( !c->wantsTabFocus()) // doesn't want tab focus, remove
 
790
         {
 
791
@@ -598,16 +599,21 @@
 
792
              i<= numberOfDesktops();
 
793
              ++i )
 
794
             focus_chain[i].remove(c);
 
795
+        global_focus_chain.remove( c );
 
796
         return;
 
797
         }
 
798
     if(c->desktop() == NET::OnAllDesktops)
 
799
         { //now on all desktops, add it to focus_chains it is not already in
 
800
         for( int i=1; i<= numberOfDesktops(); i++)
 
801
-            { // make_first works only on current desktop, don't affect all desktops
 
802
-            if( make_first && i == currentDesktop())
 
803
+            { // making first/last works only on current desktop, don't affect all desktops
 
804
+            if( i == currentDesktop()
 
805
+                && ( change == FocusChainMakeFirst || change == FocusChainMakeLast ))
 
806
                 {
 
807
                 focus_chain[ i ].remove( c );
 
808
-                focus_chain[ i ].append( c );
 
809
+                if( change == FocusChainMakeFirst )
 
810
+                    focus_chain[ i ].append( c );
 
811
+                else
 
812
+                    focus_chain[ i ].prepend( c );
 
813
                 }
 
814
             else if( !focus_chain[ i ].contains( c ))
 
815
                 focus_chain[ i ].prepend( c ); // otherwise add as the last one
 
816
@@ -619,11 +625,16 @@
 
817
             {
 
818
             if( i == c->desktop())
 
819
                 {
 
820
-                if( make_first )
 
821
+                if( change == FocusChainMakeFirst )
 
822
                     {
 
823
                     focus_chain[ i ].remove( c );
 
824
                     focus_chain[ i ].append( c );
 
825
                     }
 
826
+                else if( change == FocusChainMakeLast )
 
827
+                    {
 
828
+                    focus_chain[ i ].remove( c );
 
829
+                    focus_chain[ i ].prepend( c );
 
830
+                    }
 
831
                 else if( !focus_chain[ i ].contains( c ))
 
832
                     focus_chain[ i ].prepend( c );
 
833
                 }
 
834
@@ -631,6 +642,18 @@
 
835
                 focus_chain[ i ].remove( c );
 
836
             }
 
837
         }
 
838
+    if( change == FocusChainMakeFirst )
 
839
+        {
 
840
+        global_focus_chain.remove( c );
 
841
+        global_focus_chain.append( c );
 
842
+        }
 
843
+    else if( change == FocusChainMakeLast )
 
844
+        {
 
845
+        global_focus_chain.remove( c );
 
846
+        global_focus_chain.prepend( c );
 
847
+        }
 
848
+    else if( !global_focus_chain.contains( c ))
 
849
+        global_focus_chain.prepend( c );
 
850
     }
 
851
 
 
852
 void Workspace::updateCurrentTopMenu()
 
853
diff -urN tag/kwin/workspace.h kwin/workspace.h
 
854
--- kdebase/kwin/workspace.h    2006-04-14 15:33:17.000000000 +0000
 
855
+++ kdebase/kwin/workspace.h    2006-04-14 15:29:53.000000000 +0000
 
856
@@ -251,7 +251,8 @@
 
857
         bool checkStartupNotification( Window w, KStartupInfoId& id, KStartupInfoData& data );
 
858
 
 
859
         void focusToNull(); // SELI public?
 
860
-        void updateFocusChains( Client* c, bool make_first );
 
861
+        enum FocusChainChange { FocusChainMakeFirst, FocusChainMakeLast, FocusChainUpdate };
 
862
+        void updateFocusChains( Client* c, FocusChainChange change );
 
863
         
 
864
         bool forcedGlobalMouseGrab() const;
 
865
         void clientShortcutUpdated( Client* c );
 
866
@@ -510,6 +511,7 @@
 
867
         ClientList unconstrained_stacking_order;
 
868
         ClientList stacking_order;
 
869
         QValueVector< ClientList > focus_chain;
 
870
+        ClientList global_focus_chain; // this one is only for things like tabbox's MRU
 
871
         ClientList should_get_focus; // last is most recent
 
872
         ClientList attention_chain;
 
873