bug-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: X focus problems - was Re: Release of GUI Libraries


From: Adam Fedor
Subject: Re: X focus problems - was Re: Release of GUI Libraries
Date: Sun, 13 Jan 2002 19:09:04 -0700
User-agent: Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:0.9.4) Gecko/20011009

Another thing is that when I open an open panel I still can access menu
entries, ie. when click on 'open palettes' in Gorm I still can open the
inspector etc. Doing these nasty focus games GNUstep apps generally get a little
'confused' and do not behave properly anymore, ie. when a window is active
it does not handle inputs (ie. mouse clicks) properly etc.


Here's a patch which fixes this problem. It doesn't seem very satisfactory - basically just the last hunk -- in the targetForAction: method of NSApplication, we just tell the sender (usually [NSMenu -update]), that there is no target for any selector when a modal dialog is up. This disables most menu items. We could implement validateMenuItem: in NSApplication, but an application could easily subclass NSApplication and override this method (Gorm, in fact, does this).

I would appreciate it if someone could look at it and make any suggestions.



--
Adam Fedor, Digital Optics            | I'm glad I hate spinach, because
http://www.doc.com                    | if I didn't, I'd eat it, and you
http://www.gnustep.org                | know how I hate the stuff.
Index: Source/NSApplication.m
===================================================================
RCS file: /cvsroot/gnustep/gnustep/core/gui/Source/NSApplication.m,v
retrieving revision 1.190
diff -c -r1.190 NSApplication.m
*** Source/NSApplication.m      9 Jan 2002 20:41:07 -0000       1.190
--- Source/NSApplication.m      14 Jan 2002 01:41:55 -0000
***************
*** 1120,1127 ****
--- 1120,1136 ----
  
        if (found == YES)
        {
+         NSEventType   type = [_current_event type];
+ 
          [self sendEvent: _current_event];
  
+         // update (en/disable) the services menu's items
+         if (type != NSPeriodic && type != NSMouseMoved)
+           {
+             [_listener updateServicesMenu];
+             [_main_menu update];
+           }
+ 
          /*
           *    Check to see if the window has gone away - if so, end session.
           */
***************
*** 1394,1400 ****
    if (keyWindow != nil)
      {
        resp = [keyWindow firstResponder];
!       while (resp != nil)
        {
          if ([resp respondsToSelector: aSelector])
            {
--- 1403,1409 ----
    if (keyWindow != nil)
      {
        resp = [keyWindow firstResponder];
!       while (resp != nil && resp != keyWindow)
        {
          if ([resp respondsToSelector: aSelector])
            {
***************
*** 1412,1417 ****
--- 1421,1429 ----
          return resp;
        }
      }
+ 
+   if (_session != 0)
+     return nil;
  
    mainWindow = [self mainWindow];
    if (keyWindow != mainWindow && mainWindow != nil)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]