月別アーカイブ: 2011年10月

Update Tips page

そういえば Ubuntu 11.10 で大半のアプリが GTK+ 3 化されてるのに
私の作った Tips ページは gconf のままだった。
Fedora についても後でまとめると書いたまま放置状態ではや半年。
てゆーか本サイトをまったく更新していない…

ということで Tips ページを適当に変更することにした。

そういえば Ubuntu のボタン右寄せはどう変わったのかな?
と思って試したら以前と同じ gconf のまんまじゃねーか!
OS レベルで gconf と gsettings が混在かよ、信じられない…

しかたがないので Fedora の gsettings ページに少し追記してリンクだけにした。
どうでもいいけど gnome-tweak-tool 大人気だね。
dconf-editor の機能限定版でしかないのに何故そんなのを使うんだろう?

Gedit のページに Gedit3 プラグインの作り方を前より詳しく書いたつもり。
けど日本語で検索しても自作した人が増えた気配はまったく無い…
スクショの為に作り直ししてみて気がついたけど __init__() 初期化が有効に切り替えする毎に行われるようになっていた。
作り直してよかった、嘘を書くところだったわい。

ついでに Linux ページだけ HTML5 化!
Linux なら問題ない、Windows だと IE6 の可能性があるのが怖い。
IE6 を抹殺するには XP のサポート終了しか手段が無いのに世間は…

Gedit と Nautilus ページを分離して凄く更新したように見せかける。
そんなこんなで、あまり追記することが無かった。
Fedora 16 が出たらまた何か見つけよう。

以上 Tips ページ更新のお知らせのみでした。

しかし Unity なんて本当に使っている人いるのか?
ランチャの右クリックメニューから多重起動が選択できない、ビックリした。
GNOME 3 なら右クリックメニューでも Ctrl + クリックでも多重起動できるのに。

Alt+F2 でわざわざ Dash が開く、というか Tab キー保管が Alt+F2 からではできないなんてマジで信じられない…
naut まで打ち込んで Tab キーを叩くと nautilus まで保管されるみたいな機能ですよ。
Linux 屋でコレを使わない人なんて絶対にいないと思うのだが…
マウスでもキーボードでも不満、タブレット専用 OS かよみたいな。
Aero も GNOME3 もすぐに慣れたけど Unity には殺意しか感じないよ。

GNOME seed

何を今頃 seed というものを知った。
Ubuntu 11.10 は後で入れないと使えないので Fedora 15 で試す。

Seed – GNOME Live!

gi の動的バインディングは色々な言語から利用できる。
海外を探せば vala とかの方法も見つかる、私は vala をやるつもりはないけど。

Seed Tutorial : Standalone

ようするに JavaScript なので PyGi ベースで考えると
var new 及びセミコロンが増えて JSON でパラメータを書けばいいようだ。

#!/usr/bin/env seed

Gtk = imports.gi.Gtk;
Gtk.init (null, null);

var window = new Gtk.Window();
//window.connect("delete-event", Gtk.main_quit);
window.signal.hide.connect(Gtk.main_quit);

var check = new Gtk.CheckButton({label:"seed check"});
//check.set_property("active", true);
check.active = true;

window.add(check);
window.show_all();

Gtk.main();

シグナルは signal メソッドから辿る、プロパティはドットでアクセス。
プロパティのハイフンはアンダースコアに変換、どの言語も同じだね。
GType でサブクラスが作れコンストラクタも利用できる。
公開メンバは var を使わず this に付加して作成する、なるほど。
GTK+ も Clutter も利用できる。

これなら PyGi と同等に扱えるかも。
ということでダイアログを出してテキストを変更するテストコードを。

#!/usr/bin/env seed

Gtk = imports.gi.Gtk;

SeedWindow = new GType({
    parent: Gtk.Window.type,
    name: "SeedWindow",
    init: function (){
        var messagebox = function(text) {
            var dlg = new Gtk.MessageDialog({buttons:Gtk.ButtonsType.OK_CANCEL});
            dlg.set_title("title");
            dlg.text = "first";
            dlg.secondary_text = text;
            var r = dlg.run();
            dlg.destroy();
            return r;
        };
        var on_clicked = function(widget){
            var res = messagebox("Message Text");
            if (res == Gtk.ResponseType.OK) {
                label.set_text("OK");
            } else {
                label.set_text("Cancel");
            };
        };
        var button = new Gtk.Button({label:"button test"});
        button.signal.clicked.connect(on_clicked);
        var label = new Gtk.Entry();
        var vbox = new Gtk.VBox();
        vbox.pack_start(button);
        vbox.pack_start(label);
        this.add(vbox);
        this.signal.hide.connect(Gtk.main_quit);
        this.show_all();
    }
});

Gtk.init (null, null);
var w = new SeedWindow();
Gtk.main();

