Hi Fred,

in the meanwhile I was able to test the 

- (void)mouseDown:(NSEvent *)theEvent
{    
 NSLog(@"mouseDown ...");
 [NSApp preventWindowOrdering];        

 [self highlight:YES];

 NSEvent *mouseUpEvent = [[self window] nextEventMatchingMask:NSLeftMouseUpMask 
untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode dequeue:YES];
 NSPoint mouseLocation = [self convertPoint:[mouseUpEvent locationInWindow] 
fromView:nil];
 BOOL mouseUpInside = [self mouse:mouseLocation inRect:[self bounds]];

 if (mouseUpInside)
   {
    if ([self target]) [[self target] performSelector:[self action] 
withObject:self]; 
   }      
 [self highlight:NO];                  
}

code fragment (NSButton subclass) on GNUstep. And as expected it does not work 
there. So I am still looking for a solution ...

Do you know which part in the GNustep source tree resigns fist responder from a 
currently active control and transfers it to a clicked button? I got somehow 
lost in the event handling code. 

Thanks a lot,

   Andreas



> The method preventWindowOrdering is a NOOP on GNUstep, so it won’t help you. 
> Put if this is what helps you on MacOS then most likely your touch panel is 
> stealing the focus. You should try to override canBecomeKeyWindow for that 
> panel.
> 
> Hope this help,
> Fred
> 
>> Am 30.03.2020 um 19:13 schrieb Andreas Höschler <[email protected]>:
>> 
>>> 
>>>> Am 30.03.2020 um 15:19 schrieb Andreas Höschler <[email protected]>:
>>>> 
>>>> Hi Fred,
>>>> 
>>>>> in NSButton you find this code:
>>>>> 
>>>>> 
>>>>> - (BOOL) acceptsFirstMouse: (NSEvent *)theEvent
>>>>> {
>>>>> return YES;
>>>>> }
>>>>> 
>>>>> 
>>>>> You will need to write a subclass to handle this different.
>>>> 
>>>> Thanks a lot for your response. I created a subclass KbButton and 
>>>> overwrote this method like so
>>>> 
>>>> - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
>>>> {
>>>> NSLog(@"%@ returns acceptsFirstMouse NO", self);
>>>> return NO;
>>>> }
>>>> 
>>>> When I click on the button the currently active NSTextField looses first 
>>>> responder and the action of the button is called 
>>>> 
>>>> 30/03/20 14:42:16,912 ScaleMaster[59798]: strike sender <KbButton: 
>>>> 0x7b82ae50> stringValue A
>>>> 
>>>> The method acceptsFirstMouse: of KbButton is never called. So this 
>>>> unfortunately does not work, at least not on MacOSX (dev machine for the 
>>>> project). :-( I will port the code to GNUstep and see whether GNUstep 
>>>> behaves differently. Will let you know ...
>>> 
>>> Well, yes. I'm afraid Fred's advice is wrong (even though . While the code 
>>> in -[NSWindow sendEvent:] indeed requires  The method acceptsFirstMouse is 
>>> supposed to serve a different purpose. When you activate window by clicking 
>>> onto it, acceptsFirstMouse governs whether this click is passed to the 
>>> control under the mouse (acceptsFirstMouse returns YES) or whether it is 
>>> only for activating the window (acceptsFirstMouse returns NO). Your 
>>> original approach calling setAcceptsFirstResponder: with NO looks right to 
>>> me. It is just that the code in -[NSEvent sendEvent:] gets the logic wrong. 
>>> Where it currently says
>>> if ([v acceptsFirstResponder] && ![self makeFirstResponder: v])
>>>  {
>>>    return;
>>>  }
>>> it should really say
>>> if (![v acceptsFirstResponder] || ![self makeFirstResponder: v])
>>>  {
>>>    return;
>>>  }
>> 
>> I got this working on MacOSX by subclassing NSButton and doing 
>> 
>> - (void)mouseDown:(NSEvent *)theEvent
>> {    
>>  NSLog(@"mouseDown ...");
>>  [NSApp preventWindowOrdering];        
>> 
>>  [self highlight:YES];
>> 
>>  NSEvent *mouseUpEvent = [[self window] 
>> nextEventMatchingMask:NSLeftMouseUpMask
>>  untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode 
>> dequeue:YES];
>>  NSPoint mouseLocation = [self convertPoint:[mouseUpEvent locationInWindow] 
>> fromView:nil];
>>  BOOL mouseUpInside = [self mouse:mouseLocation inRect:[self bounds]];
>> 
>>  if (mouseUpInside)
>>    {
>>     if ([self target])
>>     [[self target] performSelector:[self action] withObject:self]; 
>>    }      
>>  [self highlight:NO];                  
>> }
>> 
>> I haven't tested that on the GNUstep machine yet. But if it worked there as 
>> well this would make my day.
>> 
>> Best wishes,
>> 
>> Andrea
>> 
> 

Reply via email to