解説ページを作ってみた

gEdit プラグインの作り方解説ページを作ってみた。
トップページ(本サイト)からどうぞ。
しかししばらく Linux でいく宣言した途端に…

それより何故誰もこういうページを作ってくれないんだろう…
てなわけで。

Windows でよく使っていた秀丸マクロは gEdit でまかなえるようになった。
何より Python と PyGtk で書けるというのは嬉しい、勉強した甲斐があった。
秀丸のマクロはヘルプとにらめっこだったからね。

でも動作確認は一旦再起動しなきゃいけないのが面倒。
ここらを柔軟にしてくれると嬉しいけど無理だろうなぁと。
キーボードマクロの記録再生みたいなのは作れるかな?まだ解らない。

後は Shift+Enter で <br /> を打てれば完璧なんだが…

Ctrl+[ で <br />
Ctrl+] で <br /> & 改行

というスニペットを作ってみたけどやはり間違えるや。
まぁこれは慣れの話だ。
とにかく gEdit って結構おもしろい。

SyntaxHighlighter 2.0 は textarea もイケた

SyntaxHighlighter 2.0 に詳しいサイトを見つけた。

SyntaxHighlighter2.0の使い方 – ShanaBrian Official WebSite

textarea のままイケたんだ orz
pre に全書き換えしたあの苦労はいったい…

まぁおかげでいつかやろうと思っていた徹底的な整理が終わったけど。
ヘッダとフッタは require_once で読み込んでソコから又色々読み込んで
てなわけでテンプレートはこんなに小さくなった。

<?php $title = ""; require_once("../_header.php"); ?>

<h2></h2>
<div class="entry">
</div>

<!--
<h2></h2>
<div class="entry">
</div>
<pre class="brush: py"></pre>
-->

<?php require_once("../_footer.php"); ?>

もう Bluefish はいらないや、で削除と。

後 pre 変更するのに困ったのが HTML のエンティティ化。
textarea は < とかはそのまんま書けたけど pre は変換しなきゃ駄目。
コレ C++ でやると泣く、山括弧を使いまくる言語だもの。

しかたがないので一度 Windows にもっていき秀丸のマクロでやったり…
それも面倒なので HTML エスケープの gEdit のプラグインを作ってみた。

HTML エスケープ
少し改造しました、トップページ(上のリンクの本サイトのとこ)からどうぞ。

もう少し試して解説ページを作ります。

IE 糞すぎる!

覚書ページの textarea → pre 化完了!
あーつかれた。

とりあえず SyntaxHighlighter v2 はなかなか良い。
それに pre なので wordpress で使うのも問題が無くなる。
textarea だと編集時に最初の閉じタグ以下が消滅していたもの。

しかし…

C# のコードをまるまる書いたページが IE で見れなくなった!
キチンと XAML も C# コードも pre で囲っているのに何故…
仮想マシンだけかな?もーやだ。

追記

原因判明、単なるオイラのミスだった。
IE って charset 指定をヘッダの一番上に書かないといけないのね…
そうしないとそれ以降の文字コードが解らずに読み込めないってことです。

でも何故か読み込めたページもあるんだよなぁ???
仕様が意味不明だ、やっぱり IE は糞すぎる!

起動している自ウインドウを見つける

多重起動防止でまだ詰まっております。
C 言語での方法はボチボチ見つかるけど Python に書き換えると上手くいかない。

色々調べると wnck なんていうモジュールがあることが解った。

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

import wnck

# デスクトップ取得
w = wnck.screen_get_default()

# ディスプレイサイズ

print "ディスプレイ幅",w.get_width()

print "ディスプレイ高さ",w.get_height()

なんてコトができるというのが解った。
が PyGtk のヘルプにも Python のヘルプにも wnck の項目が見つからない…

GNOME Library – 開発者

Gnome のヘルプ内で Libwnck というのがやっと見つかった。
Opera のページ内検索は便利だね、ドットを押すだけだし。
いや、肝心の検索バーが Linux 版はたまに入力不能になるので…まあこれはいい。
後は man と dir(wnck) と USA Google を使って地味に調べてみた。

PyGTK FAQ Entry

ほーこんなことができるんだ。
ということは

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

import gtk
import wnck

screen = wnck.screen_get_default()

while gtk.events_pending():
    gtk.main_iteration()

for window in screen.get_windows():
    name = window.get_name()
    if name.endswith("Y901x"):
        print "起動しています"
        break

なんてコードで現在 Y901x が起動しているかどうかは確認できるわけだ。
同じ名前が存在していたら困るけどまず無いだろう。
とはいえいつのまにか全然違うコードになるかもしれないんだけど…

とにかく後はウインドウに URI を渡す処理だけだ、もう少し。

デスクトッププロパティ

多重起動防止をどうするか調べていている。
どうやら atom を使う方法があるようだ、ということで

gtk.gdk.atom_intern

とかでググりまくっていたらこんなのを見つけた。

Extended Window Manager Hints

んーということならデスクトップのプロパティは

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

import gtk

# デスクトップ取得
w = gtk.gdk.get_default_root_window()
# 得られるプロパティのリスト取得
p = gtk.gdk.atom_intern("_NET_SUPPORTED")
a = w.property_get(p)[2]
# ループで丸ごと表示
for r in a:
    p = gtk.gdk.atom_intern(r)
    print r
    print w.property_get(p)

とすればどのキーワードでどのプロパティが取れるか全部表示できて解りやすい。
とりあえず出力されるタプルの3番目がリストか文字列になっている。
None でないのを展開、又は文字列ならそのまま表示させれば情報が手に入る。
freedesktop.org だから KDE でも問題無いと思う、試していないけど。

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

import gtk

# デスクトップ取得
w = gtk.gdk.get_default_root_window()

# ディスプレイサイズ
p = gtk.gdk.atom_intern("_NET_DESKTOP_GEOMETRY")
print "ディスプレイ幅",w.property_get(p)[2][0]
print "ディスプレイ高さ",w.property_get(p)[2][1]

# ワークエリア
p = gtk.gdk.atom_intern("_NET_WORKAREA")
area = w.property_get(p)
print "ワークエリア:Left",w.property_get(p)[2][0]
print "ワークエリア:Top",w.property_get(p)[2][1]
print "ワークエリア:Width",w.property_get(p)[2][2]
print "ワークエリア:Height",w.property_get(p)[2][3]

# 仮想デスクトップの数
p = gtk.gdk.atom_intern("_NET_NUMBER_OF_DESKTOPS")
print "仮想デスクトップの数",w.property_get(p)[2][0]

# 現在の仮想デスクトップ位置
p = gtk.gdk.atom_intern("_NET_CURRENT_DESKTOP")
print "現在の仮想デスクトップ位置",w.property_get(p)[2][0]

# 現在の仮想デスクトップ名
p = gtk.gdk.atom_intern("_NET_DESKTOP_NAMES")
print "現在の仮想デスクトップ名",w.property_get(p)[2],"\n"

_NET_CLIENT_LIST で表示されているウインドウ ID
_NET_ACTIVE_WINDOW でアクティブウインドウ ID

が得られるんだがコレを上手く使えないかな?いまココ