[SCM] KDE Base Workspace module packaging branch, master, updated. debian/4.6.3-1-2-g16f3d5b
Modestas Vainius
modax at alioth.debian.org
Thu Jun 2 22:45:49 UTC 2011
The following commit has been merged in the master branch:
commit 16f3d5b297629912fab79f9459034f2825cf7c8f
Author: Modestas Vainius <modax at debian.org>
Date: Fri Jun 3 01:13:22 2011 +0300
Backport a fix to multihead problems in kwin.
Backport a patch from 4.7 in order to fix some problems with multihead in kwin
(patch backport_kwin_multihead_improvements.diff).
---
debian/changelog | 2 +
.../backport_kwin_multihead_improvements.diff | 276 ++++++++++++++++++++
debian/patches/series | 1 +
3 files changed, 279 insertions(+), 0 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index d01b829..236e4cc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,7 @@
kdebase-workspace (4:4.6.3-2) UNRELEASED; urgency=low
+ * Backport a patch from 4.7 in order to fix some problems with multihead in
+ kwin (patch backport_kwin_multihead_improvements.diff).
-- Modestas Vainius <modax at debian.org> Fri, 03 Jun 2011 01:11:58 +0300
diff --git a/debian/patches/backport_kwin_multihead_improvements.diff b/debian/patches/backport_kwin_multihead_improvements.diff
new file mode 100644
index 0000000..96557c7
--- /dev/null
+++ b/debian/patches/backport_kwin_multihead_improvements.diff
@@ -0,0 +1,276 @@
+From: Alberto Mattea <alberto at mattea.info>
+From: Modestas Vainius <modax at debian.org>
+Subject: Add basic multihead support to kwin
+Origin: backport, commit:299a78772b823d28cf3c48aff696cfb978d0ae7e
+Date: Sun May 8 20:39:27 2011 +0200
+Last-Update: 2011-06-02
+Bug: https://bugs.kde.org/256242
+Applied-Upstream: 4.7
+
+For now there is autostart support on all screens and support for different resolutions on different screens.
+Keyboard shortcuts are still TODO
+REVIEW: 101125
+BUG: 256242
+
+--- a/ksmserver/startup.cpp
++++ b/ksmserver/startup.cpp
+@@ -161,10 +161,6 @@ void KSMServer::launchWM( const QList< Q
+ wmProcess = startApplication( wmStartCommands[ 0 ], QString(), QString(), true );
+ connect( wmProcess, SIGNAL( error( QProcess::ProcessError )), SLOT( wmProcessChange()));
+ connect( wmProcess, SIGNAL( finished( int, QProcess::ExitStatus )), SLOT( wmProcessChange()));
+- // there can be possibly more wm's (because of forking for multihead),
+- // but in such case care only about the process of the first one
+- for (int i = 1; i < wmStartCommands.count(); i++)
+- startApplication( wmStartCommands[i] );
+ QTimer::singleShot( 4000, this, SLOT( autoStart0() ) );
+ }
+
+--- a/kwin/geometry.cpp
++++ b/kwin/geometry.cpp
+@@ -55,6 +55,9 @@ namespace KWin
+ // Workspace
+ //********************************************
+
++extern int screen_number;
++extern bool is_multihead;
++
+ /*!
+ Resizes the workspace after an XRANDR screen size change
+ */
+@@ -250,56 +253,89 @@ void Workspace::updateClientArea()
+
+ \sa geometry()
+ */
++
+ QRect Workspace::clientArea( clientAreaOption opt, int screen, int desktop ) const
+ {
+ if( desktop == NETWinInfo::OnAllDesktops || desktop == 0 )
+ desktop = currentDesktop();
+ if( screen == -1 )
+ screen = activeScreen();
+-
+- QRect sarea = (!screenarea.isEmpty()
+- && screen < screenarea[ desktop ].size()) // screens may be missing during KWin initialization or screen config changes
+- ? screenarea[ desktop ][ screen ]
+- : Kephal::ScreenUtils::screenGeometry( screen );
+- QRect warea = workarea[ desktop ].isNull()
+- ? Kephal::ScreenUtils::desktopGeometry()
+- : workarea[ desktop ];
+- switch (opt)
+- {
+- case MaximizeArea:
+- if (options->xineramaMaximizeEnabled)
+- return sarea;
+- else
+- return warea;
+- case MaximizeFullArea:
+- if (options->xineramaMaximizeEnabled)
+- return Kephal::ScreenUtils::screenGeometry( screen );
+- else
+- return Kephal::ScreenUtils::desktopGeometry();
+- case FullScreenArea:
+- if (options->xineramaFullscreenEnabled)
+- return Kephal::ScreenUtils::screenGeometry( screen );
+- else
+- return Kephal::ScreenUtils::desktopGeometry();
+- case PlacementArea:
+- if (options->xineramaPlacementEnabled)
+- return sarea;
+- else
+- return warea;
+- case MovementArea:
+- if (options->xineramaMovementEnabled)
+- return Kephal::ScreenUtils::screenGeometry( screen );
+- else
+- return Kephal::ScreenUtils::desktopGeometry();
+- case WorkArea:
++
++ QRect sarea, warea;
++
++ if (is_multihead) {
++ sarea = (!screenarea.isEmpty()
++ && screen < screenarea[ desktop ].size()) // screens may be missing during KWin initialization or screen config changes
++ ? screenarea[ desktop ][ screen_number ]
++ : Kephal::ScreenUtils::screenGeometry(screen_number);
++ warea = workarea[ desktop ].isNull()
++ ? Kephal::ScreenUtils::screenGeometry(screen_number)
++ : workarea[ desktop ];
++ } else {
++ sarea = (!screenarea.isEmpty()
++ && screen < screenarea[ desktop ].size()) // screens may be missing during KWin initialization or screen config changes
++ ? screenarea[ desktop ][ screen ]
++ : Kephal::ScreenUtils::screenGeometry(screen);
++ warea = workarea[ desktop ].isNull()
++ ? Kephal::ScreenUtils::desktopGeometry()
++ : workarea[ desktop ];
++ }
++
++ switch(opt) {
++ case MaximizeArea:
++ if (is_multihead)
++ return sarea;
++ else if (options->xineramaMaximizeEnabled)
++ return sarea;
++ else
+ return warea;
+- case FullArea:
++ case MaximizeFullArea:
++ if (is_multihead)
++ return Kephal::ScreenUtils::screenGeometry(screen_number);
++ else if (options->xineramaMaximizeEnabled)
++ return Kephal::ScreenUtils::screenGeometry(screen);
++ else
+ return Kephal::ScreenUtils::desktopGeometry();
+- case ScreenArea:
+- return Kephal::ScreenUtils::screenGeometry( screen );
+- }
+- abort();
++ case FullScreenArea:
++ if (is_multihead)
++ return Kephal::ScreenUtils::screenGeometry(screen_number);
++ else if (options->xineramaFullscreenEnabled)
++ return Kephal::ScreenUtils::screenGeometry(screen);
++ else
++ return Kephal::ScreenUtils::desktopGeometry();
++ case PlacementArea:
++ if (is_multihead)
++ return sarea;
++ else if (options->xineramaPlacementEnabled)
++ return sarea;
++ else
++ return warea;
++ case MovementArea:
++ if (is_multihead)
++ return Kephal::ScreenUtils::screenGeometry(screen_number);
++ else if (options->xineramaMovementEnabled)
++ return Kephal::ScreenUtils::screenGeometry(screen);
++ else
++ return Kephal::ScreenUtils::desktopGeometry();
++ case WorkArea:
++ if (is_multihead)
++ return sarea;
++ else
++ return warea;
++ case FullArea:
++ if (is_multihead)
++ return Kephal::ScreenUtils::screenGeometry(screen_number);
++ else
++ return Kephal::ScreenUtils::desktopGeometry();
++ case ScreenArea:
++ if (is_multihead)
++ return Kephal::ScreenUtils::screenGeometry(screen_number);
++ else
++ return Kephal::ScreenUtils::screenGeometry(screen);
+ }
++ abort();
++}
++
+
+ QRect Workspace::clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const
+ {
+--- a/kwin/main.cpp
++++ b/kwin/main.cpp
+@@ -74,6 +74,7 @@ Options* options;
+ Atoms* atoms;
+
+ int screen_number = -1;
++bool is_multihead = false;
+
+ bool initting = false;
+
+@@ -421,58 +422,47 @@ KDE_EXPORT int kdemain( int argc, char *
+ // or command line settings to raster or OpenGL.
+ QApplication::setGraphicsSystem("native");
+
+- if( !restored )
+- { // We only do the multihead fork if we are not restored by the session
+- // manager, since the session manager will register multiple kwins,
+- // one for each screen...
+- QByteArray multiHead = qgetenv( "KDE_MULTIHEAD" );
+- if( multiHead.toLower() == "true" )
+- {
+- Display* dpy = XOpenDisplay( NULL );
+- if( !dpy )
+- {
+- fprintf( stderr, "%s: FATAL ERROR while trying to open display %s
",
+- argv[0], XDisplayName( NULL ));
+- exit( 1 );
+- }
+-
+- int number_of_screens = ScreenCount( dpy );
+- KWin::screen_number = DefaultScreen( dpy );
+- int pos; // Temporarily needed to reconstruct DISPLAY var if multi-head
+- QByteArray display_name = XDisplayString( dpy );
+- XCloseDisplay( dpy );
+- dpy = 0;
++ Display* dpy = XOpenDisplay(NULL);
++ if (!dpy) {
++ fprintf(stderr, "%s: FATAL ERROR while trying to open display %s
",
++ argv[0], XDisplayName(NULL));
++ exit(1);
++ }
+
+- if(( pos = display_name.lastIndexOf( '.' )) != -1 )
+- display_name.remove( pos, 10 ); // 10 is enough to be sure we removed ".s"
++ int number_of_screens = ScreenCount(dpy);
+
+- QString envir;
+- if( number_of_screens != 1 )
+- {
+- for( int i = 0; i < number_of_screens; i++ )
+- {
+- // If execution doesn't pass by here, then kwin
+- // acts exactly as previously
+- if( i != KWin::screen_number && fork() == 0 )
+- {
+- KWin::screen_number = i;
+- // Break here because we are the child process, we don't
+- // want to fork() anymore
+- break;
+- }
+- }
+- // In the next statement, display_name shouldn't contain a screen
+- // number. If it had it, it was removed at the "pos" check
+- envir.sprintf( "DISPLAY=%s.%d", display_name.data(), KWin::screen_number );
+-
+- if( putenv( strdup( envir.toAscii() )))
+- {
+- fprintf( stderr, "%s: WARNING: unable to set DISPLAY environment variable
", argv[0] );
+- perror("putenv()");
+- }
+- }
++ // multi head
++ if (number_of_screens != 1) {
++ KWin::is_multihead = true;
++ KWin::screen_number = DefaultScreen(dpy);
++ int pos; // Temporarily needed to reconstruct DISPLAY var if multi-head
++ QByteArray display_name = XDisplayString(dpy);
++ XCloseDisplay(dpy);
++ dpy = 0;
++
++ if ((pos = display_name.lastIndexOf('.')) != -1)
++ display_name.remove(pos, 10); // 10 is enough to be sure we removed ".s"
++
++ QString envir;
++ for (int i = 0; i < number_of_screens; i++) {
++ // If execution doesn't pass by here, then kwin
++ // acts exactly as previously
++ if (i != KWin::screen_number && fork() == 0) {
++ KWin::screen_number = i;
++ // Break here because we are the child process, we don't
++ // want to fork() anymore
++ break;
+ }
+ }
++ // In the next statement, display_name shouldn't contain a screen
++ // number. If it had it, it was removed at the "pos" check
++ envir.sprintf("DISPLAY=%s.%d", display_name.data(), KWin::screen_number);
++
++ if (putenv(strdup(envir.toAscii()))) {
++ fprintf(stderr, "%s: WARNING: unable to set DISPLAY environment variable
", argv[0]);
++ perror("putenv()");
++ }
++ }
+
+ KAboutData aboutData(
+ "kwin", // The program name used internally
diff --git a/debian/patches/series b/debian/patches/series
index 4d4b684..e1bff26 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
+backport_kwin_multihead_improvements.diff
kdm_does_not_wreak_havoc.diff
kdmrc_defaults.diff
genkdmconf.diff
--
KDE Base Workspace module packaging
More information about the pkg-kde-commits
mailing list