Gtk.MessageDialog のパラメータが buttons しか適用されない…
parent や flags とかはガン無視される、なんだかよく解らない。
造り込みが甘いのか、それとも何か特殊な指定方法が必要なのか?
まあもっと情報が出ないと普段利用にはまだチト厳しいかな。

とにかく seed は JavaScript が大好きでかつ Python の文法に「なんじゃこりゃ!」とか「self いらないだろ?」とか「唖然…」とかつぶやくような Python が嫌いで嫌いでしかたがない人にはもってこいかもしれません。

私は var と new とセミコロンと中括弧が面倒くさいですw

GtkFontChooserDialog

Ubuntu 11.10 で Gedit のフォント選択が変わっていた。
というか思いっきり文字化けしているので調べてみた。

GNOME 3.2 リリースノート

GtkFontChooserDialog という新規ウイジェットを使っているみたいね。
それならばチト Python で作ってみよう。
gi の動的バインディングは pygtk 時のようにプロジェクトの方々が静的バインドしてくれるのを待たなくても即利用できるようになったのが嬉しいね。

GtkFontChooserDialog

単なる GtkDialog のサブクラスのようだ。
ならば run() destroy() で利用できるはず。
てゆーか専用メソッドもプロパティも無いのではどうやって得るのだ?
多分ドキュメント化の遅れだろうけど。

GtkFontChooser

dir() で漁るとどうやら GtkFontChooser の関数がダイアログに直接利用できるようだ。
それならばこうしてみよう。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk

dlg = Gtk.FontChooserDialog("GTK+ 3.2 new Dlg")
if dlg.run() == Gtk.ResponseType.OK:
    print dlg.get_font()
    print dlg.get_font_size() / 1024
dlg.destroy()

で、選択した font の名前とサイズが表示できる。
というか Gedit の文字化けとまったく同じになるじゃん!

とはいえ、こんな使い方をする人はいないだろう。
以下は GtkEntry の Font を選択して変更するサンプル。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, Gio

class Win(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title("font test")
        entry = Gtk.Entry()
        entry.set_text("homurachan")
        button = Gtk.Button("Select Font")
        button.connect("clicked", self.on_clicked, entry)
        vbox = Gtk.VBox()
        vbox.pack_start(button, False, False, 0)
        vbox.pack_start(entry, False, False, 0)
        self.add(vbox)
        self.show_all()

    def on_clicked(self, widget, entry):
        dlg = Gtk.FontChooserDialog("Select Font")
        if dlg.run() == Gtk.ResponseType.OK:
            desc = dlg.get_font_desc()
            entry.modify_font(desc)
        dlg.destroy()

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="apps.test.font",
                flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, data=None):
        w = Win()
        w.set_application(self)
    
if __name__ == "__main__":
    app = App()
    app.run(None)

とりあえず fedora 16 ではアルファベットになっていることを祈る。
どこで設定しているのだろう。

しかし Unity 2D で使っているせいかもしれないけど…
Gedit にファイルドロップすると落ちるんだが…
他に外部ツール設定で範囲の languages を指定しようと思ってもポップアップがスクロールできないし、dconf-editor で gedit の smart-home-end の設定をしようとすると説明欄が最大化して何も見えなくなるし…
これではまったく使い物にならない、不具合が多すぎる。

Ubuntu 11.10 Python GTK+3

まったく気がつかない間に Ubuntu 11.10 が出ていた。
IT 系サイトも見ていたはずなんだけど…
一時期の盛り上がりは何だったんだ…

とにかく 11.10 は GTK+3 が使えるようになったかチェックだ。

日本語 Remix は今回も 32bit 版のみ、ガッカリだよ。
インストール方法は CD を入れればバカでも解るので解説はいらない。

Fedora 15 同様にアップデートではパスワード要求されなくなったみたい。
他、使用感とかは他サイトにまかせるとして。
以下は pygi 等のプログラミング関連。

やはり Nautilus や Gedit の GNOME アプリは GTK+3 になっている。
まず Python で GTK+3 や Clutter が利用できるかチェックする。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Clutter

gi で Gtk3 を指定しても例外にならない、よし GTK+3 は使える。
というかデフォルトが 3.0 側になるので GTK+2 の場合は 2.0 を指定。
Clutter は使えない、3D 機能は compiz なのだから当然かもね。

まてよ?
GTK+3 化したのにテーマが変わっていないということは…

for PyGtk (GTK+2)

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk

class Win(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.set_title("Gtk2")
        button = gtk.CheckButton("GTK+2 GtkCheckButton")
        button.set_property("active", True)
        self.add(button)
        self.connect("delete-event", gtk.main_quit)
        self.show_all()
    
if __name__ == "__main__":
    Win()
    gtk.main()

for PyGi (Gtk+3)

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk

class Win(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title("Gtk3")
        button = Gtk.CheckButton("GTK+3 GtkCheckButton")
        button.set_property("active", True)
        self.add(button)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()
    
if __name__ == "__main__":
    Win()
    Gtk.main()

やっぱり見た目は同じになるようだ。
これではいったいどのアプリケーションが GTK+3 化されたのか解り辛い。

しかも GTK+2 だとテーマエンジンが無いと WARNING が出るし。
アップグレードなら GTK+2 テーマエンジンは残ると思うけど。
つまり Firefox も GTK+2 なので WARNING が echo されると…

Fedora から半年遅れで GTK+3 を投入したのにコレだよ。
相変わらず Ubuntu はツメが甘いままリリースするようだ。

とにかく python から GTK+3 が使えるのは解った。
もう少し細かいことに気がついたら後日追記します。

HTML5 Dynamic Select

HTML5 で SeeMe(Opera serch.ini 編集アプリ) を作りたい。

Opera 使いは全員最新版を使うのでバージョンを気にする必要が無い。
ぶっちゃけ Opera にだけ対応させればいいので面倒が無い、素晴らしい。
まさに HTML5 で作るにはうってつけではないか!

というのは建前で…
Windows をまったく使っていないので Windows 版を作りたくないから。
HTML5 なら Linux で作ってツジツマを合わせればいいだけだもの。

後々で更新が面倒くさいからセクション丸ごと textarea に書き出すだけにでも…
それはどうでもよくて。

とりあえず ListBox みたいなのを作るには <select> タグでいいようだ。
コレを動的に作成して順番の入れ替えなんかの処理を入れればイケる。

Select in HTML 5
Dynamic Select in HTML with Ajax

何故か動的な JavaScript 編集コードはフランスで見つける。
日本の HTML5 解説サイトって何故かみんな似たようなのばかりでこういうのが見つからない、探し方が悪いのだろうけど英語で探したほうが早いのはたしか。
どうでもいいがドイツからコメントスパムが来るようになったぞ。

とにかく SeeMe に必要な新規作成、上下移動、削除のテストコード。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SeeMe for HTML5</title>

<style>
#id_name { float: left; }
#id_edit { float: left; }
</style>

<script>
function on_up(listbox) {
    var i = listbox.selectedIndex;
    if (i > 0) {
        var str = listbox.options[i].text;
        listbox.options[i].text = listbox.options[i-1].text;
        listbox.options[i-1].text = str;
        listbox.selectedIndex = listbox.selectedIndex - 1;
    }
}
function on_down(listbox) {
    var i = listbox.selectedIndex;
    var len = listbox.length;
    if (i < len-1) {
        var str = listbox.options[i].text;
        listbox.options[i].text = listbox.options[i+1].text;
        listbox.options[i+1].text = str;
        listbox.selectedIndex = listbox.selectedIndex + 1;
    }
}
function on_new(listbox) {
    var len = listbox.length;
    listbox[len] = new Option("new!");
    listbox.size = len + 1;
    listbox.selectedIndex = len;
}
function on_delete(listbox) {
    var i = listbox.selectedIndex;
    if (i == -1) return;
    listbox.options[i] = null;
    listbox.size = listbox.size - 1;
    var len = listbox.length;
    if (len == 0) {
        return;
    }
    else if (i == len) {
        listbox.selectedIndex = i-1;
    }
    else {
        listbox.selectedIndex = i;
    }
}
function on_select(form) {
    var i = form.listbox.selectedIndex;
    form.edit1.value = form.listbox.options[i].text;
    form.message1.value = form.listbox.options[i].text;
}
function init() {
    var listbox = document.getElementById("id_select");
    for (var i=0; i<10; i++) {
        listbox[i] = new Option("Item" + i);
    }
    listbox.size = 10;
}
</script>

</head>

<body onLoad="init()">


<form>
<div>
<input type="button" value="up" onclick="on_up(this.form.listbox)">
<input type="button" value="down" onclick="on_down(this.form.listbox)">
<input type="button" value="new item" onclick="on_new(this.form.listbox)">
<input type="button" value="delete item" onclick="on_delete(this.form.listbox)">
</div>
<div id="id_name">
<select id="id_select" name="listbox" onchange="on_select(this.form)"></select>
</div>
<div id="id_edit">
<input type="text" name="edit1" size=20><br />
<textarea name="message1" rows="6" cols="60px"></textarea>
</div>
</form>

</body>
</html>

問題なく移動な削除ができるようだ。
ということで早速こんな感じにしようと作っていた。
ユーザー名と OS さえ解れば ini のパスは解るからと思ったけど…

File オブジェクトはパスや URI の文字列からは作成できないんだね。
間に PHP あたりを噛ませてなんとかするしか無いかな…
挫折したらごめん、多分もう Windows 版は更新しない。