/* GdkMacosBaseView.c
*
* Copyright 2005 - 2007 Imendio AB
* Copyright 2011 Hiroyuki Yamamoto
* Copyright 2020 Red Hat , Inc .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library . If not , see < http : //www.gnu.org/licenses/>.
*
* SPDX - License - Identifier : LGPL - 2 . 1 - or - later
*/
#include "config.h"
#import "GdkMacosBaseView.h"
#import "GdkMacosWindow.h"
#include "gdkmacosdisplay-private.h"
#include "gdkmacossurface-private.h"
#include "gdkdebugprivate.h"
@implementation GdkMacosBaseView
-(id)initWithFrame:(NSRect)frameRect
{
if ((self = [super initWithFrame: frameRect]))
{
NSRect rect = NSMakeRect (0 , 0 , 0 , 0 );
NSTrackingAreaOptions options;
markedRange = NSMakeRange (NSNotFound, 0 );
selectedRange = NSMakeRange (0 , 0 );
[self setValue: @(YES) forKey: @"postsFrameChangedNotifications" ];
options = (NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved |
NSTrackingActiveAlways);
trackingArea = [[NSTrackingArea alloc] initWithRect:rect
options:options
owner:(id)self
userInfo:nil];
[self addTrackingArea:trackingArea];
}
return self;
}
-(void )setInputArea:(const cairo_rectangle_int_t *)area
{
NSRect rect = NSMakeRect (area->x, area->y, area->width, area->height);
NSTrackingAreaOptions options;
[self removeTrackingArea:trackingArea];
options = (NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved |
NSTrackingActiveAlways);
trackingArea = [[NSTrackingArea alloc] initWithRect:rect
options:options
owner:(id)self
userInfo:nil];
[self addTrackingArea:trackingArea];
}
-(void )setOpaqueRegion:(cairo_region_t *)region
{
/* Handled in Subclass */
}
-(BOOL )acceptsFirstMouse
{
return YES;
}
-(BOOL )mouseDownCanMoveWindow
{
return NO;
}
-(BOOL )acceptsFirstResponder
{
GDK_DEBUG (EVENTS, "acceptsFirstResponder" );
return YES;
}
-(BOOL )becomeFirstResponder
{
GDK_DEBUG (EVENTS, "becomeFirstResponder" );
return YES;
}
-(BOOL )resignFirstResponder
{
GDK_DEBUG (EVENTS, "resignFirstResponder" );
return YES;
}
-(void )setNeedsInvalidateShadow: (BOOL )invalidate
{
needsInvalidateShadow = invalidate;
}
-(NSTrackingArea *)trackingArea
{
return trackingArea;
}
-(GdkMacosSurface *)gdkSurface
{
return [(GdkMacosWindow *)[self window] gdkSurface];
}
-(GdkMacosDisplay *)gdkDisplay
{
GdkMacosSurface *surface = [self gdkSurface];
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (surface));
return GDK_MACOS_DISPLAY (display);
}
-(void )keyDown:(NSEvent *)theEvent
{
/* NOTE: When user press Cmd+A, interpretKeyEvents: will call noop:
* method . When user press and hold A to show the accented char window ,
* it consumed repeating key down events for key ' A ' do NOT call
* any other method . We use this behavior to determine if this key
* down event is filtered by interpretKeyEvents .
*/
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_FILTERED));
GDK_DEBUG (EVENTS, "keyDown" );
[self interpretKeyEvents: [NSArray arrayWithObject: theEvent]];
}
-(void )flagsChanged: (NSEvent *)theEvent
{
}
-(NSUInteger)characterIndexForPoint:(NSPoint)aPoint
{
GDK_DEBUG (EVENTS, "characterIndexForPoint" );
return 0 ;
}
-(NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange: (NSRangePointer)actualRange
{
GdkRectangle *rect;
GDK_DEBUG (EVENTS, "firstRectForCharacterRange" );
if ((rect = g_object_get_data (G_OBJECT ([self gdkSurface]), GIC_CURSOR_RECT)))
{
GdkMacosDisplay *display = [self gdkDisplay];
int ns_x, ns_y;
_gdk_macos_display_to_display_coords (display,
rect->x, rect->y + rect->height,
&ns_x, &ns_y);
return NSMakeRect (ns_x, ns_y, rect->width, rect->height);
}
return NSMakeRect (0 , 0 , 0 , 0 );
}
-(NSArray *)validAttributesForMarkedText
{
GDK_DEBUG (EVENTS, "validAttributesForMarkedText" );
return [NSArray arrayWithObjects: NSUnderlineStyleAttributeName, nil];
}
-(NSAttributedString *)attributedSubstringForProposedRange: (NSRange)aRange actualRange: (NSRangePointer)actualRange
{
GDK_DEBUG (EVENTS, "attributedSubstringForProposedRange" );
return nil;
}
-(BOOL )hasMarkedText
{
GDK_DEBUG (EVENTS, "hasMarkedText" );
return markedRange.location != NSNotFound && markedRange.length != 0 ;
}
-(NSRange)markedRange
{
GDK_DEBUG (EVENTS, "markedRange" );
return markedRange;
}
-(NSRange)selectedRange
{
GDK_DEBUG (EVENTS, "selectedRange" );
return selectedRange;
}
-(void )unmarkText
{
GDK_DEBUG (EVENTS, "unmarkText" );
selectedRange = NSMakeRange (0 , 0 );
markedRange = NSMakeRange (NSNotFound, 0 );
g_object_set_data_full (G_OBJECT ([self gdkSurface]), TIC_MARKED_TEXT, NULL, g_free);
}
-(void )setMarkedText:(id)aString selectedRange: (NSRange)newSelection replacementRange: (NSRange)replacementRange
{
const char *str;
GDK_DEBUG (EVENTS, "setMarkedText" );
if (replacementRange.location == NSNotFound)
{
markedRange = NSMakeRange (newSelection.location, [aString length]);
selectedRange = NSMakeRange (newSelection.location, newSelection.length);
}
else
{
markedRange = NSMakeRange (replacementRange.location, [aString length]);
selectedRange = NSMakeRange (replacementRange.location + newSelection.location, newSelection.length);
}
if ([aString isKindOfClass: [NSAttributedString class ]])
str = [[aString string] UTF8String];
else
str = [aString UTF8String];
g_object_set_data_full (G_OBJECT ([self gdkSurface]), TIC_MARKED_TEXT, g_strdup (str), g_free);
g_object_set_data (G_OBJECT ([self gdkSurface]),
TIC_SELECTED_POS,
GUINT_TO_POINTER (selectedRange.location));
g_object_set_data (G_OBJECT ([self gdkSurface]),
TIC_SELECTED_LEN,
GUINT_TO_POINTER (selectedRange.length));
GDK_DEBUG (EVENTS, "setMarkedText: set %s (%p, nsview %p): %s" ,
TIC_MARKED_TEXT, [self gdkSurface], self,
str ? str : "(empty)" );
/* handle text input changes by mouse events */
if (!GPOINTER_TO_UINT (g_object_get_data (G_OBJECT ([self gdkSurface]), TIC_IN_KEY_DOWN)))
_gdk_macos_surface_synthesize_null_key ([self gdkSurface]);
}
-(void )doCommandBySelector:(SEL)aSelector
{
GDK_DEBUG (EVENTS, "doCommandBySelector" );
if ([self respondsToSelector: aSelector])
[self performSelector: aSelector];
}
-(void )insertText:(id)aString replacementRange: (NSRange)replacementRange
{
const char *str;
NSString *string;
GDK_DEBUG (EVENTS, "insertText" );
if ([self hasMarkedText])
[self unmarkText];
if ([aString isKindOfClass: [NSAttributedString class ]])
string = [aString string];
else
string = aString;
NSCharacterSet *ctrlChars = [NSCharacterSet controlCharacterSet];
NSCharacterSet *wsnlChars = [NSCharacterSet whitespaceAndNewlineCharacterSet];
if ([string rangeOfCharacterFromSet:ctrlChars].length &&
[string rangeOfCharacterFromSet:wsnlChars].length == 0 )
{
/* discard invalid text input with Chinese input methods */
str = "" ;
[self unmarkText];
[[NSTextInputContext currentInputContext] discardMarkedText];
}
else
{
str = [string UTF8String];
}
g_object_set_data_full (G_OBJECT ([self gdkSurface]), TIC_INSERT_TEXT, g_strdup (str), g_free);
GDK_DEBUG (EVENTS, "insertText: set %s (%p, nsview %p): %s" ,
TIC_INSERT_TEXT, [self gdkSurface], self,
str ? str : "(empty)" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_FILTERED));
/* handle text input changes by mouse events */
if (!GPOINTER_TO_UINT (g_object_get_data (G_OBJECT ([self gdkSurface]), TIC_IN_KEY_DOWN)))
_gdk_macos_surface_synthesize_null_key ([self gdkSurface]);
}
-(void )deleteBackward:(id)sender
{
GDK_DEBUG (EVENTS, "deleteBackward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )deleteForward:(id)sender
{
GDK_DEBUG (EVENTS, "deleteForward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )deleteToBeginningOfLine:(id)sender
{
GDK_DEBUG (EVENTS, "deleteToBeginningOfLine" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )deleteToEndOfLine:(id)sender
{
GDK_DEBUG (EVENTS, "deleteToEndOfLine" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )deleteWordBackward:(id)sender
{
GDK_DEBUG (EVENTS, "deleteWordBackward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )deleteWordForward:(id)sender
{
GDK_DEBUG (EVENTS, "deleteWordForward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )insertBacktab:(id)sender
{
GDK_DEBUG (EVENTS, "insertBacktab" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )insertNewline:(id)sender
{
GDK_DEBUG (EVENTS, "insertNewline" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )insertTab:(id)sender
{
GDK_DEBUG (EVENTS, "insertTab" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveBackward:(id)sender
{
GDK_DEBUG (EVENTS, "moveBackward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveBackwardAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveBackwardAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveDown:(id)sender
{
GDK_DEBUG (EVENTS, "moveDown" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveDownAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveDownAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveForward:(id)sender
{
GDK_DEBUG (EVENTS, "moveForward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveForwardAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveForwardAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveLeft:(id)sender
{
GDK_DEBUG (EVENTS, "moveLeft" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveLeftAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveLeftAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveRight:(id)sender
{
GDK_DEBUG (EVENTS, "moveRight" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveRightAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveRightAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToBeginningOfDocument:(id)sender
{
GDK_DEBUG (EVENTS, "moveToBeginningOfDocument" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToBeginningOfDocumentAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveToBeginningOfDocumentAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToBeginningOfLine:(id)sender
{
GDK_DEBUG (EVENTS, "moveToBeginningOfLine" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToBeginningOfLineAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveToBeginningOfLineAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToEndOfDocument:(id)sender
{
GDK_DEBUG (EVENTS, "moveToEndOfDocument" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToEndOfDocumentAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveToEndOfDocumentAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToEndOfLine:(id)sender
{
GDK_DEBUG (EVENTS, "moveToEndOfLine" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveToEndOfLineAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveToEndOfLineAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveUp:(id)sender
{
GDK_DEBUG (EVENTS, "moveUp" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveUpAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveUpAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordBackward:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordBackward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordBackwardAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordBackwardAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordForward:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordForward" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordForwardAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordForwardAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordLeft:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordLeft" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordLeftAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordLeftAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordRight:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordRight" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )moveWordRightAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "moveWordRightAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )pageDown:(id)sender
{
GDK_DEBUG (EVENTS, "pageDown" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )pageDownAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "pageDownAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )pageUp:(id)sender
{
GDK_DEBUG (EVENTS, "pageUp" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )pageUpAndModifySelection:(id)sender
{
GDK_DEBUG (EVENTS, "pageUpAndModifySelection" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )selectAll:(id)sender
{
GDK_DEBUG (EVENTS, "selectAll" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )selectLine:(id)sender
{
GDK_DEBUG (EVENTS, "selectLine" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )selectWord:(id)sender
{
GDK_DEBUG (EVENTS, "selectWord" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
-(void )noop: (id)sender
{
GDK_DEBUG (EVENTS, "noop" );
g_object_set_data (G_OBJECT ([self gdkSurface]),
GIC_FILTER_KEY,
GUINT_TO_POINTER (GIC_FILTER_PASSTHRU));
}
@end
Messung V0.5 in Prozent C=98 H=96 G=96
¤ Dauer der Verarbeitung: 0.3 Sekunden
(vorverarbeitet am 2026-07-02)
¤
*© Formatika GbR, Deutschland