Accéder à l'API Carbon de Mac OS X

 

Le script ci-dessous est une brève démonstration de l'utilité de Ffidl pour accéder à l'API Carbon de Mac OS X et plus particulièrement il montre comment implémenter un gestionnaire d'événement Carbon avec Tcl en utilisant [::ffidl::stubsymbol].

Le script mêt en place un raccourci clavier système Cmd-Shift-A qui passe le labelframe bleu en rouge. Notez bien que le raccourci fonctionne même lorsque Tk n'a pas le focus.

 # Let's ffidl with Carbon HotKeys!
 #
 # Copyright (c) 2005, Daniel A. Steffen <das@users.sourceforge.net>
 # BSD License: c.f. <http://www.opensource.org/licenses/bsd-license>

 package require Tk
 package require Ffidl

 namespace eval carbon {

     ::ffidl::typedef EventHotKeyID {unsigned long} uint32
     ::ffidl::typedef EventTypeSpec uint32 uint32
     ::ffidl::typedef EventTargetRef pointer
     ::ffidl::typedef OSStatus sint32

     ::ffidl::callout RegisterEventHotKey {uint32 uint32 EventHotKeyID EventTargetRef \
                                           uint32 pointer-var} OSStatus \
             [::ffidl::symbol Carbon.framework/Carbon RegisterEventHotKey]

     ::ffidl::callout GetApplicationEventTarget {} EventTargetRef \
             [::ffidl::symbol Carbon.framework/Carbon GetApplicationEventTarget]

     ::ffidl::callout InstallEventHandler {EventTargetRef pointer-proc uint32 pointer-byte \
                                           pointer pointer-var} OSStatus \
             [::ffidl::symbol Carbon.framework/Carbon InstallEventHandler]

     ::ffidl::callout XKeysymToKeycode {pointer {unsigned long}} {unsigned long} \
             [::ffidl::stubsymbol tk intXLibStubs 35]; #XKeysymToKeycode

     ::ffidl::callout TkStringToKeysym {pointer-utf8} {unsigned long} \
             [::ffidl::stubsymbol tk intStubs 86]; #TkStringToKeysym
 }

 proc hotkeyHandler {handlerCallRef event userData} {
     .l configure -bg red
     after 200 .l configure -bg blue
     return 0
 }

 proc installHotKey {key} {
     labelframe .l -width 100 -height 100 -bg blue
     pack .l

     ::ffidl::callback hotkeyHandler {pointer pointer pointer} OSStatus

     set EventHandlerRef [binary format I 0]
     set res [carbon::InstallEventHandler [carbon::GetApplicationEventTarget] hotkeyHandler 1 \
         [binary format a4I keyb 5] 0 EventHandlerRef]
     if {$res} {puts stderr "InstallEventHandler failed: $res"; exit -1}

     set keycode [expr {[carbon::XKeysymToKeycode 0 [carbon::TkStringToKeysym $key]]>>16}]
     set modifiers [expr {1 << 8 | 1 << 9}]; #Cmd-Shift
     #set modifiers [expr {1 << 8}]; #Cmd

     set EventHotKeyRef [binary format I 0]
     set res [carbon::RegisterEventHotKey  $keycode $modifiers [binary format a4I wish 1] \
         [carbon::GetApplicationEventTarget] 0 EventHotKeyRef]
     if {$res} {puts stderr "RegisterEventHotKey failed: $res"; exit -1}
 }

 installHotKey A

Catégorie Mac OS X