Fedora」タグアーカイブ

TenKey

先日 Y901x を +,- キーで再生速度変更できるようにした。
まてよ、テンキーの +,- キーの存在を忘れていた!

だってオイラの RealForce にはテンキーが無いモン。
それに英語配列だと丁度いい位置に +,-,= キーがあるので私自身はコレでいい。
けど一応公開アプリなんだよな。

日本語配列だと絶対に + が押しにくいと思うし。
「テンキーも使える」にしておけば大半の人が問題無いだろう。
等速に戻す = キーの代わりはテンキーの Enter で代用かな。

更にメディアキーなんつーものも存在するのを今頃気がつく。
昔使っていたテンキーとメディアキーの付いている日本語配列キーボードを引っ張り出して実験と対応処理をすることにした。

テンキー超邪魔、スペースキーちっさ、いらないキー多すぎ!
せめてテンキーは左側に付けてくれと、マウス置き場に困る。
最近のノートパソコンとか何を考えて無理やりテンキーを載せているの?
ついでに記号を間違えまくる、慣れって怖い。

とにかく xev を使ってテンキーの割り当てを調べる。

gtk.keysyms.KP_Add
gtk.keysyms.KP_Subtract
gtk.keysyms.KP_Enter

なのね、コレさえ解れば処理は簡単。
KP_Plus とかが gtkkeysyms で見つからなかったけどこんな名前なのね。
NumLock off でもコレらのキーコードは同じだと今頃知った。

次はメディアキー。
だが、xev で確認できない。

totem のソースを見る。
totem-media-player-keys.c を見ると DBus を使っている。
DBus って 0.3.3 の時にマルチスレッド処理に影響が出たので外したんだが…
できれば避けたい。

というか今頃気がついたけど Rhythmbox や Totem はアクティブでない場合でもメディアキーに反応するのね。
BGM を流した状態で作業を行っている最中に再生アプリをアクティブ化せずとも Play/Pause や次を再生にできるということ。
Global Hotkey というみたい。

検索してみるとこのキーを使っている人って結構多いのね。
WinAmp とか有名どころは上記動作ができたらしい。
パソコンで音楽なんて聴かないから知らなかったよ。
というか音楽自体を全然聴かなくなったような…

つか動画では無意味な機能だ。
バックグラウンドムービーなんて相当痛々しい奴しかやらネェってば。

よし、Y901x では無視しようw
ということで変更はソレだけなのだけど 0.3.9 の公開。

それよりキーボードのストレスが凄い、RealForce に戻す。

とはいえ Global Hotkey というのは少し興味ある。
常駐している秀丸をホットキーで呼び出すみたいな動作を Linux でやりたいとか思う時があるかもしれない。
GNOME なら Alt+F2 を使えで終わるけどさ。
「gnome-ter」まで打ち込んで Tab キーを叩くとあら不思議みたいな。
…やっぱりいらないな。

but_active 3.0.1

意表を突いて Gedit Plugin を更新しました。

Gedit が 3.4 になって but_active が使えなくなったのは知っていた。
我ながら不便だけど多分バグでそのうち Gedit 側が対応すると思い放置。
しかしいつまでたっても…

もう仕様変更だとしか思えない、3.4 のソースをダウンロード。
gedit

3.4 には NotebookPopup 定義が無いジャン!
ソース側に移動したのかと思い grep コマンド。
関数名は見つかるけどメニュー用の定義はやっぱり無い。

gedit-notebook-popup-menu.c を見ると都度作成になっている。
マジで仕様変更だった、あーあ作り直ししなきゃ。
てゆーかもっと早く気がつけよ俺!

ドキュメントメニューに入れるように変更、他はそのまんま。
で普通に動くようになった、入らないなら例外を吐いてくれよ…

けどメニューがこの位置では使いにくいお。
ええい、キーボードショートカットを使えにしてしまえ。
Shift+Ctrl+Alt+W しか選べないな、まあいいや。
ダウンロードとスクリーンショットは以下に。

Gedit 及び Eye of Gnome プラグイン

今度から動かなくなったら早めに調べよう。
そういえば Eye of GNOME 3 のプラグインは使えるようになったかな?
使えるようならそろそろ GNOME3 対応版を作りたいな、今度調べる。

WebM binary

意表を突いて Y901x を更新しました。
PyGtk のままだよ、当然 GTK2 だよ、もう古いよ過去の異物だよ。
とはいえ Google Chrome なんかも GTK2 だったりするのだが。

