Hi Fred,

thanks for pointing me into the right direction. I got this figured out in the 
meanwhile. You do

- (void) sendEvent: (NSEvent*)theEvent
{
...
              if (_lastLeftMouseDownView)
                {
                  DESTROY(_lastLeftMouseDownView);
                }
              // Don't make buttons first responder otherwise they cannot 
              // send actions to the current first responder.
              // TODO: First responder status update would more cleanly 
              // handled by -mouseDown in each control subclass (Mac OS X 
              // seems to do that).

              if (_firstResponder != v && ![v isKindOfClass: [NSButton class]])
                {
                  // Only try to set first responder, when the view wants it.
                  if ([v acceptsFirstResponder] && ![self makeFirstResponder: 
v])
                    {
                      NSLog(@"Leaving early");
                      return;
                    }
               }

              if (wasKey == YES || [v acceptsFirstMouse: theEvent] == YES)
                {
                  if ([NSHelpManager isContextHelpModeActive])
                    {
                      [v helpRequested: theEvent];
                    }
                  else
                    {
                      ASSIGN(_lastLeftMouseDownView, v);
                      if (toolTipVisible != nil)
                        {
                          /* Inform the tooltips system that we have had
                           * a mouse down so it should stop displaying.
                           */
                          [toolTipVisible mouseDown: theEvent];
                        }
                      [v mouseDown: theEvent];
                    }
                }
              else
                {
                    [self mouseDown: theEvent];
                }
            }
          else
            {
              NSDebugLLog(@"NSEvent", @"Discard (window closed) %@", theEvent);
            }
          _lastPoint = [theEvent locationInWindow];
...
}

I understand the idea behind this part

        if (_firstResponder != v && ![v isKindOfClass: [NSButton class]])
                {
                  // Only try to set first responder, when the view wants it.
                  if ([v acceptsFirstResponder] && ![self makeFirstResponder: 
v])
                    {
                      NSLog(@"Leaving early");
                      return;
                    }
               }

but would suggest that this is not entirely correct. My FormTextField refuses 
to become first responder on purpose but nevertheless relies on seeing a 
mouseDown: call. I use that to activate an inspector. At another place in the 
code this mouseDown: is needed to initiate a drag operation to drag the gui 
element around. Cocoa does this correctly IMHO (sends the mouseDown:).

I could fix the problem under GNUstep by simply commenting out


/*              if (_firstResponder != v && ![v isKindOfClass: [NSButton 
class]])
                {
                  // Only try to set first responder, when the view wants it.
                  if ([v acceptsFirstResponder] && ![self makeFirstResponder: 
v])
                    {
                      return;
                    }
                }
*/

Does anything speak against submitting this change into the public tree?

Thanks,

 Andreas


> On 13 May 2020, at 21:15, Fred Kiefer <[email protected]> wrote:
> 
> The relevant section in the sendEvent: method of NSWindow looks like this:
> 
> 
>              if (wasKey == YES || [v acceptsFirstMouse: theEvent] == YES)
>                {
>                  if ([NSHelpManager isContextHelpModeActive])
>                    {
>                      [v helpRequested: theEvent];
>                    }
>                  else
>                    {
>                      ASSIGN(_lastLeftMouseDownView, v);
>                      if (toolTipVisible != nil)
>                        {
>                          /* Inform the tooltips system that we have had
>                           * a mouse down so it should stop displaying.
>                           */
>                          [toolTipVisible mouseDown: theEvent];
>                        }
>                      [v mouseDown: theEvent];
>                    }
>                }
> 
> Looks like we only call acceptsFirstMouse when the window was not already 
> key. If this isn’t what Cocoa does, you need to explain the expected 
> behaviour.
> This code looks like it is there on purpose but Apple may have changed their 
> implementation or documentation in the meantime.
> 
> Cheers,
> Fred
> 
> 
>> Am 13.05.2020 um 17:37 schrieb Andreas Höschler via Discussion list for the 
>> GNUstep programming environment <[email protected]>:
>> 
>> Hi Fred,
>> 
>> I am still trying to get my apps to work under GNUstep. I have already 
>> worked around a couple of incompatibilities between Cocoa and GNUstep that 
>> caused trouble. 
>> 
>> I now ended up at the following problem:
>> 
>> I have some NSView subclass on a window
>> 
>>      ValueElementCarrier : ElementCarrier : ComponentCarrier : 
>> ControlCarrier : NSView
>> 
>> ValueElementCarrier has a subview
>> 
>>    FormTextField : NSTextField
>> 
>> over its complete rect. 
>> 
>> @implementation FormTextField
>> 
>> - (void)mouseDown:(NSEvent *)theEvent
>> {
>>   NSLog(@"%@ mouseDown ..", self);
>>    ...
>>    [super mouseDown:theEvent];
>> }
>> 
>> - (BOOL)becomeFirstResponder
>> {
>>   BOOL result = ([(FBFormWindow *)[self window] designMode] ? NO : [super 
>> becomeFirstResponder]);
>>   NSLog(@"%@ becomeFirstResponder %d", self, result);
>>   return result;
>> }
>> 
>> - (BOOL)acceptsFirstMouse: (NSEvent*)theEvent
>> {
>>   BOOL result = [super acceptsFirstMouse:theEvent];
>>   NSLog(@"%@ acceptsFirstMouse %d", self, result);
>>   return result;
>> }
>> 
>> @end
>> 
>> 
>> When I click on this FormTextField on MacOSX I get
>> 
>> 13/05/20 17:23:40,783 InterfaceBuilder[93679]: <FormTextField: 0x102cd30> 
>> acceptsFirstMouse 1
>> 13/05/20 17:23:40,783 InterfaceBuilder[93679]: <FormTextField: 0x102cd30> 
>> becomeFirstResponder 0
>> 13/05/20 17:23:40,784 InterfaceBuilder[93679]: <FormTextField: 0x102cd30> 
>> mouseDown ..
>> 
>> When I do the same on GNUstep I get
>> 
>> 13/05/20 17:23:40,783 InterfaceBuilder[93679]: <FormTextField: 0x102cd30> 
>> becomeFirstResponder 0
>> 
>> but no call of acceptsFirstMouse and no call of mouseDown!?  This renders my 
>> up inoperable! :-(
>> 
>> Any idea? Should this behaviour be fixed in GNUstep (handled equally)? 
>> 
>> Thanks,
>> 
>> Andreas
>> 
>> 
>> 
>> 
>> 
>> 
>> 
> 


  • ... Andreas Höschler via Discussion list for the GNUstep programming environment
    • ... Fred Kiefer
      • ... Andreas Höschler via Discussion list for the GNUstep programming environment
        • ... Fred Kiefer
          • ... Andreas Höschler via Discussion list for the GNUstep programming environment
            • ... Fred Kiefer
              • ... Andreas Höschler via Discussion list for the GNUstep programming environment
        • ... Josh Freeman
          • ... Fred Kiefer
            • ... Fred Kiefer
              • ... Andreas Höschler via Discussion list for the GNUstep programming environment

Reply via email to