Gjs で Clutter の mouse-event を利用する

Clutter でマウスイベントを処理する方法を調べてみた。 devhelp の ClutterActor の Signal Details の部分と、 Events (ClutterEvent) を見ながらサンプル作成した。
説明は面倒なので省略。。。
マニュアルからわかりにくいのが、 x,y 座標を調べるところ。 coord というキーワードがわかっていて、戻り値が2つの場合の Gjs の書き方を知っていれば大丈夫です。
実際には device についても ClutterInputDevice クラスのメソッドを使えばわかるみたい。

#!/usr/bin/env gjs
const Clutter = imports.gi.Clutter;

Clutter.init(null);

let stage = new Clutter.Stage({title:"Mouse"});
stage.set_background_color(Clutter.Color.get_static(Clutter.StaticColor.BLACK));
stage.connect('destroy', Clutter.main_quit);

let actor = new Clutter.Actor({reactive:true});
actor.set_background_color(Clutter.Color.get_static(Clutter.StaticColor.WHITE));
actor.set_position(100, 100);
actor.set_size(100, 100);

actor.connect('button-press-event', function (self, event, user_data) {
    let print_string ="button-press-event:";
    let type = event.type();
    print_string += "\n\ttype:" + type;
    let time = event.get_time();
    print_string += "\n\ttime:" + time;
    let flags = event.get_flags();
    print_string += "\n\tflags:" + flags;
    let [x, y] = event.get_coords();
    print_string += "\n\tx,y:" + x + "," + y;
    let modifier_state = event.get_state();
    print_string += "\n\tstate:" + modifier_state;
    let button = event.get_button();
    print_string += "\n\tbutton:" + button;
    let click_count = event.get_click_count();
    print_string += "\n\tclick_count:" + click_count;
    let device = event.get_device();
    print_string += "\n\tdevice:" + device;
    print(print_string);});
actor.connect('button-release-event', function (self, event, user_data) {
    let print_string ="button-release-event:";
    print(print_string);});
actor.connect('enter-event', function (self, event, user_data) {
    let print_string ="enter-event:";
    print(print_string);});
actor.connect('leave-event', function (self, event, user_data) {
    let print_string ="leave-event:";
    print(print_string);});
actor.connect('motion-event', function (self, event, user_data) {
    let print_string ="motion-event:";
    let type = event.type();
    print_string += "\n\ttype:" + type;
    let time = event.get_time();
    print_string += "\n\ttime:" + time;
    let flags = event.get_flags();
    print_string += "\n\tflags:" + flags;
    let [x, y] = event.get_coords();
    print_string += "\n\tx,y:" + x + "," + y;
    let modifier_state = event.get_state();
    print_string += "\n\tstate:" + modifier_state;
    let device = event.get_device();
    print_string += "\n\tdevice:" + device;
    print(print_string);});
actor.connect('scroll-event', function (self, event, user_data) {
    let print_string ="scroll-event:";
    let type = event.type();
    print_string += "\n\ttype:" + type;
    let time = event.get_time();
    print_string += "\n\ttime:" + time;
    let flags = event.get_flags();
    print_string += "\n\tflags:" + flags;
    let [x, y] = event.get_coords();
    print_string += "\n\tx,y:" + x + "," + y;
    let direction = event.get_scroll_direction();
    print_string += "\n\tdirecction:" + direction;
    let [dx, dy] = event.get_scroll_delta();
    print_string += "\n\tdx,dy:" + dx + "," + dy;
    let modifier_state = event.get_state();
    print_string += "\n\tstate:" + modifier_state;
    let device = event.get_device();
    print_string += "\n\tdevice:" + device;
    print(print_string);});

stage.add_actor(actor);
stage.show();

Clutter.main();