359abf28d44f28cb945ab90296108e81bf997d03
[novacoin.git] / contrib / wx-patches / toplevel.cpp.diff
1 --- /wxWidgets/trunk/src/gtk/toplevel.cpp (revision 67326)\r
2 +++ /wxWidgets/trunk/src/gtk/toplevel.cpp (revision 67496)\r
3 @@ -72,4 +72,8 @@\r
4  // send any activate events at all\r
5  static int g_sendActivateEvent = -1;\r
6 +\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
10  \r
11  //-----------------------------------------------------------------------------\r
12 @@ -432,4 +436,12 @@\r
13      if (event->state == GDK_PROPERTY_NEW_VALUE && event->atom == property)\r
14      {\r
15 +        if (win->m_netFrameExtentsTimerId)\r
16 +        {\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
21 +        }\r
22 +\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
27      }\r
28 +    return false;\r
29 +}\r
30 +}\r
31 +\r
32 +extern "C" {\r
33 +static gboolean request_frame_extents_timeout(void* data)\r
34 +{\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
46      return false;\r
47  }\r
48 @@ -459,4 +489,5 @@\r
49      m_deferShowAllowed = true;\r
50      m_updateDecorSize = true;\r
51 +    m_netFrameExtentsTimerId = 0;\r
52  \r
53      m_urgency_hint = -2;\r
54 @@ -811,5 +842,6 @@\r
55      if (deferShow)\r
56      {\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
60          if (deferShow)\r
61          {\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
66 -        }\r
67 -        if (deferShow)\r
68 -        {\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
73          }\r
74 @@ -875,4 +900,12 @@\r
75              (XEvent*)&xevent);\r
76  \r
77 +        if (gs_requestFrameExtentsStatus == 0)\r
78 +        {\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
83 +        }\r
84 +\r
85          // defer calling gtk_widget_show()\r
86          m_isShown = true;\r