One thing to try subclassing NSTextField to return NO to the NSResponder -resignFirstResponder: where the default is YES.
On Tue, Mar 31, 2020 at 11:31 AM Andreas Höschler <ahoe...@smartsoft.de> wrote: > 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 <ahoe...@smartsoft.de>: > > > Am 30.03.2020 um 15:19 schrieb Andreas Höschler <ahoe...@smartsoft.de>: > > 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 > > > >