Mandriva 2010.1 Spring Beta

気がついたらもう四月後半、半年毎に Linux の新版がワンサカ出る季節である。
Mandriva One 2010.0 GNOME で何一つ不満が無いので見送りも考えているけど一応調べる。
クリアールックスにミストアイコン、更に VL ゴシックにして Fedora 臭い見た目だけど。

DistroWatch.com: Put the fun back into computing. Use Linux, BSD.

あらら、次の mandriva は 6/3 とチト遠いのですね。
ならばベータを VirtualBox で試してみよう、今回も One の GNOME 版を。

ftp://ftp.kddlabs.co.jp/Linux/distributions/Mandrake/devel/iso/2010.1/beta1/

から mandriva-linux-one-2010-spring-beta1-GNOME-africa-asia-cdrom-i586.iso をば。
md5sum –check コマンドも成功、仮想 HDD を作ってライブ CD を iso から起動。

あれ、one africa-asia を選んだのに Japanese が選択肢に無いぞ?
とりあえずデフォルトの英語を選んで進めてみる。
タイムゾーンは Asia 内に Tokyo が、キーボード選択には japanesee106 があったけど。

やっぱり Japanese は無い、入れ忘れなのかそれとも完全に見限られたのか…
ベータなせいか壁紙やテーマが 2010.0 と同じで変な気分。
Live CD 状態では追加もできないし、とりあえず細かいところを見てみよう。

やはり今回も Guest Additional は最初から適用済み状態で Live CD を起動できる。
Flash も入っているのでそのまま YouTube 観覧可能である。
このプロプライエタリ・ソフトウエアにも柔軟な姿勢は他の Linux もやってほしい。
だって結局デスクトップ用途ではみんな入れるんだもの。

日本語入力できないけど SCIM の設定があった、iBus にはしないのかな?
Font には UmePlus がしっかりあった、VL ゴシックは無いです。
Ubuntu はデフォルト状態では Gimp を外すとか見かけたけどコイツはしっかりある。
gnome-screenshot のアイコンがカッチョよくなっているけど得に変わっていないっぽい。

というか標準搭載アプリは 2010.0 と同じ。
というより KDE メインのディストリビューションだし、正式版では解らないけど。

Python が 2.6.5 に、mono が 2.6.3 に、まぁ mono は今となってはどうでもいい。
Python 依存度が低い部類のディストリなんだから 3.0 系でも…企業ユーザーが困るか。

Epiphany 2.30.0 の WebKit が普通に使える、仮想環境での試用だから何ともいえないが。
私の現環境の 2.28.1 では起動するだけで OS が不安定になる、ATI と相性が悪いのだろうか。

Nautilus のデフォルトディレクトリには Fedora 等と同じくアイコンが付くように。
GNOME の仕様なのかな?何にせよ解りやすくなったのは嬉しい。
デザインも Ubuntu の「何故こんなにダサいの…」なアイコンとは違い大人しめでイイ。
それでもウザいなら user-dirs.dirs で全部無効にすればいいだけだ。

他、Nautilus は F3 キーでもう一つペインが出せるようになった、タブより使いやすい。
しかし一覧とアイコン表示切り替えがツールバーに移動してしまった。
ツールバー非表示で使いたいのに、他に場所バーが直接入力できなくなっていたり。
新機能は嬉しいけどバー追加の結果としてこれらが犠牲になった感じ。

チビッと使ってみて気がついたのはこんなところ。
とにかくデフォルト状態は 2010.0 とあまり代わり映えしない、個々が地味に更新されただけ。

ものは試しとインストールしてそのままアップデートしてみたら日本語 local が。

africa-asia を選ぶ意味無いジャン!
と思ったけど /etc/sysconfig/i18n 編集して再起動しても適用できん…
つか、ということは最初からあったのに適用されないってことなのかな?
次版は Ubuntu を選ぶほうが正解なんだろうけど、あの超ダサいアイコンがなぁ…

続く、かも。