とりあえず再生速度変更の方法を何故か見つけたのでやってみようと。
Basic tutorial 13: Playback speed – GStreamer SDK documentation – GStreamer SDK documentation

一番目引数に 1.0 をデフォルト値に上下した float 値を入れた seek_event を作る、それを playbin2 に投げただけでアッサリ。
ただ再生停止したりファイルを切り替えするとリセットされて困った。
GST_MESSAGE_STATE_CHANGED で都度投げる方法でなんとかした。
こんなんで大丈夫かな…

ボタンを付けたかったけどスペースが無いのよね。
VLC とかみたく小さくしたくてもできないウインドウでは嫌だもの。

それと気になっていたけど放置していたところをまとめて。
Linux アプリ作りは本当にイイなぁ。
どうせ自分しか使っていないだろうから好き勝手にできるし。

VLC と違って音程は過去の遺物である Y901 同様変化する。
つか私は変化したほうが自然だと思うんだけど。
ま、これで YouTube から拾ったけど早すぎてどうやっているのかが全然解らなかったバイクのスゴテク動画をスローでじっくり検証できるようになったぞと。
倍速側なんてオマケだ、どんな場合の時に使うかワカラン。

しかーし

YouTube は最近 Flash, MPEG-4 AVC から HTML5, WebM になったのね。
これはキャッシュからコピーするスクリプトを作り替えしなければ。
というわけで今まで使っていた Nautilus スクリプトを改造した。

のだが…

YouTube の動画はいつのまにかキャッシュに残らなくなっている。
検索してゲゲッ、最近拾ってなかったので気がつかなかった…
FLASH のままな Opera キャッシュでも拾えない、お手上げだ!
あきらめて拡張を使おう、個人製作のバイク動画くらい拾わせてくれよ。

使えないけどせっかくやったので Python 覚書。

ちなみに Fedora 17 でファイルの拡張子が無い場合は
/usr/share/magic (/usr/share/misc/magic へのリンク)
の指定で見分けている、一応拡張子優先であるが。

とにかく /usr/share/magic を Gedit で開いてみる。
「エンコードが不明!」とか出るけど無視して「強制的に編集する」ボタンをば。
Ctrl+F で webm と打ち込み検索する、強制編集状態でも探せるよ。

WebM って Matroska のサブセットなんだ、今頃知った。
てか日本ではネクラでキモチワルイ奴しか今まで縁がなかったでしょコレ。
ftypwebm なんて指定で MP4 じゃダメだったのかな?

Linux の場合リポジトリからまとめてコーダーとデコーダー(あえてコーデックとは書かない)を入れられるからあんまり気にしないのよね。
MOV, RM, WebM なんかも普通に Nautilus でサムネイルできるし。
私の知る限り GStreamer で再生できないのは WMV3 だけだ。

それはどうでもよくて。

0x4282 が含まれている否かで通常 Matroska と見分けているみたい。
ま、実質先頭バイナリ4つだけ見れば動画であることは解るわな。

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

TEST_FILE = "test.webm"
WEBM = "\x1a\x45\xdf\xa3"

for a in WEBM:
    print ord(a),

print "\n-----"

o = open(TEST_FILE, "rb")
bin_array = o.read(4)
for a in bin_array:
    print ord(a),
o.close()

print "\n-----"

print bin_array == WEBM

この方法で拡張子が無くても先頭バイナリで判別が可能になる。
使い道は無かったけど、きっといつかは勉強して良かったになるはず!

実は Gio を使ったほうが簡単なんだけどね。
拡張子を取っ払ってこんなコードを試せば解るよ。

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

from gi.repository import Gio

# Create GLocalFile
# Remove File Extenshon
f = Gio.file_new_for_path("test")
# Create GFileInfo
info = f.query_info(
    Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
    Gio.FileQueryInfoFlags.NONE,
    None )

print info.get_content_type() == "video/webm"

実は Python コードを書くのも久々だったり。
とにかく半年以上間が開いたけどアプリの更新。
年金を貰える歳まで絶対に生き残ってやる!

ApplicationMenu

プログラミング関係は次回!
と書いてから一ヶ月も放置してしまった…

とはいえ何もやっていなかったわけではなく
GNOME 3.4 リリースノート
の「アプリケーションメニュー」を PyGI でやろうと四苦八苦していた。

なんか Linux も Windows もメニューバーを無くそうと試行錯誤しているね。
そりゃまあキーボードとマウスからタッチパネルに絶賛変革中だからだろうけど。
Windows がリボンを作った時はナンジャコリャだったけど先を見ていたと今なら解る。

