[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: Re: KDE/kdebase/workspace
From: Chani <chanika () gmail ! com>
Date: 2010-12-16 20:29:19
Message-ID: AANLkTi=gHr0zCW9S+PKqLzFuM==b=3i9gW=gALbfJt1R () mail ! gmail ! com
[Download RAW message or body]
sorry, git-svn fail. :(
this was actually several commits on two subjects, and should have
shown up as such; I'm not sure why it didn't.
most of the commits were for better showing of SessionInteract
windows; one was for allowing 'ALL' to mean "on all activities" in the
x property (as opposed to an empty string, which now only means "this
window hasn't thought about it yet" :)
here's the git log for the branch (which had itself suffered a merge
accident, so it's a bit confused):
commit aff3b4c38f086f3abe9b01178e297189cc4edf65
Author: Chani Armitage <chanika@gmail.com>
Date: Thu Dec 16 21:03:11 2010 +0100
show the parent of the sessioninteract window too.
it's usually the window with the unsaved document the dialog is asking
about.
commit 6830301fc03e52a15718fec4a4615f4729b13b20
Author: Chani Armitage <chanika@gmail.com>
Date: Thu Dec 16 12:01:31 2010 +0100
incorporate the 'allow' thing more nicely.
it still won't change activities to satisfy that; I'm not convinced it
should.
commit 0fbc44e8a79fdb4f381b13f350d821c29601a0ef
Merge: f9f179b 5a02e44
Author: Chani Armitage <chanika@gmail.com>
Date: Thu Dec 16 11:19:39 2010 +0100
Merge branches 'allactivities' and 'kwin-wip' into allactivities
Conflicts:
kwin/client.cpp
kwin/client.h
commit f9f179b4a0c9d2f8a2eb40eb0c858475e123ee01
Author: Chani Armitage <chanika@gmail.com>
Date: Thu Dec 16 11:13:14 2010 +0100
allow windows to be explicitly on all activities, or have no preference.
commit 5a02e448d49755873651a5341c73f517e2ee0217
Author: Chani Armitage <chanika@gmail.com>
Date: Mon Dec 13 11:59:28 2010 +0100
unfinished stuff for fixing the sessioninteract request
On Thu, Dec 16, 2010 at 9:14 PM, Chani Armitage <chanika@gmail.com> wrote:
> SVN commit 1207069 by chani:
>
> Merge branch 'allactivities'
>
> M +33 -3 kwin/client.cpp
> M +6 -0 kwin/client.h
> M +26 -3 kwin/manage.cpp
> M +10 -0 kwin/sm.cpp
> M +0 -5 kwin/workspace.h
> M +1 -1 libs/taskmanager/task.cpp
>
>
> --- trunk/KDE/kdebase/workspace/kwin/client.cpp #1207068:1207069
> @@ -128,6 +128,8 @@
> , demandAttentionKNotifyTimer( NULL )
> , paintRedirector( 0 )
> , electricMaximizing( false )
> + , activitiesDefined( false )
> + , needsSessionInteract(false)
> { // TODO: Do all as initialization
>
> scriptCache = new QHash<QScriptEngine*, ClientResolution>();
> @@ -1607,6 +1609,9 @@
> */
> int Client::desktop() const
> {
> + if (needsSessionInteract) {
> + return NET::OnAllDesktops;
> + }
> return desk;
> }
>
> @@ -1617,6 +1622,9 @@
> */
> QStringList Client::activities() const
> {
> + if (needsSessionInteract) {
> + return QStringList();
> + }
> return activityList;
> }
>
> @@ -1646,7 +1654,8 @@
> if( on )
> {
> activityList.clear();
> - XDeleteProperty( display(), window(), atoms->activities );
> + XChangeProperty(display(), window(), atoms->activities, XA_STRING, 8,
> + PropModeReplace, (const unsigned char *)"ALL", 3);
> updateActivities( true );
> }
> else
> @@ -2247,9 +2256,25 @@
> {
> QStringList newActivitiesList;
> QByteArray prop = getStringProperty(window(), atoms->activities);
> - if ( ! prop.isEmpty() )
> + activitiesDefined = !prop.isEmpty();
> + if (prop == "ALL") {
> + //copied from setOnAllActivities to avoid a redundant XChangeProperty.
> + if (!activityList.isEmpty()) {
> + activityList.clear();
> + updateActivities( true );
> + }
> + return;
> + }
> + if (prop.isEmpty()) {
> + //note: this makes it *act* like it's on all activities but doesn't set \
> the property to 'ALL' + if (!activityList.isEmpty()) {
> + activityList.clear();
> + updateActivities( true );
> + }
> + return;
> + }
> +
> newActivitiesList = QString(prop).split(',');
> -
> if (newActivitiesList == activityList)
> return; //expected change, it's ok.
>
> @@ -2272,6 +2297,11 @@
> setOnActivities( newActivitiesList );
> }
>
> +void Client::setSessionInteract(bool needed)
> +{
> + needsSessionInteract = needed;
> +}
> +
> } // namespace
>
> #include "client.moc"
> --- trunk/KDE/kdebase/workspace/kwin/client.h #1207068:1207069
> @@ -400,6 +400,9 @@
>
> TabBox::TabBoxClientImpl* tabBoxClient() const { return m_tabBoxClient; }
>
> + //sets whether the client should be treated as a SessionInteract window
> + void setSessionInteract(bool needed);
> +
> private slots:
> void autoRaise();
> void shadeHover();
> @@ -694,6 +697,9 @@
> friend class SWrapper::Client;
>
> void checkActivities();
> + bool activitiesDefined; //whether the x property was actually set
> +
> + bool needsSessionInteract;
> };
>
> /**
> --- trunk/KDE/kdebase/workspace/kwin/manage.cpp #1207068:1207069
> @@ -207,7 +207,7 @@
> desk = info->desktop(); // Window had the initial desktop property, force it
> if( desktop() == 0 && asn_valid && asn_data.desktop() != 0 )
> desk = asn_data.desktop();
> - if (!isMapped && !noborder && isNormalWindow() && isOnAllActivities()) {
> + if (!isMapped && !noborder && isNormalWindow() && !activitiesDefined) {
> //a new, regular window, when we're not recovering from a crash,
> //and it hasn't got an activity. let's try giving it the current one.
> //TODO: decide whether to keep this before the 4.6 release
> @@ -551,10 +551,33 @@
> else
> allow = workspace()->allowClientActivation( this, userTime(), false );
>
> - // If session saving, force showing new windows (i.e. "save file?" dialogs \
> etc.) + if (!(isMapped || session)) {
> + if (workspace()->sessionSaving()) {
> + /*
> + * If we get a new window during session saving, we assume it's \
> some 'save file?' dialog + * which the user really needs to see (to \
> know why logout's stalled). + * We also assume it'll be destroyed \
> when it's done - we never unset this flag. + *
> + * Given the current session management protocol, I can't see a \
> nicer way of doing this. + * Someday I'd like to see a protocol \
> that tells the windowmanager who's doing SessionInteract. + */
> + needsSessionInteract = true;
> + //show the parent too
> + ClientList mainclients = mainClients();
> + for( ClientList::ConstIterator it = mainclients.constBegin();
> + it != mainclients.constEnd(); ++it ) {
> + (*it)->setSessionInteract(true);
> + }
> + } else if (allow) {
> // also force if activation is allowed
> - if( !isOnCurrentDesktop() && !isMapped && !session && ( allow || \
> workspace()->sessionSaving() )) + if( !isOnCurrentDesktop() ) {
> workspace()->setCurrentDesktop( desktop() );
> + }
> + /*if (!isOnCurrentActivity()) {
> + workspace()->setCurrentActivity( activities().first() );
> + } FIXME no such method*/
> + }
> + }
>
> bool belongs_to_desktop = false;
> for( ClientList::ConstIterator it = group()->members().constBegin();
> --- trunk/KDE/kdebase/workspace/kwin/sm.cpp #1207068:1207069
> @@ -134,6 +134,7 @@
>
> void Workspace::storeClient( KConfigGroup &cg, int num, Client *c )
> {
> + c->setSessionInteract(false); //make sure we get the real values
> QString n = QString::number(num);
> cg.writeEntry( QString("sessionId")+n, c->sessionId().constData() );
> cg.writeEntry( QString("windowRole")+n, c->windowRole().constData() );
> @@ -613,6 +614,15 @@
> IceProcessMessages( SmcGetIceConnection( conn ), 0, 0 );
> }
>
> +void Workspace::sessionSaveDone()
> +{
> + session_saving = false;
> + //remove sessionInteract flag from all clients
> + foreach( Client* c, clients ) {
> + c->setSessionInteract(false);
> + }
> +}
> +
> } // namespace
>
> #include "sm.moc"
> --- trunk/KDE/kdebase/workspace/kwin/workspace.h #1207068:1207069
> @@ -1246,11 +1246,6 @@
> session_saving = true;
> }
>
> -inline void Workspace::sessionSaveDone()
> - {
> - session_saving = false;
> - }
> -
> inline bool Workspace::sessionSaving() const
> {
> return session_saving;
> --- trunk/KDE/kdebase/workspace/libs/taskmanager/task.cpp #1207068:1207069
> @@ -679,7 +679,7 @@
> unsigned long properties[] = { 0, NET::WM2Activities };
> NETWinInfo info(QX11Info::display(), d->win, QX11Info::appRootWindow(), properties, \
> 2); QString result(info.activities());
> - if (result.isEmpty()) {
> + if (result.isEmpty() || result == "ALL") {
> d->activities.clear();
> } else {
> d->activities = result.split(',');
>
--
This message brought to you by evyl bananas and the number 3.
www.chani3.com
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic