- case wxSYS_BORDER_X:
- case wxSYS_BORDER_Y:
- case wxSYS_EDGE_X:
- case wxSYS_EDGE_Y:
- case wxSYS_FRAMESIZE_X:
- case wxSYS_FRAMESIZE_Y:
- // If a window is specified/realized, and it is a toplevel window, we can query from wm.
- // The returned border thickness is outside the client area in that case.
- if (window)
- {
- wxTopLevelWindow *tlw = wxDynamicCast(win, wxTopLevelWindow);
- if (!tlw)
- return -1; // not a tlw, not sure how to approach
- else
- {
- // Check if wm supports frame extents - we can't know
- // the border widths if it does not.
-#if GTK_CHECK_VERSION(2,2,0)
- if (!gtk_check_version(2,2,0))
- {
- if (!gdk_x11_screen_supports_net_wm_hint(
- gdk_drawable_get_screen(window),
- gdk_atom_intern("_NET_FRAME_EXTENTS", false) ) )
- return -1;
- }
- else
-#endif
- {
- if (!gdk_net_wm_supports(gdk_atom_intern("_NET_FRAME_EXTENTS", false)))
- return -1;
- }
-
- // Get the frame extents from the windowmanager.
- // In most cases the top extent is the titlebar, so we use the bottom extent
- // for the heights.
-
- Atom type;
- gint format;
- gulong nitems;
- gulong bytes_after;
-
- if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY(gdk_drawable_get_display(window)),
- GDK_WINDOW_XWINDOW(window),
- gdk_x11_get_xatom_by_name_for_display (
- gdk_drawable_get_display(window),
- "_NET_FRAME_EXTENTS" ),
- 0, // left, right, top, bottom, CARDINAL[4]/32
- G_MAXLONG, // size of long
- false, // do not delete property
- XA_CARDINAL, // 32 bit
- &type, &format, &nitems, &bytes_after, &data
- ) == Success)
- {
- int border_return = -1;
-
- if ((type == XA_CARDINAL) && (format == 32) && (nitems >= 4) && (data))
- {
- long *borders;
- borders = (long*)data;
- switch(index)
- {
- case wxSYS_BORDER_X:
- case wxSYS_EDGE_X:
- case wxSYS_FRAMESIZE_X:
- border_return = borders[1]; // width of right extent
- break;
- default:
- border_return = borders[3]; // height of bottom extent
- break;
- }
- }
-
- if (data)
- XFree(data);
-
- return border_return;
- }
- }
- }
-
- return -1; // no window specified
-