diff options
Diffstat (limited to 'src/eggsmclient-osx.c')
-rw-r--r-- | src/eggsmclient-osx.c | 225 |
1 files changed, 113 insertions, 112 deletions
diff --git a/src/eggsmclient-osx.c b/src/eggsmclient-osx.c index e6fa376..456616c 100644 --- a/src/eggsmclient-osx.c +++ b/src/eggsmclient-osx.c @@ -51,26 +51,27 @@ typedef struct _EggSMClientOSX EggSMClientOSX; typedef struct _EggSMClientOSXClass EggSMClientOSXClass; -struct _EggSMClientOSX { - EggSMClient parent; +struct _EggSMClientOSX +{ + EggSMClient parent; - AppleEvent quit_event, quit_reply; - gboolean quit_requested, quitting; + AppleEvent quit_event, quit_reply; + gboolean quit_requested, quitting; }; struct _EggSMClientOSXClass { - EggSMClientClass parent_class; + EggSMClientClass parent_class; }; static void sm_client_osx_startup (EggSMClient *client, - const char *client_id); + const char *client_id); static void sm_client_osx_will_quit (EggSMClient *client, - gboolean will_quit); + gboolean will_quit); static gboolean sm_client_osx_end_session (EggSMClient *client, - EggSMClientEndStyle style, - gboolean request_confirmation); + EggSMClientEndStyle style, + gboolean request_confirmation); static pascal OSErr quit_requested (const AppleEvent *, AppleEvent *, long); @@ -79,157 +80,157 @@ G_DEFINE_TYPE (EggSMClientOSX, egg_sm_client_osx, EGG_TYPE_SM_CLIENT) static void egg_sm_client_osx_init (EggSMClientOSX *osx) { - ; + ; } static void egg_sm_client_osx_class_init (EggSMClientOSXClass *klass) { - EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass); + EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass); - sm_client_class->startup = sm_client_osx_startup; - sm_client_class->will_quit = sm_client_osx_will_quit; - sm_client_class->end_session = sm_client_osx_end_session; + sm_client_class->startup = sm_client_osx_startup; + sm_client_class->will_quit = sm_client_osx_will_quit; + sm_client_class->end_session = sm_client_osx_end_session; } EggSMClient * egg_sm_client_osx_new (void) { - return g_object_new (EGG_TYPE_SM_CLIENT_OSX, NULL); + return g_object_new (EGG_TYPE_SM_CLIENT_OSX, NULL); } static void sm_client_osx_startup (EggSMClient *client, - const char *client_id) + const char *client_id) { - AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, - NewAEEventHandlerUPP (quit_requested), - (long)GPOINTER_TO_SIZE (client), false); + AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, + NewAEEventHandlerUPP (quit_requested), + (long)GPOINTER_TO_SIZE (client), false); } static gboolean idle_quit_requested (gpointer client) { - egg_sm_client_quit_requested (client); - return FALSE; + egg_sm_client_quit_requested (client); + return FALSE; } static pascal OSErr quit_requested (const AppleEvent *aevt, AppleEvent *reply, long refcon) { - EggSMClient *client = GSIZE_TO_POINTER ((gsize)refcon); - EggSMClientOSX *osx = GSIZE_TO_POINTER ((gsize)refcon); - - g_return_val_if_fail (!osx->quit_requested, userCanceledErr); - - /* FIXME AEInteractWithUser? */ - - osx->quit_requested = TRUE; - AEDuplicateDesc (aevt, &osx->quit_event); - AEDuplicateDesc (reply, &osx->quit_reply); - AESuspendTheCurrentEvent (aevt); - - /* Don't emit the "quit_requested" signal immediately, since we're - * called from a weird point in the guts of gdkeventloop-quartz.c - */ - g_idle_add (idle_quit_requested, client); - return noErr; + EggSMClient *client = GSIZE_TO_POINTER ((gsize)refcon); + EggSMClientOSX *osx = GSIZE_TO_POINTER ((gsize)refcon); + + g_return_val_if_fail (!osx->quit_requested, userCanceledErr); + + /* FIXME AEInteractWithUser? */ + + osx->quit_requested = TRUE; + AEDuplicateDesc (aevt, &osx->quit_event); + AEDuplicateDesc (reply, &osx->quit_reply); + AESuspendTheCurrentEvent (aevt); + + /* Don't emit the "quit_requested" signal immediately, since we're + * called from a weird point in the guts of gdkeventloop-quartz.c + */ + g_idle_add (idle_quit_requested, client); + return noErr; } static pascal OSErr quit_requested_resumed (const AppleEvent *aevt, AppleEvent *reply, long refcon) { - EggSMClientOSX *osx = GSIZE_TO_POINTER ((gsize)refcon); + EggSMClientOSX *osx = GSIZE_TO_POINTER ((gsize)refcon); - osx->quit_requested = FALSE; - return osx->quitting ? noErr : userCanceledErr; + osx->quit_requested = FALSE; + return osx->quitting ? noErr : userCanceledErr; } static gboolean idle_will_quit (gpointer client) { - EggSMClientOSX *osx = (EggSMClientOSX *)client; - - /* Resume the event with a new handler that will return a value to - * the system. - */ - AEResumeTheCurrentEvent (&osx->quit_event, &osx->quit_reply, - NewAEEventHandlerUPP (quit_requested_resumed), - (long)GPOINTER_TO_SIZE (client)); - AEDisposeDesc (&osx->quit_event); - AEDisposeDesc (&osx->quit_reply); - - if (osx->quitting) - egg_sm_client_quit (client); - return FALSE; + EggSMClientOSX *osx = (EggSMClientOSX *)client; + + /* Resume the event with a new handler that will return a value to + * the system. + */ + AEResumeTheCurrentEvent (&osx->quit_event, &osx->quit_reply, + NewAEEventHandlerUPP (quit_requested_resumed), + (long)GPOINTER_TO_SIZE (client)); + AEDisposeDesc (&osx->quit_event); + AEDisposeDesc (&osx->quit_reply); + + if (osx->quitting) + egg_sm_client_quit (client); + return FALSE; } static void sm_client_osx_will_quit (EggSMClient *client, - gboolean will_quit) + gboolean will_quit) { - EggSMClientOSX *osx = (EggSMClientOSX *)client; + EggSMClientOSX *osx = (EggSMClientOSX *)client; - g_return_if_fail (osx->quit_requested); + g_return_if_fail (osx->quit_requested); - osx->quitting = will_quit; + osx->quitting = will_quit; - /* Finish in an idle handler since the caller might have called - * egg_sm_client_will_quit() from inside the "quit_requested" signal - * handler, but may not expect the "quit" signal to arrive during - * the _will_quit() call. - */ - g_idle_add (idle_will_quit, client); + /* Finish in an idle handler since the caller might have called + * egg_sm_client_will_quit() from inside the "quit_requested" signal + * handler, but may not expect the "quit" signal to arrive during + * the _will_quit() call. + */ + g_idle_add (idle_will_quit, client); } static gboolean sm_client_osx_end_session (EggSMClient *client, - EggSMClientEndStyle style, - gboolean request_confirmation) + EggSMClientEndStyle style, + gboolean request_confirmation) { - static const ProcessSerialNumber loginwindow_psn = { 0, kSystemProcess }; - AppleEvent event = { typeNull, NULL }, reply = { typeNull, NULL }; - AEAddressDesc target; - AEEventID id; - OSErr err; - - switch (style) - { - case EGG_SM_CLIENT_END_SESSION_DEFAULT: - case EGG_SM_CLIENT_LOGOUT: - id = request_confirmation ? kAELogOut : kAEReallyLogOut; - break; - case EGG_SM_CLIENT_REBOOT: - id = request_confirmation ? kAEShowRestartDialog : kAERestart; - break; - case EGG_SM_CLIENT_SHUTDOWN: - id = request_confirmation ? kAEShowShutdownDialog : kAEShutDown; - break; - } - - err = AECreateDesc (typeProcessSerialNumber, &loginwindow_psn, - sizeof (loginwindow_psn), &target); - if (err != noErr) - { - g_warning ("Could not create descriptor for loginwindow: %d", err); - return FALSE; - } - - err = AECreateAppleEvent (kCoreEventClass, id, &target, - kAutoGenerateReturnID, kAnyTransactionID, - &event); - AEDisposeDesc (&target); - if (err != noErr) - { - g_warning ("Could not create logout AppleEvent: %d", err); - return FALSE; - } - - err = AESend (&event, &reply, kAENoReply, kAENormalPriority, - kAEDefaultTimeout, NULL, NULL); - AEDisposeDesc (&event); - if (err == noErr) - AEDisposeDesc (&reply); - - return err == noErr; + static const ProcessSerialNumber loginwindow_psn = { 0, kSystemProcess }; + AppleEvent event = { typeNull, NULL }, reply = { typeNull, NULL }; + AEAddressDesc target; + AEEventID id; + OSErr err; + + switch (style) + { + case EGG_SM_CLIENT_END_SESSION_DEFAULT: + case EGG_SM_CLIENT_LOGOUT: + id = request_confirmation ? kAELogOut : kAEReallyLogOut; + break; + case EGG_SM_CLIENT_REBOOT: + id = request_confirmation ? kAEShowRestartDialog : kAERestart; + break; + case EGG_SM_CLIENT_SHUTDOWN: + id = request_confirmation ? kAEShowShutdownDialog : kAEShutDown; + break; + } + + err = AECreateDesc (typeProcessSerialNumber, &loginwindow_psn, + sizeof (loginwindow_psn), &target); + if (err != noErr) + { + g_warning ("Could not create descriptor for loginwindow: %d", err); + return FALSE; + } + + err = AECreateAppleEvent (kCoreEventClass, id, &target, + kAutoGenerateReturnID, kAnyTransactionID, + &event); + AEDisposeDesc (&target); + if (err != noErr) + { + g_warning ("Could not create logout AppleEvent: %d", err); + return FALSE; + } + + err = AESend (&event, &reply, kAENoReply, kAENormalPriority, + kAEDefaultTimeout, NULL, NULL); + AEDisposeDesc (&event); + if (err == noErr) + AEDisposeDesc (&reply); + + return err == noErr; } |