へなちょこハック [Vine Linux]
普段から狭い画面のノート PC (いまだに1024x768;) を使っているので、ちょっとでも画面を広く使えるように、ウィンドウを最大化した時にウィンドウのタイトルバーを消してパネルに埋め込める、windowapplets (の Window Buttons)アプレットを使っている。
これ結構便利で、実際に画面の上にパネルを表示しているとこんな感じの見た目になる。
(もちろん最大化を解除すると普通の表示に戻る)
ところが、その後にパッケージを作ったドロップダウン式の端末の Guake を、windowsaplets を有効にした状態で使おうとすると、本当なら枠(装飾)が付かないはずなのに付いた状態になるのに気づいた。
最初は「実用上は大して問題無いし、まいっか」と思ってたんだけど、しばらく使ううちにどーしてもこの無駄な枠が気になってたまらなくなってしまったので、なんとかして解消できないかと調べてみることにした。
とりあえず Guake を先に調べてみると、Guake の方は /usr/share/guake にある guake.glade の中で、
と宣言されているので、本来ならウィンドウの枠の装飾は付かないはず。
ということは Guake 側の問題では無く windowapplets 側の問題っぽいので、今度は WindowButtons アプレットを調べてみようと、gnome-window-applets-0.2.7/buttons 以下のファイルをだーっと眺めていると、windowbuttons.c に
という関数が宣言されているのを見つけた。
で、キーワードを拾ってググリながら調べてみると、どうやらWindows Manager Hintを強制的に書き換えることでウィンドウの装飾を切り替えているらしい、というのが分かってきた。
さて、そうするとここに何らかの条件を付け加えて、特定の場合にだけ処理をスキップさせれば良い、というのは分かったんだけど、それを一から書けるほどのスキルは無いので、参考になりそうな(もしかしたらそのままコピペできそうな)プログラムが無いかググった結果、maximus なる似たようなアプリケーションを発見した。
ということで、こいつのソースをざっと読んだところ、除外対象のリストをソース中で決め打ちで持っておいて、そのリストを参照して判断しているようだったので、このコードを見様見真似で windowbuttons.c に持ってきた結果、こんな感じの変更を加えることでようやく希望通りの動作になってくれた。
(ちなみに Vine Linux 向けのパッケージには既に適用済み)
ということで、結果として希望の動作に変更できたので個人的には満足している。
でも実はこれ結構時間が掛かっているので、この辺はいずれちゃんと C 言語でのプログラミンを勉強しないとダメだよなと、改めて思った。
これ結構便利で、実際に画面の上にパネルを表示しているとこんな感じの見た目になる。
(もちろん最大化を解除すると普通の表示に戻る)
ところが、その後にパッケージを作ったドロップダウン式の端末の Guake を、windowsaplets を有効にした状態で使おうとすると、本当なら枠(装飾)が付かないはずなのに付いた状態になるのに気づいた。
最初は「実用上は大して問題無いし、まいっか」と思ってたんだけど、しばらく使ううちにどーしてもこの無駄な枠が気になってたまらなくなってしまったので、なんとかして解消できないかと調べてみることにした。
とりあえず Guake を先に調べてみると、Guake の方は /usr/share/guake にある guake.glade の中で、
<property name="decorated">False</property>
と宣言されているので、本来ならウィンドウの枠の装飾は付かないはず。
ということは Guake 側の問題では無く windowapplets 側の問題っぽいので、今度は WindowButtons アプレットを調べてみようと、gnome-window-applets-0.2.7/buttons 以下のファイルをだーっと眺めていると、windowbuttons.c に
static void set_decorations(WnckWindow *window, gboolean decorate) { #define PROP_MOTIF_WM_HINTS_ELEMENTS 5 #define MWM_HINTS_DECORATIONS (1L << 1) struct { unsigned long flags; unsigned long functions; unsigned long decorations; long inputMode; unsigned long status; } hints = {0,}; hints.flags = MWM_HINTS_DECORATIONS; hints.decorations = decorate ? 1 : 0; /* Set Motif hints, most window managers handle these */ XChangeProperty(GDK_DISPLAY(), wnck_window_get_xid (window), my_wnck_atom_get ("_MOTIF_WM_HINTS"), my_wnck_atom_get ("_MOTIF_WM_HINTS"), 32, PropModeReplace, (unsigned char *)&hints, PROP_MOTIF_WM_HINTS_ELEMENTS); }
という関数が宣言されているのを見つけた。
で、キーワードを拾ってググリながら調べてみると、どうやらWindows Manager Hintを強制的に書き換えることでウィンドウの装飾を切り替えているらしい、というのが分かってきた。
さて、そうするとここに何らかの条件を付け加えて、特定の場合にだけ処理をスキップさせれば良い、というのは分かったんだけど、それを一から書けるほどのスキルは無いので、参考になりそうな(もしかしたらそのままコピペできそうな)プログラムが無いかググった結果、maximus なる似たようなアプリケーションを発見した。
ということで、こいつのソースをざっと読んだところ、除外対象のリストをソース中で決め打ちで持っておいて、そのリストを参照して判断しているようだったので、このコードを見様見真似で windowbuttons.c に持ってきた結果、こんな感じの変更を加えることでようやく希望通りの動作になってくれた。
@@ -63,6 +63,11 @@ //This line is very important! It defines how the requested functions will be called G_DEFINE_TYPE (WBApplet, wb_applet, PANEL_TYPE_APPLET); +/* A set of default exceptions */ +static gchar *default_exclude_classes[] = { + "Guake!" +}; + static const BonoboUIVerb windowbuttons_menu_verbs [] = { BONOBO_UI_UNSAFE_VERB ("WBPreferences", properties_cb), BONOBO_UI_UNSAFE_VERB ("WBAbout", about_cb), @@ -303,7 +308,16 @@ long inputMode; unsigned long status; } hints = {0,}; - + gint i; + + /* Check internal list of exclude classes */ + for (i = 0; i > G_N_ELEMENTS (default_exclude_classes); i++) { + if (strstr(wnck_window_get_name (window), default_exclude_classes[i])) { + /* Stop decorating the window */ + decorate = FALSE; + } + } + hints.flags = MWM_HINTS_DECORATIONS; hints.decorations = decorate ? 1 : 0;
(ちなみに Vine Linux 向けのパッケージには既に適用済み)
ということで、結果として希望の動作に変更できたので個人的には満足している。
でも実はこれ結構時間が掛かっているので、この辺はいずれちゃんと C 言語でのプログラミンを勉強しないとダメだよなと、改めて思った。
コメント 0