Let's write β

プログラミング中にできたことか、思ったこととか

MCCLIMのメニューの動作を変更

MCCLIMではメニューバーのメニューはマウスを押している間だけ表示され、メニューのアイテムの上でマウスをリリースするとそのメニューのコマンドが実行されるという仕様になっています。
クリックすると表示され、もういちどクリックするまではつねに表示されたままになり、そのあとにもう一度クリックするとトグルするように非表示になるという動作を標準にしたかったので、僕はちょっとだけ手を加える事にしました。(これが仕様にはんするかどうかは特に意識しておりません)
McCLIMのなかにmenu.lispというファイルがあります。その中にメニューの動作についての関数が
たくさんかかれています。
そこで、このような変更をいたしました(こちらは関数の変更):
まずは、

(defmethod handle-event ((pane menu-button-pane) (event pointer-button-press-event))                                                                                              
  (if (not (slot-value (slot-value pane 'client) 'armed))                                                     
      (arm-branch pane)                                                                                       
      (progn                                                                                                  
        (destroy-substructure (menu-root pane))                                                               
        (disarm-menu pane))))

これで、基本的にはトグルの動作になります。ボタンがおされたメニューが表示されていたらサブメニューごと閉じ、そうでなければ表示というふうになります。しかし、これでは一つ問題があります。
メニューのアイテムの実行はメニューのアイテムの上でマウスがリリースされたらという仕様になっていました最初にクリックしてメニューを表示したら、そのままおしっぱなしでメニューのアイテムの上ではなしたら実行という動作です。この仕様ものこしたいのでそのまま、以下のような設定も追加します。(こちらは追加):

(defmethod handle-event ((pane menu-button-leaf-pane) (event pointer-button-press-event))
  (with-slots (armed label client id) pane
    (when armed
      (unwind-protect
           (value-changed-callback pane client id label)
        (disarm-menu pane)
        (destroy-substructure (menu-root pane))
        ))))

つまり、メニューを初回にくりっくして、おしっぱなしにしているならメニューのアイテム上でリリースしたときの関数がよばれメニューはとじられます。一方、表示してからクリックしたなら、その時点でメニューがとじられますので、2回よびだされる事はないようにおもいます。