Expedite initialize.
[framework/uifw/expedite.git] / src / bin / .svn / text-base / engine_quartz.m.svn-base
1 /* NOTE: If you're using Expedite for performance testing,
2    set "Disable Beam Synchronization" in Quartz Debug. */
3
4 #include "main.h"
5
6 #include <Cocoa/Cocoa.h>
7 #include <Evas_Engine_Quartz.h>
8
9 @interface EvasView : NSView
10 {
11         CGContextRef ctx;
12 }
13 @end
14
15 static EvasView * evas_view;
16 static NSWindow * main_window;
17
18 @implementation EvasView
19
20 - (id) init
21 {
22    self = [super init];
23    if (self != nil)
24    {
25       ctx = NULL;
26    }
27    return self;
28 }
29
30 - (void)drawRect:(NSRect)rect
31 {
32    if(ctx != NULL)
33    {
34       evas_damage_rectangle_add(evas, 0, 0, win_w, win_h);
35       return;
36    }
37
38    ctx = [[NSGraphicsContext currentContext] graphicsPort];
39    CGContextRetain(ctx);
40 }
41
42 - (CGContextRef)context
43 {
44    return ctx;
45 }
46
47 @end
48
49 Eina_Bool
50 engine_quartz_args(const char *engine, int width, int height)
51 {
52    Evas_Engine_Info_Quartz *einfo;
53    int i;
54
55    evas_output_method_set(evas, evas_render_method_lookup("quartz"));
56    einfo = (Evas_Engine_Info_Quartz *)evas_engine_info_get(evas);
57    if (!einfo)
58    {
59       printf("Evas does not support the Quartz Engine\n");
60       return EINA_FALSE;
61    }
62    
63    // Set up the Cocoa runtime
64    [[NSAutoreleasePool alloc] init];
65    [NSApplication sharedApplication];
66
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);
71
72    [NSApp finishLaunching];
73    
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];
81    
82    evas_view = [[EvasView alloc] initWithFrame:NSMakeRect(0,0,width,height)];
83    [[main_window contentView] addSubview:evas_view];
84    
85    // drawRect: must be run at least once, to make sure we've set ctx
86    [evas_view display];
87    
88    evas_output_size_set(evas, width, height);
89    evas_output_viewport_set(evas, 0, 0, width, height);
90
91    einfo->info.context = [evas_view context];
92    if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo))
93      {
94         printf("Evas can not setup the informations of the Quartz Engine\n");
95         return EINA_FALSE;
96      }
97
98    return EINA_TRUE;
99 }
100
101 void
102 engine_quartz_loop(void)
103 {
104    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.001];
105    
106    NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
107                                        untilDate:date
108                                           inMode:NSDefaultRunLoopMode
109                                          dequeue:YES];
110    [date release];
111    
112    if (!event) return;
113
114    if([event type] == NSMouseMoved || [event type] == NSLeftMouseDragged || [event type] == NSRightMouseDragged)
115    {
116       evas_event_feed_mouse_move(evas, [event locationInWindow].x, [event locationInWindow].y, 0, NULL);
117       
118       // Also notify on entering or leaving the window
119       NSPoint mouseLoc = [[event window] convertBaseToScreen:[event locationInWindow]];
120       
121       if(NSPointInRect(mouseLoc, [[event window] frame]))
122          evas_event_feed_mouse_in(evas, 0, NULL);
123       else
124          evas_event_feed_mouse_out(evas, 0, NULL);
125       
126       [NSApp sendEvent:event];
127    }
128    else if([event type] == NSLeftMouseDown)
129    {
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);
132
133       [NSApp sendEvent:event];
134    }
135    else if([event type] == NSLeftMouseUp)
136    {
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);
139
140       [NSApp sendEvent:event];
141    }
142    else if([event type] == NSRightMouseDown)
143    {
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];
147    }
148    else if([event type] == NSRightMouseUp)
149    {
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];
153    }
154    else if([event type] == NSKeyDown)
155    {
156       NSString * chars = [event charactersIgnoringModifiers];
157
158       switch([chars characterAtIndex:0])
159       {
160          case NSLeftArrowFunctionKey:
161             evas_event_feed_key_down(evas, "Left", "Left", NULL, NULL, 0, NULL);
162             break;
163          case NSRightArrowFunctionKey:
164             evas_event_feed_key_down(evas, "Right", "Right", NULL, NULL, 0, NULL);
165             break;
166          case NSEnterCharacter:
167          case NSCarriageReturnCharacter:
168             evas_event_feed_key_down(evas, "Return", "Return", NULL, NULL, 0, NULL);
169             break;
170          case 's':
171          case '\e':
172             evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
173             break;
174          case 'q':
175             evas_event_feed_key_down(evas, "q", "q", NULL, NULL, 0, NULL);
176             break;
177       }
178       
179       [chars release];
180    }
181    else if([event type] == NSKeyUp)
182    {
183       NSString * chars = [event charactersIgnoringModifiers];
184          
185       switch([chars characterAtIndex:0])
186       {
187          case NSLeftArrowFunctionKey:
188             evas_event_feed_key_up(evas, "Left", "Left", NULL, NULL, 0, NULL);
189             break;
190          case NSRightArrowFunctionKey:
191             evas_event_feed_key_up(evas, "Right", "Right", NULL, NULL, 0, NULL);
192             break;
193          case NSEnterCharacter:
194          case NSCarriageReturnCharacter:
195             evas_event_feed_key_up(evas, "Return", "Return", NULL, NULL, 0, NULL);
196             break;
197          case '\e':
198             evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
199             break;
200          case 'q':
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);
203             else
204               evas_event_feed_key_up(evas, "q", "q", NULL, NULL, 0, NULL);
205             break;
206       }
207       
208       [chars release];
209    }
210    else if([event type] == NSFlagsChanged)
211    {
212       int flags = [event modifierFlags];
213       
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)
224       {
225          if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock"))
226            evas_key_lock_off(evas, "Caps_Lock");
227          else
228            evas_key_lock_on(evas, "Caps_Lock");
229       }
230       
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");
240    }
241    else
242    {
243       [NSApp sendEvent:event];
244    }
245    
246    [event release];
247    [NSAutoreleasePool release];
248 }
249
250 void
251 engine_quartz_shutdown(void)
252 {
253   /* If someone knows what to do here... */
254 }