gtk.Widget.allocation.height

4/18 に gtk.Widget.allocation.height が表示後でないと取得できないと書いた。
で、フルスクリーンコントローラを一旦表示するまで 50px という仮に値を入れてごまかした。

いや、よく考えたらフルスクリーンコントローラ自体のサイズを得る必要は無かった。
フルスクリーンにする前に既に toolbox, statusbar は表示されているのだから。

ということでやってみたら縦サイズが 1 に、あれ?
そうか、parent 変更すると property が消えて非表示扱いになるんだった。

ということはオブジェクト作成側で調べてパラメータで渡す…
のコードを一度書いてみたけれど何故か気に入らない、なるべくパーツ側で処理したい。
もっと上手い方法は…と考えてみたらこうすりゃいいじゃんと思いついた。

class CFullCtrl(gtk.Window):
    """
        Full Screen Controrer
    """
    def __init__(self, parent, box, parent2, bar):
        """
            GtkWindow at GTK_WINDOW_POPUP
        """
        gtk.Window.__init__(self, gtk.WINDOW_POPUP)
        # memory pointer
        self.p1 = parent
        self.p2 = parent2
        self.box = box
        self.bar = bar
        # Get Desktop Window Geometry
        root = gtk.gdk.get_default_root_window()
        x, y, w, h, d = root.get_geometry()
        # move and resize
        self.set_size_request(w, -1)
        self.y_pos = h - box.allocation.height - bar.allocation.height
        self.move(0, self.y_pos)
        # Change parent
        vbox = gtk.VBox()
        self.box.reparent(vbox)
        self.bar.reparent(vbox)
        vbox.show_all()
        self.add(vbox)
        self.connect("destroy", self.on_destroy)

    def on_destroy(self, widget, event=None):
        """
            Return Parent
        """
        self.box.reparent(self.p1)
        self.p1.set_child_packing(self.box, False, True, 0, gtk.PACK_END)
        self.bar.reparent(self.p2)
        self.p2.set_child_packing(self.bar, False, False, 0, gtk.PACK_START)
        return True

そうだよ、parent 変更する前に値を調べておけばいいじゃないの。
後はフルスクリーン切り替え時に作成や削除をやればつじつまが合うじゃないか。

def change_fullscreen(self):
    if self.fullscreen:
        self.fullscreen = False
        self.w.window.unfullscreen()
        self.w.unfullscreen()
        self.fullobj.destroy()
        self.fullobj = None
        self.w.resize(self.fullsize[0], self.fullsize[1])
    else:
        self.fullscreen = True
        cx, cy = self.w.get_size()
        self.fullsize[0] = cx
        self.fullsize[1] = cy
        self.fullobj = CFullCtrl(
                self.hbox_ctrl,
                self.toolbox,
                self.vbox_main,
                self.statusbar
            )
        self.w.fullscreen()
        self.w.window.fullscreen()

こんな感じの関数を作ればいいしパラメータも増やさずにすんだ。
しかしよく考えたらパーツ作成のパラメータは本体ポインタのみでいいような気がしてきた。
アトリビュートやメンバ関数はそのポインタから得ることができるのだから。

class CStatusBar(gtk.VBox):
    def __init__(self, owner, arg):
        self._win = owner.w
        self._owner = owner
        gtk.VBox.__init__(self)

みたいな感じで、後は self._owner 経由で本体 class のメンバを参照できる。
というか本体のコードをなるべく少なくしたいのですよ、後々のメンテナンスを考えると。
ラムダ式とかは数学系の人は好んで使うようだけどメンテが多いアプリでは怖くて使えませんわ。
ちなみに Windows 用の Y901 最終版は本体コードだけで九千行、この手では短いほうだ。

他、再生停止でマウスカーソルを表示させるのを忘れていた。
ということで Y901x-0.2.5 公開、作った本人以外に使っている人がいるかどうか知らない。

gtk.gdk.Display.get_pointer

