[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Re: Fwd: kwin bugs [and patches !]
From:       Mosfet <mosfet () mandrakesoft ! com>
Date:       1999-12-22 4:13:27
[Download RAW message or body]

David Faure wrote:
> 
> Just received this - I have no clue about kwin so I'll let
> somebody else apply, but the patches look very good, please
> consider applying !
> 
> Mosfet ? Matthias ?
> 
> ----- Forwarded message from slamb@oh.yeah.org -----
> 
> Date:   Tue, 21 Dec 1999 17:18:35 -0600 (CST)
> From: slamb@oh.yeah.org
> To: David Faure <faure@kde.org>
> Subject: kwin bugs
> 
> Hi. I just downloaded the KRASH release yesterday. Looks and feels
> awesome, but found several problems in kwin.
> 
> (If there's someone else who should see this message, please forward it.
> I would be sending it to the kde-devel list, but I am having trouble
> subscribing, probably due to my messed-up DNS setup. If you have problems
> replying, try srlamb@home.com instead.)
> 
> Anyway, the problems:
> 
> - Click to focus mode is hardcoded in.
> - Typo: s/FocusStricklyFollowsMouse/FocusStrictlyFollowsMouse/g
> - Focus follows mouse gives the focus to the root window.

> - Changing window decorations on-the-fly doesn't work correctly, nor is the
>   Be mode saved correctly. The mode saving problem is just that it saves it
>   as "Be," yet checks for "be" while loading the config file. But when changing
>   decorations on the fly, it only changes the current window, and not the
>   entire desktop's behavior, which would be consistent with the way new windows
>   open in the changed decoration style.
>

Cristian is correct about this, changing all the decorations needs to be
done in conjunction with the dynamic loading of KWin styles. Evidently
this person got further than I did tho, I kept getting segfaults when
deleting clients (this is the reason why that isn't implemented yet ;-)
That part of the patch looks cool so I'll use it in what I am doing.
Thanks :)

He's right about the "Be" spelling error as well, and I just fixed that
manually. There was also an oversite with not setting the proper config
group when writing the style, and that is also fixed.  

I don't work on the other stuff so I will leave that to however is
working on it.

> I think I've managed to fix these problems in the included patch.
> 
> The focus-follows-mouse mode fix is kind of a kludge: I copied over the
> code from clientFactory() that checks if the window's text string is "THE
> DESKTOP" and ignored its enter events. Works, though.
> 
> The window decorations thing is trickier. I did see that plans for the
> future include moving all of the different clients into dynamically
> loading libraries. I don't think this patch will cause any problems with
> that. But unfortunately the way I go through all of the clients, tear
> them apart, and rebuild them changes the focus and stacking order of the
> windows. I'm not sure how to fix this, though it probably isn't that big
> of a deal.
> 
> There's one other annoying problem that I noticed but haven't fixed yet.
> Windows seem to sometimes unshade partially, leaving the window
> horizontally sized correctly but vertically only a portion of the correct
> height. For example, I'm looking at a konqueror window that's large enough
> to display the toolbars but not any of the content pane. It isn't just KDE
> applications, either; Netscape has the same problem.
> 
> Anyway, thanks for the great software...alpha release or not, there's no
> way I'm going back to GNOME/Enlightenment.
> --
> Scott Lamb (slamb@oh.yeah.org / http://digitech.org/~slamb/)
> "The illiterate of the 21st century will not be those who cannot read and
> write, but those who cannot learn, unlearn, and relearn." - Alvin Toffler
> 
> Content-Description: bugfixes
> *** /home/slamb/kdebase/kwin/client.cpp Mon Dec  6 17:14:25 1999
> --- client.cpp  Tue Dec 21 16:47:52 1999
> ***************
> *** 1247,1262 ****
>   bool Client::x11Event( XEvent * e)
>   {
>       if ( e->type == EnterNotify ) {
> !       if ( options->focusPolicy != Options::ClickToFocus )
>             workspace()->requestFocus( this );
>         return TRUE;
>       }
>       if ( e->type == LeaveNotify ) {
>         if ( !buttonDown )
>             setCursor( arrowCursor );
> !       if ( options->focusPolicy == Options::FocusStricklyUnderMouse ) {
> !           if ( isActive() && !rect().contains( QPoint( e->xcrossing.x, e->xcrossing.y ) ) )
>                 workspace()->requestFocus( 0 ) ;
>         }
>         return TRUE;
>       }
> --- 1247,1273 ----
>   bool Client::x11Event( XEvent * e)
>   {
>       if ( e->type == EnterNotify ) {
> !       if ( options->focusPolicy != Options::ClickToFocus ) {
> !           char* name = 0;
> !           QString s;
> !           if ( XFetchName( qt_xdisplay(), (Window) win, &name ) && name ) {
> !               s = QString::fromLatin1( name );
> !               XFree( name );
> !           }
> !           if ( s == "THE DESKTOP" )
> !               return TRUE;
>             workspace()->requestFocus( this );
> +       }
>         return TRUE;
>       }
>       if ( e->type == LeaveNotify ) {
>         if ( !buttonDown )
>             setCursor( arrowCursor );
> !       if ( options->focusPolicy == Options::FocusStrictlyUnderMouse ) {
> !           if ( isActive() && !rect().contains( QPoint( e->xcrossing.x, e->xcrossing.y ) ) ) {
> !               qDebug ("Giving up focus");
>                 workspace()->requestFocus( 0 ) ;
> +           }
>         }
>         return TRUE;
>       }
> *** /home/slamb/kdebase/kwin/options.cpp        Wed Dec 15 17:14:37 1999
> --- options.cpp Tue Dec 21 16:36:47 1999
> ***************
> *** 50,60 ****
> 
>   void Options::reload()
>   {
> -     focusPolicy = ClickToFocus;
> -
>       QPalette pal = QApplication::palette();
>       KConfig *config = KGlobal::config();
>       config->setGroup("WM");
> 
>       // normal colors
>       colors[Frame] = pal.normal().background();
> --- 50,69 ----
> 
>   void Options::reload()
>   {
>       QPalette pal = QApplication::palette();
>       KConfig *config = KGlobal::config();
>       config->setGroup("WM");
> +
> +     QString focusPolicyString = config->readEntry ("focusPolicy");
> +     if (focusPolicyString == "FocusFollowsMouse") {
> +       focusPolicy = FocusFollowsMouse;
> +     } else if (focusPolicyString == "FocusUnderMouse") {
> +       focusPolicy = FocusUnderMouse;
> +     } else if (focusPolicyString == "FocusStrictlyUnderMouse") {
> +       focusPolicy = FocusStrictlyUnderMouse;
> +     } else {
> +       focusPolicy = ClickToFocus;
> +     }
> 
>       // normal colors
>       colors[Frame] = pal.normal().background();
> *** /home/slamb/kdebase/kwin/workspace.cpp      Sun Dec 19 17:13:51 1999
> --- workspace.cpp       Tue Dec 21 16:18:42 1999
> ***************
> *** 1419,1465 ****
>       KWM::switchToDesktop( current_desktop ); // ### compatibility
>   }
> 
> -
> -
>   // experimental
>   void Workspace::setDecorationStyle( int deco )
>   {
>       if ( !popup_client )
>         return;
> -     Client* c = popup_client;
> -     WId w = c->window();
> -     clients.remove( c );
> -     stacking_order.remove( c );
> -     focus_chain.remove( c );
> -     bool mapped = c->isVisible();
> -     c->hide();
> -     c->releaseWindow();
> -     KWM::moveToDesktop( w, c->desktop() );
>       KConfig* config = KGlobal::config();
>       switch ( deco ) {
> !     case 2:
> !       c = new BeClient( this, w);
> !       config->writeEntry("Plugin", "Be");
> !       break;
> !     case 3:
> !       c = new SystemClient(this, w);
> !       config->writeEntry("Plugin", "system");
> !       break;
> !     case 4:
> !       c = new NextClient(this, w);
> !       config->writeEntry("Plugin", "next");
> !       break;
> !     default:
> !       c = new StdClient( this, w );
> !       config->writeEntry("Plugin", "standard");
>       }
> !       config->sync();
> !     clients.append( c );
> !     stacking_order.append( c );
> !     c->manage( mapped );
> !     activateClient( c );
> ! }
> 
> 
>   QWidget* Workspace::desktopWidget()
>   {
> --- 1419,1462 ----
>       KWM::switchToDesktop( current_desktop ); // ### compatibility
>   }
> 
>   // experimental
>   void Workspace::setDecorationStyle( int deco )
>   {
>       if ( !popup_client )
>         return;
>       KConfig* config = KGlobal::config();
>       switch ( deco ) {
> !       case 2:   config->writeEntry("Plugin", "be");       break;
> !       case 3:   config->writeEntry("Plugin", "system");   break;
> !       case 4:   config->writeEntry("Plugin", "next");     break;
> !       default:  config->writeEntry("Plugin", "default");  break;
>       }
> !     config->sync();
> !     for (ClientList::Iterator it = clients.begin(); it != clients.end(); ++it) {
> !       Client *oldClient = (*it);
> !
> !       // Remove oldClient from the display
> !       bool mapped = oldClient->isVisible();
> !       WId w = oldClient->window();
> !       KWM::moveToDesktop( w, oldClient->desktop() ); // why is this necessary?
> !       oldClient->hide();
> !       oldClient->releaseWindow();
> 
> +       // Replace oldClient with newClient in all lists
> +       Client *newClient = clientFactory (this, w);
> +       (*it) = newClient;
> +       ClientList::Iterator jt = stacking_order.find (oldClient);
> +       //assert (jt != stacking_order.end());
> +       (*jt) = newClient;
> +       jt = focus_chain.find (oldClient);
> +       //assert (jt != focus_chain.end());
> +       (*jt) = newClient;
> +
> +       // Delete the old, display the new
> +       delete oldClient;
> +       newClient->manage (mapped);
> +     }
> + }
> 
>   QWidget* Workspace::desktopWidget()
>   {
> *** /home/slamb/kdebase/kwin/options.h  Mon Nov 29 17:15:52 1999
> --- options.h   Tue Dec 21 16:30:23 1999
> ***************
> *** 29,46 ****
>         <li>FocusUnderMouse - The window that happens to be under the
>         mouse pointer becomes active.
> 
> !       <li>FocusStricklyUnderMouse - Only the window under the mouse
>         pointer is active. If the mouse points nowhere, nothing has the
>         focus. In practice, this is the same as FocusUnderMouse, since
>         kdesktop can take the focus.
> 
> !       Note that FocusUnderMouse and FocusStricklyUnderMouse are not
>         particulary useful. They are only provided for old-fashined
>         die-hard UNIX people ;-)
> 
>         </ul>
>        */
> !     enum FocusPolicy { ClickToFocus, FocusFollowsMouse, FocusUnderMouse, FocusStricklyUnderMouse };
>       FocusPolicy focusPolicy;
> 
>       enum MoveResizeMode { Transparent, Opaque };
> --- 29,46 ----
>         <li>FocusUnderMouse - The window that happens to be under the
>         mouse pointer becomes active.
> 
> !       <li>FocusStrictlyUnderMouse - Only the window under the mouse
>         pointer is active. If the mouse points nowhere, nothing has the
>         focus. In practice, this is the same as FocusUnderMouse, since
>         kdesktop can take the focus.
> 
> !       Note that FocusUnderMouse and FocusStrictlyUnderMouse are not
>         particulary useful. They are only provided for old-fashined
>         die-hard UNIX people ;-)
> 
>         </ul>
>        */
> !     enum FocusPolicy { ClickToFocus, FocusFollowsMouse, Focus4UnderMouse, FocusStrictlyUnderMouse };
>       FocusPolicy focusPolicy;
> 
>       enum MoveResizeMode { Transparent, Opaque };
> 
> ----- End forwarded message -----
> 
> --
> David FAURE
> david@mandrakesoft.com, faure@kde.org
> http://home.clara.net/faure/
> KDE, Making The Future of Computing Available Today

-- 
Daniel M. Duley - Unix developer & sys admin.
mosfet@mandrakesoft.com
mosfet@kde.org
mosfet@jorsm.com

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic