Ubuntu」タグアーカイブ

iter_previous @ GTK+ 3 only

seemex を Ubuntu 11.04 で動かすテスト。
あらら色々問題が。
まず前回書いた StyleContext は GTK+ 2 では使えない。

# Toolbar Style
toolbar = self.uimanager.get_widget('/ToolBar')
toolbar.set_style(gtk.ToolbarStyle.ICONS)
try:
    style = toolbar.get_style_context()
    gtk.StyleContext.add_class(style, gtk.STYLE_CLASS_PRIMARY_TOOLBAR)
except Exception, s:
    pass # GTK+ 2

コレでいいや、GNOME 3 に合わせたいだけの処理なのだし。

AboutDialog の get_major_version() メソッドも使えなかった。
MAJOR_VERSION とかの定数はどちらでも使えるからコッチに変更しよう。

更に GtkTreeView 順番を上に移動する iter_previous もダメか。
GtkTreePath には確か prev メソッドがあったよな。

def on_item_up(self, widget, event=None):
    selection = self.custome_treeview.get_selection()
    model, it = selection.get_selected()
    p = model.get_path(it)
    if it:
        path = model.get_path(it)
        if path.prev():
            itprev = model.get_iter(path)
            model.swap(it, itprev)
            self.change()
        """ GTK+ 3
        itprev = it.copy()
        if model.iter_previous(itprev):
            model.swap(it, itprev)
            self.change()"""
    else:
        self.messagebox(MESSAGE_NON_SELECT)

せっかく簡単になったけど GTK+ 2 のままの Ubuntu を考慮しなきゃとは…

しかし Fedora の VirtualBox ose アップデートはまだか。
右 Ctrl+F でもそのまんま XGA サイズだし \ は打てないし辛い。

gi.repository GTK+ Version

Fedora 15 と Ubuntu 11.04 の PyGtk について。

その前に VirtualBox ose 上で Ubuntu を使っているけど \ や | が打てない。
Ubuntu日本語フォーラム / Virtualbox 4.0 で一部のキーが使えない?
VirtualBox ose の Update を待とう…
今回はホストの fedora からクリップボードコピペでなんとかした。

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

from gi.repository import Gtk

message = "「はい」を押すと終了"

while 1:
    dlg = Gtk.MessageDialog(
            None,  
            Gtk.DialogFlags.MODAL,  
            Gtk.MessageType.WARNING, 
            Gtk.ButtonsType.YES_NO,  
            message)  
    r = dlg.run()  
    dlg.destroy()
    if r == Gtk.ResponseType.YES:
        break
    elif r == Gtk.ResponseType.NO:
        message = "それは「いいえ」だろ!"
    elif r == Gtk.ResponseType.DELETE_EVENT:
        message = "閉じるボタンじゃネェ!"
    else:
        message = "不明な動作..."

このコードで Fedora 15, Ubuntu 11.04 のどちらでも動く。
Ubuntu 10.10 以前では例外になる、つか gi から無いわけで。
Fedora のダイアログは「閉じる」ボタンが出ないので右クリックで「閉じる」とやる。

import が変更になり gtk を Gtk に全置換。
以前は定数だったものの大半が enum 名のアトリビュートに変わっている。
それ以外はほとんど同様と思っていいみたい。

つまり Ubuntu 11.04 も GTK3 なのか。
と思ったけどインタラクティブシェル上でコレをやってみる。

from gi.repository import Gtk
Gtk._version

Ubuntu 11.04 の場合はこの形式で書いても GTK2 になるってことなのか。
/usr/lib64/python2.7/site-packages/gi/overrides/Gtk.py
がバージョン違いを振り分けているみたい、とにかくそういうこと。
ソースコードを見てもなんだかよくワカンネェ!

なんにしても早めにこの形式なコードへ書き換えしたほうがいいみたい。
API ドキュメントは既に GTK+ 3.0 になっているのだし。
PyGtk ドキュメントが遅いのはいつものこと。
GNOME 開発センター

ついでに

EyeOfGnome/Plugins – GNOME Live!

このとうりにやっても全然 eog が自作プラグインを認識しない…
~/.local/share/eog/plugins や ~/.local/lib64/eog/plugins
にも試しに置いてみたけど無意味だった。
/usr/lib64/eog/plugins に置くしか無いのだろうか。
ついでに IAge 指定が 2 のままじゃん、Gedit と違ってヤル気が無い感じ。
おかげで自作 eog プラグインの更新ができないよ、まいった。

current-audio property

動画コンテナ(DVD や mp4 等)は音声や映像のトラックを複数格納できる。
主に字幕用途で考えられた構造だろう、と思う…

しかしこの構造を利用して昨今では様々な応用というか実験が進んでいる。
…っぽい、業界全般なんて現場のオッサンに解るはずが無いのだからしょーがない。

確実なのは特定用途限定かつ軽いことだけがウリのプレイヤーにはトドメでしかない。
たとえば私が公開しているプレイヤーアプリとかである。
こんなのってないよ…あんまりだよ…

つまり我が Y901x 0.3.5 はまったく複数トラックメディアに対応していない。
当然開発終了している Windows 用もそうだが開発は終了しているので放置。
DirectShow のコードなんて海外にゴロゴロ転がっているけどシラネ!

実は Totem で指定すれば Y901x にも反映されるのであまり気にしていなかった。
ぶっちゃけ Totem が終了時に X の設定を初期化しないというのを利用しているだけ。
だったけどいいかげんに自分自身が気になるようになってきたのでそろそろ対策しよう。

日本語版 Ubuntu てか GNOME 環境専用アプリで続けるなら別に…
って次で GNOME を排除すると明言している Ubuntu は終わった感が…
GNOME だから選んでいた人は多いと思うんですけど…
私も Fedora 15 待ちで移行は確定だけど Ubuntu 11.04 は全然話題になっていないね…

いつものように長い戯れ言はこのくらいにして。

playbin2

n-audio プロパティでオーディオトラック数。
current-audio プロパティでオーディオトラックの指定。
が可能であるようだ。

Totem のソース bacon-video-widget-gst-0.10.c
にて parse_stream_info 関数がやっていることを参考にしただけなんだが。
C のコードを見て形を変えて Python で使うのは GPL には反していないよね。

映像やテキストのトラック関連もあるけど現状は「シラネ!」でいいだろう。
Y901x 0.3.5 の 1314 行目に以下を追記してみる。

# Audio
asink = self.player.get_property("audio-sink")
if asink:
    self.toolbox.volumebar.set_property("sensitive", True)
    v = self.toolbox.volumeadj.get_value() / 100.0
    self.set_volume(v)
    # 追加
    print self.player.get_property("n-audio")
    # デフォルトは -1 で先頭トラックはゼロ
    self.player.set_property("current-audio", 1)
else:
    self.toolbox.volumebar.set_property("sensitive", False)

なんだ、たったコレだけで 2 番目のオーディオトラックが再生できた。
playbin2 は本当に何でも簡単にやってくれる、頼るのもどうかとは解っているけど。
とにかく私程度のサンデープログラマーなオッサンにはありがたい存在である。

後は切り替えを実際に行うユーザーインターフェイスをどうするかだ。
やっぱりメニュー項目に加えるのが一番迷わない方法だと思うけど。
トラック数を調べて一度選択メニューを全部削除してそれからえっと、実装は面倒くさい…

GNOME 3.0 depends on Mono

4 月、新しい Linux がワンサカ出る季節になった。
ついに GNOME3 が Fedora に正式採用されるようです。

Linux Daily Topics:2011年4月5日 Fedora 15のGNOME 3は慣れるまでに時間がかかるかも─Fedoraアンバサダー|gihyo.jp … 技術評論社

って GTK+ も GTK3 になるのか、そりゃそうだ!
おいらの PyGtk アプリはどうなる、GTK2 のアプリは動くの?
Python も可能ならいいかげん 3 にならないか、2 に依存しすぎて無理かも。

fedora はコレを落としてみたけど完全に作りかけだよ…
独学Linux:Fedora15(Lovelock)の開発版

Ubuntu 11.04 はベータが出ている。
とにかく VirtualBox で動かして解る範囲でチェック。

Ubuntu は基本 GTK2 のままか、正式版で何がどうなるか解らないけど。

Python から PyGtk を使うと Fedora も GTK2 になる。
pygtk.require(‘3.0’)
とやりたくても現状 site-packages に gtk-2.0 ディレクトリしか無い。

そういうわけで Y901x も起動できる。
今までの GTK2 アプリも PyGtk も問題無しということでいいのかな。。

Ubuntu は GtkMenuBar が Mac 風になる、変則配置の Y901x はどうなる?

あれ、メニューがあるはずの部分が少しズレているけど問題無いみたい。
動画の縦ピクセル数も合っている、これなら得に変更する必要は無いかな。
GtkMenuBar.allocation.height がゼロを戻しているのだろうきっと。

とりあえず Ubuntu がこのままなら我がアプリは 11.04 でもイケるようだ。
今まで Ubuntu の更新毎にどこかがおかしくなっていたけど…
何も問題がないってのも逆に面白くないな…

ついでだから 11.04 のデフォルトアプリを見てみる。
OOo が LiberOffice に変わっている。
なんと Tomboy が残っている、今渡こそ Gnote になると思っていた。
Rhythmbox が Banshee に、だから何故 mono 製を選ぶかな…

GNOME3Myths – GNOME Live!

GNOME は mono 依存に戻ったのか。
Fedora にも mono が復活するのだろうか?アルファ版には無いんだが。
つか GTK3 が Gtk# から使えるということなのかな、Python はどうなる?

とにかく Fedora のベータ待ちだ、ディストリ側がどうするか解らないと。
場合によっては Fedora 移行に再挑戦するつもり。

notification area XPM Icon

