/////////////////////////////////////////////////////////////////////////////
-// Name: toplevel.cpp
+// Name: src/gtk/toplevel.cpp
// Purpose:
// Author: Robert Roebling
// Id: $Id$
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "toplevel.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/gtk/private.h"
#include "wx/timer.h"
#include "wx/settings.h"
+#include "wx/evtloop.h"
#include <glib.h>
#include <gdk/gdk.h>
// either TRUE or FALSE and an activate event will be sent during the next
// OnIdle() call and it is reset to -1: this value means that we shouldn't
// send any activate events at all
-static int g_sendActivateEvent = -1;
+static int g_sendActivateEvent = -1;
+
+//-----------------------------------------------------------------------------
+// RequestUserAttention related functions
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static void wxgtk_window_set_urgency_hint (GtkWindow *win,
+ gboolean setting)
+{
+ wxASSERT_MSG( GTK_WIDGET_REALIZED(win), wxT("wxgtk_window_set_urgency_hint: GdkWindow not realized") );
+ GdkWindow *window = GTK_WIDGET(win)->window;
+ XWMHints *wm_hints;
+
+ wm_hints = XGetWMHints(GDK_WINDOW_XDISPLAY(window), GDK_WINDOW_XWINDOW(window));
+
+ if (!wm_hints)
+ wm_hints = XAllocWMHints();
+
+ if (setting)
+ wm_hints->flags |= XUrgencyHint;
+ else
+ wm_hints->flags &= ~XUrgencyHint;
+
+ XSetWMHints(GDK_WINDOW_XDISPLAY(window), GDK_WINDOW_XWINDOW(window), wm_hints);
+ XFree(wm_hints);
+}
+
+static gboolean gtk_frame_urgency_timer_callback( wxTopLevelWindowGTK *win )
+{
+#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,7,0)
+ if(!gtk_check_version(2,7,0))
+ gtk_window_set_urgency_hint(GTK_WINDOW( win->m_widget ), FALSE);
+ else
+#endif
+ wxgtk_window_set_urgency_hint(GTK_WINDOW( win->m_widget ), FALSE);
+
+ win->m_urgency_hint = -2;
+ return FALSE;
+}
+}
//-----------------------------------------------------------------------------
// "focus_in_event"
{
if (g_isIdle)
wxapp_install_idle_handler();
-
+
switch ( g_sendActivateEvent )
{
case -1:
g_activeFrame = win;
g_lastActiveFrame = g_activeFrame;
-
+
// wxPrintf( wxT("active: %s\n"), win->GetTitle().c_str() );
-
+
+ // MR: wxRequestUserAttention related block
+ switch( win->m_urgency_hint )
+ {
+ default:
+ g_source_remove( win->m_urgency_hint );
+ // no break, fallthrough to remove hint too
+ case -1:
+#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,7,0)
+ if(!gtk_check_version(2,7,0))
+ gtk_window_set_urgency_hint(GTK_WINDOW( widget ), FALSE);
+ else
+#endif
+ {
+ wxgtk_window_set_urgency_hint(GTK_WINDOW( widget ), FALSE);
+ }
+
+ win->m_urgency_hint = -2;
+ break;
+
+ case -2: break;
+ }
+
wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
- wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
+ wxActivateEvent event(wxEVT_ACTIVATE, true, g_activeFrame->GetId());
event.SetEventObject(g_activeFrame);
g_activeFrame->GetEventHandler()->ProcessEvent(event);
//-----------------------------------------------------------------------------
extern "C" {
-static gint gtk_frame_focus_out_callback( GtkWidget *widget,
- GdkEventFocus *WXUNUSED(gdk_event),
+static gint gtk_frame_focus_out_callback( GtkWidget *widget,
+ GdkEventFocus *WXUNUSED(gdk_event),
wxTopLevelWindowGTK *win )
{
if (g_isIdle)
// wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
// g_sendActivateEvent to -1
g_sendActivateEvent = 0;
-
+
// wxASSERT_MSG( (g_activeFrame == win), wxT("TLW deactivatd although it wasn't active") );
-
+
// wxPrintf( wxT("inactive: %s\n"), win->GetTitle().c_str() );
if (g_activeFrame)
{
wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
- wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
+ wxActivateEvent event(wxEVT_ACTIVATE, false, g_activeFrame->GetId());
event.SetEventObject(g_activeFrame);
g_activeFrame->GetEventHandler()->ProcessEvent(event);
g_activeFrame = NULL;
}
-
+
return FALSE;
}
}
wxapp_install_idle_handler();
// This disables GTK's tab traversal
- gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus" );
+ g_signal_stop_emission_by_name (widget, "focus");
return TRUE;
}
}
// GTK's shrinking/growing policy
if ((win->m_gdkFunc & GDK_FUNC_RESIZE) == 0)
- gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
+ gtk_window_set_resizable(GTK_WINDOW(win->m_widget), FALSE);
else
- gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
+ gtk_window_set_resizable(GTK_WINDOW(win->m_widget), TRUE);
// reset the icon
wxIconBundle iconsOld = win->GetIcons();
GdkEvent * WXUNUSED(event),
wxTopLevelWindow *win )
{
- win->SetIconizeState(FALSE);
+ win->SetIconizeState(false);
}
}
GdkEvent * WXUNUSED(event),
wxTopLevelWindow *win )
{
- win->SetIconizeState(TRUE);
+ win->SetIconizeState(true);
}
}
}
}
-//-----------------------------------------------------------------------------
-// "draw" of m_client
-//-----------------------------------------------------------------------------
-
-#ifndef __WXGTK20__
-
-extern "C" {
-static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
-{
- GtkPizza *pizza = GTK_PIZZA(widget);
-
- gtk_paint_flat_box (win->m_widget->style,
- pizza->bin_window, GTK_STATE_NORMAL,
- GTK_SHADOW_NONE,
- rect,
- win->m_widget,
- (char *)"base",
- 0, 0, -1, -1);
-}
-}
-
-#endif // GTK+ 1.x
-
// ----------------------------------------------------------------------------
// wxTopLevelWindowGTK itself
// ----------------------------------------------------------------------------
void wxTopLevelWindowGTK::Init()
{
- m_sizeSet = FALSE;
+ m_sizeSet = false;
m_miniEdge = 0;
m_miniTitle = 0;
m_mainWidget = (GtkWidget*) NULL;
- m_insertInClientArea = TRUE;
- m_isIconized = FALSE;
- m_fsIsShowing = FALSE;
- m_themeEnabled = TRUE;
+ m_insertInClientArea = true;
+ m_isIconized = false;
+ m_fsIsShowing = false;
+ m_themeEnabled = true;
m_gdkDecor = m_gdkFunc = 0;
- m_grabbed = FALSE;
+ m_grabbed = false;
+
+ m_urgency_hint = -2;
}
bool wxTopLevelWindowGTK::Create( wxWindow *parent,
wxTopLevelWindows.Append( this );
- m_needParent = FALSE;
+ m_needParent = false;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
{
wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") );
- return FALSE;
+ return false;
}
m_title = title;
{
if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)
{
-#ifdef __WXGTK20__
m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// Tell WM that this is a dialog window and make it center
// on parent by default (this is what GtkDialog ctor does):
GDK_WINDOW_TYPE_HINT_DIALOG);
gtk_window_set_position(GTK_WINDOW(m_widget),
GTK_WIN_POS_CENTER_ON_PARENT);
-#else
- m_widget = gtk_window_new(GTK_WINDOW_DIALOG);
-#endif
}
else
{
{
gtk_window_set_type_hint(GTK_WINDOW(m_widget),
GDK_WINDOW_TYPE_HINT_UTILITY);
-
+
// On some WMs, like KDE, a TOOL_WINDOW will still show
// on the taskbar, but on Gnome a TOOL_WINDOW will not.
- // For consistency between WMs and with Windows, we
+ // For consistency between WMs and with Windows, we
// should set the NO_TASKBAR flag which will apply
// the set_skip_taskbar_hint if it is available,
// ensuring no taskbar entry will appear.
wxWindow *topParent = wxGetTopLevelParent(m_parent);
if (topParent && (((GTK_IS_WINDOW(topParent->m_widget)) &&
- (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)) ||
- (style & wxFRAME_FLOAT_ON_PARENT)))
+ (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)) ||
+ (style & wxFRAME_FLOAT_ON_PARENT)))
{
gtk_window_set_transient_for( GTK_WINDOW(m_widget),
GTK_WINDOW(topParent->m_widget) );
}
#endif
-#if GTK_CHECK_VERSION(2,4,0)
+#ifdef __WXGTK24__
if (!gtk_check_version(2,4,0))
{
if (style & wxSTAY_ON_TOP)
}
#endif
- if (!name.IsEmpty())
+ if (!name.empty())
gtk_window_set_wmclass( GTK_WINDOW(m_widget), wxGTK_CONV( name ), wxGTK_CONV( name ) );
gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
- gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
- GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this );
+ g_signal_connect (m_widget, "delete_event",
+ G_CALLBACK (gtk_frame_delete_callback), this);
// m_mainWidget holds the toolbar, the menubar and the client area
m_mainWidget = gtk_pizza_new();
if (m_miniEdge == 0) // wxMiniFrame has its own version.
{
// For m_mainWidget themes
- gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
- GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
-#ifndef __WXGTK20__
- gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
- GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
-#endif
+ g_signal_connect (m_mainWidget, "expose_event",
+ G_CALLBACK (gtk_window_expose_callback), this);
}
// m_wxwindow only represents the client area without toolbar and menubar
if (m_parent) m_parent->AddChild( this );
// the user resized the frame by dragging etc.
- gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
- GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );
+ g_signal_connect (m_widget, "size_allocate",
+ G_CALLBACK (gtk_frame_size_callback), this);
PostCreation();
// we cannot set MWM hints and icons before the widget has
// been realized, so we do this directly after realization
- gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
- GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
-
- // the only way to get the window size is to connect to this event
- gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
- GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
+ g_signal_connect (m_widget, "realize",
+ G_CALLBACK (gtk_frame_realized_callback), this);
// map and unmap for iconized state
- gtk_signal_connect( GTK_OBJECT(m_widget), "map_event",
- GTK_SIGNAL_FUNC(gtk_frame_map_callback), (gpointer)this );
- gtk_signal_connect( GTK_OBJECT(m_widget), "unmap_event",
- GTK_SIGNAL_FUNC(gtk_frame_unmap_callback), (gpointer)this );
+ g_signal_connect (m_widget, "map_event",
+ G_CALLBACK (gtk_frame_map_callback), this);
+ g_signal_connect (m_widget, "unmap_event",
+ G_CALLBACK (gtk_frame_unmap_callback), this);
// the only way to get the window size is to connect to this event
- gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
- GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
+ g_signal_connect (m_widget, "configure_event",
+ G_CALLBACK (gtk_frame_configure_callback), this);
// disable native tab traversal
- gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
- GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
+ g_signal_connect (m_widget, "focus",
+ G_CALLBACK (gtk_frame_focus_callback), this);
// activation
- gtk_signal_connect( GTK_OBJECT(m_widget), "focus_in_event",
- GTK_SIGNAL_FUNC(gtk_frame_focus_in_callback), (gpointer)this );
- gtk_signal_connect( GTK_OBJECT(m_widget), "focus_out_event",
- GTK_SIGNAL_FUNC(gtk_frame_focus_out_callback), (gpointer)this );
-
+ g_signal_connect (m_widget, "focus_in_event",
+ G_CALLBACK (gtk_frame_focus_in_callback), this);
+ g_signal_connect (m_widget, "focus_out_event",
+ G_CALLBACK (gtk_frame_focus_out_callback), this);
+
// decorations
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
{
}
}
- return TRUE;
+ return true;
}
wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
{
if (m_grabbed)
{
- wxASSERT_MSG( FALSE, _T("Window still grabbed"));
+ wxASSERT_MSG( false, _T("Window still grabbed"));
RemoveGrab();
}
- m_isBeingDeleted = TRUE;
+ m_isBeingDeleted = true;
// it may also be GtkScrolledWindow in the case of an MDI child
if (GTK_IS_WINDOW(m_widget))
{
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
}
-
+
if (g_activeFrame == this)
g_activeFrame = NULL;
if (g_lastActiveFrame == this)
bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style )
{
if (show == m_fsIsShowing)
- return FALSE; // return what?
+ return false; // return what?
m_fsIsShowing = show;
-
+
wxX11FullScreenMethod method =
wxGetFullScreenMethodX11((WXDisplay*)GDK_DISPLAY(),
(WXWindow)GDK_ROOT_WINDOW());
gtk_window_fullscreen( GTK_WINDOW( m_widget ) );
else
gtk_window_unfullscreen( GTK_WINDOW( m_widget ) );
-
- return TRUE;
}
else
#endif // GTK+ >= 2.2.0
(WXWindow)GDK_WINDOW_XWINDOW(window),
show, &m_fsSaveFrame, method);
}
- else
+ else // hide
{
if (method != wxX11_FS_WMSPEC)
{
}
}
- return TRUE;
+ // documented behaviour is to show the window if it's still hidden when
+ // showing it full screen
+ if ( show && !IsShown() )
+ Show();
+
+ return true;
}
// ----------------------------------------------------------------------------
GtkOnSize( m_x, m_y, m_width, m_height );
}
-
+
if (show)
gtk_widget_set_uposition( m_widget, m_x, m_y );
-
+
return wxWindow::Show( show );
}
void wxTopLevelWindowGTK::Raise()
{
-#ifdef __WXGTK20__
gtk_window_present( GTK_WINDOW( m_widget ) );
-#else
- wxWindow::Raise();
-#endif
}
void wxTopLevelWindowGTK::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
// avoid recursions
if (m_resizing)
return;
- m_resizing = TRUE;
+ m_resizing = true;
int old_x = m_x;
int old_y = m_y;
maxWidth = -1;
maxHeight = -1;
#endif
-
+
if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth;
if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight;
if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth;
/* we set the size in GtkOnSize, i.e. mostly the actual resizing is
done either directly before the frame is shown or in idle time
so that different calls to SetSize() don't lead to flicker. */
- m_sizeSet = FALSE;
+ m_sizeSet = false;
}
- m_resizing = FALSE;
+ m_resizing = false;
}
void wxTopLevelWindowGTK::DoGetClientSize( int *width, int *height ) const
// avoid recursions
if (m_resizing) return;
- m_resizing = TRUE;
+ m_resizing = true;
if ( m_wxwindow == NULL ) return;
maxWidth = -1;
maxHeight = -1;
#endif
-
+
if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth;
if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight;
if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth;
// is no need to set the size or position of m_wxwindow.
}
- m_sizeSet = TRUE;
+ m_sizeSet = true;
// send size event to frame
wxSizeEvent event( wxSize(m_width,m_height), GetId() );
event.SetEventObject( this );
GetEventHandler()->ProcessEvent( event );
- m_resizing = FALSE;
+ m_resizing = false;
}
void wxTopLevelWindowGTK::OnInternalIdle()
}
wxWindow::OnInternalIdle();
-
+
// Synthetize activate events.
if ( g_sendActivateEvent != -1 )
{
bool activate = g_sendActivateEvent != 0;
-
+
// if (!activate) wxPrintf( wxT("de") );
// wxPrintf( wxT("activate\n") );
-
+
// do it only once
g_sendActivateEvent = -1;
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
+ if ( title == m_title )
+ return;
+
m_title = title;
+
gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) );
}
wxTopLevelWindowBase::SetIcons( icons );
-#ifdef __WXGTK20__
GList *list = NULL;
size_t max = icons.m_icons.GetCount();
}
gtk_window_set_icon_list(GTK_WINDOW(m_widget), list);
g_list_free(list);
-
-#else // !__WXGTK20__
- GdkWindow* window = m_widget->window;
- if (!window)
- return;
-
- wxIcon icon = icons.GetIcon(-1);
- if (icon.Ok())
- {
- wxMask *mask = icon.GetMask();
- GdkBitmap *bm = (GdkBitmap *) NULL;
- if (mask) bm = mask->GetBitmap();
-
- gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
- }
-
- wxSetIconsX11( (WXDisplay*)GDK_WINDOW_XDISPLAY( window ),
- (WXWindow)GDK_WINDOW_XWINDOW( window ), icons );
-#endif // !__WXGTK20__
}
// ----------------------------------------------------------------------------
void wxTopLevelWindowGTK::Maximize(bool maximize)
{
-#ifdef __WXGTK20__
if (maximize)
gtk_window_maximize( GTK_WINDOW( m_widget ) );
else
gtk_window_unmaximize( GTK_WINDOW( m_widget ) );
-#else
- wxFAIL_MSG( _T("not implemented") );
-#endif
}
bool wxTopLevelWindowGTK::IsMaximized() const
{
-#ifdef __WXGTK20__
if(!m_widget->window)
return false;
return gdk_window_get_state(m_widget->window) & GDK_WINDOW_STATE_MAXIMIZED;
-#else
- // wxFAIL_MSG( _T("not implemented") );
-
- // This is an approximation
- return FALSE;
-#endif
}
void wxTopLevelWindowGTK::Restore()
{
-#ifdef __WXGTK20__
// "Present" seems similar enough to "restore"
gtk_window_present( GTK_WINDOW( m_widget ) );
-#else
- wxFAIL_MSG( _T("not implemented") );
-#endif
}
void wxTopLevelWindowGTK::Iconize( bool iconize )
{
-#ifdef __WXGTK20__
if (iconize)
gtk_window_iconify( GTK_WINDOW( m_widget ) );
else
gtk_window_deiconify( GTK_WINDOW( m_widget ) );
-#else
- if (iconize)
- {
- GdkWindow *window = m_widget->window;
-
- // you should do it later, for example from OnCreate() handler
- wxCHECK_RET( window, _T("frame not created yet - can't iconize") );
-
- XIconifyWindow( GDK_WINDOW_XDISPLAY( window ),
- GDK_WINDOW_XWINDOW( window ),
- DefaultScreen( GDK_DISPLAY() ) );
- }
-#endif
}
bool wxTopLevelWindowGTK::IsIconized() const
{
if (!m_grabbed)
{
- m_grabbed = TRUE;
+ m_grabbed = true;
gtk_grab_add( m_widget );
- gtk_main();
+ wxEventLoop().Run();
gtk_grab_remove( m_widget );
}
}
if (m_grabbed)
{
gtk_main_quit();
- m_grabbed = FALSE;
+ m_grabbed = false;
}
}
}
else
{
-#ifdef __WXGTK20__
- gdk_window_shape_combine_region(window, region.GetRegion(), 0, 0);
-#else
- wxBitmap bmp = region.ConvertToBitmap();
- bmp.SetMask(new wxMask(bmp, *wxBLACK));
- GdkBitmap* mask = bmp.GetMask()->GetBitmap();
- gdk_window_shape_combine_mask(window, mask, 0, 0);
-#endif
- return TRUE;
+ gdk_window_shape_combine_region(window, region.GetRegion(), 0, 0);
+ return true;
}
}
- return FALSE;
+ return false;
}
bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
{
- wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), FALSE,
+ wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
_T("Shaped windows must be created with the wxFRAME_SHAPED style."));
GdkWindow *window = NULL;
return (this == (wxTopLevelWindowGTK*)g_activeFrame);
}
+void wxTopLevelWindowGTK::RequestUserAttention(int flags)
+{
+ bool new_hint_value = false;
+
+ // FIXME: This is a workaround to focus handling problem
+ // If RequestUserAttention is called for example right after a wxSleep, OnInternalIdle hasn't
+ // yet been processed, and the internal focus system is not up to date yet.
+ // wxYieldIfNeeded ensures the processing of it, but can have unwanted side effects - MR
+ ::wxYieldIfNeeded();
+
+ if(m_urgency_hint >= 0)
+ g_source_remove(m_urgency_hint);
+
+ m_urgency_hint = -2;
+
+ if( GTK_WIDGET_REALIZED(m_widget) && !IsActive() )
+ {
+ new_hint_value = true;
+
+ if (flags & wxUSER_ATTENTION_INFO)
+ {
+ m_urgency_hint = g_timeout_add(5000, (GSourceFunc)gtk_frame_urgency_timer_callback, this);
+ } else {
+ m_urgency_hint = -1;
+ }
+ }
+
+#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2,7,0)
+ if(!gtk_check_version(2,7,0))
+ gtk_window_set_urgency_hint(GTK_WINDOW( m_widget ), new_hint_value);
+ else
+#endif
+ wxgtk_window_set_urgency_hint(GTK_WINDOW( m_widget ), new_hint_value);
+}
+
+void wxTopLevelWindowGTK::SetWindowStyleFlag( long style )
+{
+ // Store which styles were changed
+ long styleChanges = style ^ m_windowStyle;
+
+ // Process wxWindow styles. This also updates the internal variable
+ // Therefore m_windowStyle bits carry now the _new_ style values
+ wxWindow::SetWindowStyleFlag(style);
+
+ // just return for now if widget does not exist yet
+ if (!m_widget)
+ return;
+
+#ifdef __WXGTK24__
+ if ( (styleChanges & wxSTAY_ON_TOP) && !gtk_check_version(2,4,0) )
+ gtk_window_set_keep_above(GTK_WINDOW(m_widget), m_windowStyle & wxSTAY_ON_TOP);
+#endif // GTK+ 2.4
+#if GTK_CHECK_VERSION(2,2,0)
+ if ( (styleChanges & wxFRAME_NO_TASKBAR) && !gtk_check_version(2,2,0) )
+ {
+ gtk_window_set_skip_taskbar_hint(GTK_WINDOW(m_widget), m_windowStyle & wxFRAME_NO_TASKBAR);
+ }
+#endif // GTK+ 2.2
+}