モードスタックの話。モードスタックに関してはあんまり弄れる部分ではないしなんともいえないわけですが、とりあえずモードスタックがスタックでなくなると、モードに復帰したときにself変数の値とか消えてしまうのではないでしょーか。あと、使い道があるかわからないですが、自分より下位のモードにイベントを透過させるモードなんかも作ろうと思えば作れるかと思うのです(OnTimer系なんかはもしかしたら使えるかも)。PushModeを書き換えて、すでにスタックされていたらそれを先頭に呼び出すのがベターなのかなと。

def MyPush(mode):
    _m = mode

    if mode_stack :
        mode_stack[0].OnLoseControl()

        for idx, m in enumerate(mode_stack):
            if m.__class__.__name__== mode.__class__.__name__:
                _m = mode_stack.pop(idx)

    mode_stack.insert(0,_m)

    mode_stack[0].OnPush()
    mode_stack[0].OnGetControl()
clmode.Push = MyPush

なんとなくイマイチ感はぬぐえないですが、シロさんこんな感じでどうでしょう。