Y901x-0.2.3 は大失敗だった。

motion-notify-event で処理しているから VideoArea 領域を外れたら認識しない。
つまり 16:9 の動画を 16:10 ディスプレイで表示した場合とかでは下に黒帯が出る。
その黒帯部分では領域外なので motion を認識なんてするはずがない。
つまりフルスクリーンでのコントローラは出ないわけだ。

んー Cinema では WM_MOUSEMOVE で計算してやっていたんだけどなぁ。
GTK+ ではレイアウタなので超ややこしいし、WindowsAPI の GetCapture みたく…
ってソレどうやるの?面倒なので Timer で処理するようにしよう。

# GetCursolPos
a, x, y, b = gtk.gdk.display_get_default().get_pointer()

で x と y にスクリーン座標で現在のマウスカーソル位置が取得できるようだ。
a は gtk.gdk.Screen、b は Shift や Ctrl の Mask、ここでは使わないのでダミー。
この値を元に処理したらとりあえずディスプレイより横長動画でも処理できた。

せっかくタイマー処理でマウスカーソル位置を取得しているんだからカーソル消去も。
只の Y901 からの伝統で通常時でも画面上は静止状態マウスカーソルを一秒後に消す。
っっって、GTK+ で WindowsAPI の ShowCursor(FALSE); ってどうするの?

gtk.gdk.Cursor

の下のほうに普通に書いていた、つまり自分で作らないといけないんだね。
これが解れば処理方法自体は同じなので Python コードにて書き換えるだけだ。
ということで細かい処理は Y901x のコードを見てもらうとして簡単に。

class Y901window(dbus.service.Object):
    def __init__(self, bus_name):
        # ...
        self.mousepoint = [0, 0]
        self.invisiblecount = 0;
        # Create invisible cursor
        pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
        color = gtk.gdk.Color()
        self.noncursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)

省略しすぎかな、とにかくタイマーで

    def on_timer(self):
        # ...
        # GetCursolPos
        a, x, y, b = gtk.gdk.display_get_default().get_pointer()
        # FullScreen at Controler
        if self.fullobj:
            if self.fullobj.y_pos < y:
                self.fullobj.show_all()
            else:
                self.fullobj.hide()
        # Cursor Auto Invisible
        if self.mousepoint[0] == x and self.mousepoint[1] == y:
            if self.invisiblecount < 5:
                self.invisiblecount += 1
            else:
                self.video_window.window.set_cursor(self.noncursor)
        else:
            self.invisiblecount = 0;
            self.mousepoint[0] = x
            self.mousepoint[1] = y
            self.video_window.window.set_cursor(None)
        # return True is Repeat
        return self.is_playing

と時間表示とフルスクリーンコントローラとカーソル消去を全部やってみた。
とりあえずこれでつじつまが合っている、かなり Windows 用 Y901(Cinema) を再現できた。
ということで Y901x-0.2.4 公開しました。
やっぱり全然人増えねぇ、Windows 用のようにいかないわな。

gtk.Widget.reparent

いいかげんに Y901x もフルスクリーンでコントローラを出すようにしよう。

方法は色々あるんだが、一番簡単なのは show() hide() だけで済ませる方法。
しかしこれではムービー画面が拡大縮小されてみったくない。
WMP12 や Cinema のように浮き上がらせて表示させる、の方法は解らない…

オーソドックスに下からヒョッコリ出てくる方法にでもとりあえずやっとこう。
これも方法が沢山あるけど別ウインドウを作って被せるのが一番簡単だろう。

とりあえずコントローラ用の gtk.Window を gtk.WINDOW_POPUP 指定で作成。
gtk.Widget の reparent() メソッドで parent の gtk.Box をコッチに変更。
unparent() set_parent() を使うとうまくいかなかった、つか実態が消滅するんだが。

parent を変更すると property が消える、パッキング情報は Box 側が持つんだから当然か。
.NET Framework の WPF なら子オブジェクト側が持っているんだよね、色々あってややこしい。
なので set_child_packing メソッドでパッキング情報を追加するのを忘れずにと。