clipoli の Linux 版作成の続き。

C# ソースコードで配布の Windows 版と同様に変なことがやりたい。
このアプリを使ってもらいたいという理由で作っているわけじゃないのよ。
Windows も Linux も他に何もインストールせずこんなことができる!を伝えたい。
Linux 版はたった一つの Python スクリプトで全部まかなうという方向でいく。

とりあえず通知スペース用アイコンをオリジナルに。
/usr/share/pixmaps に XPM を放り込んで…
をやりたくないのでコードに埋め込む。

Windows から clipoli 用に作ったアイコンを持ってくる。
Gimp で開いて XPM に変換保存、拡張子を xpm で保存するだけの全自動。
XPM ファイルを Gedit で開き Python スクリプトにコピペ。
static char 配列を List に書き換える。

#static char * icon_xpm[] = {
#};
# ↓
icon = [
]

###

tray = gtk.StatusIcon()
xpm = gtk.gdk.pixbuf_new_from_xpm_data(icon)
tray.set_from_pixbuf(xpm)

これだけでオリジナルアイコン処理は完成。

INI ファイル読み込みは下記の lead_lines 関数で。
C# で以前作ったのと比較にならないほど短い!
やっぱり構造体を用意する必要が無いって素晴らしい。

[Launcher]
メモ帳=gedit
端末=gnome-terminal
localhost=xdg-open http://localhost/

[Clipboard]
黒=ほむほむ
赤=あんこ
私ってほんとバカ=こんなの絶対おかしいよ

なんて test.ini を用意して実験。

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import pygtk
pygtk.require("2.0")
import gtk
import os

icon = [
"32 32 3 1",
" 	c None",
".	c #000000",
"+	c #FFFFFF",
"                                ",
"   ............                 ",
"   .++++++++++.                 ",
"   .++++++++++. ......          ",
"   .++++++++++. .++++.          ",
"   .++++++++++. .++++.          ",
"   .++++...+++. .++++.          ",
"   .++++....... .++++.          ",
"   .++++.       .++++.          ",
"   .++++.       .++++.          ",
"   .++++.       .++++. ......   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. ......   ",
"   .++++.       .++++.          ",
"   .++++.       .++++. ......   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++....... .++++. .++++.   ",
"   .++++...+++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   ............ ...... ......   ",
"                                "]

def read_lines(filename):
    if os.path.exists(filename):
        f = open(filename)
        x = f.read()
        f.close()
        lines = x.split("\n")
        section = ""
        for line in lines:
            if line == "": continue
            if line[0] == ";": continue
            if len(line) > 2 and line[0] =="[" and line[-1] == "]":
                section = line[1:-1]
            elif section == "":
                pass # Nothing
            elif "=" in line:
                pos = line.index("=")
                yield (section, line[:pos], line[pos+1:])


class TrayItem(gtk.Menu):
    def __init__( self, trayIcon):
        gtk.Menu.__init__( self)
        self.tray = trayIcon
        # ini
        filename = os.path.join(os.path.dirname(__file__), "test.ini")
        for section, key, value in read_lines(filename):
            m = gtk.MenuItem(key)
            m.set_name(value)
            if section == "Launcher":
                m.connect("activate", self.on_launcher)
            elif section == "Clipboard":
                m.connect("activate", self.on_clipboard)
            self.append(m)
        self.append(gtk.SeparatorMenuItem())
        q = gtk.MenuItem("終了(_X)")
        q.connect("activate", self.on_quit)
        self.append(q)
        self.show_all()

    def on_launcher(self, widget):
        l = widget.get_name()
        os.system("%s &" % l)

    def on_clipboard(self, widget):
        c = gtk.Clipboard()
        c.set_text(widget.get_name())

    def on_quit(self, widget):
        gtk.main_quit()

    def show_menu(self, widget, button, time):
        self.popup( None, None, gtk.status_icon_position_menu, 0, time, self.tray)

    def show_menu_act(self, widget):
        self.popup( None, None, gtk.status_icon_position_menu, 0, 0, self.tray)

if __name__ == '__main__':
    # Create GtkStatusIcon and GtkMenu
    tray = gtk.StatusIcon()
    trayMenu = TrayItem(tray)
    # Icon as XPM data
    xpm = gtk.gdk.pixbuf_new_from_xpm_data(icon)
    tray.set_from_pixbuf(xpm)
    # Left and Right Click
    tray.connect( "popup-menu", trayMenu.show_menu)
    tray.connect( "activate", trayMenu.show_menu_act)
    gtk.main()

それっぽくなってきた。
KDE でも使える、ランチャするアプリは KDE に合わせなきゃいけないけど。
下は Mandriva で試してみた画像。

てかアプリ名はいかに、clipolix と又 x のサフィックス付きにするつもりだが。
SeeMe for Linux も次回から SeeMex にしよう、名前が長くて面倒だし。
てゆーか今の Opera ではあんまり SeeMe の意味が無くなっているんだが…