2016-03-23 21 views
0

X11でウィンドウのタイトル/キャプションの高さを取得するにはどうすればよいですか?私は境界線の太さを取得するには、以下を使用しています:X11ウィンドウのキャプションの高さを取得

XWindowAttributes wndattr; 
::XGetWindowAttributes(display, wnd, &wndattr) 
... = lWndAttr->border_width; 

私は、タイトルバーのストレートフォワードとして何かを見つけるように見えることはできません。 (This答えは右、私はフォントを通過する必要があるが、それは正しいことができない暗示のようです?)

+1

もちろんその答えは正しいわけではありません。 –

答えて

0

XGetWindowAttributesはこのようになりますXWindowAttributes structurex、へのポインタを返します。

typedef struct { 
    int x, y;     /* location of window */ 
    int width, height;   /* width and height of window */ 
    int border_width;   /* border width of window */ 
    int depth;     /* depth of window */ 
    Visual *visual;    /* the associated visual structure */ 
    Window root;    /* root of screen containing window */ 
#if defined(__cplusplus) || defined(c_plusplus) 
    int c_class;    /* C++ InputOutput, InputOnly*/ 
#else 
    int class;     /* InputOutput, InputOnly*/ 
#endif 
    int bit_gravity;   /* one of bit gravity values */ 
    int win_gravity;   /* one of the window gravity values */ 
    int backing_store;   /* NotUseful, WhenMapped, Always */ 
    unsigned long backing_planes;/* planes to be preserved if possible */ 
    unsigned long backing_pixel;/* value to be used when restoring planes */ 
    Bool save_under;   /* boolean, should bits under be saved? */ 
    Colormap colormap;   /* color map to be associated with window */ 
    Bool map_installed;   /* boolean, is color map currently installed*/ 
    int map_state;    /* IsUnmapped, IsUnviewable, IsViewable */ 
    long all_event_masks;  /* set of events all people have interest in*/ 
    long your_event_mask;  /* my event mask */ 
    long do_not_propagate_mask; /* set of events that should not propagate */ 
    Bool override_redirect;  /* boolean value for override-redirect */ 
    Screen *screen;    /* back pointer to correct screen */ 
} XWindowAttributes; 

面白い部分はウィジェットのウィンドウの位置とサイズを与える最初の部分です。 タイトルは、そのウィンドウの一部ではありません。これはウィンドウマネージャによって管理され、 "装飾"と呼ばれるものの一部です。

さらに読書:

0

答えが使用ウィンドウマネージャに本当に依存は、WMS親の変更ターゲットウィンドウのほとんどはの子であることを芽フレームであるため、アルゴリズムは次のようになります。

  • rootに達するまで親ウィンドウに移動します。ルートより前のものはフレームです
  • は、ターゲットウィンドウの長方形とフレームの長方形を比較します。フレームのトップマイナスターゲットトップがあなたのキャプションの高さを与えるだろう
0

現代のウィンドウマネージャはExtended Window Manager Hints仕様を遵守し、あなたはちょうど_NET_FRAME_EXTENTSプロパティをチェックする必要があります。

#include <X11/Xlib.h> 
#include <stdio.h> 

int main() 
{ 
    Display* d; 
    Window w, root; 
    Atom a, t; 
    int s; 
    long fg, bg; 
    int f; 
    unsigned long n, b; 
    unsigned char *data = 0; 
    long* extents; 
    XEvent e; 

    d = XOpenDisplay(0); 
    s = DefaultScreen(d); 
    root = DefaultRootWindow(d); 
    fg = BlackPixel(d, s); 
    bg = WhitePixel(d, s); 
    w = XCreateSimpleWindow(d, root, 0, 0, 200, 200, 0, fg, bg); 
    XSelectInput(d, w, ExposureMask|ButtonPressMask|KeyPressMask|PropertyChangeMask); 

    XMapWindow(d,w); 

    a = XInternAtom(d, "_NET_FRAME_EXTENTS", True); /* Property to check */ 

    /* Window manager doesn't set up the extents immediately */ 
    /* Wait until they are set up and there are 4 of them */ 
    while (XGetWindowProperty(d, w, a, 
        0, 4, False, AnyPropertyType, 
        &t, &f, 
        &n, &b, &data) != Success || n != 4 || b != 0) 
    { 
     printf ("Waiting for extents\n"); 
     XNextEvent(d, &e); 
    } 

    /* OK got extents */ 
    extents = (long*) data; 
    printf ("Got frame extents: left %ld right %ld top %ld bottom %ld\n", 
      extents[0], extents[1], extents[2], extents[3]); 

    return 0; 
} 

近代的でないWMを使用している場合は、あなた自身で行ってください。 Andreyの答えに示唆されるように、ウィンドウツリーを歩いてみてください。これはうまくいく可能性がありますが、保証されていません。一部のウィンドウマネージャーは、別々の「フレーム」ウィンドウをまったく使用しません(たとえば、1つのウィンドウにすべてのフレームをオーバーレイビジュアルで描画できます)。

+0

私は合計X11 n00bですし、最小(擬似?)コードサンプルを大いに感謝します、ありがとう! –

関連する問題