Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 211469 | Differences between
and this patch

Collapse All | Expand All

(-)kdebase.sav/kwin/activation.cpp (+36 lines)
Lines 358-363 void Workspace::takeActivity( Client* c, Link Here
358
        return;
358
        return;
359
        }
359
        }
360
    c->takeActivity( flags, handled, Allowed );
360
    c->takeActivity( flags, handled, Allowed );
361
    if( !c->isOnScreen( active_screen ))
362
        active_screen = c->screen();
361
    }
363
    }
362
364
363
void Workspace::handleTakeActivity( Client* c, Time /*timestamp*/, int flags )
365
void Workspace::handleTakeActivity( Client* c, Time /*timestamp*/, int flags )
Lines 411-416 bool Workspace::activateNextClient( Clie Link Here
411
                {
413
                {
412
                if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop())
414
                if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop())
413
                    continue;
415
                    continue;
416
                if( options->separateScreenFocus )
417
                    {
418
                    if( c != NULL && !(*it)->isOnScreen( c->screen()))
419
                        continue;
420
                    if( c == NULL && !(*it)->isOnScreen( activeScreen()))
421
                        continue;
422
                    }
414
                if( mainwindows.contains( *it ))
423
                if( mainwindows.contains( *it ))
415
                    {
424
                    {
416
                    get_focus = *it;
425
                    get_focus = *it;
Lines 436-441 bool Workspace::activateNextClient( Clie Link Here
436
    return true;
445
    return true;
437
    }
446
    }
438
447
448
void Workspace::setCurrentScreen( int new_screen )
449
    {
450
    if (new_screen < 0 || new_screen > numScreens())
451
        return;
452
    if ( !options->focusPolicyIsReasonable())
453
        return;
454
    closeActivePopup();
455
    Client* get_focus = NULL;
456
    for( ClientList::ConstIterator it = focus_chain[currentDesktop()].fromLast();
457
         it != focus_chain[currentDesktop()].end();
458
         --it )
459
        {
460
        if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop())
461
            continue;
462
        if( !(*it)->screen() == new_screen )
463
            continue;
464
        get_focus = *it;
465
        break;
466
        }
467
    if( get_focus == NULL )
468
        get_focus = findDesktop( true, currentDesktop());
469
    if( get_focus != NULL && get_focus != mostRecentlyActivatedClient())
470
        requestFocus( get_focus );
471
    active_screen = new_screen;
472
    }
439
473
440
void Workspace::gotFocusIn( const Client* c )
474
void Workspace::gotFocusIn( const Client* c )
441
    {
475
    {
Lines 858-863 void Client::startupIdChanged() Link Here
858
        desktop = asn_data.desktop();
892
        desktop = asn_data.desktop();
859
    if( !isOnAllDesktops())
893
    if( !isOnAllDesktops())
860
        workspace()->sendClientToDesktop( this, desktop, true );
894
        workspace()->sendClientToDesktop( this, desktop, true );
895
    if( asn_data.xinerama() != -1 )
896
        workspace()->sendClientToScreen( this, asn_data.xinerama());
861
    Time timestamp = asn_id.timestamp();
897
    Time timestamp = asn_id.timestamp();
862
    if( timestamp == 0 && asn_data.timestamp() != -1U )
898
    if( timestamp == 0 && asn_data.timestamp() != -1U )
863
        timestamp = asn_data.timestamp();
899
        timestamp = asn_data.timestamp();
(-)kdebase.sav/kwin/client.cpp (+14 lines)
Lines 1235-1240 bool Client::isOnCurrentDesktop() const Link Here
1235
    return isOnDesktop( workspace()->currentDesktop());
1235
    return isOnDesktop( workspace()->currentDesktop());
1236
    }
1236
    }
1237
1237
1238
int Client::screen() const
1239
    {
1240
    if( !options->xineramaEnabled )
1241
        return 0;
1242
    return workspace()->screenNumber( geometry().center());
1243
    }
1244
1245
bool Client::isOnScreen( int screen ) const
1246
    {
1247
    if( !options->xineramaEnabled )
1248
        return screen == 0;
1249
    return workspace()->screenGeometry( screen ).intersects( geometry());
1250
    }
1251
1238
// performs activation and/or raising of the window
1252
// performs activation and/or raising of the window
1239
void Client::takeActivity( int flags, bool handled, allowed_t )
1253
void Client::takeActivity( int flags, bool handled, allowed_t )
1240
    {
1254
    {
(-)kdebase.sav/kwin/client.h (+3 lines)
Lines 116-121 class Client : public QObject, public KD Link Here
116
        bool isOnCurrentDesktop() const;
116
        bool isOnCurrentDesktop() const;
117
        bool isOnAllDesktops() const;
117
        bool isOnAllDesktops() const;
118
        void setOnAllDesktops( bool set );
118
        void setOnAllDesktops( bool set );
119
        
120
        bool isOnScreen( int screen ) const; // true if it's at least partially there
121
        int screen() const; // the screen where the center is
119
122
120
    // !isMinimized() && not hidden, i.e. normally visible on some virtual desktop
123
    // !isMinimized() && not hidden, i.e. normally visible on some virtual desktop
121
        bool isShown( bool shaded_is_shown ) const;
124
        bool isShown( bool shaded_is_shown ) const;
(-)kdebase.sav/kwin/geometry.cpp (-8 / +18 lines)
Lines 205-218 void Workspace::updateClientArea() Link Here
205
205
206
  \sa geometry()
206
  \sa geometry()
207
 */
207
 */
208
QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const
208
QRect Workspace::clientArea( clientAreaOption opt, int screen, int desktop ) const
209
    {
209
    {
210
    if( desktop == NETWinInfo::OnAllDesktops || desktop == 0 )
210
    if( desktop == NETWinInfo::OnAllDesktops || desktop == 0 )
211
        desktop = currentDesktop();
211
        desktop = currentDesktop();
212
    QDesktopWidget *desktopwidget = KApplication::desktop();
212
    QDesktopWidget *desktopwidget = KApplication::desktop();
213
    int screen = desktopwidget->isVirtualDesktop() ? desktopwidget->screenNumber( p ) : desktopwidget->primaryScreen();
214
    if( screen < 0 )
215
        screen = desktopwidget->primaryScreen();
216
    QRect sarea = screenarea // may be NULL during KWin initialization
213
    QRect sarea = screenarea // may be NULL during KWin initialization
217
        ? screenarea[ desktop ][ screen ]
214
        ? screenarea[ desktop ][ screen ]
218
        : desktopwidget->screenGeometry( screen );
215
        : desktopwidget->screenGeometry( screen );
Lines 257-267 QRect Workspace::clientArea( clientAreaO Link Here
257
    return QRect();
254
    return QRect();
258
    }
255
    }
259
256
257
QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const
258
    {
259
    QDesktopWidget *desktopwidget = KApplication::desktop();
260
    int screen = desktopwidget->screenNumber( p );
261
    if( screen < 0 )
262
        screen = desktopwidget->primaryScreen();
263
    return clientArea( opt, screen, desktop );
264
    }
265
260
QRect Workspace::clientArea( clientAreaOption opt, const Client* c ) const
266
QRect Workspace::clientArea( clientAreaOption opt, const Client* c ) const
261
    {
267
    {
262
    return clientArea( opt, c->geometry().center(), c->desktop());
268
    return clientArea( opt, c->geometry().center(), c->desktop());
263
    }
269
    }
264
270
271
265
/*!
272
/*!
266
  Client \a c is moved around to position \a pos. This gives the
273
  Client \a c is moved around to position \a pos. This gives the
267
  workspace the opportunity to interveniate and to implement
274
  workspace the opportunity to interveniate and to implement
Lines 890-899 void Client::checkWorkspacePosition() Link Here
890
            setGeometry( area );
897
            setGeometry( area );
891
        return;
898
        return;
892
        }
899
        }
893
    if( maximizeMode() != MaximizeRestore )
894
	// TODO update geom_restore?
895
        changeMaximize( false, false, true ); // adjust size
896
897
    if( isFullScreen())
900
    if( isFullScreen())
898
        {
901
        {
899
        QRect area = workspace()->clientArea( FullScreenArea, this );
902
        QRect area = workspace()->clientArea( FullScreenArea, this );
Lines 920-925 void Client::checkWorkspacePosition() Link Here
920
        return;
923
        return;
921
        }
924
        }
922
925
926
    if( maximizeMode() != MaximizeRestore )
927
	// TODO update geom_restore?
928
        changeMaximize( false, false, true ); // adjust size
929
923
    if( !isShade()) // TODO
930
    if( !isShade()) // TODO
924
        {
931
        {
925
        int old_diff_x = workarea_diff_x;
932
        int old_diff_x = workarea_diff_x;
Lines 1715-1720 void Client::setGeometry( int x, int y, Link Here
1715
    sendSyntheticConfigureNotify();
1722
    sendSyntheticConfigureNotify();
1716
    updateWindowRules();
1723
    updateWindowRules();
1717
    checkMaximizeGeometry();
1724
    checkMaximizeGeometry();
1725
    workspace()->checkActiveScreen( this );
1718
    }
1726
    }
1719
1727
1720
void Client::plainResize( int w, int h, ForceGeometry_t force )
1728
void Client::plainResize( int w, int h, ForceGeometry_t force )
Lines 1768-1773 void Client::plainResize( int w, int h, Link Here
1768
    sendSyntheticConfigureNotify();
1776
    sendSyntheticConfigureNotify();
1769
    updateWindowRules();
1777
    updateWindowRules();
1770
    checkMaximizeGeometry();
1778
    checkMaximizeGeometry();
1779
    workspace()->checkActiveScreen( this );
1771
    }
1780
    }
1772
1781
1773
/*!
1782
/*!
Lines 1788-1793 void Client::move( int x, int y, ForceGe Link Here
1788
    sendSyntheticConfigureNotify();
1797
    sendSyntheticConfigureNotify();
1789
    updateWindowRules();
1798
    updateWindowRules();
1790
    checkMaximizeGeometry();
1799
    checkMaximizeGeometry();
1800
    workspace()->checkActiveScreen( this );
1791
    }
1801
    }
1792
1802
1793
1803
(-)kdebase.sav/kwin/kcmkwin/kwinoptions/windows.cpp (+51 lines)
Lines 76-81 Link Here
76
#define KWIN_SHADEHOVER_INTERVAL   "ShadeHoverInterval"
76
#define KWIN_SHADEHOVER_INTERVAL   "ShadeHoverInterval"
77
#define KWIN_FOCUS_STEALING        "FocusStealingPreventionLevel"
77
#define KWIN_FOCUS_STEALING        "FocusStealingPreventionLevel"
78
#define KWIN_HIDE_UTILITY          "HideUtilityWindowsForInactive"
78
#define KWIN_HIDE_UTILITY          "HideUtilityWindowsForInactive"
79
#define KWIN_SEPARATE_SCREEN_FOCUS "SeparateScreenFocus"
80
#define KWIN_ACTIVE_MOUSE_SCREEN   "ActiveMouseScreen"
79
81
80
// kwm config keywords
82
// kwm config keywords
81
#define KWM_ELECTRIC_BORDER                  "ElectricBorders"
83
#define KWM_ELECTRIC_BORDER                  "ElectricBorders"
Lines 209-214 KFocusConfig::KFocusConfig (bool _standA Link Here
209
    QWhatsThis::add( delayFocus, i18n("This is the delay after which the window the mouse pointer is over"
211
    QWhatsThis::add( delayFocus, i18n("This is the delay after which the window the mouse pointer is over"
210
                                       " will automatically receive focus.") );
212
                                       " will automatically receive focus.") );
211
213
214
    separateScreenFocus = new QCheckBox( i18n( "S&eparate screen focus" ), fcsBox );
215
    fLay->addWidget( separateScreenFocus );
216
    wtstr = i18n( "When this option is enabled, focus operations are limited only to the active Xinerama screen" );
217
    QWhatsThis::add( separateScreenFocus, wtstr );
218
219
    activeMouseScreen = new QCheckBox( i18n( "Active &mouse screen" ), fcsBox );
220
    fLay->addWidget( activeMouseScreen );
221
    wtstr = i18n( "When this option is enabled, active Xinerama screen (where for example new windows appear)"
222
                  " is the screen with the mouse pointer. When disabled, the active Xinerama screen is the screen"
223
                  " with the focused window. This option is by default disabled for Click to focus and"
224
                  " enabled for other focus policies." );
225
    QWhatsThis::add( activeMouseScreen, wtstr );
226
    connect(focusCombo, SIGNAL(activated(int)), this, SLOT(updateActiveMouseScreen()));
227
228
    if (!QApplication::desktop()->isVirtualDesktop() ||
229
        QApplication::desktop()->numScreens() == 1) // No Ximerama 
230
    {
231
        separateScreenFocus->hide();
232
        activeMouseScreen->hide();
233
    }
234
212
    lay->addWidget(fcsBox);
235
    lay->addWidget(fcsBox);
213
236
214
    kbdBox = new QButtonGroup(i18n("Navigation"), this);
237
    kbdBox = new QButtonGroup(i18n("Navigation"), this);
Lines 260-265 KFocusConfig::KFocusConfig (bool _standA Link Here
260
    connect(fcsBox, SIGNAL(clicked(int)), SLOT(changed()));
283
    connect(fcsBox, SIGNAL(clicked(int)), SLOT(changed()));
261
    connect(autoRaise, SIGNAL(valueChanged(int)), SLOT(changed()));
284
    connect(autoRaise, SIGNAL(valueChanged(int)), SLOT(changed()));
262
    connect(delayFocus, SIGNAL(valueChanged(int)), SLOT(changed()));
285
    connect(delayFocus, SIGNAL(valueChanged(int)), SLOT(changed()));
286
    connect(separateScreenFocus, SIGNAL(clicked()), SLOT(changed()));
287
    connect(activeMouseScreen, SIGNAL(clicked()), SLOT(changed()));
263
    connect(altTabPopup, SIGNAL(clicked()), SLOT(changed()));
288
    connect(altTabPopup, SIGNAL(clicked()), SLOT(changed()));
264
    connect(traverseAll, SIGNAL(clicked()), SLOT(changed()));
289
    connect(traverseAll, SIGNAL(clicked()), SLOT(changed()));
265
    connect(rollOverDesktops, SIGNAL(clicked()), SLOT(changed()));
290
    connect(rollOverDesktops, SIGNAL(clicked()), SLOT(changed()));
Lines 366-371 void KFocusConfig::delayFocusOnTog(bool Link Here
366
void KFocusConfig::clickRaiseOnTog(bool ) {
391
void KFocusConfig::clickRaiseOnTog(bool ) {
367
}
392
}
368
393
394
void KFocusConfig::setSeparateScreenFocus(bool s) {
395
    separateScreenFocus->setChecked(s);
396
}
397
398
void KFocusConfig::setActiveMouseScreen(bool a) {
399
    activeMouseScreen->setChecked(a);
400
}
401
402
void KFocusConfig::updateActiveMouseScreen()
403
{
404
    // on by default for non click to focus policies
405
    KConfigGroup cfg( config, "Windows" );
406
    if( !cfg.hasKey( KWIN_ACTIVE_MOUSE_SCREEN ))
407
        setActiveMouseScreen( focusCombo->currentItem() != 0 );
408
}
409
369
void KFocusConfig::setAltTabMode(bool a) {
410
void KFocusConfig::setAltTabMode(bool a) {
370
    altTabPopup->setChecked(a);
411
    altTabPopup->setChecked(a);
371
}
412
}
Lines 412-417 void KFocusConfig::load( void ) Link Here
412
    setClickRaise(key != "off");
453
    setClickRaise(key != "off");
413
    setAutoRaiseEnabled();      // this will disable/hide the auto raise delay widget if focus==click
454
    setAutoRaiseEnabled();      // this will disable/hide the auto raise delay widget if focus==click
414
    setDelayFocusEnabled();
455
    setDelayFocusEnabled();
456
    
457
    setSeparateScreenFocus( config->readBoolEntry(KWIN_SEPARATE_SCREEN_FOCUS, false));
458
    // on by default for non click to focus policies
459
    setActiveMouseScreen( config->readBoolEntry(KWIN_ACTIVE_MOUSE_SCREEN, focusCombo->currentItem() != 0 ));
415
460
416
    key = config->readEntry(KWIN_ALTTABMODE, "KDE");
461
    key = config->readEntry(KWIN_ALTTABMODE, "KDE");
417
    setAltTabMode(key == "KDE");
462
    setAltTabMode(key == "KDE");
Lines 467-472 void KFocusConfig::save( void ) Link Here
467
    else
512
    else
468
        config->writeEntry(KWIN_CLICKRAISE, "off");
513
        config->writeEntry(KWIN_CLICKRAISE, "off");
469
514
515
    config->writeEntry(KWIN_SEPARATE_SCREEN_FOCUS, separateScreenFocus->isChecked());
516
    config->writeEntry(KWIN_ACTIVE_MOUSE_SCREEN, activeMouseScreen->isChecked());
517
470
    if (altTabPopup->isChecked())
518
    if (altTabPopup->isChecked())
471
        config->writeEntry(KWIN_ALTTABMODE, "KDE");
519
        config->writeEntry(KWIN_ALTTABMODE, "KDE");
472
    else
520
    else
Lines 500-505 void KFocusConfig::defaults() Link Here
500
    setAutoRaise(false);
548
    setAutoRaise(false);
501
    setDelayFocus(false);
549
    setDelayFocus(false);
502
    setClickRaise(true);
550
    setClickRaise(true);
551
    setSeparateScreenFocus( false );
552
    // on by default for non click to focus policies
553
    setActiveMouseScreen( focusCombo->currentItem() != 0 );
503
    setAltTabMode(true);
554
    setAltTabMode(true);
504
    setTraverseAll( false );
555
    setTraverseAll( false );
505
    setRollOverDesktops(true);
556
    setRollOverDesktops(true);
(-)kdebase.sav/kwin/kcmkwin/kwinoptions/windows.h (+5 lines)
Lines 86-91 private slots: Link Here
86
  void delayFocusOnTog(bool);
86
  void delayFocusOnTog(bool);
87
  void clickRaiseOnTog(bool);
87
  void clickRaiseOnTog(bool);
88
  void updateAltTabMode();
88
  void updateAltTabMode();
89
  void updateActiveMouseScreen();
89
	void changed() { emit KCModule::changed(true); }
90
	void changed() { emit KCModule::changed(true); }
90
91
91
92
Lines 101-106 private: Link Here
101
  void setDelayFocusInterval(int);
102
  void setDelayFocusInterval(int);
102
  void setDelayFocus(bool);
103
  void setDelayFocus(bool);
103
  void setClickRaise(bool);
104
  void setClickRaise(bool);
105
  void setSeparateScreenFocus(bool);
106
  void setActiveMouseScreen(bool);
104
  void setAltTabMode(bool);
107
  void setAltTabMode(bool);
105
  void setTraverseAll(bool);
108
  void setTraverseAll(bool);
106
  void setRollOverDesktops(bool);
109
  void setRollOverDesktops(bool);
Lines 113-118 private: Link Here
113
  QCheckBox *clickRaiseOn;
116
  QCheckBox *clickRaiseOn;
114
  KIntNumInput *autoRaise;
117
  KIntNumInput *autoRaise;
115
  KIntNumInput *delayFocus;
118
  KIntNumInput *delayFocus;
119
  QCheckBox *separateScreenFocus;
120
  QCheckBox *activeMouseScreen;
116
121
117
  QButtonGroup *kbdBox;
122
  QButtonGroup *kbdBox;
118
  QCheckBox    *altTabPopup;
123
  QCheckBox    *altTabPopup;
(-)kdebase.sav/kwin/kwinbindings.cpp (+18 lines)
Lines 104-109 Link Here
104
	DEF( I18N_NOOP("Window One Desktop to the Left"),      0, 0, slotWindowToDesktopLeft() );
104
	DEF( I18N_NOOP("Window One Desktop to the Left"),      0, 0, slotWindowToDesktopLeft() );
105
	DEF( I18N_NOOP("Window One Desktop Up"),               0, 0, slotWindowToDesktopUp() );
105
	DEF( I18N_NOOP("Window One Desktop Up"),               0, 0, slotWindowToDesktopUp() );
106
	DEF( I18N_NOOP("Window One Desktop Down"),             0, 0, slotWindowToDesktopDown() );
106
	DEF( I18N_NOOP("Window One Desktop Down"),             0, 0, slotWindowToDesktopDown() );
107
	DEF( I18N_NOOP("Window to Screen 0"),                  0, 0, slotWindowToScreen(int) );
108
	DEF( I18N_NOOP("Window to Screen 1"),                  0, 0, slotWindowToScreen(int) );
109
	DEF( I18N_NOOP("Window to Screen 2"),                  0, 0, slotWindowToScreen(int) );
110
	DEF( I18N_NOOP("Window to Screen 3"),                  0, 0, slotWindowToScreen(int) );
111
	DEF( I18N_NOOP("Window to Screen 4"),                  0, 0, slotWindowToScreen(int) );
112
	DEF( I18N_NOOP("Window to Screen 5"),                  0, 0, slotWindowToScreen(int) );
113
	DEF( I18N_NOOP("Window to Screen 6"),                  0, 0, slotWindowToScreen(int) );
114
	DEF( I18N_NOOP("Window to Screen 7"),                  0, 0, slotWindowToScreen(int) );
115
	DEF( I18N_NOOP("Window to Next Screen"),               0, 0, slotWindowToNextScreen() );
107
116
108
	keys->insert( "Group:Desktop Switching", i18n("Desktop Switching") );
117
	keys->insert( "Group:Desktop Switching", i18n("Desktop Switching") );
109
	DEF( I18N_NOOP("Switch to Desktop 1"),  CTRL+Qt::Key_F1, WIN+Qt::Key_F1, slotSwitchToDesktop(int) );
118
	DEF( I18N_NOOP("Switch to Desktop 1"),  CTRL+Qt::Key_F1, WIN+Qt::Key_F1, slotSwitchToDesktop(int) );
Lines 132-137 Link Here
132
	DEF( I18N_NOOP("Switch One Desktop to the Left"),      0, 0, slotSwitchDesktopLeft() );
141
	DEF( I18N_NOOP("Switch One Desktop to the Left"),      0, 0, slotSwitchDesktopLeft() );
133
	DEF( I18N_NOOP("Switch One Desktop Up"),               0, 0, slotSwitchDesktopUp() );
142
	DEF( I18N_NOOP("Switch One Desktop Up"),               0, 0, slotSwitchDesktopUp() );
134
	DEF( I18N_NOOP("Switch One Desktop Down"),             0, 0, slotSwitchDesktopDown() );
143
	DEF( I18N_NOOP("Switch One Desktop Down"),             0, 0, slotSwitchDesktopDown() );
144
	DEF( I18N_NOOP("Switch to Screen 0"),                  0, 0, slotSwitchToScreen(int) );
145
	DEF( I18N_NOOP("Switch to Screen 1"),                  0, 0, slotSwitchToScreen(int) );
146
	DEF( I18N_NOOP("Switch to Screen 2"),                  0, 0, slotSwitchToScreen(int) );
147
	DEF( I18N_NOOP("Switch to Screen 3"),                  0, 0, slotSwitchToScreen(int) );
148
	DEF( I18N_NOOP("Switch to Screen 4"),                  0, 0, slotSwitchToScreen(int) );
149
	DEF( I18N_NOOP("Switch to Screen 5"),                  0, 0, slotSwitchToScreen(int) );
150
	DEF( I18N_NOOP("Switch to Screen 6"),                  0, 0, slotSwitchToScreen(int) );
151
	DEF( I18N_NOOP("Switch to Screen 7"),                  0, 0, slotSwitchToScreen(int) );
152
	DEF( I18N_NOOP("Switch to Next Screen"),               0, 0, slotSwitchToNextScreen() );
135
153
136
	keys->insert( "Group:Miscellaneous", i18n("Miscellaneous") );
154
	keys->insert( "Group:Miscellaneous", i18n("Miscellaneous") );
137
	DEF( I18N_NOOP("Mouse Emulation"),                     ALT+Qt::Key_F12, 0, slotMouseEmulation() );
155
	DEF( I18N_NOOP("Mouse Emulation"),                     ALT+Qt::Key_F12, 0, slotMouseEmulation() );
(-)kdebase.sav/kwin/kwin.kcfg (+3 lines)
Lines 60-65 Link Here
60
  <entry key="IgnorePositionClasses" type="StringList" />
60
  <entry key="IgnorePositionClasses" type="StringList" />
61
  <entry key="KillPingTimeout" type="Int" />
61
  <entry key="KillPingTimeout" type="Int" />
62
  <entry key="ShowDesktopIsMinimizeAll" type="Bool" />
62
  <entry key="ShowDesktopIsMinimizeAll" type="Bool" />
63
   <entry key="SeparateScreenFocus" type="Bool" />
64
   <entry key="ActiveMouseScreen" type="Bool" />
65
   <entry key="XineramaPlacementScreen" type="Int" />
63
  </group>
66
  </group>
64
 <group name="WM" >
67
 <group name="WM" >
(-)kdebase.sav/kwin/manage.cpp (-3 / +8 lines)
Lines 166-172 bool Client::manage( Window w, bool isMa Link Here
166
                 it != mainclients.end();
166
                 it != mainclients.end();
167
                 ++it )
167
                 ++it )
168
                {
168
                {
169
                if( (*it)->isSpecialWindow())
169
                if( mainclients.count() > 1 && (*it)->isSpecialWindow())
170
                    continue; // don't consider toolbars etc when placing
170
                    continue; // don't consider toolbars etc when placing
171
                maincl = *it;
171
                maincl = *it;
172
                if( (*it)->isOnCurrentDesktop())
172
                if( (*it)->isOnCurrentDesktop())
Lines 202-210 bool Client::manage( Window w, bool isMa Link Here
202
    if( isMapped || session )
202
    if( isMapped || session )
203
        area = workspace()->clientArea( FullArea, geom.center(), desktop());
203
        area = workspace()->clientArea( FullArea, geom.center(), desktop());
204
    else if( options->xineramaPlacementEnabled )
204
    else if( options->xineramaPlacementEnabled )
205
        area = workspace()->clientArea( PlacementArea, QCursor::pos(), desktop());
205
        {
206
        int screen = options->xineramaPlacementScreen;
207
        if( screen == -1 ) // active screen
208
            screen = asn_data.xinerama() == -1 ? workspace()->activeScreen() : asn_data.xinerama();
209
        area = workspace()->clientArea( PlacementArea, workspace()->screenGeometry( screen ).center(), desktop());
210
        }
206
    else
211
    else
207
        area = workspace()->clientArea( PlacementArea, geom.center(), desktop());
212
        area = workspace()->clientArea( PlacementArea, QCursor::pos(), desktop());
208
213
209
    if( int type = checkFullScreenHack( geom ))
214
    if( int type = checkFullScreenHack( geom ))
210
        {
215
        {
(-)kdebase.sav/kwin/options.cpp (-1 / +5 lines)
Lines 70-75 unsigned long Options::updateSettings() Link Here
70
    altTabStyle = KDE; // what a default :-)
70
    altTabStyle = KDE; // what a default :-)
71
    if ( val == "CDE" )
71
    if ( val == "CDE" )
72
        altTabStyle = CDE;
72
        altTabStyle = CDE;
73
        
74
    separateScreenFocus = config->readBoolEntry( "SeparateScreenFocus", false );
75
    activeMouseScreen = config->readBoolEntry( "ActiveMouseScreen", focusPolicy != ClickToFocus );
73
76
74
    rollOverDesktops = config->readBoolEntry("RollOverDesktops", TRUE);
77
    rollOverDesktops = config->readBoolEntry("RollOverDesktops", TRUE);
75
    
78
    
Lines 99-107 unsigned long Options::updateSettings() Link Here
99
    delete gc;
102
    delete gc;
100
103
101
    placement = Placement::policyFromString( config->readEntry("Placement"), true );
104
    placement = Placement::policyFromString( config->readEntry("Placement"), true );
105
    xineramaPlacementScreen = KCLAMP( config->readNumEntry( "XineramaPlacementScreen", -1 ),
106
        -1, qApp->desktop()->numScreens() - 1 );
102
107
103
    animateShade = config->readBoolEntry("AnimateShade", TRUE );
108
    animateShade = config->readBoolEntry("AnimateShade", TRUE );
104
105
    animateMinimize = config->readBoolEntry("AnimateMinimize", TRUE );
109
    animateMinimize = config->readBoolEntry("AnimateMinimize", TRUE );
106
    animateMinimizeSpeed = config->readNumEntry("AnimateMinimizeSpeed", 5 );
110
    animateMinimizeSpeed = config->readNumEntry("AnimateMinimizeSpeed", 5 );
107
111
(-)kdebase.sav/kwin/options.h (+8 lines)
Lines 124-129 class Options : public KDecorationOption Link Here
124
         */
124
         */
125
        enum AltTabStyle { KDE, CDE };
125
        enum AltTabStyle { KDE, CDE };
126
        AltTabStyle altTabStyle;
126
        AltTabStyle altTabStyle;
127
        
128
        // whether to see Xinerama screens separately for focus (in Alt+Tab, when activating next client)
129
        bool separateScreenFocus;
130
        // whether active Xinerama screen is the one with mouse (or with the active window)
131
        bool activeMouseScreen;
127
132
128
        /**
133
        /**
129
         * Xinerama options
134
         * Xinerama options
Lines 133-138 class Options : public KDecorationOption Link Here
133
        bool xineramaMovementEnabled;
138
        bool xineramaMovementEnabled;
134
        bool xineramaMaximizeEnabled;
139
        bool xineramaMaximizeEnabled;
135
        bool xineramaFullscreenEnabled;
140
        bool xineramaFullscreenEnabled;
141
        
142
        // number, or -1 = active screen (Workspace::activeScreen())
143
        int xineramaPlacementScreen;
136
144
137
        /**
145
        /**
138
           MoveResizeMode, either Tranparent or Opaque.
146
           MoveResizeMode, either Tranparent or Opaque.
(-)kdebase.sav/kwin/placement.cpp (-1 / +6 lines)
Lines 473-479 void Placement::placeOnMainWindow(Client Link Here
473
         it != mainwindows.end();
473
         it != mainwindows.end();
474
         ++it )
474
         ++it )
475
        {
475
        {
476
        if( (*it)->isSpecialWindow())
476
        if( mainwindows.count() > 1 && (*it)->isSpecialWindow())
477
            continue; // don't consider toolbars etc when placing
477
            continue; // don't consider toolbars etc when placing
478
        ++mains_count;
478
        ++mains_count;
479
        place_on2 = *it;
479
        place_on2 = *it;
Lines 502-507 void Placement::placeOnMainWindow(Client Link Here
502
            }
502
            }
503
        place_on = place_on2; // use the only window filtered together with 'mains_count'
503
        place_on = place_on2; // use the only window filtered together with 'mains_count'
504
        }
504
        }
505
    if( place_on->isDesktop())
506
        {
507
        place( c, area, Centered );
508
        return;
509
        }
505
    QRect geom = c->geometry();
510
    QRect geom = c->geometry();
506
    geom.moveCenter( place_on->geometry().center());
511
    geom.moveCenter( place_on->geometry().center());
507
    c->move( geom.topLeft());
512
    c->move( geom.topLeft());
(-)kdebase.sav/kwin/popupinfo.cpp (-4 / +3 lines)
Lines 25-31 License. See the file "COPYING" for the Link Here
25
#include <klocale.h>
25
#include <klocale.h>
26
#include <qapplication.h>
26
#include <qapplication.h>
27
#include <qdesktopwidget.h>
27
#include <qdesktopwidget.h>
28
#include <qcursor.h>
29
#include <kstringhandler.h>
28
#include <kstringhandler.h>
30
#include <kglobalsettings.h>
29
#include <kglobalsettings.h>
31
30
Lines 34-41 License. See the file "COPYING" for the Link Here
34
namespace KWinInternal
33
namespace KWinInternal
35
{
34
{
36
35
37
PopupInfo::PopupInfo( const char *name )
36
PopupInfo::PopupInfo( Workspace* ws, const char *name )
38
    : QWidget( 0, name )
37
    : QWidget( 0, name ), workspace( ws )
39
    {
38
    {
40
    m_infoString = "";
39
    m_infoString = "";
41
    m_shown = false;
40
    m_shown = false;
Lines 60-66 PopupInfo::~PopupInfo() Link Here
60
 */
59
 */
61
void PopupInfo::reset()
60
void PopupInfo::reset()
62
    {
61
    {
63
    QRect r = KGlobalSettings::desktopGeometry(QCursor::pos());
62
    QRect r = workspace->screenGeometry( workspace->activeScreen());
64
63
65
    int w = fontMetrics().width( m_infoString ) + 30;
64
    int w = fontMetrics().width( m_infoString ) + 30;
66
65
(-)kdebase.sav/kwin/popupinfo.h (-1 / +2 lines)
Lines 24-30 class PopupInfo : public QWidget Link Here
24
    {
24
    {
25
    Q_OBJECT
25
    Q_OBJECT
26
    public:
26
    public:
27
        PopupInfo( const char *name=0 );
27
        PopupInfo( Workspace* ws, const char *name=0 );
28
        ~PopupInfo();
28
        ~PopupInfo();
29
29
30
        void reset();
30
        void reset();
Lines 43-48 class PopupInfo : public QWidget Link Here
43
        bool m_show;
43
        bool m_show;
44
        bool m_shown;
44
        bool m_shown;
45
        QString m_infoString;
45
        QString m_infoString;
46
        Workspace* workspace;
46
    };
47
    };
47
48
48
} // namespace
49
} // namespace
(-)kdebase.sav/kwin/tabbox.cpp (-16 / +25 lines)
Lines 23-29 License. See the file "COPYING" for the Link Here
23
#include <klocale.h>
23
#include <klocale.h>
24
#include <qapplication.h>
24
#include <qapplication.h>
25
#include <qdesktopwidget.h>
25
#include <qdesktopwidget.h>
26
#include <qcursor.h>
27
#include <kstringhandler.h>
26
#include <kstringhandler.h>
28
#include <stdarg.h>
27
#include <stdarg.h>
29
#include <kdebug.h>
28
#include <kdebug.h>
Lines 111-136 void TabBox::createClientList(ClientList Link Here
111
110
112
    while ( c )
111
    while ( c )
113
        {
112
        {
113
        Client* add = NULL;
114
        if ( ((desktop == -1) || c->isOnDesktop(desktop))
114
        if ( ((desktop == -1) || c->isOnDesktop(desktop))
115
             && c->wantsTabFocus() )
115
             && c->wantsTabFocus() )
116
            { // don't add windows that have modal dialogs
117
            Client* modal = c->findModal();
118
            if( modal == NULL || modal == c )
119
                add = c;
120
            else if( !list.contains( modal ))
121
                add = modal;
122
            else
123
                {
124
                // nothing
125
                }
126
            }
127
128
        if( options->separateScreenFocus && options->xineramaEnabled )
116
            {
129
            {
117
            if ( start == c )
130
            if( c->screen() != workspace()->activeScreen())
131
                add = NULL;
132
            }
133
134
        if( add != NULL )
135
            {
136
            if ( start == add )
118
                {
137
                {
119
                list.remove( c );
138
                list.remove( add );
120
                list.prepend( c );
139
                list.prepend( add );
121
                }
140
                }
122
            else
141
            else
123
                { // don't add windows that have modal dialogs
142
                list += add;
124
                Client* modal = c->findModal();
125
                if( modal == NULL || modal == c )
126
                    list += c;
127
                else if( !list.contains( modal ))
128
                    list += modal;
129
                else
130
                    {
131
                    // nothing
132
                    }
133
                }
134
            }
143
            }
135
144
136
        if ( chain )
145
        if ( chain )
Lines 157-163 void TabBox::reset() Link Here
157
    {
166
    {
158
    int w, h, cw = 0, wmax = 0;
167
    int w, h, cw = 0, wmax = 0;
159
168
160
    QRect r = KGlobalSettings::desktopGeometry(QCursor::pos());
169
    QRect r = workspace()->screenGeometry( workspace()->activeScreen());
161
170
162
    // calculate height of 1 line
171
    // calculate height of 1 line
163
    // fontheight + 1 pixel above + 1 pixel below, or 32x32 icon + 2 pixel above + below
172
    // fontheight + 1 pixel above + 1 pixel below, or 32x32 icon + 2 pixel above + below
(-)kdebase.sav/kwin/useractions.cpp (+40 lines)
Lines 482-508 bool Client::performMouseCommand( Option Link Here
482
        case Options::MouseActivateAndRaise:
482
        case Options::MouseActivateAndRaise:
483
            replay = isActive(); // for clickraise mode
483
            replay = isActive(); // for clickraise mode
484
            workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled && replay );
484
            workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled && replay );
485
            workspace()->setActiveScreenMouse( globalPos );
485
            break;
486
            break;
486
        case Options::MouseActivateAndLower:
487
        case Options::MouseActivateAndLower:
487
            workspace()->requestFocus( this );
488
            workspace()->requestFocus( this );
488
            workspace()->lowerClient( this );
489
            workspace()->lowerClient( this );
490
            workspace()->setActiveScreenMouse( globalPos );
489
            break;
491
            break;
490
        case Options::MouseActivate:
492
        case Options::MouseActivate:
491
            replay = isActive(); // for clickraise mode
493
            replay = isActive(); // for clickraise mode
492
            workspace()->takeActivity( this, ActivityFocus, handled && replay );
494
            workspace()->takeActivity( this, ActivityFocus, handled && replay );
495
            workspace()->setActiveScreenMouse( globalPos );
493
            break;
496
            break;
494
        case Options::MouseActivateRaiseAndPassClick:
497
        case Options::MouseActivateRaiseAndPassClick:
495
            workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled );
498
            workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled );
499
            workspace()->setActiveScreenMouse( globalPos );
496
            replay = TRUE;
500
            replay = TRUE;
497
            break;
501
            break;
498
        case Options::MouseActivateAndPassClick:
502
        case Options::MouseActivateAndPassClick:
499
            workspace()->takeActivity( this, ActivityFocus, handled );
503
            workspace()->takeActivity( this, ActivityFocus, handled );
504
            workspace()->setActiveScreenMouse( globalPos );
500
            replay = TRUE;
505
            replay = TRUE;
501
            break;
506
            break;
502
        case Options::MouseActivateRaiseAndMove:
507
        case Options::MouseActivateRaiseAndMove:
503
        case Options::MouseActivateRaiseAndUnrestrictedMove:
508
        case Options::MouseActivateRaiseAndUnrestrictedMove:
504
            workspace()->raiseClient( this );
509
            workspace()->raiseClient( this );
505
            workspace()->requestFocus( this );
510
            workspace()->requestFocus( this );
511
            workspace()->setActiveScreenMouse( globalPos );
506
            if( options->moveMode == Options::Transparent && isMovable())
512
            if( options->moveMode == Options::Transparent && isMovable())
507
                move_faked_activity = workspace()->fakeRequestedActivity( this );
513
                move_faked_activity = workspace()->fakeRequestedActivity( this );
508
        // fallthrough
514
        // fallthrough
Lines 709-714 void Workspace::slotWindowToDesktop( int Link Here
709
            sendClientToDesktop( c, i, true );
715
            sendClientToDesktop( c, i, true );
710
    }
716
    }
711
717
718
void Workspace::slotSwitchToScreen( int i )
719
    {
720
    setCurrentScreen( i );
721
    }
722
723
void Workspace::slotSwitchToNextScreen()
724
    {
725
    slotSwitchToScreen(( activeScreen() + 1 ) % numScreens());
726
    }
727
728
void Workspace::slotWindowToScreen( int i )
729
    {
730
    Client* c = active_popup_client ? active_popup_client : active_client;
731
    if( i >= 0 && i <= numScreens() && c
732
        && !c->isDesktop()
733
        && !c->isDock()
734
        && !c->isTopMenu())
735
        {
736
        sendClientToScreen( c, i );
737
        }
738
    }
739
740
void Workspace::slotWindowToNextScreen()
741
    {
742
    Client* c = active_popup_client ? active_popup_client : active_client;
743
    if( c
744
        && !c->isDesktop()
745
        && !c->isDock()
746
        && !c->isTopMenu())
747
        {
748
        sendClientToScreen( c, ( c->screen() + 1 ) % numScreens());
749
        }
750
    }
751
712
/*!
752
/*!
713
  Maximizes the popup client
753
  Maximizes the popup client
714
 */
754
 */
(-)kdebase.sav/kwin/workspace.cpp (-1 / +77 lines)
Lines 70-75 Workspace::Workspace( bool restore ) Link Here
70
    QObject           (0, "workspace"),
70
    QObject           (0, "workspace"),
71
    current_desktop   (0),
71
    current_desktop   (0),
72
    number_of_desktops(0),
72
    number_of_desktops(0),
73
    active_screen     (0),
73
    active_popup( NULL ),
74
    active_popup( NULL ),
74
    active_popup_client( NULL ),
75
    active_popup_client( NULL ),
75
    desktop_widget    (0),
76
    desktop_widget    (0),
Lines 189-195 Workspace::Workspace( bool restore ) Link Here
189
    client_keys = new KGlobalAccel( this );
190
    client_keys = new KGlobalAccel( this );
190
    initShortcuts();
191
    initShortcuts();
191
    tab_box = new TabBox( this );
192
    tab_box = new TabBox( this );
192
    popupinfo = new PopupInfo( );
193
    popupinfo = new PopupInfo( this );
193
194
194
    init();
195
    init();
195
196
Lines 288-293 void Workspace::init() Link Here
288
        NET::WM2ExtendedStrut |
289
        NET::WM2ExtendedStrut |
289
        NET::WM2KDETemporaryRules |
290
        NET::WM2KDETemporaryRules |
290
        NET::WM2ShowingDesktop |
291
        NET::WM2ShowingDesktop |
292
         NET::WM2FullPlacement |
291
        NET::WM2DesktopLayout |
293
        NET::WM2DesktopLayout |
292
        0
294
        0
293
        ,
295
        ,
Lines 1502-1507 void Workspace::sendClientToDesktop( Cli Link Here
1502
    updateClientArea();
1504
    updateClientArea();
1503
    }
1505
    }
1504
1506
1507
int Workspace::numScreens() const
1508
    {
1509
    if( !options->xineramaEnabled )
1510
        return 0;
1511
    return qApp->desktop()->numScreens();
1512
    }
1513
1514
int Workspace::activeScreen() const
1515
    {
1516
    if( !options->xineramaEnabled )
1517
        return 1;
1518
    if( !options->activeMouseScreen )
1519
        {
1520
        if( activeClient() != NULL && !activeClient()->isOnScreen( active_screen ))
1521
            return qApp->desktop()->screenNumber( activeClient()->geometry().center());
1522
        return active_screen;
1523
        }
1524
    return qApp->desktop()->screenNumber( QCursor::pos());
1525
    }
1526
1527
// check whether a client moved completely out of what's considered the active screen,
1528
// if yes, set a new active screen
1529
void Workspace::checkActiveScreen( const Client* c )
1530
    {
1531
    if( !options->xineramaEnabled )
1532
        return;
1533
    if( !c->isActive())
1534
        return;
1535
    if( !c->isOnScreen( active_screen ))
1536
        active_screen = c->screen();
1537
    }
1538
1539
// called e.g. when a user clicks on a window, set active screen to be the screen
1540
// where the click occured
1541
void Workspace::setActiveScreenMouse( QPoint mousepos )
1542
    {
1543
    if( !options->xineramaEnabled )
1544
        return;
1545
    active_screen = qApp->desktop()->screenNumber( mousepos );
1546
    }
1547
1548
QRect Workspace::screenGeometry( int screen ) const
1549
    {
1550
    if( !options->xineramaEnabled )
1551
        return qApp->desktop()->geometry();
1552
    return qApp->desktop()->screenGeometry( screen );
1553
    }
1554
1555
int Workspace::screenNumber( QPoint pos ) const
1556
    {
1557
    if( !options->xineramaEnabled )
1558
        return 0;
1559
    return qApp->desktop()->screenNumber( pos );
1560
    }
1561
1562
void Workspace::sendClientToScreen( Client* c, int screen )
1563
    {
1564
    if( c->screen() == screen ) // don't use isOnScreen(), that's true even when only partially
1565
        return;
1566
    GeometryUpdatesPostponer blocker( c );
1567
    QRect old_sarea = clientArea( MaximizeArea, c );
1568
    QRect sarea = clientArea( MaximizeArea, screen, c->desktop());
1569
    c->setGeometry( sarea.x() - old_sarea.x() + c->x(), sarea.y() - old_sarea.y() + c->y(),
1570
        c->size().width(), c->size().height());
1571
    c->checkWorkspacePosition();
1572
    ClientList transients_stacking_order = ensureStackingOrder( c->transients());
1573
    for( ClientList::ConstIterator it = transients_stacking_order.begin();
1574
         it != transients_stacking_order.end();
1575
         ++it )
1576
        sendClientToScreen( *it, screen );
1577
    if( c->isActive())
1578
        active_screen = screen;
1579
    }
1580
1505
void Workspace::setDesktopLayout( int, int, int )
1581
void Workspace::setDesktopLayout( int, int, int )
1506
   { // DCOP-only, unused
1582
   { // DCOP-only, unused
1507
   }
1583
   }
(-)kdebase.sav/kwin/workspace.h (+15 lines)
Lines 91-96 class Workspace : public QObject, public Link Here
91
91
92
        QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const;
92
        QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const;
93
        QRect clientArea( clientAreaOption, const Client* c ) const;
93
        QRect clientArea( clientAreaOption, const Client* c ) const;
94
        QRect clientArea( clientAreaOption, int screen, int desktop ) const;
94
95
95
        /**
96
        /**
96
         * @internal
97
         * @internal
Lines 161-166 class Workspace : public QObject, public Link Here
161
         */
162
         */
162
        int numberOfDesktops() const;
163
        int numberOfDesktops() const;
163
        void setNumberOfDesktops( int n );
164
        void setNumberOfDesktops( int n );
165
        
166
        int activeScreen() const;
167
        int numScreens() const;
168
        void checkActiveScreen( const Client* c );
169
        void setActiveScreenMouse( QPoint mousepos );
170
        QRect screenGeometry( int screen ) const;
171
        int screenNumber( QPoint pos ) const;
164
172
165
        QWidget* desktopWidget();
173
        QWidget* desktopWidget();
166
174
Lines 186-191 class Workspace : public QObject, public Link Here
186
        void sendClientToDesktop( Client* c, int desktop, bool dont_activate );
194
        void sendClientToDesktop( Client* c, int desktop, bool dont_activate );
187
        void windowToPreviousDesktop( Client* c );
195
        void windowToPreviousDesktop( Client* c );
188
        void windowToNextDesktop( Client* c );
196
        void windowToNextDesktop( Client* c );
197
        void sendClientToScreen( Client* c, int screen );
189
198
190
    // KDE4 remove me - and it's also in the DCOP interface :(
199
    // KDE4 remove me - and it's also in the DCOP interface :(
191
        void showWindowMenuAt( unsigned long id, int x, int y );
200
        void showWindowMenuAt( unsigned long id, int x, int y );
Lines 222-227 class Workspace : public QObject, public Link Here
222
        void nextDesktop();
231
        void nextDesktop();
223
        void previousDesktop();
232
        void previousDesktop();
224
        void circulateDesktopApplications();
233
        void circulateDesktopApplications();
234
        void setCurrentScreen( int new_screen );
225
235
226
        QString desktopName( int desk ) const;
236
        QString desktopName( int desk ) const;
227
        void setDesktopLayout(int o, int x, int y);
237
        void setDesktopLayout(int o, int x, int y);
Lines 297-302 class Workspace : public QObject, public Link Here
297
    //void slotSwitchToWindow( int );
307
    //void slotSwitchToWindow( int );
298
        void slotWindowToDesktop( int );
308
        void slotWindowToDesktop( int );
299
    //void slotWindowToListPosition( int );
309
    //void slotWindowToListPosition( int );
310
        void slotSwitchToScreen( int );
311
        void slotWindowToScreen( int );
312
        void slotSwitchToNextScreen();
313
        void slotWindowToNextScreen();
300
314
301
        void slotWindowMaximize();
315
        void slotWindowMaximize();
302
        void slotWindowMaximizeVertical();
316
        void slotWindowMaximizeVertical();
Lines 477-482 class Workspace : public QObject, public Link Here
477
        int current_desktop;
491
        int current_desktop;
478
        int number_of_desktops;
492
        int number_of_desktops;
479
        QMemArray<int> desktop_focus_chain;
493
        QMemArray<int> desktop_focus_chain;
494
        int active_screen;
480
495
481
        QWidget* active_popup;
496
        QWidget* active_popup;
482
        Client* active_popup_client;
497
        Client* active_popup_client;

Return to bug 211469