Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 147597 Details for
Bug 211469
kde-base/{kdebase,kdelibs}-3.5.{8,9} - Xinerama patches missing
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
kdebase patch if applied directly from kwin ebuild
kdebase-kwin-only-seli-xinerama.patch (text/plain), 33.28 KB, created by
Vladimir Brik
on 2008-03-29 01:08:26 UTC
(
hide
)
Description:
kdebase patch if applied directly from kwin ebuild
Filename:
MIME Type:
Creator:
Vladimir Brik
Created:
2008-03-29 01:08:26 UTC
Size:
33.28 KB
patch
obsolete
>diff -u -p -N -r kdebase.sav/kwin/activation.cpp kdebase/kwin/activation.cpp >--- kdebase.sav/kwin/activation.cpp 2006-04-13 14:03:15.000000000 +0200 >+++ kdebase/kwin/activation.cpp 2006-09-01 13:27:34.000000000 +0200 >@@ -358,6 +358,8 @@ void Workspace::takeActivity( Client* c, > return; > } > c->takeActivity( flags, handled, Allowed ); >+ if( !c->isOnScreen( active_screen )) >+ active_screen = c->screen(); > } > > void Workspace::handleTakeActivity( Client* c, Time /*timestamp*/, int flags ) >@@ -411,6 +413,13 @@ bool Workspace::activateNextClient( Clie > { > if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop()) > continue; >+ if( options->separateScreenFocus ) >+ { >+ if( c != NULL && !(*it)->isOnScreen( c->screen())) >+ continue; >+ if( c == NULL && !(*it)->isOnScreen( activeScreen())) >+ continue; >+ } > if( mainwindows.contains( *it )) > { > get_focus = *it; >@@ -436,6 +445,31 @@ bool Workspace::activateNextClient( Clie > return true; > } > >+void Workspace::setCurrentScreen( int new_screen ) >+ { >+ if (new_screen < 0 || new_screen > numScreens()) >+ return; >+ if ( !options->focusPolicyIsReasonable()) >+ return; >+ closeActivePopup(); >+ Client* get_focus = NULL; >+ for( ClientList::ConstIterator it = focus_chain[currentDesktop()].fromLast(); >+ it != focus_chain[currentDesktop()].end(); >+ --it ) >+ { >+ if( !(*it)->isShown( false ) || !(*it)->isOnCurrentDesktop()) >+ continue; >+ if( !(*it)->screen() == new_screen ) >+ continue; >+ get_focus = *it; >+ break; >+ } >+ if( get_focus == NULL ) >+ get_focus = findDesktop( true, currentDesktop()); >+ if( get_focus != NULL && get_focus != mostRecentlyActivatedClient()) >+ requestFocus( get_focus ); >+ active_screen = new_screen; >+ } > > void Workspace::gotFocusIn( const Client* c ) > { >@@ -858,6 +892,8 @@ void Client::startupIdChanged() > desktop = asn_data.desktop(); > if( !isOnAllDesktops()) > workspace()->sendClientToDesktop( this, desktop, true ); >+ if( asn_data.xinerama() != -1 ) >+ workspace()->sendClientToScreen( this, asn_data.xinerama()); > Time timestamp = asn_id.timestamp(); > if( timestamp == 0 && asn_data.timestamp() != -1U ) > timestamp = asn_data.timestamp(); >diff -u -p -N -r kdebase.sav/kwin/client.cpp kdebase/kwin/client.cpp >--- kdebase.sav/kwin/client.cpp 2006-08-18 15:43:34.000000000 +0200 >+++ kdebase/kwin/client.cpp 2006-09-01 13:26:00.000000000 +0200 >@@ -1235,6 +1235,20 @@ bool Client::isOnCurrentDesktop() const > return isOnDesktop( workspace()->currentDesktop()); > } > >+int Client::screen() const >+ { >+ if( !options->xineramaEnabled ) >+ return 0; >+ return workspace()->screenNumber( geometry().center()); >+ } >+ >+bool Client::isOnScreen( int screen ) const >+ { >+ if( !options->xineramaEnabled ) >+ return screen == 0; >+ return workspace()->screenGeometry( screen ).intersects( geometry()); >+ } >+ > // performs activation and/or raising of the window > void Client::takeActivity( int flags, bool handled, allowed_t ) > { >diff -u -p -N -r kdebase.sav/kwin/client.h kdebase/kwin/client.h >--- kdebase.sav/kwin/client.h 2006-04-13 14:03:15.000000000 +0200 >+++ kdebase/kwin/client.h 2006-09-01 13:26:00.000000000 +0200 >@@ -116,6 +116,9 @@ class Client : public QObject, public KD > bool isOnCurrentDesktop() const; > bool isOnAllDesktops() const; > void setOnAllDesktops( bool set ); >+ >+ bool isOnScreen( int screen ) const; // true if it's at least partially there >+ int screen() const; // the screen where the center is > > // !isMinimized() && not hidden, i.e. normally visible on some virtual desktop > bool isShown( bool shaded_is_shown ) const; >diff -u -p -N -r kdebase.sav/kwin/geometry.cpp kdebase/kwin/geometry.cpp >--- kdebase.sav/kwin/geometry.cpp 2006-08-10 15:05:22.000000000 +0200 >+++ kdebase/kwin/geometry.cpp 2006-09-01 13:27:39.000000000 +0200 >@@ -205,14 +205,11 @@ void Workspace::updateClientArea() > > \sa geometry() > */ >-QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const >+QRect Workspace::clientArea( clientAreaOption opt, int screen, int desktop ) const > { > if( desktop == NETWinInfo::OnAllDesktops || desktop == 0 ) > desktop = currentDesktop(); > QDesktopWidget *desktopwidget = KApplication::desktop(); >- int screen = desktopwidget->isVirtualDesktop() ? desktopwidget->screenNumber( p ) : desktopwidget->primaryScreen(); >- if( screen < 0 ) >- screen = desktopwidget->primaryScreen(); > QRect sarea = screenarea // may be NULL during KWin initialization > ? screenarea[ desktop ][ screen ] > : desktopwidget->screenGeometry( screen ); >@@ -257,11 +254,21 @@ QRect Workspace::clientArea( clientAreaO > return QRect(); > } > >+QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const >+ { >+ QDesktopWidget *desktopwidget = KApplication::desktop(); >+ int screen = desktopwidget->screenNumber( p ); >+ if( screen < 0 ) >+ screen = desktopwidget->primaryScreen(); >+ return clientArea( opt, screen, desktop ); >+ } >+ > QRect Workspace::clientArea( clientAreaOption opt, const Client* c ) const > { > return clientArea( opt, c->geometry().center(), c->desktop()); > } > >+ > /*! > Client \a c is moved around to position \a pos. This gives the > workspace the opportunity to interveniate and to implement >@@ -890,10 +897,6 @@ void Client::checkWorkspacePosition() > setGeometry( area ); > return; > } >- if( maximizeMode() != MaximizeRestore ) >- // TODO update geom_restore? >- changeMaximize( false, false, true ); // adjust size >- > if( isFullScreen()) > { > QRect area = workspace()->clientArea( FullScreenArea, this ); >@@ -920,6 +923,10 @@ void Client::checkWorkspacePosition() > return; > } > >+ if( maximizeMode() != MaximizeRestore ) >+ // TODO update geom_restore? >+ changeMaximize( false, false, true ); // adjust size >+ > if( !isShade()) // TODO > { > int old_diff_x = workarea_diff_x; >@@ -1715,6 +1722,7 @@ void Client::setGeometry( int x, int y, > sendSyntheticConfigureNotify(); > updateWindowRules(); > checkMaximizeGeometry(); >+ workspace()->checkActiveScreen( this ); > } > > void Client::plainResize( int w, int h, ForceGeometry_t force ) >@@ -1768,6 +1776,7 @@ void Client::plainResize( int w, int h, > sendSyntheticConfigureNotify(); > updateWindowRules(); > checkMaximizeGeometry(); >+ workspace()->checkActiveScreen( this ); > } > > /*! >@@ -1788,6 +1797,7 @@ void Client::move( int x, int y, ForceGe > sendSyntheticConfigureNotify(); > updateWindowRules(); > checkMaximizeGeometry(); >+ workspace()->checkActiveScreen( this ); > } > > >diff -u -p -N -r kdebase.sav/kwin/kcmkwin/kwinoptions/windows.cpp kdebase/kwin/kcmkwin/kwinoptions/windows.cpp >--- kdebase.sav/kwin/kcmkwin/kwinoptions/windows.cpp 2006-09-01 13:22:04.000000000 +0200 >+++ kdebase/kwin/kcmkwin/kwinoptions/windows.cpp 2006-09-01 15:54:18.000000000 +0200 >@@ -76,6 +76,8 @@ > #define KWIN_SHADEHOVER_INTERVAL "ShadeHoverInterval" > #define KWIN_FOCUS_STEALING "FocusStealingPreventionLevel" > #define KWIN_HIDE_UTILITY "HideUtilityWindowsForInactive" >+#define KWIN_SEPARATE_SCREEN_FOCUS "SeparateScreenFocus" >+#define KWIN_ACTIVE_MOUSE_SCREEN "ActiveMouseScreen" > > // kwm config keywords > #define KWM_ELECTRIC_BORDER "ElectricBorders" >@@ -209,6 +211,27 @@ KFocusConfig::KFocusConfig (bool _standA > QWhatsThis::add( delayFocus, i18n("This is the delay after which the window the mouse pointer is over" > " will automatically receive focus.") ); > >+ separateScreenFocus = new QCheckBox( i18n( "S&eparate screen focus" ), fcsBox ); >+ fLay->addWidget( separateScreenFocus ); >+ wtstr = i18n( "When this option is enabled, focus operations are limited only to the active Xinerama screen" ); >+ QWhatsThis::add( separateScreenFocus, wtstr ); >+ >+ activeMouseScreen = new QCheckBox( i18n( "Active &mouse screen" ), fcsBox ); >+ fLay->addWidget( activeMouseScreen ); >+ wtstr = i18n( "When this option is enabled, active Xinerama screen (where for example new windows appear)" >+ " is the screen with the mouse pointer. When disabled, the active Xinerama screen is the screen" >+ " with the focused window. This option is by default disabled for Click to focus and" >+ " enabled for other focus policies." ); >+ QWhatsThis::add( activeMouseScreen, wtstr ); >+ connect(focusCombo, SIGNAL(activated(int)), this, SLOT(updateActiveMouseScreen())); >+ >+ if (!QApplication::desktop()->isVirtualDesktop() || >+ QApplication::desktop()->numScreens() == 1) // No Ximerama >+ { >+ separateScreenFocus->hide(); >+ activeMouseScreen->hide(); >+ } >+ > lay->addWidget(fcsBox); > > kbdBox = new QButtonGroup(i18n("Navigation"), this); >@@ -260,6 +283,8 @@ KFocusConfig::KFocusConfig (bool _standA > connect(fcsBox, SIGNAL(clicked(int)), SLOT(changed())); > connect(autoRaise, SIGNAL(valueChanged(int)), SLOT(changed())); > connect(delayFocus, SIGNAL(valueChanged(int)), SLOT(changed())); >+ connect(separateScreenFocus, SIGNAL(clicked()), SLOT(changed())); >+ connect(activeMouseScreen, SIGNAL(clicked()), SLOT(changed())); > connect(altTabPopup, SIGNAL(clicked()), SLOT(changed())); > connect(traverseAll, SIGNAL(clicked()), SLOT(changed())); > connect(rollOverDesktops, SIGNAL(clicked()), SLOT(changed())); >@@ -366,6 +391,22 @@ void KFocusConfig::delayFocusOnTog(bool > void KFocusConfig::clickRaiseOnTog(bool ) { > } > >+void KFocusConfig::setSeparateScreenFocus(bool s) { >+ separateScreenFocus->setChecked(s); >+} >+ >+void KFocusConfig::setActiveMouseScreen(bool a) { >+ activeMouseScreen->setChecked(a); >+} >+ >+void KFocusConfig::updateActiveMouseScreen() >+{ >+ // on by default for non click to focus policies >+ KConfigGroup cfg( config, "Windows" ); >+ if( !cfg.hasKey( KWIN_ACTIVE_MOUSE_SCREEN )) >+ setActiveMouseScreen( focusCombo->currentItem() != 0 ); >+} >+ > void KFocusConfig::setAltTabMode(bool a) { > altTabPopup->setChecked(a); > } >@@ -412,6 +453,10 @@ void KFocusConfig::load( void ) > setClickRaise(key != "off"); > setAutoRaiseEnabled(); // this will disable/hide the auto raise delay widget if focus==click > setDelayFocusEnabled(); >+ >+ setSeparateScreenFocus( config->readBoolEntry(KWIN_SEPARATE_SCREEN_FOCUS, false)); >+ // on by default for non click to focus policies >+ setActiveMouseScreen( config->readBoolEntry(KWIN_ACTIVE_MOUSE_SCREEN, focusCombo->currentItem() != 0 )); > > key = config->readEntry(KWIN_ALTTABMODE, "KDE"); > setAltTabMode(key == "KDE"); >@@ -467,6 +512,9 @@ void KFocusConfig::save( void ) > else > config->writeEntry(KWIN_CLICKRAISE, "off"); > >+ config->writeEntry(KWIN_SEPARATE_SCREEN_FOCUS, separateScreenFocus->isChecked()); >+ config->writeEntry(KWIN_ACTIVE_MOUSE_SCREEN, activeMouseScreen->isChecked()); >+ > if (altTabPopup->isChecked()) > config->writeEntry(KWIN_ALTTABMODE, "KDE"); > else >@@ -500,6 +548,9 @@ void KFocusConfig::defaults() > setAutoRaise(false); > setDelayFocus(false); > setClickRaise(true); >+ setSeparateScreenFocus( false ); >+ // on by default for non click to focus policies >+ setActiveMouseScreen( focusCombo->currentItem() != 0 ); > setAltTabMode(true); > setTraverseAll( false ); > setRollOverDesktops(true); >diff -u -p -N -r kdebase.sav/kwin/kcmkwin/kwinoptions/windows.h kdebase/kwin/kcmkwin/kwinoptions/windows.h >--- kdebase.sav/kwin/kcmkwin/kwinoptions/windows.h 2006-04-13 14:03:15.000000000 +0200 >+++ kdebase/kwin/kcmkwin/kwinoptions/windows.h 2006-09-01 15:54:18.000000000 +0200 >@@ -86,6 +86,7 @@ private slots: > void delayFocusOnTog(bool); > void clickRaiseOnTog(bool); > void updateAltTabMode(); >+ void updateActiveMouseScreen(); > void changed() { emit KCModule::changed(true); } > > >@@ -101,6 +102,8 @@ private: > void setDelayFocusInterval(int); > void setDelayFocus(bool); > void setClickRaise(bool); >+ void setSeparateScreenFocus(bool); >+ void setActiveMouseScreen(bool); > void setAltTabMode(bool); > void setTraverseAll(bool); > void setRollOverDesktops(bool); >@@ -113,6 +116,8 @@ private: > QCheckBox *clickRaiseOn; > KIntNumInput *autoRaise; > KIntNumInput *delayFocus; >+ QCheckBox *separateScreenFocus; >+ QCheckBox *activeMouseScreen; > > QButtonGroup *kbdBox; > QCheckBox *altTabPopup; >diff -u -p -N -r kdebase.sav/kwin/kwinbindings.cpp kdebase/kwin/kwinbindings.cpp >--- kdebase.sav/kwin/kwinbindings.cpp 2005-09-19 20:44:41.000000000 +0200 >+++ kdebase/kwin/kwinbindings.cpp 2006-09-01 13:26:35.000000000 +0200 >@@ -104,6 +104,15 @@ > DEF( I18N_NOOP("Window One Desktop to the Left"), 0, 0, slotWindowToDesktopLeft() ); > DEF( I18N_NOOP("Window One Desktop Up"), 0, 0, slotWindowToDesktopUp() ); > DEF( I18N_NOOP("Window One Desktop Down"), 0, 0, slotWindowToDesktopDown() ); >+ DEF( I18N_NOOP("Window to Screen 0"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 1"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 2"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 3"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 4"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 5"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 6"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Screen 7"), 0, 0, slotWindowToScreen(int) ); >+ DEF( I18N_NOOP("Window to Next Screen"), 0, 0, slotWindowToNextScreen() ); > > keys->insert( "Group:Desktop Switching", i18n("Desktop Switching") ); > DEF( I18N_NOOP("Switch to Desktop 1"), CTRL+Qt::Key_F1, WIN+Qt::Key_F1, slotSwitchToDesktop(int) ); >@@ -132,6 +141,15 @@ > DEF( I18N_NOOP("Switch One Desktop to the Left"), 0, 0, slotSwitchDesktopLeft() ); > DEF( I18N_NOOP("Switch One Desktop Up"), 0, 0, slotSwitchDesktopUp() ); > DEF( I18N_NOOP("Switch One Desktop Down"), 0, 0, slotSwitchDesktopDown() ); >+ DEF( I18N_NOOP("Switch to Screen 0"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 1"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 2"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 3"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 4"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 5"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 6"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Screen 7"), 0, 0, slotSwitchToScreen(int) ); >+ DEF( I18N_NOOP("Switch to Next Screen"), 0, 0, slotSwitchToNextScreen() ); > > keys->insert( "Group:Miscellaneous", i18n("Miscellaneous") ); > DEF( I18N_NOOP("Mouse Emulation"), ALT+Qt::Key_F12, 0, slotMouseEmulation() ); >diff -u -p -N -r kdebase.sav/kwin/kwin.kcfg kdebase/kwin/kwin.kcfg >--- kdebase.sav/kwin/kwin.kcfg 2006-08-02 18:25:50.000000000 +0200 >+++ kdebase/kwin/kwin.kcfg 2006-09-01 13:26:05.000000000 +0200 >@@ -60,6 +60,9 @@ > <entry key="IgnorePositionClasses" type="StringList" /> > <entry key="KillPingTimeout" type="Int" /> > <entry key="ShowDesktopIsMinimizeAll" type="Bool" /> >+ <entry key="SeparateScreenFocus" type="Bool" /> >+ <entry key="ActiveMouseScreen" type="Bool" /> >+ <entry key="XineramaPlacementScreen" type="Int" /> > </group> > > <group name="WM" > >diff -u -p -N -r kdebase.sav/kwin/manage.cpp kdebase/kwin/manage.cpp >--- kdebase.sav/kwin/manage.cpp 2006-08-10 15:05:22.000000000 +0200 >+++ kdebase/kwin/manage.cpp 2006-09-01 13:27:09.000000000 +0200 >@@ -166,7 +166,7 @@ bool Client::manage( Window w, bool isMa > it != mainclients.end(); > ++it ) > { >- if( (*it)->isSpecialWindow()) >+ if( mainclients.count() > 1 && (*it)->isSpecialWindow()) > continue; // don't consider toolbars etc when placing > maincl = *it; > if( (*it)->isOnCurrentDesktop()) >@@ -202,9 +202,14 @@ bool Client::manage( Window w, bool isMa > if( isMapped || session ) > area = workspace()->clientArea( FullArea, geom.center(), desktop()); > else if( options->xineramaPlacementEnabled ) >- area = workspace()->clientArea( PlacementArea, QCursor::pos(), desktop()); >+ { >+ int screen = options->xineramaPlacementScreen; >+ if( screen == -1 ) // active screen >+ screen = asn_data.xinerama() == -1 ? workspace()->activeScreen() : asn_data.xinerama(); >+ area = workspace()->clientArea( PlacementArea, workspace()->screenGeometry( screen ).center(), desktop()); >+ } > else >- area = workspace()->clientArea( PlacementArea, geom.center(), desktop()); >+ area = workspace()->clientArea( PlacementArea, QCursor::pos(), desktop()); > > if( int type = checkFullScreenHack( geom )) > { >diff -u -p -N -r kdebase.sav/kwin/options.cpp kdebase/kwin/options.cpp >--- kdebase.sav/kwin/options.cpp 2006-08-02 18:25:50.000000000 +0200 >+++ kdebase/kwin/options.cpp 2006-09-01 13:26:05.000000000 +0200 >@@ -70,6 +70,9 @@ unsigned long Options::updateSettings() > altTabStyle = KDE; // what a default :-) > if ( val == "CDE" ) > altTabStyle = CDE; >+ >+ separateScreenFocus = config->readBoolEntry( "SeparateScreenFocus", false ); >+ activeMouseScreen = config->readBoolEntry( "ActiveMouseScreen", focusPolicy != ClickToFocus ); > > rollOverDesktops = config->readBoolEntry("RollOverDesktops", TRUE); > >@@ -99,9 +102,10 @@ unsigned long Options::updateSettings() > delete gc; > > placement = Placement::policyFromString( config->readEntry("Placement"), true ); >+ xineramaPlacementScreen = KCLAMP( config->readNumEntry( "XineramaPlacementScreen", -1 ), >+ -1, qApp->desktop()->numScreens() - 1 ); > > animateShade = config->readBoolEntry("AnimateShade", TRUE ); >- > animateMinimize = config->readBoolEntry("AnimateMinimize", TRUE ); > animateMinimizeSpeed = config->readNumEntry("AnimateMinimizeSpeed", 5 ); > >diff -u -p -N -r kdebase.sav/kwin/options.h kdebase/kwin/options.h >--- kdebase.sav/kwin/options.h 2006-08-02 18:25:50.000000000 +0200 >+++ kdebase/kwin/options.h 2006-09-01 13:26:05.000000000 +0200 >@@ -124,6 +124,11 @@ class Options : public KDecorationOption > */ > enum AltTabStyle { KDE, CDE }; > AltTabStyle altTabStyle; >+ >+ // whether to see Xinerama screens separately for focus (in Alt+Tab, when activating next client) >+ bool separateScreenFocus; >+ // whether active Xinerama screen is the one with mouse (or with the active window) >+ bool activeMouseScreen; > > /** > * Xinerama options >@@ -133,6 +138,9 @@ class Options : public KDecorationOption > bool xineramaMovementEnabled; > bool xineramaMaximizeEnabled; > bool xineramaFullscreenEnabled; >+ >+ // number, or -1 = active screen (Workspace::activeScreen()) >+ int xineramaPlacementScreen; > > /** > MoveResizeMode, either Tranparent or Opaque. >diff -u -p -N -r kdebase.sav/kwin/placement.cpp kdebase/kwin/placement.cpp >--- kdebase.sav/kwin/placement.cpp 2006-01-04 14:58:52.000000000 +0100 >+++ kdebase/kwin/placement.cpp 2006-09-01 13:26:28.000000000 +0200 >@@ -473,7 +473,7 @@ void Placement::placeOnMainWindow(Client > it != mainwindows.end(); > ++it ) > { >- if( (*it)->isSpecialWindow()) >+ if( mainwindows.count() > 1 && (*it)->isSpecialWindow()) > continue; // don't consider toolbars etc when placing > ++mains_count; > place_on2 = *it; >@@ -502,6 +502,11 @@ void Placement::placeOnMainWindow(Client > } > place_on = place_on2; // use the only window filtered together with 'mains_count' > } >+ if( place_on->isDesktop()) >+ { >+ place( c, area, Centered ); >+ return; >+ } > QRect geom = c->geometry(); > geom.moveCenter( place_on->geometry().center()); > c->move( geom.topLeft()); >diff -u -p -N -r kdebase.sav/kwin/popupinfo.cpp kdebase/kwin/popupinfo.cpp >--- kdebase.sav/kwin/popupinfo.cpp 2006-04-13 14:03:15.000000000 +0200 >+++ kdebase/kwin/popupinfo.cpp 2006-09-01 13:26:00.000000000 +0200 >@@ -25,7 +25,6 @@ License. See the file "COPYING" for the > #include <klocale.h> > #include <qapplication.h> > #include <qdesktopwidget.h> >-#include <qcursor.h> > #include <kstringhandler.h> > #include <kglobalsettings.h> > >@@ -34,8 +33,8 @@ License. See the file "COPYING" for the > namespace KWinInternal > { > >-PopupInfo::PopupInfo( const char *name ) >- : QWidget( 0, name ) >+PopupInfo::PopupInfo( Workspace* ws, const char *name ) >+ : QWidget( 0, name ), workspace( ws ) > { > m_infoString = ""; > m_shown = false; >@@ -60,7 +59,7 @@ PopupInfo::~PopupInfo() > */ > void PopupInfo::reset() > { >- QRect r = KGlobalSettings::desktopGeometry(QCursor::pos()); >+ QRect r = workspace->screenGeometry( workspace->activeScreen()); > > int w = fontMetrics().width( m_infoString ) + 30; > >diff -u -p -N -r kdebase.sav/kwin/popupinfo.h kdebase/kwin/popupinfo.h >--- kdebase.sav/kwin/popupinfo.h 2005-05-04 17:03:21.000000000 +0200 >+++ kdebase/kwin/popupinfo.h 2006-09-01 13:26:00.000000000 +0200 >@@ -24,7 +24,7 @@ class PopupInfo : public QWidget > { > Q_OBJECT > public: >- PopupInfo( const char *name=0 ); >+ PopupInfo( Workspace* ws, const char *name=0 ); > ~PopupInfo(); > > void reset(); >@@ -43,6 +43,7 @@ class PopupInfo : public QWidget > bool m_show; > bool m_shown; > QString m_infoString; >+ Workspace* workspace; > }; > > } // namespace >diff -u -p -N -r kdebase.sav/kwin/tabbox.cpp kdebase/kwin/tabbox.cpp >--- kdebase.sav/kwin/tabbox.cpp 2006-09-01 13:22:04.000000000 +0200 >+++ kdebase/kwin/tabbox.cpp 2006-09-01 13:26:00.000000000 +0200 >@@ -23,7 +23,6 @@ License. See the file "COPYING" for the > #include <klocale.h> > #include <qapplication.h> > #include <qdesktopwidget.h> >-#include <qcursor.h> > #include <kstringhandler.h> > #include <stdarg.h> > #include <kdebug.h> >@@ -111,26 +110,36 @@ void TabBox::createClientList(ClientList > > while ( c ) > { >+ Client* add = NULL; > if ( ((desktop == -1) || c->isOnDesktop(desktop)) > && c->wantsTabFocus() ) >+ { // don't add windows that have modal dialogs >+ Client* modal = c->findModal(); >+ if( modal == NULL || modal == c ) >+ add = c; >+ else if( !list.contains( modal )) >+ add = modal; >+ else >+ { >+ // nothing >+ } >+ } >+ >+ if( options->separateScreenFocus && options->xineramaEnabled ) > { >- if ( start == c ) >+ if( c->screen() != workspace()->activeScreen()) >+ add = NULL; >+ } >+ >+ if( add != NULL ) >+ { >+ if ( start == add ) > { >- list.remove( c ); >- list.prepend( c ); >+ list.remove( add ); >+ list.prepend( add ); > } > else >- { // don't add windows that have modal dialogs >- Client* modal = c->findModal(); >- if( modal == NULL || modal == c ) >- list += c; >- else if( !list.contains( modal )) >- list += modal; >- else >- { >- // nothing >- } >- } >+ list += add; > } > > if ( chain ) >@@ -157,7 +166,7 @@ void TabBox::reset() > { > int w, h, cw = 0, wmax = 0; > >- QRect r = KGlobalSettings::desktopGeometry(QCursor::pos()); >+ QRect r = workspace()->screenGeometry( workspace()->activeScreen()); > > // calculate height of 1 line > // fontheight + 1 pixel above + 1 pixel below, or 32x32 icon + 2 pixel above + below >diff -u -p -N -r kdebase.sav/kwin/useractions.cpp kdebase/kwin/useractions.cpp >--- kdebase.sav/kwin/useractions.cpp 2006-07-31 11:46:28.000000000 +0200 >+++ kdebase/kwin/useractions.cpp 2006-09-01 13:27:44.000000000 +0200 >@@ -482,27 +482,33 @@ bool Client::performMouseCommand( Option > case Options::MouseActivateAndRaise: > replay = isActive(); // for clickraise mode > workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled && replay ); >+ workspace()->setActiveScreenMouse( globalPos ); > break; > case Options::MouseActivateAndLower: > workspace()->requestFocus( this ); > workspace()->lowerClient( this ); >+ workspace()->setActiveScreenMouse( globalPos ); > break; > case Options::MouseActivate: > replay = isActive(); // for clickraise mode > workspace()->takeActivity( this, ActivityFocus, handled && replay ); >+ workspace()->setActiveScreenMouse( globalPos ); > break; > case Options::MouseActivateRaiseAndPassClick: > workspace()->takeActivity( this, ActivityFocus | ActivityRaise, handled ); >+ workspace()->setActiveScreenMouse( globalPos ); > replay = TRUE; > break; > case Options::MouseActivateAndPassClick: > workspace()->takeActivity( this, ActivityFocus, handled ); >+ workspace()->setActiveScreenMouse( globalPos ); > replay = TRUE; > break; > case Options::MouseActivateRaiseAndMove: > case Options::MouseActivateRaiseAndUnrestrictedMove: > workspace()->raiseClient( this ); > workspace()->requestFocus( this ); >+ workspace()->setActiveScreenMouse( globalPos ); > if( options->moveMode == Options::Transparent && isMovable()) > move_faked_activity = workspace()->fakeRequestedActivity( this ); > // fallthrough >@@ -709,6 +715,40 @@ void Workspace::slotWindowToDesktop( int > sendClientToDesktop( c, i, true ); > } > >+void Workspace::slotSwitchToScreen( int i ) >+ { >+ setCurrentScreen( i ); >+ } >+ >+void Workspace::slotSwitchToNextScreen() >+ { >+ slotSwitchToScreen(( activeScreen() + 1 ) % numScreens()); >+ } >+ >+void Workspace::slotWindowToScreen( int i ) >+ { >+ Client* c = active_popup_client ? active_popup_client : active_client; >+ if( i >= 0 && i <= numScreens() && c >+ && !c->isDesktop() >+ && !c->isDock() >+ && !c->isTopMenu()) >+ { >+ sendClientToScreen( c, i ); >+ } >+ } >+ >+void Workspace::slotWindowToNextScreen() >+ { >+ Client* c = active_popup_client ? active_popup_client : active_client; >+ if( c >+ && !c->isDesktop() >+ && !c->isDock() >+ && !c->isTopMenu()) >+ { >+ sendClientToScreen( c, ( c->screen() + 1 ) % numScreens()); >+ } >+ } >+ > /*! > Maximizes the popup client > */ >diff -u -p -N -r kdebase.sav/kwin/workspace.cpp kdebase/kwin/workspace.cpp >--- kdebase.sav/kwin/workspace.cpp 2006-08-02 18:25:50.000000000 +0200 >+++ kdebase/kwin/workspace.cpp 2006-09-01 13:27:44.000000000 +0200 >@@ -70,6 +70,7 @@ Workspace::Workspace( bool restore ) > QObject (0, "workspace"), > current_desktop (0), > number_of_desktops(0), >+ active_screen (0), > active_popup( NULL ), > active_popup_client( NULL ), > desktop_widget (0), >@@ -189,7 +190,7 @@ Workspace::Workspace( bool restore ) > client_keys = new KGlobalAccel( this ); > initShortcuts(); > tab_box = new TabBox( this ); >- popupinfo = new PopupInfo( ); >+ popupinfo = new PopupInfo( this ); > > init(); > >@@ -288,6 +289,7 @@ void Workspace::init() > NET::WM2ExtendedStrut | > NET::WM2KDETemporaryRules | > NET::WM2ShowingDesktop | >+ NET::WM2FullPlacement | > NET::WM2DesktopLayout | > 0 > , >@@ -1502,6 +1504,80 @@ void Workspace::sendClientToDesktop( Cli > updateClientArea(); > } > >+int Workspace::numScreens() const >+ { >+ if( !options->xineramaEnabled ) >+ return 0; >+ return qApp->desktop()->numScreens(); >+ } >+ >+int Workspace::activeScreen() const >+ { >+ if( !options->xineramaEnabled ) >+ return 1; >+ if( !options->activeMouseScreen ) >+ { >+ if( activeClient() != NULL && !activeClient()->isOnScreen( active_screen )) >+ return qApp->desktop()->screenNumber( activeClient()->geometry().center()); >+ return active_screen; >+ } >+ return qApp->desktop()->screenNumber( QCursor::pos()); >+ } >+ >+// check whether a client moved completely out of what's considered the active screen, >+// if yes, set a new active screen >+void Workspace::checkActiveScreen( const Client* c ) >+ { >+ if( !options->xineramaEnabled ) >+ return; >+ if( !c->isActive()) >+ return; >+ if( !c->isOnScreen( active_screen )) >+ active_screen = c->screen(); >+ } >+ >+// called e.g. when a user clicks on a window, set active screen to be the screen >+// where the click occured >+void Workspace::setActiveScreenMouse( QPoint mousepos ) >+ { >+ if( !options->xineramaEnabled ) >+ return; >+ active_screen = qApp->desktop()->screenNumber( mousepos ); >+ } >+ >+QRect Workspace::screenGeometry( int screen ) const >+ { >+ if( !options->xineramaEnabled ) >+ return qApp->desktop()->geometry(); >+ return qApp->desktop()->screenGeometry( screen ); >+ } >+ >+int Workspace::screenNumber( QPoint pos ) const >+ { >+ if( !options->xineramaEnabled ) >+ return 0; >+ return qApp->desktop()->screenNumber( pos ); >+ } >+ >+void Workspace::sendClientToScreen( Client* c, int screen ) >+ { >+ if( c->screen() == screen ) // don't use isOnScreen(), that's true even when only partially >+ return; >+ GeometryUpdatesPostponer blocker( c ); >+ QRect old_sarea = clientArea( MaximizeArea, c ); >+ QRect sarea = clientArea( MaximizeArea, screen, c->desktop()); >+ c->setGeometry( sarea.x() - old_sarea.x() + c->x(), sarea.y() - old_sarea.y() + c->y(), >+ c->size().width(), c->size().height()); >+ c->checkWorkspacePosition(); >+ ClientList transients_stacking_order = ensureStackingOrder( c->transients()); >+ for( ClientList::ConstIterator it = transients_stacking_order.begin(); >+ it != transients_stacking_order.end(); >+ ++it ) >+ sendClientToScreen( *it, screen ); >+ if( c->isActive()) >+ active_screen = screen; >+ } >+ > void Workspace::setDesktopLayout( int, int, int ) > { // DCOP-only, unused > } >diff -u -p -N -r kdebase.sav/kwin/workspace.h kdebase/kwin/workspace.h >--- kdebase.sav/kwin/workspace.h 2006-04-13 14:03:15.000000000 +0200 >+++ kdebase/kwin/workspace.h 2006-09-01 13:27:44.000000000 +0200 >@@ -91,6 +91,7 @@ class Workspace : public QObject, public > > QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const; > QRect clientArea( clientAreaOption, const Client* c ) const; >+ QRect clientArea( clientAreaOption, int screen, int desktop ) const; > > /** > * @internal >@@ -161,6 +162,13 @@ class Workspace : public QObject, public > */ > int numberOfDesktops() const; > void setNumberOfDesktops( int n ); >+ >+ int activeScreen() const; >+ int numScreens() const; >+ void checkActiveScreen( const Client* c ); >+ void setActiveScreenMouse( QPoint mousepos ); >+ QRect screenGeometry( int screen ) const; >+ int screenNumber( QPoint pos ) const; > > QWidget* desktopWidget(); > >@@ -186,6 +194,7 @@ class Workspace : public QObject, public > void sendClientToDesktop( Client* c, int desktop, bool dont_activate ); > void windowToPreviousDesktop( Client* c ); > void windowToNextDesktop( Client* c ); >+ void sendClientToScreen( Client* c, int screen ); > > // KDE4 remove me - and it's also in the DCOP interface :( > void showWindowMenuAt( unsigned long id, int x, int y ); >@@ -222,6 +231,7 @@ class Workspace : public QObject, public > void nextDesktop(); > void previousDesktop(); > void circulateDesktopApplications(); >+ void setCurrentScreen( int new_screen ); > > QString desktopName( int desk ) const; > void setDesktopLayout(int o, int x, int y); >@@ -297,6 +307,10 @@ class Workspace : public QObject, public > //void slotSwitchToWindow( int ); > void slotWindowToDesktop( int ); > //void slotWindowToListPosition( int ); >+ void slotSwitchToScreen( int ); >+ void slotWindowToScreen( int ); >+ void slotSwitchToNextScreen(); >+ void slotWindowToNextScreen(); > > void slotWindowMaximize(); > void slotWindowMaximizeVertical(); >@@ -477,6 +491,7 @@ class Workspace : public QObject, public > int current_desktop; > int number_of_desktops; > QMemArray<int> desktop_focus_chain; >+ int active_screen; > > QWidget* active_popup; > Client* active_popup_client;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 211469
:
147585
|
147586
|
147596
| 147597