From 30dea05497c1f00d72d7dbf7f2f4818dfaa0e500 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 9 Aug 1998 13:06:25 +0000 Subject: [PATCH] Added Pop-up menus. Hunted down bug in dnd Changed widget, that wxWin connects to in certain case (in controls, where m_widget is not the connect widget, such as list control and text control) Compile fixes all over git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@486 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/listctrl.h | 2 ++ include/wx/gtk/listbox.h | 2 +- include/wx/gtk/textctrl.h | 2 +- include/wx/gtk/window.h | 5 +++- include/wx/gtk1/listbox.h | 2 +- include/wx/gtk1/textctrl.h | 2 +- include/wx/gtk1/window.h | 5 +++- samples/controls/controls.cpp | 14 ++++++++++ samples/dnd/dnd.cpp | 23 ++++++++++++----- src/gtk/dnd.cpp | 2 ++ src/gtk/frame.cpp | 16 ++++++------ src/gtk/listbox.cpp | 4 +-- src/gtk/mdi.cpp | 2 +- src/gtk/menu.cpp | 4 ++- src/gtk/notebook.cpp | 1 + src/gtk/textctrl.cpp | 2 +- src/gtk/window.cpp | 48 +++++++++++++++++++++++++---------- src/gtk1/dnd.cpp | 2 ++ src/gtk1/frame.cpp | 16 ++++++------ src/gtk1/listbox.cpp | 4 +-- src/gtk1/mdi.cpp | 2 +- src/gtk1/menu.cpp | 4 ++- src/gtk1/notebook.cpp | 1 + src/gtk1/textctrl.cpp | 2 +- src/gtk1/window.cpp | 48 +++++++++++++++++++++++++---------- 25 files changed, 149 insertions(+), 66 deletions(-) diff --git a/include/wx/generic/listctrl.h b/include/wx/generic/listctrl.h index 02d797f8bb..227bc96d83 100644 --- a/include/wx/generic/listctrl.h +++ b/include/wx/generic/listctrl.h @@ -540,7 +540,9 @@ class wxListMainWindow: public wxScrolledWindow long FindItem(long start, long data); long HitTest( int x, int y, int &flags ); void InsertItem( wxListItem &item ); +// void AddItem( wxListItem &item ); void InsertColumn( long col, wxListItem &item ); +// void AddColumn( wxListItem &item ); void SortItems( wxListCtrlCompare fn, long data ); virtual bool OnListNotify( wxListEvent &event ); diff --git a/include/wx/gtk/listbox.h b/include/wx/gtk/listbox.h index 88dafbcc45..43012923c1 100644 --- a/include/wx/gtk/listbox.h +++ b/include/wx/gtk/listbox.h @@ -74,7 +74,7 @@ class wxListBox: public wxControl void SetString( int n, const wxString &string ); void SetStringSelection( const wxString &string, bool select = TRUE ); - virtual GtkWidget *GetDropTargetWidget(void); + virtual GtkWidget *GetConnectWidget(void); private: diff --git a/include/wx/gtk/textctrl.h b/include/wx/gtk/textctrl.h index 797c61bc7f..2c8d9febeb 100644 --- a/include/wx/gtk/textctrl.h +++ b/include/wx/gtk/textctrl.h @@ -99,7 +99,7 @@ public: wxTextCtrl& operator<<(double d); wxTextCtrl& operator<<(const char c); - virtual GtkWidget* GetDropTargetWidget(void); + virtual GtkWidget* GetConnectWidget(void); private: bool m_modified; diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index 91a20f9496..15f75c70ba 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -164,11 +164,14 @@ public: virtual bool TransferDataFromWindow(); void OnInitDialog( wxInitDialogEvent &event ); virtual void InitDialog(); + + virtual bool PopupMenu( wxMenu *menu, int x, int y ); virtual void SetDropTarget( wxDropTarget *dropTarget ); virtual wxDropTarget *GetDropTarget() const; + private: - virtual GtkWidget* GetDropTargetWidget(void); + virtual GtkWidget* GetConnectWidget(void); public: virtual void SetScrollbar( int orient, int pos, int thumbVisible, diff --git a/include/wx/gtk1/listbox.h b/include/wx/gtk1/listbox.h index 88dafbcc45..43012923c1 100644 --- a/include/wx/gtk1/listbox.h +++ b/include/wx/gtk1/listbox.h @@ -74,7 +74,7 @@ class wxListBox: public wxControl void SetString( int n, const wxString &string ); void SetStringSelection( const wxString &string, bool select = TRUE ); - virtual GtkWidget *GetDropTargetWidget(void); + virtual GtkWidget *GetConnectWidget(void); private: diff --git a/include/wx/gtk1/textctrl.h b/include/wx/gtk1/textctrl.h index 797c61bc7f..2c8d9febeb 100644 --- a/include/wx/gtk1/textctrl.h +++ b/include/wx/gtk1/textctrl.h @@ -99,7 +99,7 @@ public: wxTextCtrl& operator<<(double d); wxTextCtrl& operator<<(const char c); - virtual GtkWidget* GetDropTargetWidget(void); + virtual GtkWidget* GetConnectWidget(void); private: bool m_modified; diff --git a/include/wx/gtk1/window.h b/include/wx/gtk1/window.h index 91a20f9496..15f75c70ba 100644 --- a/include/wx/gtk1/window.h +++ b/include/wx/gtk1/window.h @@ -164,11 +164,14 @@ public: virtual bool TransferDataFromWindow(); void OnInitDialog( wxInitDialogEvent &event ); virtual void InitDialog(); + + virtual bool PopupMenu( wxMenu *menu, int x, int y ); virtual void SetDropTarget( wxDropTarget *dropTarget ); virtual wxDropTarget *GetDropTarget() const; + private: - virtual GtkWidget* GetDropTargetWidget(void); + virtual GtkWidget* GetConnectWidget(void); public: virtual void SetScrollbar( int orient, int pos, int thumbVisible, diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 663f1b4c95..bd57a74f0a 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -123,6 +123,20 @@ bool MyApp::OnInit(void) return TRUE; } +//---------------------------------------------------------------------- +// MyTextCtrl +//---------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl) + EVT_RIGHT_DOWN (MyTextCtrl::OnRightButton) +END_EVENT_TABLE() + +MyTextCtrl::MyTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value, + const wxPoint &pos, const wxSize &size, int style ) : + wxTextCtrl( parent, id, value, pos, size, style ) +{ +} + //---------------------------------------------------------------------- // MyPanel //---------------------------------------------------------------------- diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 68e299b830..9df7943189 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -82,7 +82,8 @@ public: void OnHelp (wxCommandEvent& event); void OnLogClear(wxCommandEvent& event); - void OnMouseBtnDown(wxMouseEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnRightDown(wxMouseEvent& event); bool OnClose(); @@ -116,10 +117,8 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) EVT_MENU(Menu_Drag, DnDFrame::OnDrag) EVT_MENU(Menu_Help, DnDFrame::OnHelp) EVT_MENU(Menu_Clear, DnDFrame::OnLogClear) - - EVT_LEFT_DOWN(OnMouseBtnDown) - EVT_RIGHT_DOWN(OnMouseBtnDown) - EVT_MIDDLE_DOWN(OnMouseBtnDown) + EVT_LEFT_DOWN(OnLeftDown) + EVT_RIGHT_DOWN(OnRightDown) END_EVENT_TABLE() // `Main program' equivalent, creating windows and returning main app frame @@ -291,10 +290,11 @@ bool DnDFrame::OnClose() return TRUE; } -void DnDFrame::OnMouseBtnDown(wxMouseEvent& /* event */ ) +void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) ) { if ( !m_strText.IsEmpty() ) { // start drag operation + wxTextDataObject data(m_strText); wxDropSource dragSource(data, this); const char *pc; @@ -312,6 +312,17 @@ void DnDFrame::OnMouseBtnDown(wxMouseEvent& /* event */ ) } } +void DnDFrame::OnRightDown(wxMouseEvent &event ) +{ + wxMenu *menu = new wxMenu; + + menu->Append(Menu_Drag, "&Test drag..."); + menu->Append(Menu_About, "&About"); + menu->Append(Menu_Quit, "E&xit"); + + PopupMenu( menu, event.GetX(), event.GetY() ); +} + DnDFrame::~DnDFrame() { if ( m_pLog != NULL ) { diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index ce49947151..2498e7c423 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -263,6 +263,8 @@ wxDropSource::DragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) ) UnregisterWindow(); + g_blockEventsOnDrag = FALSE; + return m_retValue; }; diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index beb8a3df5c..033ec23f9d 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -400,16 +400,16 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar ) if (m_frameMenuBar) { + wxNode *node = m_frameMenuBar->m_menus.First(); + while (node) + { + wxMenu *menu = (wxMenu*)node->Data(); + SetInvokingWindow( menu, this ); + node = node->Next(); + }; + if (m_frameMenuBar->m_parent != this) { - wxNode *node = m_frameMenuBar->m_menus.First(); - while (node) - { - wxMenu *menu = (wxMenu*)node->Data(); - SetInvokingWindow( menu, this ); - node = node->Next(); - }; - m_frameMenuBar->m_parent = this; gtk_myfixed_put( GTK_MYFIXED(m_mainWindow), m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index dad6cd6915..c8a8bea0d7 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -167,7 +167,7 @@ void wxListBox::Delete( int n ) wxNode *node = m_clientData.Nth( n ); if (!node) { - wxFAIL_MSG(_("wxListBox::Delete wrong index")); + wxFAIL_MSG("wxListBox::Delete wrong index"); } else m_clientData.DeleteNode( node ); @@ -347,7 +347,7 @@ int wxListBox::GetIndex( GtkWidget *item ) const return -1; }; -GtkWidget *wxListBox::GetDropTargetWidget(void) +GtkWidget *wxListBox::GetConnectWidget(void) { return GTK_WIDGET(m_list); }; diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 25dc7ba34b..4f71cc31cf 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -324,7 +324,7 @@ void wxMDIClientWindow::AddChild( wxWindow *child ) { if (!child->IsKindOf(CLASSINFO(wxMDIChildFrame))) { - wxFAIL_MSG(_("wxNotebook::AddChild: Child has to be wxMDIChildFrame")); + wxFAIL_MSG("wxNotebook::AddChild: Child has to be wxMDIChildFrame"); return; }; diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 0e99bfef14..93bc49891b 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -15,6 +15,7 @@ #include "wx/menu.h" #include "wx/log.h" +#include "wx/intl.h" //----------------------------------------------------------------------------- // wxMenuBar @@ -183,6 +184,7 @@ wxMenuItem::wxMenuItem() void wxMenuItem::SetText(const wxString& str) { + m_text = ""; for ( const char *pc = str; *pc != '\0'; pc++ ) { if ( *pc == '&' ) pc++; // skip it @@ -193,7 +195,7 @@ void wxMenuItem::SetText(const wxString& str) void wxMenuItem::Check( bool check ) { - wxCHECK_RET( IsCheckable(), _("can't check uncheckable item!") ) + wxCHECK_RET( IsCheckable(), _("Can't check uncheckable item!") ) m_isChecked = check; gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check ); diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index da307dfb3e..a2c5f2f9df 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -16,6 +16,7 @@ #include "wx/panel.h" #include "wx/utils.h" #include "wx/imaglist.h" +#include "wx/intl.h" #include "wx/log.h" //----------------------------------------------------------------------------- diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index a4e3470b53..5f73627ccf 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -387,7 +387,7 @@ wxTextCtrl& wxTextCtrl::operator<<(const char c) return *this; } -GtkWidget* wxTextCtrl::GetDropTargetWidget(void) +GtkWidget* wxTextCtrl::GetConnectWidget(void) { return GTK_WIDGET(m_text); }; diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 097bd145e8..382d1e089b 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -25,6 +25,7 @@ #include "wx/dcclient.h" #include "wx/dnd.h" #include "wx/mdi.h" +#include "wx/menu.h" #include "wx/notebook.h" #include "wx/statusbr.h" #include @@ -55,13 +56,13 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd if (g_blockEventsOnDrag) return; /* - if (IS_KIND_OF(win,wxTreeCtrl)) + if (IS_KIND_OF(win,wxStatusBar)) { printf( "OnExpose from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); - + printf( "x: %d \n", gdk_event->area.x ); printf( "y: %d \n", gdk_event->area.y ); printf( "w: %d \n", gdk_event->area.width ); @@ -92,6 +93,8 @@ void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, if (g_blockEventsOnDrag) return; /* + if (IS_KIND_OF(win,wxStatusBar)) + { printf( "OnDraw from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); @@ -101,6 +104,7 @@ void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, printf( "y: %d \n", rect->y ); printf( "w: %d \n", rect->width ); printf( "h: %d \n", rect->height ); +} */ win->m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height ); @@ -297,7 +301,7 @@ gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_ev printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); */ - + wxEventType event_type = wxEVT_LEFT_DOWN; if (gdk_event->button == 1) @@ -945,8 +949,7 @@ void wxWindow::PostCreation(void) // GtkStyle *style = m_widget->style; // style->font = m_font.GetInternalFont( 1.0 ); // destroy old font ? - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); gtk_object_set_data (GTK_OBJECT (connect_widget), "MyWxWindow", (gpointer)this ); @@ -1418,8 +1421,7 @@ void wxWindow::MakeModal( bool modal ) void wxWindow::SetFocus(void) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); if (connect_widget) { if (GTK_WIDGET_CAN_FOCUS(connect_widget) && !GTK_WIDGET_HAS_FOCUS (connect_widget) ) @@ -1587,7 +1589,7 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) rect->width, rect->height ); else - Clear(); + Clear(); }; if (!rect) { @@ -1713,9 +1715,29 @@ void wxWindow::InitDialog(void) GetEventHandler()->ProcessEvent(event); }; +static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) +{ + menu->SetInvokingWindow( win ); + wxNode *node = menu->m_items.First(); + while (node) + { + wxMenuItem *menuitem = (wxMenuItem*)node->Data(); + if (menuitem->IsSubMenu()) + SetInvokingWindow( menuitem->GetSubMenu(), win ); + node = node->Next(); + }; +}; + +bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) ) +{ + SetInvokingWindow( menu, this ); + gtk_menu_popup( GTK_MENU(menu->m_menu), NULL, NULL, NULL, NULL, 0, 0 ); + return TRUE; +} + void wxWindow::SetDropTarget( wxDropTarget *dropTarget ) { - GtkWidget *dnd_widget = GetDropTargetWidget(); + GtkWidget *dnd_widget = GetConnectWidget(); if (m_pDropTarget) { @@ -1740,7 +1762,7 @@ wxDropTarget *wxWindow::GetDropTarget() const return m_pDropTarget; }; -GtkWidget* wxWindow::GetDropTargetWidget(void) +GtkWidget* wxWindow::GetConnectWidget(void) { GtkWidget *connect_widget = m_widget; if (m_wxwindow) connect_widget = m_wxwindow; @@ -1779,8 +1801,7 @@ long wxWindow::GetWindowStyleFlag(void) const void wxWindow::CaptureMouse(void) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); gtk_grab_add( connect_widget ); gdk_pointer_grab ( connect_widget->window, FALSE, (GdkEventMask) @@ -1792,8 +1813,7 @@ void wxWindow::CaptureMouse(void) void wxWindow::ReleaseMouse(void) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); gtk_grab_remove( connect_widget ); gdk_pointer_ungrab ( GDK_CURRENT_TIME ); }; diff --git a/src/gtk1/dnd.cpp b/src/gtk1/dnd.cpp index ce49947151..2498e7c423 100644 --- a/src/gtk1/dnd.cpp +++ b/src/gtk1/dnd.cpp @@ -263,6 +263,8 @@ wxDropSource::DragResult wxDropSource::DoDragDrop( bool WXUNUSED(bAllowMove) ) UnregisterWindow(); + g_blockEventsOnDrag = FALSE; + return m_retValue; }; diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index beb8a3df5c..033ec23f9d 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -400,16 +400,16 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar ) if (m_frameMenuBar) { + wxNode *node = m_frameMenuBar->m_menus.First(); + while (node) + { + wxMenu *menu = (wxMenu*)node->Data(); + SetInvokingWindow( menu, this ); + node = node->Next(); + }; + if (m_frameMenuBar->m_parent != this) { - wxNode *node = m_frameMenuBar->m_menus.First(); - while (node) - { - wxMenu *menu = (wxMenu*)node->Data(); - SetInvokingWindow( menu, this ); - node = node->Next(); - }; - m_frameMenuBar->m_parent = this; gtk_myfixed_put( GTK_MYFIXED(m_mainWindow), m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index dad6cd6915..c8a8bea0d7 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -167,7 +167,7 @@ void wxListBox::Delete( int n ) wxNode *node = m_clientData.Nth( n ); if (!node) { - wxFAIL_MSG(_("wxListBox::Delete wrong index")); + wxFAIL_MSG("wxListBox::Delete wrong index"); } else m_clientData.DeleteNode( node ); @@ -347,7 +347,7 @@ int wxListBox::GetIndex( GtkWidget *item ) const return -1; }; -GtkWidget *wxListBox::GetDropTargetWidget(void) +GtkWidget *wxListBox::GetConnectWidget(void) { return GTK_WIDGET(m_list); }; diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index 25dc7ba34b..4f71cc31cf 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -324,7 +324,7 @@ void wxMDIClientWindow::AddChild( wxWindow *child ) { if (!child->IsKindOf(CLASSINFO(wxMDIChildFrame))) { - wxFAIL_MSG(_("wxNotebook::AddChild: Child has to be wxMDIChildFrame")); + wxFAIL_MSG("wxNotebook::AddChild: Child has to be wxMDIChildFrame"); return; }; diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 0e99bfef14..93bc49891b 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -15,6 +15,7 @@ #include "wx/menu.h" #include "wx/log.h" +#include "wx/intl.h" //----------------------------------------------------------------------------- // wxMenuBar @@ -183,6 +184,7 @@ wxMenuItem::wxMenuItem() void wxMenuItem::SetText(const wxString& str) { + m_text = ""; for ( const char *pc = str; *pc != '\0'; pc++ ) { if ( *pc == '&' ) pc++; // skip it @@ -193,7 +195,7 @@ void wxMenuItem::SetText(const wxString& str) void wxMenuItem::Check( bool check ) { - wxCHECK_RET( IsCheckable(), _("can't check uncheckable item!") ) + wxCHECK_RET( IsCheckable(), _("Can't check uncheckable item!") ) m_isChecked = check; gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check ); diff --git a/src/gtk1/notebook.cpp b/src/gtk1/notebook.cpp index da307dfb3e..a2c5f2f9df 100644 --- a/src/gtk1/notebook.cpp +++ b/src/gtk1/notebook.cpp @@ -16,6 +16,7 @@ #include "wx/panel.h" #include "wx/utils.h" #include "wx/imaglist.h" +#include "wx/intl.h" #include "wx/log.h" //----------------------------------------------------------------------------- diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index a4e3470b53..5f73627ccf 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -387,7 +387,7 @@ wxTextCtrl& wxTextCtrl::operator<<(const char c) return *this; } -GtkWidget* wxTextCtrl::GetDropTargetWidget(void) +GtkWidget* wxTextCtrl::GetConnectWidget(void) { return GTK_WIDGET(m_text); }; diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 097bd145e8..382d1e089b 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -25,6 +25,7 @@ #include "wx/dcclient.h" #include "wx/dnd.h" #include "wx/mdi.h" +#include "wx/menu.h" #include "wx/notebook.h" #include "wx/statusbr.h" #include @@ -55,13 +56,13 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd if (g_blockEventsOnDrag) return; /* - if (IS_KIND_OF(win,wxTreeCtrl)) + if (IS_KIND_OF(win,wxStatusBar)) { printf( "OnExpose from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); - + printf( "x: %d \n", gdk_event->area.x ); printf( "y: %d \n", gdk_event->area.y ); printf( "w: %d \n", gdk_event->area.width ); @@ -92,6 +93,8 @@ void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, if (g_blockEventsOnDrag) return; /* + if (IS_KIND_OF(win,wxStatusBar)) + { printf( "OnDraw from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); @@ -101,6 +104,7 @@ void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, printf( "y: %d \n", rect->y ); printf( "w: %d \n", rect->width ); printf( "h: %d \n", rect->height ); +} */ win->m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height ); @@ -297,7 +301,7 @@ gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_ev printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); */ - + wxEventType event_type = wxEVT_LEFT_DOWN; if (gdk_event->button == 1) @@ -945,8 +949,7 @@ void wxWindow::PostCreation(void) // GtkStyle *style = m_widget->style; // style->font = m_font.GetInternalFont( 1.0 ); // destroy old font ? - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); gtk_object_set_data (GTK_OBJECT (connect_widget), "MyWxWindow", (gpointer)this ); @@ -1418,8 +1421,7 @@ void wxWindow::MakeModal( bool modal ) void wxWindow::SetFocus(void) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); if (connect_widget) { if (GTK_WIDGET_CAN_FOCUS(connect_widget) && !GTK_WIDGET_HAS_FOCUS (connect_widget) ) @@ -1587,7 +1589,7 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) rect->width, rect->height ); else - Clear(); + Clear(); }; if (!rect) { @@ -1713,9 +1715,29 @@ void wxWindow::InitDialog(void) GetEventHandler()->ProcessEvent(event); }; +static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) +{ + menu->SetInvokingWindow( win ); + wxNode *node = menu->m_items.First(); + while (node) + { + wxMenuItem *menuitem = (wxMenuItem*)node->Data(); + if (menuitem->IsSubMenu()) + SetInvokingWindow( menuitem->GetSubMenu(), win ); + node = node->Next(); + }; +}; + +bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) ) +{ + SetInvokingWindow( menu, this ); + gtk_menu_popup( GTK_MENU(menu->m_menu), NULL, NULL, NULL, NULL, 0, 0 ); + return TRUE; +} + void wxWindow::SetDropTarget( wxDropTarget *dropTarget ) { - GtkWidget *dnd_widget = GetDropTargetWidget(); + GtkWidget *dnd_widget = GetConnectWidget(); if (m_pDropTarget) { @@ -1740,7 +1762,7 @@ wxDropTarget *wxWindow::GetDropTarget() const return m_pDropTarget; }; -GtkWidget* wxWindow::GetDropTargetWidget(void) +GtkWidget* wxWindow::GetConnectWidget(void) { GtkWidget *connect_widget = m_widget; if (m_wxwindow) connect_widget = m_wxwindow; @@ -1779,8 +1801,7 @@ long wxWindow::GetWindowStyleFlag(void) const void wxWindow::CaptureMouse(void) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); gtk_grab_add( connect_widget ); gdk_pointer_grab ( connect_widget->window, FALSE, (GdkEventMask) @@ -1792,8 +1813,7 @@ void wxWindow::CaptureMouse(void) void wxWindow::ReleaseMouse(void) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *connect_widget = GetConnectWidget(); gtk_grab_remove( connect_widget ); gdk_pointer_ungrab ( GDK_CURRENT_TIME ); }; -- 2.45.2