discuss-gnustep
[Top][All Lists]
Advanced

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

Re: focus problem


From: Fred Kiefer
Subject: Re: focus problem
Date: Thu, 23 Aug 2007 01:45:02 +0200
User-agent: Thunderbird 1.5.0.12 (X11/20060911)

Let me try to reduce the amount of confusion in this discussion. There
are multiple issues with focus setting in GNUstep and Yen-Ju and Andreas
are talking about to completely different ones.
Andreas has a problem when switching between applications via DO. This
should be fixed by my latest change to SVN, but this change introduced a
well known race condition when clicking on slow responding applications.
Richard and I will be looking into this some more.
Yen-Ju is concerned about the focus loss of an application when the last
window is closed. His different patches try to solve this.
As for the last patch I am a bit surprised that it changes anything. We
have similar code already in [NSWindow _lossOfKeyOrMainWindow]. The main
difference I see here is that Yen-Ju's code doesn't check if the ordered
out window was key before. But why would we have to change the focus
when the window being closed wasn't key?
The patch may still be valid, I just don't understand it.

Cheers,
Fred


Yen-Ju Chen wrote:
> On 8/22/07, Yen-Ju Chen <yjchenx@gmail.com> wrote:
>> On 8/22/07, Yen-Ju Chen <yjchenx@gmail.com> wrote:
>>> On 8/22/07, Andreas Höschler <ahoesch@smartsoft.de> wrote:
>>>> Hi Yen-Ju,
>>>>
>>>>> As I said, the first half of the issue is that GNUstep cannot find the
>>>>> focused window while it is unmapped. So it deactivates itself.
>>>>> This patch transfers the focus to another window in the
>>>>> same GNUstep application before it is unmapped,
>>>>> therefore, fixes the problem.
>>>>>
>>>>> The second half of the problem is that after the unmapping,
>>>>> window manager tends to actively find another window to focus on,
>>>>> therefore, even GNUstep transfers the focus, it still loses it.
>>>>> So there is nothing GNUstep can do about it.
>>>>> It has to be fixed on window manager.
>>>>>
>>>>> This patch works for me, but may need to improvement.
>>>> Thanks for working on this!
>>>>
>>>> After applying your patch I can no longer switch between applications
>>>> via clicking on application windows. The clicked window is not put to
>>>> foreground!? :-(
>>   O.K. I can see why it happens. It's another racing issue. :(
>>   Well, the patch may need to move to up stream.
> 
>   Here is the same patch, but apply on -gui when window is closed.
>   Therefore, it will not affect the situation when window loses focus,
>   but not closed (application switching).
>   The idea is the same: transfer focus to another window before it
> gets unmapped.
>   This patch does not fix "key focus on wrong window", "window
> flicking", nor "menu disappear after last document minimized".
>   It only fixes the "menu disappear after last document window closed".
> 
>   Yen-Ju
> 
>>   Yen-Ju
>>
>>> Do you have latest Azalea from -trunk ?
>>> There are a few changes on it to match what GNUstep does.
>>> I have no problem switching application by clicking on their windows.
>>> But I will run it for a while to see.
>>> Fixing such bug has a side-effect that it may introduce another one.  :(
>>>
>>> I am pretty sure that the problem is as I described.
>>> But the fix may not be totally correct.
>>> And it doesn't fix the loss of focus during minimization.
>>> I am also not sure whether it will break on WindowMaker.
>>>
>>> Yen-Ju
>>>
>>>> Regards,
>>>>
>>>>    Andreas
>>>>
>>>>
>>>>
>>
>> ------------------------------------------------------------------------
>>
>> Index: NSWindow.m
>> ===================================================================
>> --- NSWindow.m       (revision 25410)
>> +++ NSWindow.m       (working copy)
>> @@ -2455,7 +2455,42 @@
>>        _f.has_opened = NO;
>>        [NSApp removeWindowsItem: self];
>>        [self orderOut: self];
>> +#if 1
>> +       /* We move focus to another window so that window manager will not 
>> +          randomly assign the focus. */
>> +       NSWindow *key_win = [NSApp keyWindow];
>> +       if (key_win == nil)
>> +               key_win = [NSApp mainWindow];
>> +       if ((key_win == nil) && [[NSApp windows] count])
>> +       {
>> +               int i, count = [[NSApp windows] count];
>> +               for (i = 0; i < count; i++)
>> +               {
>> +                       key_win = [[NSApp windows] objectAtIndex: i];
>> +                       if (key_win  ==  self) 
>> +                       {
>> +                               key_win = nil;
>> +                               continue;
>> +                       }
>> +                       if ([key_win isKindOfClass: [NSWindow class]])
>> +                       {
>> +                               if ([key_win canBecomeKeyWindow] == NO)
>> +                               {
>> +                                       /* Get GSCacheWindow or NSIconWindow 
>> sometimes */
>> +                                       key_win = nil;
>> +                                       continue;
>> +                               }
>> +                       }
>> +               }
>> +       }
>> +       if (key_win == nil)
>> +               key_win = [[NSApp mainMenu] window];
>> +       int key_num = [key_win windowNumber];
>> +NSLog(@"Set Input Focus to %d", key_num);
>> +    [GSServerForWindow(key_win) setinputfocus: key_num];
>> +#endif
>>  
>> +
>>        RELEASE(pool);
>>        
>>        _f.has_closed = YES;





reply via email to

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