Init();
Create(parent, id, value, pos, size, choices, style, validator, name);
}
+ ~wxComboBox();
bool Create(wxWindow *parent, wxWindowID id,
const wxString& value = wxEmptyString,
Create( parent, id, defaultDirectory, defaultFilename, wildCard, style, pos, size, name );
}
- virtual ~wxGtkFileCtrl() {}
+ virtual ~wxGtkFileCtrl();
bool Create( wxWindow *parent,
wxWindowID id,
{
Create(parent, id, title, pos, size, style, name);
}
+ ~wxMiniFrame();
bool Create(wxWindow *parent,
wxWindowID id,
Create( parent, id, value, minValue, maxValue,
pos, size, style, validator, name );
}
+ ~wxSlider();
bool Create(wxWindow *parent,
wxWindowID id,
#ifndef _WX_GTK_WEBKITCTRL_H_
#define _WX_GTK_WEBKITCTRL_H_
-#include "wx/setup.h"
+#include "wx/defs.h"
#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && defined(__WXGTK__)
class WXDLLIMPEXP_WEBVIEW wxWebViewWebKit : public wxWebView
{
public:
- wxWebViewWebKit() { }
+ wxWebViewWebKit();
wxWebViewWebKit(wxWindow *parent,
wxWindowID id = wxID_ANY,
// implement base class (pure) virtual methods
// -------------------------------------------
- virtual bool Destroy();
-
virtual void Raise();
virtual void Lower();
// extra (wxGTK-specific) flags
bool m_noExpose:1; // wxGLCanvas has its own redrawing
bool m_nativeSizeEvent:1; // wxGLCanvas sends wxSizeEvent upon "alloc_size"
- bool m_hasVMT:1; // set after PostCreation() is called
bool m_isScrolling:1; // dragging scrollbar thumb?
bool m_clipPaintRegion:1; // true after ScrollWindow()
wxRegion m_nativeUpdateRegion; // not transformed for RTL
void GTKFreezeWidget(GtkWidget *w);
void GTKThawWidget(GtkWidget *w);
+ void GTKDisconnect(void* instance);
#if wxUSE_TOOLTIPS
virtual void DoSetToolTip( wxToolTip *tip );
extern "C" {
static void gtk_checkbox_toggled_callback(GtkWidget *widget, wxCheckBox *cb)
{
- if (!cb->m_hasVMT) return;
-
if (g_blockEventsOnDrag) return;
// Transitions for 3state checkbox must be done manually, GTK's checkbox
void wxChoice::SendSelectionChangedEvent(wxEventType evt_type)
{
- if (!m_hasVMT)
- return;
-
if (GetSelection() == -1)
return;
static void
gtkcombobox_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
{
- if (!combo->m_hasVMT) return;
-
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
event.SetString( combo->GetValue() );
event.SetEventObject( combo );
EVT_UPDATE_UI(wxID_SELECTALL, wxComboBox::OnUpdateSelectAll)
END_EVENT_TABLE()
+wxComboBox::~wxComboBox()
+{
+ if (m_entry)
+ GTKDisconnect(m_entry);
+}
+
void wxComboBox::Init()
{
m_entry = NULL;
#endif
)
{
- wxPoint pt = wxGetMousePosition();
- wxRect rect(ClientToScreen(wxPoint(0, 0)), GetSize());
- if (!onlyIfUnderMouse || rect.Contains(pt))
+ if (!onlyIfUnderMouse || GetScreenRect().Contains(wxGetMousePosition()))
{
Hide();
Show();
// This won't do anything if we're not editing it
wxcol->GetRenderer()->CancelEditing();
}
+
+ GTKDisconnect(m_treeview);
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(m_treeview));
+ if (selection)
+ GTKDisconnect(selection);
}
m_cols.Clear();
void wxDataViewCtrl::Init()
{
+ m_treeview = NULL;
m_internal = NULL;
m_cols.DeleteContents( true );
IMPLEMENT_DYNAMIC_CLASS( wxGtkFileCtrl, wxControl )
+wxGtkFileCtrl::~wxGtkFileCtrl()
+{
+ if (m_fcWidget)
+ GTKDisconnect(m_fcWidget);
+}
+
void wxGtkFileCtrl::Init()
{
m_checkNextSelEvent = false;
GtkAllocation * WXUNUSED(alloc),
wxGLCanvas *win)
{
- if (!win->m_hasVMT)
- return;
-
wxSizeEvent event( wxSize(win->m_width,win->m_height), win->GetId() );
event.SetEventObject( win );
win->HandleWindowEvent( event );
wxListBox::~wxListBox()
{
- m_hasVMT = false;
+ if (m_treeview)
+ {
+ GTKDisconnect(m_treeview);
+ GtkTreeSelection* selection = gtk_tree_view_get_selection(m_treeview);
+ if (selection)
+ GTKDisconnect(selection);
+ }
Clear();
}
GtkWidget* widget = m_widget;
m_focusWidget =
m_widget = NULL;
- g_signal_handlers_disconnect_matched(widget,
- GSignalMatchType(G_SIGNAL_MATCH_DATA), 0, 0, NULL, NULL, this);
+ GTKDisconnect(widget);
g_object_unref(widget);
}
}
// Destroying a menu generates a "hide" signal even if it's not shown
// currently, so disconnect it to avoid dummy wxEVT_MENU_CLOSE events
// generation.
- g_signal_handlers_disconnect_by_func(m_menu, (gpointer)menu_hide, this);
+ g_signal_handlers_disconnect_matched(m_menu,
+ GSignalMatchType(G_SIGNAL_MATCH_DATA), 0, 0, NULL, NULL, this);
// see wxMenu::Init
g_object_unref(m_menu);
return NULL;
GtkWidget * const mitem = item->GetMenuItem();
+
+ g_signal_handlers_disconnect_matched(mitem,
+ GSignalMatchType(G_SIGNAL_MATCH_DATA), 0, 0, NULL, NULL, item);
+
#ifdef __WXGTK3__
gtk_menu_item_set_submenu(GTK_MENU_ITEM(mitem), NULL);
#else
wxGTKCairoDC dc(cr);
#else
- if (!win->m_hasVMT || gdk_event->count > 0 ||
+ if (gdk_event->count > 0 ||
gdk_event->window != gtk_widget_get_window(widget))
{
return false;
static gboolean
gtk_window_button_press_callback(GtkWidget* widget, GdkEventButton* gdk_event, wxMiniFrame* win)
{
- if (!win->m_hasVMT || gdk_event->window != gtk_widget_get_window(widget))
+ if (gdk_event->window != gtk_widget_get_window(widget))
return false;
if (g_blockEventsOnDrag) return TRUE;
if (g_blockEventsOnScroll) return TRUE;
static gboolean
gtk_window_button_release_callback(GtkWidget* widget, GdkEventButton* gdk_event, wxMiniFrame* win)
{
- if (!win->m_hasVMT || gdk_event->window != gtk_widget_get_window(widget))
+ if (gdk_event->window != gtk_widget_get_window(widget))
return false;
if (g_blockEventsOnDrag) return TRUE;
if (g_blockEventsOnScroll) return TRUE;
static gboolean
gtk_window_leave_callback(GtkWidget *widget,
GdkEventCrossing* gdk_event,
- wxMiniFrame *win)
+ wxMiniFrame*)
{
- if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
if (gdk_event->window != gtk_widget_get_window(widget))
return false;
static gboolean
gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxMiniFrame *win )
{
- if (!win->m_hasVMT || gdk_event->window != gtk_widget_get_window(widget))
+ if (gdk_event->window != gtk_widget_get_window(widget))
return false;
if (g_blockEventsOnDrag) return TRUE;
if (g_blockEventsOnScroll) return TRUE;
IMPLEMENT_DYNAMIC_CLASS(wxMiniFrame,wxFrame)
+wxMiniFrame::~wxMiniFrame()
+{
+ if (m_widget)
+ {
+ GtkWidget* eventbox = gtk_bin_get_child(GTK_BIN(m_widget));
+ GTKDisconnect(eventbox);
+ }
+}
+
bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
const wxPoint &pos, const wxSize &size,
long style, const wxString &name )
gtk_window_present( GTK_WINDOW(m_parent->m_widget) );
gint result = gtk_dialog_run(GTK_DIALOG(m_widget));
+ GTKDisconnect(m_widget);
gtk_widget_destroy(m_widget);
g_object_unref(m_widget);
m_widget = NULL;
// because it's a private GDK function and calling normal
// gdk_window_destroy() results in X errors while nulling just the window
// pointer and destroying m_widget results in many GTK errors
+ GTKDisconnect(m_widget);
m_widget = NULL;
// notice that we intentionally don't use Close() nor Delete() here as our
extern "C" {
static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBox *rb )
{
- if (!rb->m_hasVMT) return;
if (g_blockEventsOnDrag) return;
if (!gtk_toggle_button_get_active(button)) return;
extern "C" {
static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxRadioBox *rb )
{
- if (!rb->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
if ( ((gdk_event->keyval == GDK_Tab) ||
while (node)
{
GtkWidget *button = GTK_WIDGET( node->GetData()->button );
+ GTKDisconnect(button);
gtk_widget_destroy( button );
node = node->GetNext();
}
static
void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *rb )
{
- if (!rb->m_hasVMT) return;
-
if (g_blockEventsOnDrag) return;
if (!gtk_toggle_button_get_active(button)) return;
const double oldPos = win->m_pos;
win->m_pos = value;
- if (!win->m_hasVMT || g_blockEventsOnDrag)
+ if (g_blockEventsOnDrag)
return;
if (win->GTKEventsDisabled())
wxSlider::wxSlider()
{
- m_pos = 0;
- m_scrollEventType = GTK_SCROLL_NONE;
- m_needThumbRelease = false;
- m_blockScrollEvent = false;
+ m_scale = NULL;
+}
+
+wxSlider::~wxSlider()
+{
+ if (m_scale && m_scale != m_widget)
+ GTKDisconnect(m_scale);
}
bool wxSlider::Create(wxWindow *parent,
{
m_pos = value;
m_scrollEventType = GTK_SCROLL_NONE;
+ m_needThumbRelease = false;
+ m_blockScrollEvent = false;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
const double value = gtk_spin_button_get_value(spinbutton);
const int pos = int(value);
const int oldPos = win->m_pos;
- if (!win->m_hasVMT || g_blockEventsOnDrag || pos == oldPos)
+ if (g_blockEventsOnDrag || pos == oldPos)
{
win->m_pos = pos;
return;
static void
gtk_value_changed(GtkSpinButton* spinbutton, wxSpinCtrlGTKBase* win)
{
- if (!win->m_hasVMT || g_blockEventsOnDrag)
+ if (g_blockEventsOnDrag)
return;
if (wxIsKindOf(win, wxSpinCtrl))
static void
gtk_changed(GtkSpinButton* spinbutton, wxSpinCtrl* win)
{
- if (!win->m_hasVMT)
- return;
-
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
event.SetEventObject( win );
event.SetString(gtk_entry_get_text(GTK_ENTRY(spinbutton)));
if ( win->IgnoreTextUpdate() )
return;
- if (!win->m_hasVMT) return;
-
if ( win->MarkDirtyOnChange() )
win->MarkDirty();
SetUpdateFont(false);
m_text = NULL;
+ m_buffer = NULL;
m_showPositionOnThaw = NULL;
m_anonymousMarkList = NULL;
}
wxTextCtrl::~wxTextCtrl()
{
+ if (m_text)
+ GTKDisconnect(m_text);
+ if (m_buffer)
+ GTKDisconnect(m_buffer);
+
// this is also done by wxWindowGTK dtor, but has to be done here so our
// DoThaw() override is called
while (IsFrozen())
extern "C" {
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{
- if (!cb->m_hasVMT || g_blockEventsOnDrag)
+ if (g_blockEventsOnDrag)
return;
// Generate a wx event.
GdkEventConfigure *WXUNUSED(event),
wxTopLevelWindowGTK *win )
{
- if (!win->m_hasVMT || !win->IsShown())
+ if (!win->IsShown())
return FALSE;
wxPoint point;
GParamSpec*,
wxWebViewWebKit *webKitCtrl)
{
- // We can be called from webkit_web_view_dispose() during the window
- // destruction, don't use half-destroyed object in this case.
- if ( webKitCtrl->IsBeingDeleted() )
- return;
-
wxString url = webKitCtrl->GetCurrentURL();
WebKitLoadStatus status;
wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewWebKit, wxWebView);
+wxWebViewWebKit::wxWebViewWebKit()
+{
+ m_web_view = NULL;
+}
+
bool wxWebViewWebKit::Create(wxWindow *parent,
wxWindowID id,
const wxString &url,
wxWebViewWebKit::~wxWebViewWebKit()
{
- // The main goal here is to set m_isBeingDeleted to true to avoid the use
- // of this -- already half-destroyed -- object from WebKit callbacks, but
- // just setting it would prevent wxWindowDestroyEvent from being sent, so
- // send it now instead.
- SendDestroyEvent();
+ if (m_web_view)
+ GTKDisconnect(m_web_view);
}
bool wxWebViewWebKit::Enable( bool enable )
GdkEventKey *gdk_event,
wxWindow *win )
{
- if (!win->m_hasVMT)
- return FALSE;
if (g_blockEventsOnDrag)
return FALSE;
GdkEventKey *gdk_event,
wxWindowGTK *win )
{
- if (!win->m_hasVMT)
- return FALSE;
-
if (g_blockEventsOnDrag)
return FALSE;
bool wxWindowGTK::GTKShouldIgnoreEvent() const
{
- return !m_hasVMT || g_blockEventsOnDrag;
+ return g_blockEventsOnDrag;
}
int wxWindowGTK::GTKCallbackCommonPrologue(GdkEventAny *event) const
{
- if (!m_hasVMT)
- return FALSE;
if (g_blockEventsOnDrag)
return TRUE;
if (g_blockEventsOnScroll)
m_width = 0;
m_height = 0;
- m_hasVMT = false;
-
m_showOnIdle = false;
m_noExpose = false;
return true;
}
+void wxWindowGTK::GTKDisconnect(void* instance)
+{
+ g_signal_handlers_disconnect_matched(instance,
+ GSignalMatchType(G_SIGNAL_MATCH_DATA), 0, 0, NULL, NULL, this);
+}
+
wxWindowGTK::~wxWindowGTK()
{
SendDestroyEvent();
if ( gs_deferredFocusOut == this )
gs_deferredFocusOut = NULL;
- m_hasVMT = false;
+ if (m_widget)
+ GTKDisconnect(m_widget);
+ if (m_wxwindow && m_wxwindow != m_widget)
+ GTKDisconnect(m_wxwindow);
// destroy children before destroying this window itself
DestroyChildren();
- // unhook focus handlers to prevent stray events being
- // propagated to this (soon to be) dead object
- if (m_focusWidget != NULL)
- {
- g_signal_handlers_disconnect_by_func (m_focusWidget,
- (gpointer) gtk_window_focus_in_callback,
- this);
- g_signal_handlers_disconnect_by_func (m_focusWidget,
- (gpointer) gtk_window_focus_out_callback,
- this);
- }
-
if (m_widget)
Show( false );
InheritAttributes();
- m_hasVMT = true;
-
SetLayoutDirection(wxLayout_Default);
// unless the window was created initially hidden (i.e. Hide() had been
G_CALLBACK (gtk_window_leave_callback), this);
}
-bool wxWindowGTK::Destroy()
-{
- m_hasVMT = false;
-
- return wxWindowBase::Destroy();
-}
-
static GSList* gs_queueResizeList;
extern "C" {
// update current position
m_scrollPos[barIndex] = value;
// If event should be ignored, or integral position has not changed
- if (!m_hasVMT || g_blockEventsOnDrag || wxRound(value) == wxRound(oldPos))
+ if (g_blockEventsOnDrag || wxRound(value) == wxRound(oldPos))
{
return wxEVT_NULL;
}