reflexion 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/application.cpp +56 -7
- data/.doc/ext/reflex/capture_event.cpp +1 -1
- data/.doc/ext/reflex/chase_constraint.cpp +84 -0
- data/.doc/ext/reflex/clipboard.cpp +65 -0
- data/.doc/ext/reflex/color_event.cpp +76 -0
- data/.doc/ext/reflex/color_picker.cpp +113 -0
- data/.doc/ext/reflex/constraint.cpp +135 -0
- data/.doc/ext/reflex/contact_event.cpp +1 -1
- data/.doc/ext/reflex/control_change_event.cpp +1 -1
- data/.doc/ext/reflex/device.cpp +1 -1
- data/.doc/ext/reflex/device_event.cpp +1 -1
- data/.doc/ext/reflex/draw_event.cpp +1 -1
- data/.doc/ext/reflex/ellipse_shape.cpp +1 -1
- data/.doc/ext/reflex/event.cpp +1 -1
- data/.doc/ext/reflex/file_dialog.cpp +181 -0
- data/.doc/ext/reflex/file_event.cpp +103 -0
- data/.doc/ext/reflex/filter.cpp +1 -1
- data/.doc/ext/reflex/focus_event.cpp +1 -1
- data/.doc/ext/reflex/frame_event.cpp +1 -1
- data/.doc/ext/reflex/gamepad.cpp +48 -0
- data/.doc/ext/reflex/image_view.cpp +1 -1
- data/.doc/ext/reflex/key_event.cpp +1 -274
- data/.doc/ext/reflex/line_shape.cpp +1 -1
- data/.doc/ext/reflex/link_constraint.cpp +178 -0
- data/.doc/ext/reflex/menu.cpp +303 -0
- data/.doc/ext/reflex/midi.cpp +9 -2
- data/.doc/ext/reflex/midi_event.cpp +1 -1
- data/.doc/ext/reflex/motion_event.cpp +1 -1
- data/.doc/ext/reflex/native.cpp +40 -10
- data/.doc/ext/reflex/note_event.cpp +1 -1
- data/.doc/ext/reflex/pin.cpp +156 -0
- data/.doc/ext/reflex/pointer.cpp +3 -1
- data/.doc/ext/reflex/pointer_event.cpp +3 -3
- data/.doc/ext/reflex/polygon_shape.cpp +1 -1
- data/.doc/ext/reflex/rect_shape.cpp +1 -1
- data/.doc/ext/reflex/reflex.cpp +606 -237
- data/.doc/ext/reflex/screen.cpp +27 -1
- data/.doc/ext/reflex/scroll_event.cpp +1 -1
- data/.doc/ext/reflex/selector.cpp +5 -5
- data/.doc/ext/reflex/shape.cpp +1 -1
- data/.doc/ext/reflex/snap_constraint.cpp +125 -0
- data/.doc/ext/reflex/style.cpp +1 -1
- data/.doc/ext/reflex/style_length.cpp +4 -3
- data/.doc/ext/reflex/text_event.cpp +104 -0
- data/.doc/ext/reflex/timer.cpp +1 -1
- data/.doc/ext/reflex/timer_event.cpp +1 -1
- data/.doc/ext/reflex/update_event.cpp +1 -1
- data/.doc/ext/reflex/view.cpp +206 -79
- data/.doc/ext/reflex/wheel_constraint.cpp +142 -0
- data/.doc/ext/reflex/wheel_event.cpp +1 -1
- data/.doc/ext/reflex/window.cpp +282 -31
- data/.github/workflows/release-gem.yml +2 -40
- data/.github/workflows/tag.yml +5 -28
- data/.github/workflows/test.yml +1 -28
- data/ChangeLog.md +79 -0
- data/Gemfile.lock +13 -8
- data/README.md +1 -0
- data/Rakefile +13 -2
- data/Reflex.podspec +2 -2
- data/VERSION +1 -1
- data/ext/reflex/application.cpp +62 -7
- data/ext/reflex/capture_event.cpp +1 -1
- data/ext/reflex/chase_constraint.cpp +89 -0
- data/ext/reflex/clipboard.cpp +69 -0
- data/ext/reflex/color_event.cpp +80 -0
- data/ext/reflex/color_picker.cpp +121 -0
- data/ext/reflex/constraint.cpp +146 -0
- data/ext/reflex/contact_event.cpp +1 -1
- data/ext/reflex/control_change_event.cpp +1 -1
- data/ext/reflex/device.cpp +1 -1
- data/ext/reflex/device_event.cpp +1 -1
- data/ext/reflex/draw_event.cpp +1 -1
- data/ext/reflex/ellipse_shape.cpp +1 -1
- data/ext/reflex/event.cpp +1 -1
- data/ext/reflex/extconf.rb +4 -2
- data/ext/reflex/file_dialog.cpp +194 -0
- data/ext/reflex/file_event.cpp +108 -0
- data/ext/reflex/filter.cpp +1 -1
- data/ext/reflex/focus_event.cpp +1 -1
- data/ext/reflex/frame_event.cpp +1 -1
- data/ext/reflex/gamepad.cpp +50 -0
- data/ext/reflex/image_view.cpp +1 -1
- data/ext/reflex/key_event.cpp +1 -275
- data/ext/reflex/line_shape.cpp +1 -1
- data/ext/reflex/link_constraint.cpp +194 -0
- data/ext/reflex/menu.cpp +331 -0
- data/ext/reflex/midi.cpp +11 -3
- data/ext/reflex/midi_event.cpp +1 -1
- data/ext/reflex/motion_event.cpp +1 -1
- data/ext/reflex/native.cpp +40 -10
- data/ext/reflex/note_event.cpp +1 -1
- data/ext/reflex/pin.cpp +165 -0
- data/ext/reflex/pointer.cpp +3 -1
- data/ext/reflex/pointer_event.cpp +3 -3
- data/ext/reflex/polygon_shape.cpp +1 -1
- data/ext/reflex/rect_shape.cpp +1 -1
- data/ext/reflex/reflex.cpp +608 -237
- data/ext/reflex/screen.cpp +31 -2
- data/ext/reflex/scroll_event.cpp +1 -1
- data/ext/reflex/selector.cpp +5 -5
- data/ext/reflex/selector.h +10 -10
- data/ext/reflex/shape.cpp +1 -1
- data/ext/reflex/snap_constraint.cpp +135 -0
- data/ext/reflex/style.cpp +1 -1
- data/ext/reflex/style_length.cpp +4 -3
- data/ext/reflex/text_event.cpp +111 -0
- data/ext/reflex/timer.cpp +1 -1
- data/ext/reflex/timer_event.cpp +1 -1
- data/ext/reflex/update_event.cpp +1 -1
- data/ext/reflex/view.cpp +236 -96
- data/ext/reflex/wheel_constraint.cpp +154 -0
- data/ext/reflex/wheel_event.cpp +1 -1
- data/ext/reflex/window.cpp +318 -40
- data/include/reflex/application.h +19 -0
- data/include/reflex/clipboard.h +53 -0
- data/include/reflex/color_picker.h +65 -0
- data/include/reflex/constraint.h +275 -0
- data/include/reflex/defs.h +204 -195
- data/include/reflex/event.h +180 -88
- data/include/reflex/file_dialog.h +73 -0
- data/include/reflex/gamepad.h +3 -0
- data/include/reflex/menu.h +120 -0
- data/include/reflex/midi.h +3 -0
- data/include/reflex/pin.h +68 -0
- data/include/reflex/pointer.h +4 -0
- data/include/reflex/reflex.h +2 -0
- data/include/reflex/ruby/application.h +6 -1
- data/include/reflex/ruby/clipboard.h +23 -0
- data/include/reflex/ruby/color_picker.h +89 -0
- data/include/reflex/ruby/constraint.h +94 -0
- data/include/reflex/ruby/event.h +62 -29
- data/include/reflex/ruby/file_dialog.h +89 -0
- data/include/reflex/ruby/gamepad.h +46 -0
- data/include/reflex/ruby/menu.h +103 -0
- data/include/reflex/ruby/pin.h +40 -0
- data/include/reflex/ruby/reflex.h +3 -0
- data/include/reflex/ruby/view.h +123 -39
- data/include/reflex/ruby/window.h +96 -19
- data/include/reflex/ruby.h +3 -0
- data/include/reflex/screen.h +11 -2
- data/include/reflex/view.h +66 -27
- data/include/reflex/window.h +57 -12
- data/include/reflex.h +8 -0
- data/lib/reflex/application.rb +5 -5
- data/lib/reflex/autoinit.rb +3 -1
- data/lib/reflex/button.rb +3 -3
- data/lib/reflex/chase_constraint.rb +15 -0
- data/lib/reflex/clipboard.rb +19 -0
- data/lib/reflex/color_event.rb +16 -0
- data/lib/reflex/color_picker.rb +45 -0
- data/lib/reflex/constraint.rb +29 -0
- data/lib/reflex/control_change_event.rb +17 -0
- data/lib/reflex/extension.rb +1 -1
- data/lib/reflex/file_dialog.rb +70 -0
- data/lib/reflex/file_event.rb +37 -0
- data/lib/reflex/helper.rb +79 -0
- data/lib/reflex/key_event.rb +14 -14
- data/lib/reflex/link_constraint.rb +31 -0
- data/lib/reflex/menu.rb +92 -0
- data/lib/reflex/model.rb +19 -19
- data/lib/reflex/note_event.rb +1 -1
- data/lib/reflex/pin.rb +39 -0
- data/lib/reflex/pointer.rb +30 -1
- data/lib/reflex/pointer_event.rb +13 -2
- data/lib/reflex/reflex.rb +5 -0
- data/lib/reflex/shape.rb +14 -14
- data/lib/reflex/snap_constraint.rb +28 -0
- data/lib/reflex/style.rb +16 -16
- data/lib/reflex/text_event.rb +40 -0
- data/lib/reflex/timer.rb +3 -3
- data/lib/reflex/view.rb +85 -18
- data/lib/reflex/wheel_constraint.rb +28 -0
- data/lib/reflex/wheel_event.rb +19 -1
- data/lib/reflex/window.rb +25 -13
- data/lib/reflex.rb +23 -8
- data/pod.rake +1 -1
- data/reflex.gemspec +4 -4
- data/samples/constraint.rb +152 -0
- data/samples/ime.rb +100 -0
- data/samples/ios/hello/hello.xcodeproj/project.pbxproj +236 -224
- data/samples/menu.rb +32 -0
- data/samples/model.rb +3 -3
- data/samples/test/alert.rb +93 -0
- data/samples/test/always_on.rb +76 -0
- data/samples/test/app_background.rb +51 -0
- data/samples/test/boundary.rb +75 -0
- data/samples/test/callback_exception.rb +101 -0
- data/samples/test/cancel.rb +53 -0
- data/samples/test/color_picker.rb +63 -0
- data/samples/test/file_dialog.rb +102 -0
- data/samples/window_style.rb +156 -0
- data/src/application.cpp +180 -20
- data/src/application.h +95 -5
- data/src/clipboard.cpp +81 -0
- data/src/color_picker.cpp +113 -0
- data/src/color_picker.h +36 -0
- data/src/constraint.cpp +1662 -0
- data/src/constraint.h +64 -0
- data/src/event.cpp +416 -252
- data/src/event.h +13 -2
- data/src/file_dialog.cpp +163 -0
- data/src/file_dialog.h +52 -0
- data/src/gamepad.cpp +42 -5
- data/src/gamepad.h +4 -0
- data/src/ios/app_delegate.mm +5 -3
- data/src/ios/application.mm +29 -0
- data/src/ios/clipboard.mm +44 -0
- data/src/ios/color_picker.mm +19 -0
- data/src/ios/event.h +6 -2
- data/src/ios/event.mm +31 -12
- data/src/ios/file_dialog.mm +21 -0
- data/src/ios/gamepad.mm +4 -4
- data/src/ios/menu.mm +41 -0
- data/src/ios/reflex.mm +8 -0
- data/src/ios/screen.mm +26 -0
- data/src/ios/view_controller.mm +47 -42
- data/src/ios/window.mm +44 -9
- data/src/menu.cpp +387 -0
- data/src/menu.h +81 -0
- data/src/midi.cpp +61 -31
- data/src/osx/app_delegate.h +4 -0
- data/src/osx/app_delegate.mm +168 -139
- data/src/osx/application.mm +103 -5
- data/src/osx/clipboard.mm +45 -0
- data/src/osx/color_picker.mm +112 -0
- data/src/osx/event.h +10 -0
- data/src/osx/event.mm +114 -30
- data/src/osx/file_dialog.mm +168 -0
- data/src/osx/gamepad.mm +2 -2
- data/src/osx/gamepad_hid.mm +1 -1
- data/src/osx/menu.h +25 -0
- data/src/osx/menu.mm +516 -0
- data/src/osx/native_window.h +16 -2
- data/src/osx/native_window.mm +141 -57
- data/src/osx/opengl_view.h +2 -1
- data/src/osx/opengl_view.mm +229 -37
- data/src/osx/reflex.mm +38 -0
- data/src/osx/screen.mm +36 -0
- data/src/osx/window.mm +117 -24
- data/src/pin.cpp +137 -0
- data/src/pointer.cpp +36 -16
- data/src/pointer.h +10 -0
- data/src/rays.h +46 -0
- data/src/sdl/application.cpp +73 -8
- data/src/sdl/clipboard.cpp +39 -0
- data/src/sdl/color_picker.cpp +18 -0
- data/src/sdl/event.cpp +44 -6
- data/src/sdl/event.h +18 -3
- data/src/sdl/file_dialog.cpp +20 -0
- data/src/sdl/gamepad.cpp +3 -7
- data/src/sdl/menu.cpp +40 -0
- data/src/sdl/reflex.cpp +20 -0
- data/src/sdl/screen.cpp +36 -0
- data/src/sdl/window.cpp +168 -37
- data/src/shape.cpp +15 -10
- data/src/view.cpp +583 -233
- data/src/view.h +22 -4
- data/src/vk.h +416 -0
- data/src/win32/application.cpp +167 -12
- data/src/win32/application.h +20 -0
- data/src/win32/clipboard.cpp +210 -0
- data/src/win32/color_picker.cpp +82 -0
- data/src/win32/event.cpp +123 -11
- data/src/win32/event.h +22 -3
- data/src/win32/file_dialog.cpp +226 -0
- data/src/win32/gamepad.cpp +9 -2
- data/src/win32/menu.cpp +490 -0
- data/src/win32/menu.h +35 -0
- data/src/win32/opengl.cpp +2 -9
- data/src/win32/reflex.cpp +44 -3
- data/src/win32/screen.cpp +164 -3
- data/src/win32/screen.h +8 -0
- data/src/win32/tray.cpp +191 -0
- data/src/win32/tray.h +22 -0
- data/src/win32/vk.cpp +11 -0
- data/src/win32/window.cpp +858 -135
- data/src/win32/window.h +9 -0
- data/src/window.cpp +929 -183
- data/src/window.h +77 -33
- data/src/world.cpp +86 -15
- data/src/world.h +9 -2
- data/test/helper.rb +24 -0
- data/test/test_application.rb +101 -1
- data/test/test_chase_constraint.rb +122 -0
- data/test/test_clipboard.rb +54 -0
- data/test/test_color_event.rb +36 -0
- data/test/test_color_picker.rb +62 -0
- data/test/test_constraint.rb +184 -0
- data/test/test_event.rb +1 -1
- data/test/test_file_dialog.rb +48 -0
- data/test/test_file_event.rb +43 -0
- data/test/test_has_text_preedit.rb +54 -0
- data/test/test_key_event.rb +23 -2
- data/test/test_link_constraint.rb +237 -0
- data/test/test_menu.rb +237 -0
- data/test/test_pin.rb +65 -0
- data/test/test_pointer.rb +50 -26
- data/test/test_pointer_event.rb +25 -10
- data/test/test_reflex.rb +36 -0
- data/test/test_screen.rb +24 -2
- data/test/test_snap_constraint.rb +140 -0
- data/test/test_text_event.rb +54 -0
- data/test/test_view.rb +152 -25
- data/test/test_wheel_constraint.rb +125 -0
- data/test/test_wheel_event.rb +24 -10
- data/test/test_window.rb +205 -43
- metadata +154 -10
- data/.github/workflows/utils.rb +0 -127
data/src/osx/gamepad_hid.mm
CHANGED
|
@@ -567,7 +567,7 @@ namespace Reflex
|
|
|
567
567
|
|
|
568
568
|
CFIndex count = CFSetGetCount(set.get());
|
|
569
569
|
std::vector<IOHIDDeviceRef> devices(count, NULL);
|
|
570
|
-
CFSetGetValues(set.get(), (const void**)
|
|
570
|
+
CFSetGetValues(set.get(), (const void**) devices.data());
|
|
571
571
|
|
|
572
572
|
for (CFIndex i = 0; i < count; ++i)
|
|
573
573
|
handle_connect_event(app, kIOReturnSuccess, manager, devices[i]);
|
data/src/osx/menu.h
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// -*- objc -*-
|
|
2
|
+
#pragma once
|
|
3
|
+
#ifndef __REFLEX_SRC_OSX_MENU_H__
|
|
4
|
+
#define __REFLEX_SRC_OSX_MENU_H__
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
#import <AppKit/NSMenu.h>
|
|
8
|
+
#include "../menu.h"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
namespace Reflex
|
|
12
|
+
{
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
NSMenu* Menu_get_nssubmenu (Menu* menu);
|
|
16
|
+
|
|
17
|
+
void Menu_set_native_action (Menu* menu, SEL action);
|
|
18
|
+
|
|
19
|
+
void Menu_apply_to_main_menu (Menu* menu);
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
}// Reflex
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
#endif//EOH
|
data/src/osx/menu.mm
ADDED
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
// -*- objc -*-
|
|
2
|
+
#include "menu.h"
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
#import <Cocoa/Cocoa.h>
|
|
6
|
+
#import <AppKit/AppKit.h>
|
|
7
|
+
#import <objc/runtime.h>
|
|
8
|
+
#include "reflex/exception.h"
|
|
9
|
+
#include "reflex/event.h"
|
|
10
|
+
#include "reflex/view.h"
|
|
11
|
+
#include "../rays.h"
|
|
12
|
+
#include "window.h"
|
|
13
|
+
#include "screen.h"
|
|
14
|
+
#import "native_window.h"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@interface ReflexMenuTarget : NSObject <NSMenuDelegate>
|
|
18
|
+
@end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
static NSValue*
|
|
22
|
+
menu2value (Reflex::Menu* menu)
|
|
23
|
+
{
|
|
24
|
+
return [NSValue valueWithPointer: menu];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static Reflex::Menu*
|
|
28
|
+
value2menu (NSValue* value)
|
|
29
|
+
{
|
|
30
|
+
return value ? (Reflex::Menu*) value.pointerValue : NULL;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static void
|
|
34
|
+
set_owner (NSMenuItem* nsitem, Reflex::Menu* owner)
|
|
35
|
+
{
|
|
36
|
+
[nsitem setRepresentedObject: menu2value(owner)];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static Reflex::Menu*
|
|
40
|
+
get_owner (NSMenuItem* nsitem)
|
|
41
|
+
{
|
|
42
|
+
return value2menu(nsitem.representedObject);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static void*
|
|
46
|
+
associated_object_key ()
|
|
47
|
+
{
|
|
48
|
+
static char key;
|
|
49
|
+
return &key;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static void
|
|
53
|
+
set_owner (NSMenu* nsmenu, Reflex::Menu* owner)
|
|
54
|
+
{
|
|
55
|
+
objc_setAssociatedObject(
|
|
56
|
+
nsmenu, associated_object_key(), menu2value(owner),
|
|
57
|
+
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static Reflex::Menu*
|
|
61
|
+
get_owner (NSMenu* nsmenu)
|
|
62
|
+
{
|
|
63
|
+
return value2menu(objc_getAssociatedObject(nsmenu, associated_object_key()));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static ReflexMenuTarget*
|
|
67
|
+
menu_target ()
|
|
68
|
+
{
|
|
69
|
+
static ReflexMenuTarget* target = [[ReflexMenuTarget alloc] init];
|
|
70
|
+
return target;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
namespace Reflex
|
|
75
|
+
{
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
struct MenuData : public Menu::Data
|
|
79
|
+
{
|
|
80
|
+
|
|
81
|
+
NSMenuItem* nsitem = nil;
|
|
82
|
+
|
|
83
|
+
NSMenu* nssubmenu = nil;
|
|
84
|
+
|
|
85
|
+
SEL native_action = NULL;
|
|
86
|
+
|
|
87
|
+
MenuData ()
|
|
88
|
+
{
|
|
89
|
+
nsitem = [[NSMenuItem alloc]
|
|
90
|
+
initWithTitle: @"" action: @selector(handleMenuItem:) keyEquivalent: @""];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
virtual ~MenuData ()
|
|
94
|
+
{
|
|
95
|
+
[nsitem release];
|
|
96
|
+
[nssubmenu release];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
NSMenu* get_nssubmenu (Menu* menu)
|
|
100
|
+
{
|
|
101
|
+
if (!nssubmenu)
|
|
102
|
+
{
|
|
103
|
+
nssubmenu = [[NSMenu alloc] initWithTitle: @""];
|
|
104
|
+
set_owner(nssubmenu, menu);
|
|
105
|
+
[nssubmenu setAutoenablesItems: NO];
|
|
106
|
+
[nssubmenu setDelegate: menu_target()];
|
|
107
|
+
[nsitem setSubmenu: nssubmenu];
|
|
108
|
+
}
|
|
109
|
+
return nssubmenu;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
};// MenuData
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
static MenuData&
|
|
116
|
+
get_data (Menu* menu)
|
|
117
|
+
{
|
|
118
|
+
if (!menu)
|
|
119
|
+
argument_error(__FILE__, __LINE__);
|
|
120
|
+
|
|
121
|
+
return (MenuData&) *menu->self;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static void
|
|
125
|
+
Menu_validate_items (NSMenu* nsmenu)
|
|
126
|
+
{
|
|
127
|
+
for (NSMenuItem* nsitem in nsmenu.itemArray)
|
|
128
|
+
{
|
|
129
|
+
Menu* menu = get_owner(nsitem);
|
|
130
|
+
if (!menu) continue;
|
|
131
|
+
|
|
132
|
+
MenuData& self = get_data(menu);
|
|
133
|
+
if (!self.native_action) continue;
|
|
134
|
+
|
|
135
|
+
[nsitem setEnabled:
|
|
136
|
+
menu->is_enabled() && [NSApp targetForAction: self.native_action] != nil];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
Menu::Data*
|
|
141
|
+
Menu_create_data ()
|
|
142
|
+
{
|
|
143
|
+
return new MenuData();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
void
|
|
147
|
+
Menu_validate_shortcut_modifiers (uint modifiers)
|
|
148
|
+
{
|
|
149
|
+
static const uint SUPPORTED =
|
|
150
|
+
MOD_SHIFT | MOD_CONTROL | MOD_ALT | MOD_OPTION | MOD_COMMAND;
|
|
151
|
+
|
|
152
|
+
if (modifiers & ~SUPPORTED)
|
|
153
|
+
{
|
|
154
|
+
argument_error(
|
|
155
|
+
__FILE__, __LINE__,
|
|
156
|
+
"modifiers 0x%X can not be used for a shortcut on macOS.",
|
|
157
|
+
modifiers & ~SUPPORTED);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static NSString*
|
|
162
|
+
get_keyequivalent_string (int key)
|
|
163
|
+
{
|
|
164
|
+
using namespace Reflex;
|
|
165
|
+
switch (key)
|
|
166
|
+
{
|
|
167
|
+
#define KEY_STR(key) [NSString stringWithFormat: @"%C", (unichar) (key)]
|
|
168
|
+
|
|
169
|
+
case KEY_A: return @"a";
|
|
170
|
+
case KEY_B: return @"b";
|
|
171
|
+
case KEY_C: return @"c";
|
|
172
|
+
case KEY_D: return @"d";
|
|
173
|
+
case KEY_E: return @"e";
|
|
174
|
+
case KEY_F: return @"f";
|
|
175
|
+
case KEY_G: return @"g";
|
|
176
|
+
case KEY_H: return @"h";
|
|
177
|
+
case KEY_I: return @"i";
|
|
178
|
+
case KEY_J: return @"j";
|
|
179
|
+
case KEY_K: return @"k";
|
|
180
|
+
case KEY_L: return @"l";
|
|
181
|
+
case KEY_M: return @"m";
|
|
182
|
+
case KEY_N: return @"n";
|
|
183
|
+
case KEY_O: return @"o";
|
|
184
|
+
case KEY_P: return @"p";
|
|
185
|
+
case KEY_Q: return @"q";
|
|
186
|
+
case KEY_R: return @"r";
|
|
187
|
+
case KEY_S: return @"s";
|
|
188
|
+
case KEY_T: return @"t";
|
|
189
|
+
case KEY_U: return @"u";
|
|
190
|
+
case KEY_V: return @"v";
|
|
191
|
+
case KEY_W: return @"w";
|
|
192
|
+
case KEY_X: return @"x";
|
|
193
|
+
case KEY_Y: return @"y";
|
|
194
|
+
case KEY_Z: return @"z";
|
|
195
|
+
|
|
196
|
+
case KEY_0: return @"0";
|
|
197
|
+
case KEY_1: return @"1";
|
|
198
|
+
case KEY_2: return @"2";
|
|
199
|
+
case KEY_3: return @"3";
|
|
200
|
+
case KEY_4: return @"4";
|
|
201
|
+
case KEY_5: return @"5";
|
|
202
|
+
case KEY_6: return @"6";
|
|
203
|
+
case KEY_7: return @"7";
|
|
204
|
+
case KEY_8: return @"8";
|
|
205
|
+
case KEY_9: return @"9";
|
|
206
|
+
|
|
207
|
+
case KEY_MINUS: return @"-";
|
|
208
|
+
case KEY_EQUAL: return @"=";
|
|
209
|
+
case KEY_COMMA: return @",";
|
|
210
|
+
case KEY_PERIOD: return @".";
|
|
211
|
+
case KEY_SEMICOLON: return @";";
|
|
212
|
+
case KEY_QUOTE: return @"'";
|
|
213
|
+
case KEY_SLASH: return @"/";
|
|
214
|
+
case KEY_BACKSLASH: return @"\\";
|
|
215
|
+
case KEY_GRAVE: return @"`";
|
|
216
|
+
case KEY_LBRACKET: return @"[";
|
|
217
|
+
case KEY_RBRACKET: return @"]";
|
|
218
|
+
|
|
219
|
+
case KEY_ENTER: return @"\r";
|
|
220
|
+
case KEY_SPACE: return @" ";
|
|
221
|
+
case KEY_TAB: return @"\t";
|
|
222
|
+
case KEY_ESCAPE: return @"\033";
|
|
223
|
+
case KEY_BACKSPACE: return @"\b";
|
|
224
|
+
case KEY_DELETE: return KEY_STR(NSDeleteFunctionKey);
|
|
225
|
+
case KEY_INSERT: return KEY_STR(NSInsertFunctionKey);
|
|
226
|
+
|
|
227
|
+
case KEY_LEFT: return KEY_STR(NSLeftArrowFunctionKey);
|
|
228
|
+
case KEY_RIGHT: return KEY_STR(NSRightArrowFunctionKey);
|
|
229
|
+
case KEY_UP: return KEY_STR(NSUpArrowFunctionKey);
|
|
230
|
+
case KEY_DOWN: return KEY_STR(NSDownArrowFunctionKey);
|
|
231
|
+
case KEY_HOME: return KEY_STR(NSHomeFunctionKey);
|
|
232
|
+
case KEY_END: return KEY_STR(NSEndFunctionKey);
|
|
233
|
+
case KEY_PAGEUP: return KEY_STR(NSPageUpFunctionKey);
|
|
234
|
+
case KEY_PAGEDOWN: return KEY_STR(NSPageDownFunctionKey);
|
|
235
|
+
|
|
236
|
+
case KEY_F1: return KEY_STR(NSF1FunctionKey);
|
|
237
|
+
case KEY_F2: return KEY_STR(NSF2FunctionKey);
|
|
238
|
+
case KEY_F3: return KEY_STR(NSF3FunctionKey);
|
|
239
|
+
case KEY_F4: return KEY_STR(NSF4FunctionKey);
|
|
240
|
+
case KEY_F5: return KEY_STR(NSF5FunctionKey);
|
|
241
|
+
case KEY_F6: return KEY_STR(NSF6FunctionKey);
|
|
242
|
+
case KEY_F7: return KEY_STR(NSF7FunctionKey);
|
|
243
|
+
case KEY_F8: return KEY_STR(NSF8FunctionKey);
|
|
244
|
+
case KEY_F9: return KEY_STR(NSF9FunctionKey);
|
|
245
|
+
case KEY_F10: return KEY_STR(NSF10FunctionKey);
|
|
246
|
+
case KEY_F11: return KEY_STR(NSF11FunctionKey);
|
|
247
|
+
case KEY_F12: return KEY_STR(NSF12FunctionKey);
|
|
248
|
+
case KEY_F13: return KEY_STR(NSF13FunctionKey);
|
|
249
|
+
case KEY_F14: return KEY_STR(NSF14FunctionKey);
|
|
250
|
+
case KEY_F15: return KEY_STR(NSF15FunctionKey);
|
|
251
|
+
case KEY_F16: return KEY_STR(NSF16FunctionKey);
|
|
252
|
+
case KEY_F17: return KEY_STR(NSF17FunctionKey);
|
|
253
|
+
case KEY_F18: return KEY_STR(NSF18FunctionKey);
|
|
254
|
+
case KEY_F19: return KEY_STR(NSF19FunctionKey);
|
|
255
|
+
case KEY_F20: return KEY_STR(NSF20FunctionKey);
|
|
256
|
+
case KEY_F21: return KEY_STR(NSF21FunctionKey);
|
|
257
|
+
case KEY_F22: return KEY_STR(NSF22FunctionKey);
|
|
258
|
+
case KEY_F23: return KEY_STR(NSF23FunctionKey);
|
|
259
|
+
case KEY_F24: return KEY_STR(NSF24FunctionKey);
|
|
260
|
+
|
|
261
|
+
#undef KEY_STR
|
|
262
|
+
}
|
|
263
|
+
return @"";
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
static NSEventModifierFlags
|
|
267
|
+
modifiers2mask (uint mods)
|
|
268
|
+
{
|
|
269
|
+
NSEventModifierFlags mask = 0;
|
|
270
|
+
if (mods & MOD_SHIFT) mask |= NSEventModifierFlagShift;
|
|
271
|
+
if (mods & MOD_CONTROL) mask |= NSEventModifierFlagControl;
|
|
272
|
+
if (mods & MOD_COMMAND) mask |= NSEventModifierFlagCommand;
|
|
273
|
+
if (mods & (MOD_OPTION | MOD_ALT)) mask |= NSEventModifierFlagOption;
|
|
274
|
+
return mask;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
void
|
|
278
|
+
Menu_update (Menu* menu)
|
|
279
|
+
{
|
|
280
|
+
auto& self = get_data(menu);
|
|
281
|
+
bool old_sep = self.nsitem && self.nsitem.isSeparatorItem;
|
|
282
|
+
bool is_sep = menu->is_separator();
|
|
283
|
+
|
|
284
|
+
if (!self.nsitem || is_sep != old_sep)
|
|
285
|
+
{
|
|
286
|
+
NSMenu* parent = self.nsitem.menu;
|
|
287
|
+
NSInteger index = parent ? [parent indexOfItem: self.nsitem] : -1;
|
|
288
|
+
|
|
289
|
+
NSMenuItem* nsitem = is_sep
|
|
290
|
+
? [[NSMenuItem separatorItem] retain]
|
|
291
|
+
: [[NSMenuItem alloc]
|
|
292
|
+
initWithTitle: @""
|
|
293
|
+
action: @selector(handleMenuItem:)
|
|
294
|
+
keyEquivalent: @""];
|
|
295
|
+
|
|
296
|
+
if (parent)
|
|
297
|
+
{
|
|
298
|
+
[parent removeItem: self.nsitem];
|
|
299
|
+
[parent insertItem: nsitem atIndex: index];
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
[self.nsitem release];
|
|
303
|
+
self.nsitem = nsitem;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (is_sep) return;
|
|
307
|
+
|
|
308
|
+
set_owner(self.nsitem, menu);
|
|
309
|
+
[self.nsitem setTarget: self.native_action ? nil : menu_target()];
|
|
310
|
+
[self.nsitem setAction: self.native_action ? self.native_action : @selector(handleMenuItem:)];
|
|
311
|
+
[self.nsitem setTitle: [NSString stringWithUTF8String: menu->label()]];
|
|
312
|
+
[self.nsitem setEnabled: menu->is_enabled() ? YES : NO];
|
|
313
|
+
[self.nsitem setState: menu->is_checked() ? NSControlStateValueOn : NSControlStateValueOff];
|
|
314
|
+
[self.nsitem setKeyEquivalent: get_keyequivalent_string(menu->shortcut_key())];
|
|
315
|
+
[self.nsitem setKeyEquivalentModifierMask: modifiers2mask(menu->shortcut_modifiers())];
|
|
316
|
+
[self.nsitem setImage: menu->image() ? Rays::Bitmap_get_nsimage(menu->image().bitmap()) : nil];
|
|
317
|
+
[self.nsitem setSubmenu: menu->empty() ? nil : self.nssubmenu];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
void
|
|
321
|
+
Menu_popup (Menu* menu, View* view, coord x, coord y)
|
|
322
|
+
{
|
|
323
|
+
Menu_cancel_active_pointers_for_popup(view);
|
|
324
|
+
|
|
325
|
+
MenuData& self = get_data(menu);
|
|
326
|
+
|
|
327
|
+
if (!self.nssubmenu)
|
|
328
|
+
invalid_state_error(__FILE__, __LINE__);
|
|
329
|
+
|
|
330
|
+
if (view)
|
|
331
|
+
{
|
|
332
|
+
Window* win = view->window();
|
|
333
|
+
if (!win)
|
|
334
|
+
invalid_state_error(__FILE__, __LINE__);
|
|
335
|
+
|
|
336
|
+
NSWindow* nswin = Window_get_data(win).native;
|
|
337
|
+
if (!nswin)
|
|
338
|
+
invalid_state_error(__FILE__, __LINE__);
|
|
339
|
+
|
|
340
|
+
NSView* nsview = nswin.contentView;
|
|
341
|
+
if (!nsview)
|
|
342
|
+
invalid_state_error(__FILE__, __LINE__);
|
|
343
|
+
|
|
344
|
+
Point win_pos = view->to_window(Point(x, y));
|
|
345
|
+
CGFloat win_h = nsview.frame.size.height;
|
|
346
|
+
[self.nssubmenu popUpMenuPositioningItem: nil
|
|
347
|
+
atLocation: NSMakePoint(win_pos.x, win_h - win_pos.y)
|
|
348
|
+
inView: nsview];
|
|
349
|
+
}
|
|
350
|
+
else
|
|
351
|
+
{
|
|
352
|
+
[self.nssubmenu popUpMenuPositioningItem: nil
|
|
353
|
+
atLocation: NSMakePoint(x, primary_screen_height() - y)
|
|
354
|
+
inView: nil];
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
void
|
|
359
|
+
Menu_child_added (Menu* parent, Menu* child, int index)
|
|
360
|
+
{
|
|
361
|
+
auto& p = get_data(parent);
|
|
362
|
+
auto& c = get_data(child);
|
|
363
|
+
|
|
364
|
+
[p.get_nssubmenu(parent) insertItem: c.nsitem atIndex: index];
|
|
365
|
+
Menu_update(child);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
void
|
|
369
|
+
Menu_child_removed (Menu* parent, Menu* child)
|
|
370
|
+
{
|
|
371
|
+
auto& p = get_data(parent);
|
|
372
|
+
auto& c = get_data(child);
|
|
373
|
+
|
|
374
|
+
if (p.nssubmenu && c.nsitem.menu == p.nssubmenu)
|
|
375
|
+
[p.nssubmenu removeItem: c.nsitem];
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
NSMenu*
|
|
379
|
+
Menu_get_nssubmenu (Menu* menu)
|
|
380
|
+
{
|
|
381
|
+
return get_data(menu).get_nssubmenu(menu);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
void
|
|
385
|
+
Menu_set_native_action (Menu* menu, SEL action)
|
|
386
|
+
{
|
|
387
|
+
MenuData& self = get_data(menu);
|
|
388
|
+
|
|
389
|
+
self.native_action = action;
|
|
390
|
+
Menu_update(menu);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
void
|
|
394
|
+
Menu_apply_to_main_menu (Menu* menu)
|
|
395
|
+
{
|
|
396
|
+
if (!menu && app())
|
|
397
|
+
menu = app()->menu();
|
|
398
|
+
|
|
399
|
+
if (!menu) return;
|
|
400
|
+
|
|
401
|
+
[NSApp setMainMenu: get_data(menu).get_nssubmenu(menu)];
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
}// Reflex
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
static NSMenuItem*
|
|
409
|
+
find_key_equivalent_item (NSMenu* nsmenu, NSEvent* event)
|
|
410
|
+
{
|
|
411
|
+
static const NSEventModifierFlags KEY_EQUIVALENT_MODIFIER_MASK =
|
|
412
|
+
NSEventModifierFlagCommand |
|
|
413
|
+
NSEventModifierFlagShift |
|
|
414
|
+
NSEventModifierFlagOption |
|
|
415
|
+
NSEventModifierFlagControl;
|
|
416
|
+
|
|
417
|
+
if (event.type != NSEventTypeKeyDown)
|
|
418
|
+
return nil;
|
|
419
|
+
|
|
420
|
+
NSEventModifierFlags mods = event.modifierFlags & KEY_EQUIVALENT_MODIFIER_MASK;
|
|
421
|
+
NSString* chars = event.charactersIgnoringModifiers;
|
|
422
|
+
|
|
423
|
+
for (NSMenuItem* nsitem in nsmenu.itemArray)
|
|
424
|
+
{
|
|
425
|
+
if (!nsitem.enabled) continue;
|
|
426
|
+
|
|
427
|
+
if (nsitem.hasSubmenu)
|
|
428
|
+
{
|
|
429
|
+
NSMenuItem* found = find_key_equivalent_item(nsitem.submenu, event);
|
|
430
|
+
if (found) return found;
|
|
431
|
+
}
|
|
432
|
+
else if (
|
|
433
|
+
nsitem.keyEquivalent.length > 0 &&
|
|
434
|
+
nsitem.keyEquivalentModifierMask == mods &&
|
|
435
|
+
[nsitem.keyEquivalent isEqualToString: chars])
|
|
436
|
+
{
|
|
437
|
+
return nsitem;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return nil;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
@implementation ReflexMenuTarget
|
|
445
|
+
|
|
446
|
+
- (void) handleMenuItem: (id) sender
|
|
447
|
+
{
|
|
448
|
+
NSMenuItem* nsitem = nil;
|
|
449
|
+
if ([sender isKindOfClass: NSMenuItem.class])
|
|
450
|
+
nsitem = (NSMenuItem*) sender;
|
|
451
|
+
else if ([sender isKindOfClass: NSMenu.class])
|
|
452
|
+
nsitem = find_key_equivalent_item((NSMenu*) sender, NSApp.currentEvent);
|
|
453
|
+
|
|
454
|
+
Reflex::Menu* menu = get_owner(nsitem);
|
|
455
|
+
if (!menu) return;
|
|
456
|
+
|
|
457
|
+
Reflex::Event e;
|
|
458
|
+
Reflex::Menu_call_click_event(menu, &e);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
- (void) menuWillOpen: (NSMenu*) nsmenu
|
|
462
|
+
{
|
|
463
|
+
Reflex::Menu_validate_items(nsmenu);
|
|
464
|
+
|
|
465
|
+
Reflex::Menu* menu = get_owner(nsmenu);
|
|
466
|
+
if (!menu) return;
|
|
467
|
+
|
|
468
|
+
Reflex::Event e;
|
|
469
|
+
Reflex::Menu_call_open_submenu_event(menu, &e);
|
|
470
|
+
|
|
471
|
+
for (NSMenuItem* nsitem in nsmenu.itemArray)
|
|
472
|
+
{
|
|
473
|
+
Reflex::Menu* child = get_owner(nsitem);
|
|
474
|
+
if (!child) continue;
|
|
475
|
+
|
|
476
|
+
Reflex::Event ce;
|
|
477
|
+
Reflex::Menu_call_show_event(child, &ce);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
- (void) menuDidClose: (NSMenu*) nsmenu
|
|
482
|
+
{
|
|
483
|
+
Reflex::Menu* menu = get_owner(nsmenu);
|
|
484
|
+
if (!menu) return;
|
|
485
|
+
|
|
486
|
+
for (NSMenuItem* nsitem in nsmenu.itemArray)
|
|
487
|
+
{
|
|
488
|
+
Reflex::Menu* child = get_owner(nsitem);
|
|
489
|
+
if (!child) continue;
|
|
490
|
+
|
|
491
|
+
Reflex::Event ce;
|
|
492
|
+
Reflex::Menu_call_hide_event(child, &ce);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
Reflex::Event e;
|
|
496
|
+
Reflex::Menu_call_close_submenu_event(menu, &e);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
- (BOOL) menuHasKeyEquivalent: (NSMenu*) nsmenu
|
|
500
|
+
forEvent: (NSEvent*) event
|
|
501
|
+
target: (id*) target
|
|
502
|
+
action: (SEL*) action
|
|
503
|
+
{
|
|
504
|
+
// answer key equivalent matching ourselves: AppKit's own scanning of
|
|
505
|
+
// delegate-backed menus caches stale results across setMainMenu calls,
|
|
506
|
+
// leaving every shortcut dead until the menu bar is clicked once
|
|
507
|
+
|
|
508
|
+
NSMenuItem* nsitem = find_key_equivalent_item(nsmenu, event);
|
|
509
|
+
if (!nsitem) return NO;
|
|
510
|
+
|
|
511
|
+
*target = nsitem.target;
|
|
512
|
+
*action = nsitem.action;
|
|
513
|
+
return YES;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
@end// ReflexMenuTarget
|
data/src/osx/native_window.h
CHANGED
|
@@ -4,10 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
@interface NativeWindow : NSWindow <NSWindowDelegate>
|
|
6
6
|
|
|
7
|
-
- (void)
|
|
7
|
+
- (void) setTitlebarBackgroundVisible: (BOOL) visible;
|
|
8
|
+
|
|
9
|
+
- (void) setTitlebarButtonsVisible: (BOOL) visible;
|
|
10
|
+
|
|
11
|
+
- (void) setTitlebarContainerVisible: (BOOL) visible;
|
|
12
|
+
|
|
13
|
+
- (void) setBackgroundTransparent: (BOOL) transparent;
|
|
8
14
|
|
|
9
15
|
- (BOOL) hasFullScreenFlag;
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
- (void) draw;
|
|
18
|
+
|
|
19
|
+
- (BOOL) isTextInputEnabled;
|
|
20
|
+
|
|
21
|
+
- (void) textPreedit: (NSString*) text selection: (NSRange) selection;
|
|
22
|
+
|
|
23
|
+
- (void) textCommit: (NSString*) text synthesizeKeyEvent: (BOOL) synthesize;
|
|
24
|
+
|
|
25
|
+
- (NSRect) textInputBounds;
|
|
12
26
|
|
|
13
27
|
@end// NativeWindow
|