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
>>
>