んでディスプレイサイズを取得して…ってどうやるのだ?

ぱぇぽぃ2 ? Blog Archive ? デスクトッププロパティ

なんだ、自分でやっていたや。
でも Python の勉強を始めたばかりな頃にやったことなんで効率悪すぎる。
wnck を使えば簡単だけど KDE 対応でまた…
ということで、何か他の方法は無いか探したら恐るべきコードを発見。

pygtkだけ でスクリーンショットをとる

何コレ、たったこれだけ(八行)で本当に全画面スクリーンショットアプリが完成!
PyGtk 恐るべし、gnome-screenshot が強力すぎて自分で作ろうとは思わないけど。

つーか画面サイズを調べるのって get_geometry() メソッドを呼ぶだけだったのか。
やはり知識が無いと無駄なコードを書くことを自分で証明した。

とにかくコレでディスプレイサイズがゲットできたので作ってしまえだ。
表示後でないと gtk.Widget.allocation.height が取れないのをどうするか悩む。

ごまかしたらイマイチなコードになっちゃった、けど開発途中なんだからいいや。
後マウスカーソルを消す処理もいれたいけど出したいからこのまんま出してしまえ(ぉい!
具体的なコードは Y901x の common.py の CFullCtrl class を見てくれ。
更新毎に少しずつマトモなコードになる、多分。

ということで Y901x-0.2.3 を公開しました、本サイトからぞうぞ。
listbox 表示状態を記憶せず毎回表示していたのも修正した、今まで何故気がつかない…

だから Linux 用を作ったところで全然金にも人気にもならないなんて解っているよ。
いいじゃないか、作りたいんだから。

diary

Event Structures
か。

GDK イベントの取得とリサイズ
の「イベント構造体」リンク先が消えていたので覚書、英語ページになっちゃったけど。

本当に Web はケタ外れな勢いで変化している、だから
「今の状態で最新及び未確定な未来以外の情報はいらない」
を凄く遠回しで形にしたツイッなんとかが勢力を伸ばしたのは今考えれば当然だったのかな。
古い考えのままなのに人気に便乗した人達のおかげでなるようになったわけだが。

【2ch】ニュー速クオリティ:Windows 8 コンセプトデスクトップ公開 究極のデスクトップを求めていく

唖然としてくれ、Ubuntu でページ内検索してもまったく引っかからない。
本屋さんのパソコン雑誌コーナーであれだけ勢力を伸ばしておいてさえもこの結果。
メインで linux を使っている人なんて実は全然おらんってことだ。
解っていたけど、画面スクロールしていくと悲しくなるばかり。

GoogleOS って名前が出ているけどココに書き込みしているような人が使う可能性は完全にゼロ。
古い古い Windows とチョッピリ操作性が違うだけで拒否反応をする人しか日本人にはいないんだよ。
Mac でさえ興味だけ、Mandriva なんて次回は日本語用ローカライズさえ怪しいかも…

 * 上下矢印キー(ボリューム調節等)でフォーカスが移らないように
 * 何も再生されていない状態の選択ディレクトリを glib.USER_DIRECTORY_VIDEOS に

をついさっき Y901x でやったけどコレだけで更新もアレだなぁ…
公開するかどうかも怪しい Y901w との整合性もあるし、コッチは Aero 全開でいきたいし。
でなければ新しいアプリなんて作る意味すらない、古い OS 用なら古いアプリを使えばいいだけだ。
作る側と使う側のギャップは埋まるどころか開くばかり、個人オンラインソフトが廃れたのも当然か。

どうでもいいが、在日(チョンじゃない)外国人の iPhone 普及率に最近気がついてビビった。
そういえばガラケーというよりケータイサイトって日本語しか無いんだよね、そりゃ当然なのか。
日本独自なケータイ文化が廃れるのも時間の問題か、今は何をやればいいか全然ワカンネ。