discuss-gnustep
[Top][All Lists]
Advanced

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

Re: Touch panel keyboard in GNUstep app


From: Andreas Höschler
Subject: Re: Touch panel keyboard in GNUstep app
Date: Mon, 30 Mar 2020 17:13:17 +0000 (UTC)

Hi all,

> 
>> Am 30.03.2020 um 15:19 schrieb Andreas Höschler <address@hidden>:
>> 
>> 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

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