読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

SBCL / Linux Mint でGUI (cl-gtk2, cffi-clutter, McCLIM)

方針

  • 日本語の表示と入力を試す
  • fcitxとMozcを使う。IME周りよくわからないので問題おきたらそこで断念する(と思う)
  • quicklispで簡単に使えないものも飛ばす。

DockerとかVagrantSBCLだけ入れた仮想環境作って、本当にゼロから入れるときの手順を残そうかと思ったんだけど、日本語入力周りがわけわかんないことになりそうな気がするので先延ばしにする。。

cl-gtk2

インストール。3つに分かれてるので全て入れておく。

(ql:quickload :cl-gtk2-gtk :cl-gtk2-cairo :cl-gtk2-gtkglext)

CLiki: cl-gtk2 を見つつ、サンプルコードを書き換えてボタンに日本語表示。

(ql:quickload :cl-gtk2-gtk :cl-gtk2-cairo :cl-gtk2-gtkglext)

(defun run ()
  (let ((output *standard-output*))
    (gtk:within-main-loop
      (let ((window (make-instance 'gtk:gtk-window
                                   :type :toplevel
                                   :window-position :center
                                   :title "世界"
                                   :default-width 300
                                   :default-height 100))
            (button (make-instance 'gtk:button :label "こんにちは"))
            (counter 0))
        (gobject:g-signal-connect button "clicked"
                                  (lambda (b)
                                    (declare (ignore b))
                                    (format output "Hello, world!~%")
                                    (setf (gtk:button-label button)
                                          (format nil
                                                  "こんにちは! (clicked ~D times)"
                                                  (incf counter)))))
        (gtk:container-add window button)
        (gtk:widget-show window :all t)))))

(run)

f:id:phaendal:20150327061427p:plain

問題ナシ!

入力はどうだろう?

(load "~/.sbclrc")
(ql:quickload :cl-gtk2-gtk :cl-gtk2-cairo :cl-gtk2-gtkglext)

(defun run ()
  (gtk:within-main-loop
    (let ((window (make-instance 'gtk:gtk-window
                                 :type :toplevel
                                 :window-position :center
                                 :title "世界"
                                 :default-width 300
                                 :default-height 100))
          (button (make-instance 'gtk:button :label "こんにちは"))
          (entry (make-instance 'gtk:entry))
          (v-box (make-instance 'gtk:v-box)))
      (gobject:g-signal-connect button "clicked"
                                (lambda (b)
                                  (declare (ignore b))
                                  (setf (gtk:button-label button)
                                        (format nil
                                                "入力は ~S"
                                                (read-from-string (gtk:entry-text entry))))))
      (gtk:container-add window v-box)
      (gtk:box-pack-start v-box entry)
      (gtk:box-pack-start v-box button)
      
      (gtk:widget-show window :all t))))

(run)

f:id:phaendal:20150327062327p:plain

変換候補ウインドウの位置もズレず、インライン入力できた。ただ今気づいたんだけど、選択してそのまま入力したときの挙動がおかしい。選択範囲が消えずに残ったまま入力される。まあ確定したら消えるからいいんだけど。。

Ltkも良かったけど、こっちのほうが日本語入力安定感あって、見た目もGTK2で好みだ。

gobjectが謎なので公式?チュートリアルとかで調べてみよう。

cffi-clutter

Ramarren/cffi-clutter · GitHub

Clutterってなんだ?調べたら、OpenGL上に構築されたGUIライブラリらしい。GLUTみたいなものなのかな。

リッチな外観とOpenGLによる高速アニメーション処理のほか、GTK+にPango、GStreamerやCairoといったGnome関連のライブラリと高い親和性を備え

おおー!

と思ったんだけど、quickloadできず、リポジトリ見ても使い方よくわからない。とりあえずcloneしてquickloadしたけど、結局以下のエラーが出て使えなかった。

/usr/include/glib-2.0/glib/gtypes.h:32:24: fatal error: glibconfig.h: そのようなファイルやディレクトリはありません

gtkの場所がわからないみたいだけど、どこを修正すればいいのかわからず断念。

McCLIM

#:g1: frontpageなどを見るとMcCLIMめちゃ面白そう。

(ql:quickload :McCLIM)

で一発で入った。

letter: [Common Lisp] McCLIM で日本語表示できたのコードを真似て日本語を表示してみる。(in-package :clim-user)が必要なことに気づかずに暫く悩んだ。climの環境の中で何かする、ってイメージなのかな。

(ql:quickload :McCLIM)
(ql:quickload :McCLIM-freetype)

(in-package :clim-user)

(define-application-frame hello-frame ()
  ()
  (:pane (make-pane 'application-pane :display-function #'display-hello ))
  (:geometry :width 400 :height 200))

(defmethod display-hello ((hello-frame hello-frame) stream)
  (format stream "こんにちは"))

(run-frame-top-level (make-application-frame 'hello-frame))

えらくシンプルなコードだ!

f:id:phaendal:20150327072548p:plain

で、日本語入力はquek/mcclim-uim · GitHubを使えばuimから入力できるみたいだけど、fcitxからは無理なのかな。今ちょっと日本語環境いじりたくないので後回しにする。cffiとか理解したらmcclim-fcitxとか書いてみたい。

感想

ほか、CommonQtも良さそうかなと思ったんだけど、C++のコード読めないといけないっぽくて断念。とりあえずcl-gtk2、Ltkを使っておけば良さそうかなという印象。ただどっちも更新が大分前なのが気になる。。

広告を非表示にする