summaryrefslogtreecommitdiffstats
path: root/opensuse/tdelibs/xinerama.patch
diff options
context:
space:
mode:
Diffstat (limited to 'opensuse/tdelibs/xinerama.patch')
-rw-r--r--opensuse/tdelibs/xinerama.patch543
1 files changed, 543 insertions, 0 deletions
diff --git a/opensuse/tdelibs/xinerama.patch b/opensuse/tdelibs/xinerama.patch
new file mode 100644
index 000000000..dec878b40
--- /dev/null
+++ b/opensuse/tdelibs/xinerama.patch
@@ -0,0 +1,543 @@
+Index: kio/kio/krun.h
+===================================================================
+--- kio/kio/krun.h.orig
++++ kio/kio/krun.h
+@@ -111,6 +111,8 @@ public:
+ */
+ KRun( const KURL& url, QWidget* window, mode_t mode = 0,
+ bool isLocalFile = false, bool showProgressInfo = true );
++ KRun( const KURL& url, QWidget* window, const QCString& asn, mode_t mode = 0,
++ bool isLocalFile = false, bool showProgressInfo = true );
+
+ /**
+ * Destructor. Don't call it yourself, since a KRun object auto-deletes
+@@ -210,6 +212,8 @@ public:
+ * @since 3.5.2
+ */
+ static pid_t run( const KService& _service, const KURL::List& _urls, QWidget* window, bool tempFiles = false );
++ static pid_t run( const KService& _service, const KURL::List& _urls, QWidget* window,
++ const QCString& asn, bool tempFiles = false );
+ /**
+ * Open a list of URLs with a certain service (application).
+ *
+@@ -226,6 +230,8 @@ public:
+ /// @since 3.5.3
+ /// @internal
+ static pid_t run( const KService& _service, const KURL::List& _urls, QWidget* window, bool tempFiles, const QString& suggestedFileName );
++ static pid_t run( const KService& _service, const KURL::List& _urls, QWidget* window,
++ const QCString& asn, bool tempFiles, const QString& suggestedFileName );
+
+ /**
+ * Open a list of URLs with.
+@@ -269,6 +275,7 @@ public:
+ static pid_t runURL( const KURL& _url, const QString& _mimetype );
+ /// @since 3.5.3
+ /// @internal
++ static pid_t runURL( const KURL& _url, const QString& _mimetype, QWidget* window, const QCString& asn, bool tempFile, bool runExecutables, const QString& suggestedFileName );
+ static pid_t runURL( const KURL& _url, const QString& _mimetype, bool tempFile, bool runExecutables, const QString& suggestedFileName );
+
+ /**
+@@ -299,6 +306,8 @@ public:
+ * of running command) if command was unsafe for map notification.
+ */
+ static pid_t runCommand( const QString& cmd, const QString & execName, const QString & icon );
++ static pid_t runCommand( const QString& cmd, const QString & execName, const QString & icon,
++ QWidget* window, const QCString& asn );
+
+ /**
+ * Display the Open-With dialog for those URLs, and run the chosen application.
+@@ -438,7 +447,7 @@ protected:
+ virtual void virtual_hook( int id, void* data );
+
+ private:
+- void init (const KURL& url, QWidget* window, mode_t mode,
++ void init (const KURL& url, QWidget* window, const QCString& asn, mode_t mode,
+ bool isLocalFile, bool showProgressInfo);
+ private:
+ class KRunPrivate;
+Index: kio/kio/krun.cpp
+===================================================================
+--- kio/kio/krun.cpp.orig
++++ kio/kio/krun.cpp
+@@ -77,6 +77,7 @@ public:
+ QString m_localPath;
+ QString m_suggestedFileName;
+ QGuardedPtr <QWidget> m_window;
++ QCString m_asn;
+ };
+
+ pid_t KRun::runURL( const KURL& u, const QString& _mimetype )
+@@ -109,14 +110,20 @@ bool KRun::isExecutableFile( const KURL&
+ return false;
+ }
+
+-// This is called by foundMimeType, since it knows the mimetype of the URL
+ pid_t KRun::runURL( const KURL& u, const QString& _mimetype, bool tempFile, bool runExecutables, const QString& suggestedFileName )
+ {
++ return runURL( u, _mimetype, NULL, "", tempFile, runExecutables, suggestedFileName );
++}
++
++// This is called by foundMimeType, since it knows the mimetype of the URL
++pid_t KRun::runURL( const KURL& u, const QString& _mimetype, QWidget* window, const QCString& asn,
++ bool tempFile, bool runExecutables, const QString& suggestedFileName )
++{
+ bool noRun = false;
+ bool noAuth = false;
+ if ( _mimetype == "inode/directory-locked" )
+ {
+- KMessageBoxWrapper::error( 0L,
++ KMessageBoxWrapper::error( window,
+ i18n("<qt>Unable to enter <b>%1</b>.\nYou do not have access rights to this location.</qt>").arg(u.htmlURL()) );
+ return 0;
+ }
+@@ -133,7 +140,7 @@ pid_t KRun::runURL( const KURL& u, const
+ {
+ QString path = u.path();
+ shellQuote( path );
+- return (KRun::runCommand(path)); // just execute the url as a command
++ return (KRun::runCommand(path, QString::null, QString::null, window, asn)); // just execute the url as a command
+ // ## TODO implement deleting the file if tempFile==true
+ }
+ else
+@@ -155,14 +162,14 @@ pid_t KRun::runURL( const KURL& u, const
+
+ if ( noRun )
+ {
+- KMessageBox::sorry( 0L,
++ KMessageBox::sorry( window,
+ i18n("<qt>The file <b>%1</b> is an executable program. "
+ "For safety it will not be started.</qt>").arg(u.htmlURL()));
+ return 0;
+ }
+ if ( noAuth )
+ {
+- KMessageBoxWrapper::error( 0L,
++ KMessageBoxWrapper::error( window,
+ i18n("<qt>You do not have permission to run <b>%1</b>.</qt>").arg(u.htmlURL()) );
+ return 0;
+ }
+@@ -182,7 +189,7 @@ pid_t KRun::runURL( const KURL& u, const
+ return displayOpenWithDialog( lst, tempFile, suggestedFileName );
+ }
+
+- return KRun::run( *offer, lst, 0 /*window*/, tempFile, suggestedFileName );
++ return KRun::run( *offer, lst, window, asn, tempFile, suggestedFileName );
+ }
+
+ bool KRun::displayOpenWithDialog( const KURL::List& lst )
+@@ -536,13 +543,13 @@ QString KRun::binaryName( const QString
+ }
+
+ static pid_t runCommandInternal( KProcess* proc, const KService* service, const QString& binName,
+- const QString &execName, const QString & iconName )
++ const QString &execName, const QString & iconName, QWidget* window, QCString asn )
+ {
+ if (service && !service->desktopEntryPath().isEmpty()
+ && !KDesktopFile::isAuthorizedDesktopFile( service->desktopEntryPath() ))
+ {
+ kdWarning() << "No authorization to execute " << service->desktopEntryPath() << endl;
+- KMessageBox::sorry(0, i18n("You are not authorized to execute this file."));
++ KMessageBox::sorry(window, i18n("You are not authorized to execute this file."));
+ return 0;
+ }
+ QString bin = KRun::binaryName( binName, true );
+@@ -550,10 +557,10 @@ static pid_t runCommandInternal( KProces
+ bool silent;
+ QCString wmclass;
+ KStartupInfoId id;
+- bool startup_notify = KRun::checkStartupNotify( binName, service, &silent, &wmclass );
++ bool startup_notify = ( asn != "0" && KRun::checkStartupNotify( binName, service, &silent, &wmclass ));
+ if( startup_notify )
+ {
+- id.initId();
++ id.initId( asn );
+ id.setupStartupEnv();
+ KStartupInfoData data;
+ data.setHostname();
+@@ -572,6 +579,8 @@ static pid_t runCommandInternal( KProces
+ if( silent )
+ data.setSilent( KStartupInfoData::Yes );
+ data.setDesktop( KWin::currentDesktop());
++ if( window )
++ data.setLaunchedBy( window->winId());
+ KStartupInfo::sendStartup( id, data );
+ }
+ pid_t pid = KProcessRunner::run( proc, binName, id );
+@@ -635,7 +644,8 @@ bool KRun::checkStartupNotify( const QSt
+ return true;
+ }
+
+-static pid_t runTempService( const KService& _service, const KURL::List& _urls, bool tempFiles, const QString& suggestedFileName )
++static pid_t runTempService( const KService& _service, const KURL::List& _urls, QWidget* window,
++ const QCString& asn, bool tempFiles, const QString& suggestedFileName )
+ {
+ if (!_urls.isEmpty()) {
+ kdDebug(7010) << "runTempService: first url " << _urls.first().url() << endl;
+@@ -654,7 +664,7 @@ static pid_t runTempService( const KServ
+ {
+ KURL::List singleUrl;
+ singleUrl.append(*it);
+- runTempService( _service, singleUrl, tempFiles, suggestedFileName );
++ runTempService( _service, singleUrl, window, "", tempFiles, suggestedFileName );
+ }
+ KURL::List singleUrl;
+ singleUrl.append(_urls.first());
+@@ -673,7 +683,7 @@ static pid_t runTempService( const KServ
+ proc->setWorkingDirectory(_service.path());
+
+ return runCommandInternal( proc, &_service, KRun::binaryName( _service.exec(), false ),
+- _service.name(), _service.icon() );
++ _service.name(), _service.icon(), window, asn );
+ }
+
+ // WARNING: don't call this from processDesktopExec, since klauncher uses that too...
+@@ -734,11 +744,22 @@ pid_t KRun::run( const KService& _servic
+
+ pid_t KRun::run( const KService& _service, const KURL::List& _urls, QWidget* window, bool tempFiles )
+ {
+- return run( _service, _urls, window, tempFiles, QString::null );
++ return run( _service, _urls, window, "", tempFiles, QString::null );
++}
++
++pid_t KRun::run( const KService& _service, const KURL::List& _urls, QWidget* window, const QCString& asn, bool tempFiles )
++{
++ return run( _service, _urls, window, asn, tempFiles, QString::null );
+ }
+
+ pid_t KRun::run( const KService& _service, const KURL::List& _urls, QWidget* window, bool tempFiles, const QString& suggestedFileName )
+ {
++ return run( _service, _urls, window, "", tempFiles, suggestedFileName );
++}
++
++pid_t KRun::run( const KService& _service, const KURL::List& _urls, QWidget* window, const QCString& asn,
++ bool tempFiles, const QString& suggestedFileName )
++{
+ if (!_service.desktopEntryPath().isEmpty() &&
+ !KDesktopFile::isAuthorizedDesktopFile( _service.desktopEntryPath()))
+ {
+@@ -759,7 +780,7 @@ pid_t KRun::run( const KService& _servic
+
+ if ( tempFiles || _service.desktopEntryPath().isEmpty() || !suggestedFileName.isEmpty() )
+ {
+- return runTempService(_service, _urls, tempFiles, suggestedFileName);
++ return runTempService(_service, _urls, window, asn, tempFiles, suggestedFileName);
+ }
+
+ kdDebug(7010) << "KRun::run " << _service.desktopEntryPath() << endl;
+@@ -773,9 +794,25 @@ pid_t KRun::run( const KService& _servic
+
+ QString error;
+ int pid = 0;
+-
++
++ QCString myasn = asn;
++ // startServiceByDesktopPath() doesn't take QWidget*, add it to the startup info now
++ if( window != NULL )
++ {
++ if( myasn.isEmpty())
++ myasn = KStartupInfo::createNewStartupId();
++ if( myasn != "0" )
++ {
++ KStartupInfoId id;
++ id.initId( myasn );
++ KStartupInfoData data;
++ data.setLaunchedBy( window->winId());
++ KStartupInfo::sendChange( id, data );
++ }
++ }
++
+ int i = KApplication::startServiceByDesktopPath(
+- _service.desktopEntryPath(), urls.toStringList(), &error, 0L, &pid
++ _service.desktopEntryPath(), urls.toStringList(), &error, 0L, &pid, myasn
+ );
+
+ if (i != 0)
+@@ -800,33 +837,47 @@ pid_t KRun::run( const QString& _exec, c
+
+ pid_t KRun::runCommand( QString cmd )
+ {
+- return KRun::runCommand( cmd, QString::null, QString::null );
++ return KRun::runCommand( cmd, QString::null, QString::null, NULL, "" );
+ }
+
+ pid_t KRun::runCommand( const QString& cmd, const QString &execName, const QString & iconName )
+ {
++ return KRun::runCommand( cmd, execName, iconName, NULL, "" );
++}
++
++pid_t KRun::runCommand( const QString& cmd, const QString &execName, const QString & iconName,
++ QWidget* window, const QCString& asn )
++{
+ kdDebug(7010) << "runCommand " << cmd << "," << execName << endl;
+ KProcess * proc = new KProcess;
+ proc->setUseShell(true);
+ *proc << cmd;
+ KService::Ptr service = KService::serviceByDesktopName( binaryName( execName, true ) );
+- return runCommandInternal( proc, service.data(), binaryName( execName, false ), execName, iconName );
++ return runCommandInternal( proc, service.data(), binaryName( execName, false ), execName, iconName,
++ window, asn );
+ }
+
+ KRun::KRun( const KURL& url, mode_t mode, bool isLocalFile, bool showProgressInfo )
+ :m_timer(0,"KRun::timer")
+ {
+- init (url, 0, mode, isLocalFile, showProgressInfo);
++ init (url, 0, "", mode, isLocalFile, showProgressInfo);
+ }
+
+ KRun::KRun( const KURL& url, QWidget* window, mode_t mode, bool isLocalFile,
+ bool showProgressInfo )
+ :m_timer(0,"KRun::timer")
+ {
+- init (url, window, mode, isLocalFile, showProgressInfo);
++ init (url, window, "", mode, isLocalFile, showProgressInfo);
++}
++
++KRun::KRun( const KURL& url, QWidget* window, const QCString& asn, mode_t mode, bool isLocalFile,
++ bool showProgressInfo )
++ :m_timer(0,"KRun::timer")
++{
++ init (url, window, asn, mode, isLocalFile, showProgressInfo);
+ }
+
+-void KRun::init ( const KURL& url, QWidget* window, mode_t mode, bool isLocalFile,
++void KRun::init ( const KURL& url, QWidget* window, const QCString& asn, mode_t mode, bool isLocalFile,
+ bool showProgressInfo )
+ {
+ m_bFault = false;
+@@ -842,6 +893,7 @@ void KRun::init ( const KURL& url, QWidg
+ d = new KRunPrivate;
+ d->m_runExecutables = true;
+ d->m_window = window;
++ d->m_asn = asn;
+ setEnableExternalBrowser(true);
+
+ // Start the timer. This means we will return to the event
+@@ -942,7 +994,7 @@ void KRun::init()
+ KService::Ptr service = KService::serviceByStorageId( exec );
+ if (service)
+ {
+- run( *service, urls );
++ run( *service, urls, d->m_window, d->m_asn );
+ ok = true;
+ }
+ }
+@@ -1235,7 +1287,7 @@ void KRun::foundMimeType( const QString&
+ {
+ KURL::List lst;
+ lst.append( m_strURL );
+- m_bFinished = KRun::run( *serv, lst );
++ m_bFinished = KRun::run( *serv, lst, d->m_window, d->m_asn );
+ /// Note: the line above means that if that service failed, we'll
+ /// go to runURL to maybe find another service, even though a dialog
+ /// box was displayed. That's good if runURL tries another service,
+@@ -1250,7 +1302,7 @@ void KRun::foundMimeType( const QString&
+ m_strURL.setPath( d->m_localPath );
+ }
+
+- if (!m_bFinished && KRun::runURL( m_strURL, type, false, d->m_runExecutables, d->m_suggestedFileName )){
++ if (!m_bFinished && KRun::runURL( m_strURL, type, d->m_window, d->m_asn, false, d->m_runExecutables, d->m_suggestedFileName )){
+ m_bFinished = true;
+ }
+ else{
+Index: kdecore/kstartupinfo.cpp
+===================================================================
+--- kdecore/kstartupinfo.cpp.orig
++++ kdecore/kstartupinfo.cpp
+@@ -1109,7 +1109,7 @@ unsigned long KStartupInfoId::timestamp(
+ struct KStartupInfoDataPrivate
+ {
+ KStartupInfoDataPrivate() : desktop( 0 ), wmclass( "" ), hostname( "" ),
+- silent( KStartupInfoData::Unknown ), timestamp( -1U ), screen( -1 ) {}
++ silent( KStartupInfoData::Unknown ), timestamp( -1U ), screen( -1 ), xinerama( -1 ), launched_by( 0 ) {}
+ QString bin;
+ QString name;
+ QString description;
+@@ -1121,6 +1121,8 @@ struct KStartupInfoDataPrivate
+ KStartupInfoData::TriState silent;
+ unsigned long timestamp;
+ int screen;
++ int xinerama;
++ WId launched_by;
+ };
+
+ QString KStartupInfoData::to_text() const
+@@ -1151,6 +1153,10 @@ QString KStartupInfoData::to_text() cons
+ ret += QString::fromLatin1( " TIMESTAMP=%1" ).arg( d->timestamp );
+ if( d->screen != -1 )
+ ret += QString::fromLatin1( " SCREEN=%1" ).arg( d->screen );
++ if( d->xinerama != -1 )
++ ret += QString::fromLatin1( " XINERAMA=%1" ).arg( d->xinerama );
++ if( d->launched_by != 0 )
++ ret += QString::fromLatin1( " LAUNCHED_BY=%1" ).arg( d->launched_by );
+ return ret;
+ }
+
+@@ -1169,6 +1175,8 @@ KStartupInfoData::KStartupInfoData( cons
+ const QString silent_str = QString::fromLatin1( "SILENT=" );
+ const QString timestamp_str = QString::fromLatin1( "TIMESTAMP=" );
+ const QString screen_str = QString::fromLatin1( "SCREEN=" );
++ const QString xinerama_str = QString::fromLatin1( "XINERAMA=" );
++ const QString launched_by_str = QString::fromLatin1( "LAUNCHED_BY=" );
+ for( QStringList::Iterator it = items.begin();
+ it != items.end();
+ ++it )
+@@ -1199,6 +1207,10 @@ KStartupInfoData::KStartupInfoData( cons
+ d->timestamp = get_unum( *it );
+ else if( ( *it ).startsWith( screen_str ))
+ d->screen = get_num( *it );
++ else if( ( *it ).startsWith( xinerama_str ))
++ d->xinerama = get_num( *it );
++ else if( ( *it ).startsWith( launched_by_str ))
++ d->launched_by = get_num( *it );
+ }
+ }
+
+@@ -1242,6 +1254,10 @@ void KStartupInfoData::update( const KSt
+ d->timestamp = data_P.timestamp();
+ if( data_P.screen() != -1 )
+ d->screen = data_P.screen();
++ if( data_P.xinerama() != -1 && xinerama() != -1 ) // don't overwrite
++ d->xinerama = data_P.xinerama();
++ if( data_P.launchedBy() != 0 && launchedBy() != 0 ) // don't overwrite
++ d->launched_by = data_P.launchedBy();
+ }
+
+ KStartupInfoData::KStartupInfoData()
+@@ -1412,6 +1428,26 @@ int KStartupInfoData::screen() const
+ return d->screen;
+ }
+
++void KStartupInfoData::setXinerama( int xinerama )
++ {
++ d->xinerama = xinerama;
++ }
++
++int KStartupInfoData::xinerama() const
++ {
++ return d->xinerama;
++ }
++
++void KStartupInfoData::setLaunchedBy( WId window )
++ {
++ d->launched_by = window;
++ }
++
++WId KStartupInfoData::launchedBy() const
++ {
++ return d->launched_by;
++ }
++
+ static
+ long get_num( const QString& item_P )
+ {
+Index: kdecore/netwm_def.h
+===================================================================
+--- kdecore/netwm_def.h.orig
++++ kdecore/netwm_def.h
+@@ -610,6 +610,7 @@ public:
+ WM2WindowRole = 1<<11, ///< @since 3.3
+ WM2ClientMachine = 1<<12, ///< @since 3.3
+ WM2ShowingDesktop = 1<<13, ///< @since 3.5
++ WM2FullPlacement = 1<<14,
+ WM2DesktopLayout = 1<<15 ///< @since 3.5.8
+ };
+
+Index: kdecore/netwm.cpp
+===================================================================
+--- kdecore/netwm.cpp.orig
++++ kdecore/netwm.cpp
+@@ -145,6 +145,9 @@ static Atom net_wm_state_stays_on_top =
+ // used to determine whether application window is managed or not
+ static Atom xa_wm_state = 0;
+
++// ability flags
++static Atom net_wm_full_placement = 0;
++
+ static Bool netwm_atoms_created = False;
+ const unsigned long netwm_sendevent_mask = (SubstructureRedirectMask|
+ SubstructureNotifyMask);
+@@ -236,7 +239,7 @@ static int wcmp(const void *a, const voi
+ }
+
+
+-static const int netAtomCount = 84;
++static const int netAtomCount = 85;
+ static void create_atoms(Display *d) {
+ static const char * const names[netAtomCount] =
+ {
+@@ -330,7 +333,9 @@ static void create_atoms(Display *d) {
+ "_KDE_NET_WM_TEMPORARY_RULES",
+
+ "WM_STATE",
+- "WM_PROTOCOLS"
++ "WM_PROTOCOLS",
++
++ "_NET_WM_FULL_PLACEMENT"
+ };
+
+ Atom atoms[netAtomCount], *atomsp[netAtomCount] =
+@@ -425,7 +430,9 @@ static void create_atoms(Display *d) {
+ &kde_net_wm_temporary_rules,
+
+ &xa_wm_state,
+- &wm_protocols
++ &wm_protocols,
++
++ &net_wm_full_placement
+ };
+
+ assert( !netwm_atoms_created );
+@@ -1355,6 +1362,8 @@ void NETRootInfo::setSupported() {
+
+ if (p->properties[ PROTOCOLS2 ] & WM2KDETemporaryRules)
+ atoms[pnum++] = kde_net_wm_temporary_rules;
++ if (p->properties[ PROTOCOLS2 ] & WM2FullPlacement)
++ atoms[pnum++] = net_wm_full_placement;
+
+ XChangeProperty(p->display, p->root, net_supported, XA_ATOM, 32,
+ PropModeReplace, (unsigned char *) atoms, pnum);
+@@ -1587,6 +1596,8 @@ void NETRootInfo::updateSupportedPropert
+
+ else if( atom == kde_net_wm_temporary_rules )
+ p->properties[ PROTOCOLS2 ] |= WM2KDETemporaryRules;
++ else if( atom == net_wm_full_placement )
++ p->properties[ PROTOCOLS2 ] |= WM2FullPlacement;
+ }
+
+ extern Time qt_x_user_time;
+Index: kdecore/kstartupinfo.h
+===================================================================
+--- kdecore/kstartupinfo.h.orig
++++ kdecore/kstartupinfo.h
+@@ -635,6 +635,30 @@ class KDECORE_EXPORT KStartupInfoData
+ * This is usually not necessary to set, as it's set by default to qt_xscreen().
+ */
+ void setScreen( int screen );
++
++ /**
++ * The Xinerama screen for the startup notification, -1 if unknown.
++ */
++ int xinerama() const;
++
++ /**
++ * Sets the Xinerama screen for the startup notification ( i.e. the screeen on which
++ * the starting application should appear ).
++ * @param xinerama the Xinerama screen for the startup notification
++ */
++ void setXinerama( int xinerama );
++
++ /**
++ * The toplevel window of the application that caused this startup notification,
++ * 0 if unknown.
++ */
++ WId launchedBy() const;
++
++ /**
++ * Sets the toplevel window of the application that caused this startup notification.
++ * @param window window ID of the toplevel window that is responsible for this startup
++ */
++ void setLaunchedBy( WId window );
+
+ /**
+ * Updates the notification data from the given data. Some data, such as the desktop