C のサンプルコードは公式の以下にあるのだが
GtkApplication
GtkApplicationWindow
GActionMap

GtkActionEntry はシーケンス(つまりリスト)でよかったが
GActionEntry は上手く行かなかった。
こんな感じでイケると思ったけどシーケンスでは Gio.ActionEntry ではないと例外になる。

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

from gi.repository import Gtk, Gio

menu_xml = """
<interface>
    <menu id='app-menu'>
        <section>
            <item>
                <attribute name='label' translatable='yes'>_MessageBox</attribute>
                <attribute name='action'>app.messagebox</attribute>
                <attribute name='accel'>&lt;Primary&gt;m</attribute>
            </item>
            <item>
                <attribute name='label' translatable='yes'>_Quit</attribute>
                <attribute name='action'>app.quit</attribute>
                <attribute name='accel'>&lt;Primary&gt;q</attribute>
            </item>
        </section>
    </menu>
</interface>"""

class Win(Gtk.ApplicationWindow):
    def __init__(self, app):
        Gtk.Window.__init__(self)
        self.set_application(app)
        self.show_all()

def on_messagebox(action, parameter, user_data):
    dlg = Gtk.MessageDialog(
            None,
            Gtk.DialogFlags.MODAL,
            Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK,
            "text")
    r = dlg.run()  
    dlg.destroy()
    return r

def on_quit(action, parameter, user_data):
    user_data.quit()

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self,
            application_id="apps.test.appmenu",
            flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("startup", self.on_startup)
        self.connect("activate", self.on_activate)

    def on_startup(self, data=None):
        try:
            # GActionEntry [] a Gio.ActionEntry
            aes = [ ("messagebox", on_messagebox, None, None, None),
                    ("quit", on_quit, None, None, None) ]
            ###
            self.add_action_entries(aes, len(aes), self)
            #=> Expected Gio.ActionEntry, but got StructMeta
            ###
            builder = Gtk.Builder()
            builder.add_from_string(menu_xml)
            menubar = builder.get_object("app-menu")
            self.set_app_menu(menubar)
        except Exception, e:
            print e
            self.quit()

    def on_activate(self, data=None):
        w = Win(app)

if __name__ == "__main__":
    app = App()
    app.run(None)

全部 const 指定だしスタック上のデータでないと駄目なのかな?
それだとヒープ上にしか変数を作れない動的言語はお手上げになるんだけど。

海外を探しても PyGI のコードはほとんど見つからない。
現状ではみんな試行錯誤して様子見しているかブン投げているかだろうな。
はたしてこの動的バインディングは熟成して普及するのであろうか?

ええい、今回もとりあえず C 言語でコンパイルだけやってみるか。

Fedora は初期状態では gcc すら入っていない。
gcc, gtk3-devel, gtk3-devel-docs でとりあえず環境は揃う。
ついでに anjuta を導入、vala なんかもオマケで入る。
これらについては気が向いたら何か書く。

c_appmenu.tar.gz

うん、C ならやはり普通にアプリケーションメニューは使える。
それなら DLL にすれば、って動的言語な意味ネェ…
C が一部でも必要ならソースコードのみで配れる C で全部作ったほうが楽。
Python と DLL では最低 x86, x86_64 用の2つを配るはめになるわけで。

ということで当面は C 言語とお付き合いになりそうです。
難しくはないんだけど、ただただ面倒くさいのが難点。

org.gnome.shell.overrides

GNOME Shell について今頃知った。
gsettings コマンドを使ってもいいけど dconf-editor のほうが簡単。

org.gnome.shell.overrides

を開いて

attach-modal-dialogs
を false にすると「情報」等のモーダルダイアログがタイトルバーからニョキッと出るのが普通のダイアログになる。

button-layout
:minimize,maximize,close と書けば Windows と同じボタン配列に。
コロン ‘:’ より左に書けば Ubuntu のような左寄せにもできる。

dinamic-workspaces
を false にすると動的ではない昔ながらな4つのワークスペースに。

edge-tiling
を false にするとタイトルバーを掴んで画面上部に持っていくと最大化するあのムカつく動作を行わず GNOME2 同様なスナップになる。

workspaces-only-on-primary
は多分マルチモニタでなければ関係ない。

デフォルトに戻したい場合は右下ボタンで一発。
いやいや、やはりタイトルバーを掴んでの移動はスナップのほうが使いやすい。