1 --- /wxWidgets/trunk/src/gtk/toplevel.cpp (revision 67326)
\r
2 +++ /wxWidgets/trunk/src/gtk/toplevel.cpp (revision 67496)
\r
4 // send any activate events at all
\r
5 static int g_sendActivateEvent = -1;
\r
7 +// Whether _NET_REQUEST_FRAME_EXTENTS support is working
\r
8 +// 0 == not tested yet, 1 == working, 2 == broken
\r
9 +static int gs_requestFrameExtentsStatus;
\r
11 //-----------------------------------------------------------------------------
\r
12 @@ -432,4 +436,12 @@
\r
13 if (event->state == GDK_PROPERTY_NEW_VALUE && event->atom == property)
\r
15 + if (win->m_netFrameExtentsTimerId)
\r
17 + // WM support for _NET_REQUEST_FRAME_EXTENTS is working
\r
18 + gs_requestFrameExtentsStatus = 1;
\r
19 + g_source_remove(win->m_netFrameExtentsTimerId);
\r
20 + win->m_netFrameExtentsTimerId = 0;
\r
23 wxSize decorSize = win->m_decorSize;
\r
24 int left, right, top, bottom;
\r
25 @@ -439,4 +451,22 @@
\r
26 win->GTKUpdateDecorSize(decorSize);
\r
33 +static gboolean request_frame_extents_timeout(void* data)
\r
35 + // WM support for _NET_REQUEST_FRAME_EXTENTS is broken
\r
36 + gs_requestFrameExtentsStatus = 2;
\r
37 + gdk_threads_enter();
\r
38 + wxTopLevelWindowGTK* win = static_cast<wxTopLevelWindowGTK*>(data);
\r
39 + win->m_netFrameExtentsTimerId = 0;
\r
40 + wxSize decorSize = win->m_decorSize;
\r
41 + int left, right, top, bottom;
\r
42 + if (wxGetFrameExtents(gtk_widget_get_window(win->m_widget), &left, &right, &top, &bottom))
\r
43 + decorSize.Set(left + right, top + bottom);
\r
44 + win->GTKUpdateDecorSize(decorSize);
\r
45 + gdk_threads_leave();
\r
49 m_deferShowAllowed = true;
\r
50 m_updateDecorSize = true;
\r
51 + m_netFrameExtentsTimerId = 0;
\r
53 m_urgency_hint = -2;
\r
57 - deferShow = m_deferShowAllowed && !GTK_WIDGET_REALIZED(m_widget);
\r
58 + deferShow = gs_requestFrameExtentsStatus != 2 &&
\r
59 + m_deferShowAllowed && !gtk_widget_get_realized(m_widget);
\r
62 @@ -829,11 +861,4 @@
\r
63 // GetSize()/SetSize() because it makes window bigger between each
\r
64 // restore and save.
\r
65 - m_updateDecorSize = deferShow;
\r
69 - // Fluxbox support for _NET_REQUEST_FRAME_EXTENTS is broken
\r
70 - const char* name = gdk_x11_screen_get_window_manager_name(screen);
\r
71 - deferShow = strcmp(name, "Fluxbox") != 0;
\r
72 m_updateDecorSize = deferShow;
\r
74 @@ -875,4 +900,12 @@
\r
77 + if (gs_requestFrameExtentsStatus == 0)
\r
79 + // if WM does not respond to request within 1 second,
\r
80 + // we assume support for _NET_REQUEST_FRAME_EXTENTS is not working
\r
81 + m_netFrameExtentsTimerId =
\r
82 + g_timeout_add(1000, request_frame_extents_timeout, this);
\r
85 // defer calling gtk_widget_show()
\r