From: YAMAMOTO Mitsuharu Date: Sat, 10 Dec 2005 01:49:53 +0000 (+0000) Subject: (Qmac_ready_for_drag_n_drop, Qapplication, Qabout) X-Git-Tag: emacs-pretest-22.0.90~5380 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6a0b5d3781c988dbb3580d64a7a453250702e10c;p=emacs.git (Qmac_ready_for_drag_n_drop, Qapplication, Qabout) (Qpreferences): Remove variables. (syms_of_macterm) : Don't initialize them. (Qhicommand) [USE_CARBON_EVENTS]: New variable. (syms_of_macterm) [USE_CARBON_EVENTS]: Initialize it. (init_required_apple_events, do_ae_open_application) (do_ae_print_documents, do_ae_open_documents) (do_ae_quit_application): Remove functions and prototypes. (mac_ready_for_apple_events, Qundefined, init_apple_event_handler) (mac_find_apple_event_spec): Add externs. (mac_store_application_menu_event): Remove function. (mac_store_apple_event, mac_make_lispy_event_code): New functions. (mac_handle_command_event): Create Apple event from Carbon event. Use mac_store_apple_event instead of mac_store_application_menu_event. [MAC_OSX] (mac_store_services_event): Likewise. (struct SelectionRange, SelectionRange): Remove struct and typedef. [MAC_OS8] (main): Call init_apple_event_handler instead of init_required_apple_events. (mac_initialize) [MAC_OSX]: Likewise. [!USE_CARBON_EVENTS] (mac_wait_next_event): Use mac_ready_for_apple_events instead of Qmac_ready_for_drag_n_drop. --- diff --git a/src/macterm.c b/src/macterm.c index babb009f022..5d8fb1d5f51 100644 --- a/src/macterm.c +++ b/src/macterm.c @@ -622,7 +622,7 @@ atsu_get_text_layout_with_text_ptr (text, text_length, style, text_layout) ByteCount sizes[] = {sizeof (ATSLineLayoutOptions)}; static ATSLineLayoutOptions line_layout = #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020 - kATSLineDisableAllLayoutOperations | kATSLineUseDeviceMetrics + kATSLineDisableAllLayoutOperations | kATSLineUseDeviceMetrics #else kATSLineIsDisplayOnly | kATSLineFractDisable #endif @@ -8127,20 +8127,18 @@ Lisp_Object Vmac_pass_control_to_system; Carbon/Apple event handlers. */ static struct input_event *read_socket_inev = NULL; -/* Set in term/mac-win.el to indicate that event loop can now generate - drag and drop events. */ -Lisp_Object Qmac_ready_for_drag_n_drop; - Point saved_menu_event_location; /* Apple Events */ -static void init_required_apple_events (void); -static pascal OSErr -do_ae_open_application (const AppleEvent *, AppleEvent *, long); -static pascal OSErr -do_ae_print_documents (const AppleEvent *, AppleEvent *, long); -static pascal OSErr do_ae_open_documents (AppleEvent *, AppleEvent *, long); -static pascal OSErr do_ae_quit_application (AppleEvent *, AppleEvent *, long); +#if USE_CARBON_EVENTS +static Lisp_Object Qhicommand; +#endif +extern int mac_ready_for_apple_events; +extern Lisp_Object Qundefined; +extern void init_apple_event_handler P_ ((void)); +extern void mac_find_apple_event_spec P_ ((AEEventClass, AEEventID, + Lisp_Object *, Lisp_Object *, + Lisp_Object *)); #if TARGET_API_MAC_CARBON /* Drag and Drop */ @@ -8150,11 +8148,10 @@ static DragTrackingHandlerUPP mac_do_track_dragUPP = NULL; static DragReceiveHandlerUPP mac_do_receive_dragUPP = NULL; #endif -static Lisp_Object Qapplication, Qabout; #if USE_CARBON_EVENTS #ifdef MAC_OSX extern void init_service_handler (); -static Lisp_Object Qpreferences, Qservices, Qpaste, Qperform; +static Lisp_Object Qservices, Qpaste, Qperform; #endif /* Window Event Handler */ static pascal OSStatus mac_handle_window_event (EventHandlerCallRef, @@ -8699,179 +8696,49 @@ do_zoom_window (WindowPtr w, int zoom_in_or_out) x_real_positions (f, &f->left_pos, &f->top_pos); } -/* Intialize AppleEvent dispatcher table for the required events. */ -void -init_required_apple_events () -{ - OSErr err; - long result; - - /* Make sure we have apple events before starting. */ - err = Gestalt (gestaltAppleEventsAttr, &result); - if (err != noErr) - abort (); - - if (!(result & (1 << gestaltAppleEventsPresent))) - abort (); - -#if TARGET_API_MAC_CARBON - err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, - NewAEEventHandlerUPP - ((AEEventHandlerProcPtr) do_ae_open_application), - 0L, false); -#else - err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, - NewAEEventHandlerProc - ((AEEventHandlerProcPtr) do_ae_open_application), - 0L, false); -#endif - if (err != noErr) - abort (); - -#if TARGET_API_MAC_CARBON - err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, - NewAEEventHandlerUPP - ((AEEventHandlerProcPtr) do_ae_open_documents), - 0L, false); -#else - err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, - NewAEEventHandlerProc - ((AEEventHandlerProcPtr) do_ae_open_documents), - 0L, false); -#endif - if (err != noErr) - abort (); - -#if TARGET_API_MAC_CARBON - err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, - NewAEEventHandlerUPP - ((AEEventHandlerProcPtr) do_ae_print_documents), - 0L, false); -#else - err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, - NewAEEventHandlerProc - ((AEEventHandlerProcPtr) do_ae_print_documents), - 0L, false); -#endif - if (err != noErr) - abort (); - -#if TARGET_API_MAC_CARBON - err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, - NewAEEventHandlerUPP - ((AEEventHandlerProcPtr) do_ae_quit_application), - 0L, false); -#else - err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, - NewAEEventHandlerProc - ((AEEventHandlerProcPtr) do_ae_quit_application), - 0L, false); -#endif - if (err != noErr) - abort (); -} - -void -mac_store_application_menu_event (event) -#if USE_CARBON_EVENTS - EventRef event; -#else - UInt32 event; -#endif +OSErr +mac_store_apple_event (class, id, desc) + Lisp_Object class, id; + const AEDesc *desc; { + OSErr err = noErr; struct input_event buf; - Lisp_Object frame, entry; - - EVENT_INIT (buf); - - XSETFRAME (frame, mac_focus_frame (&one_mac_display_info)); - buf.kind = MENU_BAR_EVENT; - buf.frame_or_window = frame; - buf.arg = frame; - kbd_buffer_store_event (&buf); - - buf.arg = Qapplication; - kbd_buffer_store_event (&buf); + AEDesc *desc_copy; -#if USE_CARBON_EVENTS - switch (GetEventClass (event)) + desc_copy = xmalloc (sizeof (AEDesc)); + if (desc_copy == NULL) + err = memFullErr; + else + err = AEDuplicateDesc (desc, desc_copy); + if (err == noErr) { -#ifdef MAC_OSX - case kEventClassService: - buf.arg = Qservices; - kbd_buffer_store_event (&buf); - switch (GetEventKind (event)) - { - case kEventServicePaste: - entry = Qpaste; - break; + EVENT_INIT (buf); - case kEventServicePerform: - { - OSErr err; - CFStringRef message; - - err = GetEventParameter (event, kEventParamServiceMessageName, - typeCFStringRef, NULL, - sizeof (CFStringRef), NULL, &message); - buf.arg = Qperform; - kbd_buffer_store_event (&buf); - if (err == noErr && message) - entry = intern (SDATA (cfstring_to_lisp (message))); - else - entry = Qnil; - } - break; + buf.kind = MAC_APPLE_EVENT; + buf.x = class; + buf.y = id; + buf.code = (int)desc_copy; + XSETFRAME (buf.frame_or_window, + mac_focus_frame (&one_mac_display_info)); + buf.arg = Qnil; + kbd_buffer_store_event (&buf); + } - default: - abort (); - } - break; -#endif /* MAC_OSX */ - case kEventClassCommand: - { - HICommand command; + return err; +} - GetEventParameter(event, kEventParamDirectObject, typeHICommand, - NULL, sizeof (HICommand), NULL, &command); - switch (command.commandID) - { - case kHICommandAbout: - entry = Qabout; - break; -#ifdef MAC_OSX - case kHICommandPreferences: - entry = Qpreferences; - break; -#endif /* MAC_OSX */ - case kHICommandQuit: - entry = Qquit; - break; - default: - abort (); - } - } - break; +Lisp_Object +mac_make_lispy_event_code (code) + int code; +{ + AEDesc *desc = (AEDesc *)code; + Lisp_Object obj; - default: - abort (); - } -#else /* USE_CARBON_EVENTS */ - switch (event) - { - case kHICommandAbout: - entry = Qabout; - break; - case kHICommandQuit: - entry = Qquit; - break; - default: - abort (); - } -#endif + obj = mac_aedesc_to_lisp (desc); + AEDisposeDesc (desc); + xfree (desc); - buf.arg = entry; - kbd_buffer_store_event (&buf); + return obj; } #if USE_CARBON_EVENTS @@ -8881,28 +8748,49 @@ mac_handle_command_event (next_handler, event, data) EventRef event; void *data; { + OSStatus result; + OSErr err; HICommand command; - OSErr result; + Lisp_Object class_key, id_key, binding; - GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, - sizeof (HICommand), NULL, &command); + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + return result; - switch (command.commandID) - { - case kHICommandAbout: -#ifdef MAC_OSX - case kHICommandPreferences: -#endif /* MAC_OSX */ - result = CallNextEventHandler (next_handler, event); - if (result != eventNotHandledErr) - return result; + GetEventParameter (event, kEventParamDirectObject, typeHICommand, NULL, + sizeof (HICommand), NULL, &command); - mac_store_application_menu_event (event); - return noErr; + if (command.commandID == 0) + return eventNotHandledErr; - default: - break; - } + /* A HICommand event is mapped to an Apple event whose event class + symbol is `hicommand' and event ID is its command ID. */ + class_key = Qhicommand; + mac_find_apple_event_spec (0, command.commandID, + &class_key, &id_key, &binding); + if (!NILP (binding) && !EQ (binding, Qundefined)) + if (INTEGERP (binding)) + return XINT (binding); + else + { + AppleEvent apple_event; + UInt32 modifiers; + static EventParamName names[] = {kEventParamDirectObject, + kEventParamKeyModifiers}; + static EventParamType types[] = {typeHICommand, + typeUInt32}; + static UInt32 sizes[] = {sizeof (HICommand), + sizeof (UInt32)}; + err = create_apple_event_from_event_ref (event, 2, names, types, + sizes, &apple_event); + if (err == noErr) + { + err = mac_store_apple_event (class_key, id_key, &apple_event); + AEDisposeDesc (&apple_event); + } + if (err == noErr) + return noErr; + } return eventNotHandledErr; } @@ -9064,6 +8952,52 @@ mac_handle_mouse_event (next_handler, event, data) return eventNotHandledErr; } + +#ifdef MAC_OSX +OSErr +mac_store_services_event (event) + EventRef event; +{ + OSErr err; + AppleEvent apple_event; + Lisp_Object id_key; + + switch (GetEventKind (event)) + { + case kEventServicePaste: + id_key = Qpaste; + err = create_apple_event_from_event_ref (event, 0, NULL, + NULL, NULL, &apple_event); + break; + + case kEventServicePerform: + { + static EventParamName names[] = {kEventParamServiceMessageName, + kEventParamServiceUserData}; + static EventParamType types[] = {typeCFStringRef, + typeCFStringRef}; + static UInt32 sizes[] = {sizeof (CFStringRef), + sizeof (CFStringRef)}; + + id_key = Qperform; + err = create_apple_event_from_event_ref (event, 2, names, types, + sizes, &apple_event); + } + break; + + default: + abort (); + } + + if (err == noErr) + { + err = mac_store_apple_event (Qservices, id_key, &apple_event); + AEDisposeDesc (&apple_event); + } + + return err; +} +#endif /* MAC_OSX */ #endif /* USE_CARBON_EVENTS */ @@ -9122,159 +9056,6 @@ remove_window_handler (window) #endif } -/* Open Application Apple Event */ -static pascal OSErr -do_ae_open_application(const AppleEvent *pae, AppleEvent *preply, long prefcon) -{ - return noErr; -} - - -/* Called when we receive an AppleEvent with an ID of - "kAEOpenDocuments". This routine gets the direct parameter, - extracts the FSSpecs in it, and puts their names on a list. */ -#pragma options align=mac68k -typedef struct SelectionRange { - short unused1; // 0 (not used) - short lineNum; // line to select (<0 to specify range) - long startRange; // start of selection range (if line < 0) - long endRange; // end of selection range (if line < 0) - long unused2; // 0 (not used) - long theDate; // modification date/time -} SelectionRange; -#pragma options align=reset - -static pascal OSErr -do_ae_open_documents(AppleEvent *message, AppleEvent *reply, long refcon) -{ - OSErr err, err2; - AEDesc the_desc; - AEKeyword keyword; - DescType actual_type; - Size actual_size; - SelectionRange position; - Lisp_Object file_list = Qnil; - - xassert (read_socket_inev); - - err = AEGetParamDesc (message, keyDirectObject, typeAEList, &the_desc); - if (err != noErr) - goto descriptor_error_exit; - - err = AEGetParamPtr (message, keyAEPosition, typeChar, &actual_type, &position, sizeof(SelectionRange), &actual_size); - if (err == noErr) - file_list = Fcons (list3 (make_number (position.lineNum + 1), - make_number (position.startRange + 1), - make_number (position.endRange + 1)), - file_list); - - /* Check to see that we got all of the required parameters from the - event descriptor. For an 'odoc' event this should just be the - file list. */ - err = AEGetAttributePtr(message, keyMissedKeywordAttr, typeWildCard, - &actual_type, (Ptr) &keyword, - sizeof (keyword), &actual_size); - /* No error means that we found some unused parameters. - errAEDescNotFound means that there are no more parameters. If we - get an error code other than that, flag it. */ - if ((err == noErr) || (err != errAEDescNotFound)) - { - err = errAEEventNotHandled; - goto error_exit; - } - err = noErr; - - /* Got all the parameters we need. Now, go through the direct - object list and parse it up. */ - { - long num_files_to_open; - - err = AECountItems (&the_desc, &num_files_to_open); - if (err == noErr) - { - int i; - - /* AE file list is one based so just use that for indexing here. */ - for (i = 1; i <= num_files_to_open; i++) - { - char unix_path_name[MAXPATHLEN]; -#ifdef MAC_OSX - FSRef fref; - - err = AEGetNthPtr (&the_desc, i, typeFSRef, &keyword, - &actual_type, &fref, sizeof (FSRef), - &actual_size); - if (err != noErr || actual_type != typeFSRef) - continue; - - if (FSRefMakePath (&fref, unix_path_name, sizeof (unix_path_name)) - == noErr) -#else - FSSpec fs; - - err = AEGetNthPtr(&the_desc, i, typeFSS, &keyword, &actual_type, - (Ptr) &fs, sizeof (fs), &actual_size); - if (err != noErr) continue; - - if (fsspec_to_posix_pathname (&fs, unix_path_name, - sizeof (unix_path_name) - 1) == noErr) -#endif - /* x-dnd functions expect undecoded filenames. */ - file_list = Fcons (make_unibyte_string (unix_path_name, - strlen (unix_path_name)), - file_list); - } - } - - /* Build a DRAG_N_DROP_EVENT type event as is done in - constuct_drag_n_drop in w32term.c. */ - if (!NILP (file_list)) - { - struct frame *f = mac_focus_frame (&one_mac_display_info); - WindowPtr wp; - Lisp_Object frame; - - read_socket_inev->kind = DRAG_N_DROP_EVENT; - read_socket_inev->code = 0; - read_socket_inev->modifiers = 0; - - XSETINT (read_socket_inev->x, 0); - XSETINT (read_socket_inev->y, 0); - - XSETFRAME (frame, f); - read_socket_inev->frame_or_window = Fcons (frame, file_list); - -#if 0 - /* Regardless of whether Emacs was suspended or in the - foreground, ask it to redraw its entire screen. Otherwise - parts of the screen can be left in an inconsistent - state. */ - wp = FRAME_MAC_WINDOW (f); - if (wp) -#if TARGET_API_MAC_CARBON - { - Rect r; - - GetWindowPortBounds (wp, &r); - InvalWindowRect (wp, &r); - } -#else /* not TARGET_API_MAC_CARBON */ - InvalRect (&(wp->portRect)); -#endif /* not TARGET_API_MAC_CARBON */ -#endif - } - } - -error_exit: - /* Nuke the coerced file list in any case */ - err2 = AEDisposeDesc(&the_desc); - -descriptor_error_exit: - /* InvalRect(&(gFrontMacWindowP->mWP->portRect)); */ - return err; -} - - #if TARGET_API_MAC_CARBON static pascal OSErr mac_do_track_drag (DragTrackingMessage message, WindowPtr window, @@ -9429,44 +9210,6 @@ mac_do_receive_drag (WindowPtr window, void *handlerRefCon, #endif -/* Print Document Apple Event */ -static pascal OSErr -do_ae_print_documents (const AppleEvent *pAE, AppleEvent *reply, long refcon) -{ - return errAEEventNotHandled; -} - - -static pascal OSErr -do_ae_quit_application (AppleEvent* message, AppleEvent *reply, long refcon) -{ -#if USE_CARBON_EVENTS - OSErr err; - EventRef event = NULL; - static const HICommand quit_command = {kEventAttributeNone, kHICommandQuit}; - - err = CreateEvent (NULL, kEventClassCommand, kEventCommandProcess, 0, - kEventAttributeUserEvent, &event); - if (err == noErr) - err = SetEventParameter (event, kEventParamDirectObject, typeHICommand, - sizeof (HICommand), &quit_command); - if (err == noErr) - mac_store_application_menu_event (event); - if (event) - ReleaseEvent (event); - - if (err == noErr) - return noErr; - else - return errAEEventNotHandled; -#else - mac_store_application_menu_event (kHICommandQuit); - - return noErr; -#endif -} - - #if __profile__ void profiler_exit_proc () @@ -9520,7 +9263,7 @@ main (void) initialize_applescript (); - init_required_apple_events (); + init_apple_event_handler (); { char **argv; @@ -9724,7 +9467,7 @@ mac_wait_next_event (er, sleep_time, dequeue) mouse_region = NewRgn (); event_mask = everyEvent; - if (NILP (Fboundp (Qmac_ready_for_drag_n_drop))) + if (!mac_ready_for_apple_events) event_mask -= highLevelEventMask; current_tick = TickCount (); @@ -10891,7 +10634,6 @@ mac_initialize () BLOCK_INPUT; #if TARGET_API_MAC_CARBON - init_required_apple_events (); #if USE_CARBON_EVENTS #ifdef MAC_OSX @@ -10906,6 +10648,8 @@ mac_initialize () #endif /* USE_CARBON_EVENTS */ #ifdef MAC_OSX + init_apple_event_handler (); + if (!inhibit_window_system) MakeMeTheFrontProcess (); #endif @@ -10936,15 +10680,14 @@ syms_of_macterm () Fput (Qhyper, Qmodifier_value, make_number (hyper_modifier)); Fput (Qsuper, Qmodifier_value, make_number (super_modifier)); - Qapplication = intern ("application"); staticpro (&Qapplication); - Qabout = intern ("about"); staticpro (&Qabout); - -#if USE_CARBON_EVENTS && defined (MAC_OSX) - Qpreferences = intern ("preferences"); staticpro (&Qpreferences); +#if USE_CARBON_EVENTS + Qhicommand = intern ("hicommand"); staticpro (&Qhicommand); +#ifdef MAC_OSX Qservices = intern ("services"); staticpro (&Qservices); Qpaste = intern ("paste"); staticpro (&Qpaste); Qperform = intern ("perform"); staticpro (&Qperform); #endif +#endif #ifdef MAC_OSX Fprovide (intern ("mac-carbon"), Qnil); @@ -10953,9 +10696,6 @@ syms_of_macterm () staticpro (&Qreverse); Qreverse = intern ("reverse"); - staticpro (&Qmac_ready_for_drag_n_drop); - Qmac_ready_for_drag_n_drop = intern ("mac-ready-for-drag-n-drop"); - staticpro (&x_display_name_list); x_display_name_list = Qnil;