1 /* NOTE: If you're using Expedite for performance testing,
2 set "Disable Beam Synchronization" in Quartz Debug. */
6 #include <Cocoa/Cocoa.h>
7 #include <Evas_Engine_Quartz.h>
9 @interface EvasView : NSView
15 static EvasView * evas_view;
16 static NSWindow * main_window;
18 @implementation EvasView
30 - (void)drawRect:(NSRect)rect
34 evas_damage_rectangle_add(evas, 0, 0, win_w, win_h);
38 ctx = [[NSGraphicsContext currentContext] graphicsPort];
42 - (CGContextRef)context
50 engine_quartz_args(const char *engine, int width, int height)
52 Evas_Engine_Info_Quartz *einfo;
55 evas_output_method_set(evas, evas_render_method_lookup("quartz"));
56 einfo = (Evas_Engine_Info_Quartz *)evas_engine_info_get(evas);
59 printf("Evas does not support the Quartz Engine\n");
63 // Set up the Cocoa runtime
64 [[NSAutoreleasePool alloc] init];
65 [NSApplication sharedApplication];
67 // Register ourselves as a full-fledged Cocoa app, instead of a NSUIElement.
68 // This gives benefits like window focus and a dock icon!
69 ProcessSerialNumber psn = { 0, kCurrentProcess };
70 TransformProcessType (&psn, kProcessTransformToForegroundApplication);
72 [NSApp finishLaunching];
74 // Create our main window, and embed an EvasView in it
75 main_window = [[NSWindow alloc] initWithContentRect:NSMakeRect(20,500,width,height) styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask) backing:NSBackingStoreBuffered defer:NO screen:nil];
76 [main_window makeKeyAndOrderFront:NSApp];
77 [main_window setTitle:@"Expedite"];
78 [main_window makeMainWindow];
79 [main_window setAcceptsMouseMovedEvents:YES];
80 [NSApp activateIgnoringOtherApps:YES];
82 evas_view = [[EvasView alloc] initWithFrame:NSMakeRect(0,0,width,height)];
83 [[main_window contentView] addSubview:evas_view];
85 // drawRect: must be run at least once, to make sure we've set ctx
88 evas_output_size_set(evas, width, height);
89 evas_output_viewport_set(evas, 0, 0, width, height);
91 einfo->info.context = [evas_view context];
92 if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo))
94 printf("Evas can not setup the informations of the Quartz Engine\n");
102 engine_quartz_loop(void)
104 NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.001];
106 NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
108 inMode:NSDefaultRunLoopMode
114 if([event type] == NSMouseMoved || [event type] == NSLeftMouseDragged || [event type] == NSRightMouseDragged)
116 evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL);
118 // Also notify on entering or leaving the window
119 NSPoint mouseLoc = [[event window] convertBaseToScreen:[event locationInWindow]];
121 if(NSPointInRect(mouseLoc, [[event window] frame]))
122 evas_event_feed_mouse_in(evas, 0, NULL);
124 evas_event_feed_mouse_out(evas, 0, NULL);
126 [NSApp sendEvent:event];
128 else if([event type] == NSLeftMouseDown)
130 evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL);
131 evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL);
133 [NSApp sendEvent:event];
135 else if([event type] == NSLeftMouseUp)
137 evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL);
138 evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL);
140 [NSApp sendEvent:event];
142 else if([event type] == NSRightMouseDown)
144 evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL);
145 evas_event_feed_mouse_down(evas, 3, EVAS_BUTTON_NONE, 0, NULL);
146 [NSApp sendEvent:event];
148 else if([event type] == NSRightMouseUp)
150 evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL);
151 evas_event_feed_mouse_up(evas, 3, EVAS_BUTTON_NONE, 0, NULL);
152 [NSApp sendEvent:event];
154 else if([event type] == NSKeyDown)
156 NSString * chars = [event charactersIgnoringModifiers];
158 switch([chars characterAtIndex:0])
160 case NSLeftArrowFunctionKey:
161 evas_event_feed_key_down(evas, "Left", "Left", NULL, NULL, 0, NULL);
163 case NSRightArrowFunctionKey:
164 evas_event_feed_key_down(evas, "Right", "Right", NULL, NULL, 0, NULL);
166 case NSEnterCharacter:
167 case NSCarriageReturnCharacter:
168 evas_event_feed_key_down(evas, "Return", "Return", NULL, NULL, 0, NULL);
172 evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
175 evas_event_feed_key_down(evas, "q", "q", NULL, NULL, 0, NULL);
181 else if([event type] == NSKeyUp)
183 NSString * chars = [event charactersIgnoringModifiers];
185 switch([chars characterAtIndex:0])
187 case NSLeftArrowFunctionKey:
188 evas_event_feed_key_up(evas, "Left", "Left", NULL, NULL, 0, NULL);
190 case NSRightArrowFunctionKey:
191 evas_event_feed_key_up(evas, "Right", "Right", NULL, NULL, 0, NULL);
193 case NSEnterCharacter:
194 case NSCarriageReturnCharacter:
195 evas_event_feed_key_up(evas, "Return", "Return", NULL, NULL, 0, NULL);
198 evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
201 if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock"))
202 evas_event_feed_key_up(evas, "Q", "Q", NULL, NULL, 0, NULL);
204 evas_event_feed_key_up(evas, "q", "q", NULL, NULL, 0, NULL);
210 else if([event type] == NSFlagsChanged)
212 int flags = [event modifierFlags];
214 // Turn special key flags on
215 if(flags & NSShiftKeyMask)
216 evas_key_modifier_on(evas, "Shift");
217 else if(flags & NSControlKeyMask)
218 evas_key_modifier_on(evas, "Control");
219 else if(flags & NSAlternateKeyMask)
220 evas_key_modifier_on(evas, "Alt");
221 else if(flags & NSCommandKeyMask)
222 evas_key_modifier_on(evas, "Super");
223 else if(flags & NSAlphaShiftKeyMask)
225 if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock"))
226 evas_key_lock_off(evas, "Caps_Lock");
228 evas_key_lock_on(evas, "Caps_Lock");
231 // Turn special key flags off
232 if(!(flags & NSShiftKeyMask))
233 evas_key_modifier_off(evas, "Shift");
234 else if(!(flags & NSControlKeyMask))
235 evas_key_modifier_off(evas, "Control");
236 else if(!(flags & NSAlternateKeyMask))
237 evas_key_modifier_off(evas, "Alt");
238 else if(!(flags & NSCommandKeyMask))
239 evas_key_modifier_off(evas, "Super");
243 [NSApp sendEvent:event];
247 [NSAutoreleasePool release];
251 engine_quartz_shutdown(void)
253 /* If someone knows what to do here... */