2012-04-21 14 views
3

私はPythonのxlibバインディングを使って書かれたウィンドウマネージャーで作業していますが、私はdwmの動作をもっとpythonicな方法で模倣しようとしています。私は必要なものをたくさん得ていますが、Xの組み込みウィンドウ機能を使ってウィンドウのフォーカスを指示するのに問題があります。Python xlibでのウィンドウの枠線の描画

Xlibのウィンドウクラスのインスタンスがあり、ドキュメントを正しく読んでいるとすれば、これは(少なくとも今のところは)私がしたいことを行うはずです - 既存のウィンドウのウィンドウ境界をa華やかな色と2pxに境界線の幅を設定します。

def set_active_border(self, window): 
    border_color = self.colormap.alloc_named_color(\ 
     "#ff00ff").pixel 
    window.change_attributes(None,border_pixel=border_color, 
      border_width = 2) 
    self.dpy.sync() 

はしかし、私はこのことから何を取得 - 私は私のプログラムは、実際に私がイベントに関連付けられたコールバック関数を実行しているが、私は国境に全く色の変化を取得していないことを証明するためにprint文を追加することができます。誰かが私がここで逃しているものを正確に特定できますか?それが助けになるなら、私はもっと完全な例をペーストすることができます。私はそれが唯一の境界を処理するビットですが、確かにそれは確信していません。

+0

Python Xlibバインディングは、基礎となるXlib関数を直接変換するようです.Xlibでは、XChangeWindowAttributes()はborder_width属性を受け入れません。ウィンドウマネージャは通常、XConfigureWindow()またはXSetWindowBorderWidth()を呼び出してborder_widthを設定します。 – ottomeister

+0

Gaah。私が言っていることはこれです:あなたがまだそれをやっていないのなら、change_attributes()を呼び出す前にset_active_border()関数のwindow.configure(border_width = 2)を呼び出してみてください。 (私はXSetBorderWidth()のためのPythonバインディングを見ません。)XSetWindowBorderWidth()。 – ottomeister

+0

これまでにconfigure(border_width = 2)の呼び出しがありましたが、コメントアウトされました。アプローチは機能していないようです。私は試しました: window.configure(border_width = 2); window.change_attributes(...)とwindow.change_attributes()だけを使用します。まだダイスはありません。私はさらに情報があるときに報告します。 – bbenne10

答えて

3

これは完全なPEBKACのようです。私は答えを見つけました。基本的に、私はこれをやっていた:

def set_active_border(self, window): 
    border_color = self.colormap.alloc_named_color(\ 
     "#ff00ff").pixel 
    window.configure(border_width = 2) 
    window.change_attributes(None,border_pixel=border_color, 
     border_width = 2) 
    self.dpy.sync() 

これは明らかにこれは何もしていなかったXを混乱させていた。私がつまずいてきた解決策はそうのように、)(window.change_attributesからBORDER_WIDTH部分を除去呼び出すことだった:

def set_active_border(self, window): 
    border_color = self.colormap.alloc_named_color(\ 
     "#ff00ff").pixel 
    window.configure(border_width = 2) 
    window.change_attributes(None,border_pixel=border_color) 
    self.dpy.sync() 

私はこれが道を後に誰かに役立ちます願っています!