X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f5e27805de786dbb3976782ba2a3365c27256031..2243eed57327ce844cfaf61f25b11cf372f96309:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index d874ab00bb..6da95fff04 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -43,32 +43,32 @@ for all other window classes, does seems required as well. What does wxWindow do? It contains the common interface for the following - jobs of its descentants: + jobs of its descendants: 1) Define the rudimentary behaviour common to all window classes, such as - resizing, intercepting user input so as to make it possible to use these - events for special purposes in a derived class, window names etc. + resizing, intercepting user input (so as to make it possible to use these + events for special purposes in a derived class), window names etc. 2) Provide the possibility to contain and manage children, if the derived class is allowed to contain children, which holds true for those window - classes, which do not display a native GTK widget. To name them, these + classes which do not display a native GTK widget. To name them, these classes are wxPanel, wxScrolledWindow, wxDialog, wxFrame. The MDI frame- work classes are a special case and are handled a bit differently from - the rest. + the rest. The same holds true for the wxNotebook class. 3) Provide the possibility to draw into a client area of a window. This, too, only holds true for classes that do not display a native GTK widget as above. - 4) Provide the entire mechanism for scrolling widgets. This actaul inter- - face for this is usually in wxScrolledWidget, but the GTK implementation + 4) Provide the entire mechanism for scrolling widgets. This actual inter- + face for this is usually in wxScrolledWindow, but the GTK implementation is in this class. 5) A multitude of helper or extra methods for special purposes, such as Drag'n'Drop, managing validators etc. - Normally one might expect, that one wxWindows class would always contain - one GTK widget. Under GTK, there is no such allround widget that has all + Normally one might expect, that one wxWindows window would always correspond + to one GTK widget. Under GTK, there is no such allround widget that has all the functionality. Moreover, the GTK defines a client area as a different widget from the actual widget you are handling. Last but not least some special classes (e.g. wxFrame) handle different categories of widgets and @@ -79,18 +79,21 @@ this directory. All windows must have a widget, with which they interact with other under- - lying GTK widget. It is this widget, e.g. that has to be resized etc and + lying GTK widgets. It is this widget, e.g. that has to be resized etc and thw wxWindow class has a member variable called m_widget which holds a - pointer to this widget. When the window class displays a GTK native widget, - this is the only GTK widget the class manages. When the class has a client - area for drawing into and for containing children it must have at least - one more GTK widget to handle (of the type GtkMyFixed, defined in win_gtk.c), - but there can be any number of widgets, handled by a class (e.g. the frame - class handles three). The common rule for all windows is only, that the - widget that interacts with the rest of GTK must be referenced in m_widget - and all other widgets must be children of this widget on the GTK level. - The top-most widget, which also represents the client area, must be in - the m_wxwindow field and must be of the type GtkMyFixed. + pointer to this widget. When the window class represents a GTK native widget, + this is (in most cases) the only GTK widget the class manages. E.g. the + wxStatitText class handles only a GtkLabel widget a pointer to which you + can find in m_widget (defined in wxWindow) + + When the class has a client area for drawing into and for containing children + it has to handle the client area widget (of the type GtkMyFixed, defined in + win_gtk.c), but there could be any number of widgets, handled by a class + The common rule for all windows is only, that the widget that interacts with + the rest of GTK must be referenced in m_widget and all other widgets must be + children of this widget on the GTK level. The top-most widget, which also + represents the client area, must be in the m_wxwindow field and must be of + the type GtkMyFixed. As I said, the window classes that display a GTK native widget only have one widget, so in the case of e.g. the wxButton class m_widget holds a @@ -105,6 +108,16 @@ */ +//----------------------------------------------------------------------------- +// cond comp +//----------------------------------------------------------------------------- + +#if (GTK_MINOR_VERSION == 1) +#if (GTK_MICRO_VERSION >= 3) +#define NEW_GTK_DND_CODE +#endif +#endif + //----------------------------------------------------------------------------- // data //----------------------------------------------------------------------------- @@ -485,60 +498,60 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxWindow *win ) { - if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE; + if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE; - if (g_blockEventsOnDrag) return TRUE; + if (g_blockEventsOnDrag) return TRUE; - if (!win->HasVMT()) return TRUE; + if (!win->HasVMT()) return TRUE; /* - printf( "OnMotion from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnMotion from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - wxMouseEvent event( wxEVT_MOTION ); - event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); - event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); - event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); - event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); - event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); - event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); - event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); + wxMouseEvent event( wxEVT_MOTION ); + event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); + event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK); + event.m_altDown = (gdk_event->state & GDK_MOD1_MASK); + event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK); + event.m_leftDown = (gdk_event->state & GDK_BUTTON1_MASK); + event.m_middleDown = (gdk_event->state & GDK_BUTTON2_MASK); + event.m_rightDown = (gdk_event->state & GDK_BUTTON3_MASK); - event.m_x = (long)gdk_event->x; - event.m_y = (long)gdk_event->y; + event.m_x = (long)gdk_event->x; + event.m_y = (long)gdk_event->y; - // Some control don't have their own X window and thus cannot get - // any events. + // Some control don't have their own X window and thus cannot get + // any events. - if (!g_capturing) - { - wxNode *node = win->GetChildren()->First(); - while (node) + if (!g_capturing) { - wxWindow *child = (wxWindow*)node->Data(); - if ((child->m_x <= event.m_x) && - (child->m_y <= event.m_y) && - (child->m_x+child->m_width >= event.m_x) && - (child->m_y+child->m_height >= event.m_y)) - { - win = child; - event.m_x -= child->m_x; - event.m_y -= child->m_y; - break; - } - node = node->Next(); + wxNode *node = win->GetChildren()->First(); + while (node) + { + wxWindow *child = (wxWindow*)node->Data(); + if ((child->m_x <= event.m_x) && + (child->m_y <= event.m_y) && + (child->m_x+child->m_width >= event.m_x) && + (child->m_y+child->m_height >= event.m_y)) + { + win = child; + event.m_x -= child->m_x; + event.m_y -= child->m_y; + break; + } + node = node->Next(); + } } - } - event.SetEventObject( win ); + event.SetEventObject( win ); - if (win->GetEventHandler()->ProcessEvent( event )) - gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "motion_notify_event" ); + if (win->GetEventHandler()->ProcessEvent( event )) + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "motion_notify_event" ); - return TRUE; + return TRUE; } //----------------------------------------------------------------------------- @@ -547,39 +560,39 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) { - if (g_blockEventsOnDrag) return TRUE; - if (win->m_wxwindow) - { - if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow)) + if (g_blockEventsOnDrag) return TRUE; + if (win->m_wxwindow) { - GTK_WIDGET_SET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS); + if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow)) + { + GTK_WIDGET_SET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS); /* - printf( "SetFocus flag from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "SetFocus flag from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ + } } - } - if (!win->HasVMT()) return TRUE; + if (!win->HasVMT()) return TRUE; /* - printf( "OnSetFocus from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( " " ); - printf( WXSTRINGCAST win->GetLabel() ); - printf( ".\n" ); + printf( "OnSetFocus from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( " " ); + printf( WXSTRINGCAST win->GetLabel() ); + printf( ".\n" ); */ - wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); - event.SetEventObject( win ); + wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); + event.SetEventObject( win ); - if (win->GetEventHandler()->ProcessEvent( event )) - gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" ); + if (win->GetEventHandler()->ProcessEvent( event )) + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" ); - return TRUE; + return TRUE; } //----------------------------------------------------------------------------- @@ -588,29 +601,29 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED( static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) { - if (g_blockEventsOnDrag) return TRUE; - if (win->m_wxwindow) - { - if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow)) - GTK_WIDGET_UNSET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS); - } + if (g_blockEventsOnDrag) return TRUE; + if (win->m_wxwindow) + { + if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow)) + GTK_WIDGET_UNSET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS); + } - if (!win->HasVMT()) return TRUE; + if (!win->HasVMT()) return TRUE; /* - printf( "OnKillFocus from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnKillFocus from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); - event.SetEventObject( win ); + wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); + event.SetEventObject( win ); - if (win->GetEventHandler()->ProcessEvent( event )) - gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" ); + if (win->GetEventHandler()->ProcessEvent( event )) + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" ); - return TRUE; + return TRUE; } //----------------------------------------------------------------------------- @@ -619,29 +632,29 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win ) { - if (widget->window != gdk_event->window) return TRUE; + if (widget->window != gdk_event->window) return TRUE; - if (g_blockEventsOnDrag) return TRUE; + if (g_blockEventsOnDrag) return TRUE; - if (!win->HasVMT()) return TRUE; + if (!win->HasVMT()) return TRUE; /* - printf( "OnEnter from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnEnter from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - if ((widget->window) && (win->m_cursor)) - gdk_window_set_cursor( widget->window, win->m_cursor->GetCursor() ); + if ((widget->window) && (win->m_cursor)) + gdk_window_set_cursor( widget->window, win->m_cursor->GetCursor() ); - wxMouseEvent event( wxEVT_ENTER_WINDOW ); - event.SetEventObject( win ); + wxMouseEvent event( wxEVT_ENTER_WINDOW ); + event.SetEventObject( win ); - if (win->GetEventHandler()->ProcessEvent( event )) - gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" ); + if (win->GetEventHandler()->ProcessEvent( event )) + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" ); - return TRUE; + return TRUE; } //----------------------------------------------------------------------------- @@ -650,29 +663,29 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win ) { - if (widget->window != gdk_event->window) return TRUE; + if (widget->window != gdk_event->window) return TRUE; - if (g_blockEventsOnDrag) return TRUE; + if (g_blockEventsOnDrag) return TRUE; - if (!win->HasVMT()) return TRUE; + if (!win->HasVMT()) return TRUE; /* - printf( "OnLeave from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnLeave from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - if ((widget->window) && (win->m_cursor)) - gdk_window_set_cursor( widget->window, wxSTANDARD_CURSOR->GetCursor() ); + if ((widget->window) && (win->m_cursor)) + gdk_window_set_cursor( widget->window, wxSTANDARD_CURSOR->GetCursor() ); - wxMouseEvent event( wxEVT_LEAVE_WINDOW ); - event.SetEventObject( win ); + wxMouseEvent event( wxEVT_LEAVE_WINDOW ); + event.SetEventObject( win ); - if (win->GetEventHandler()->ProcessEvent( event )) - gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" ); + if (win->GetEventHandler()->ProcessEvent( event )) + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" ); - return TRUE; + return TRUE; } //----------------------------------------------------------------------------- @@ -681,36 +694,36 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *win ) { - if (g_blockEventsOnDrag) return; + if (g_blockEventsOnDrag) return; /* - printf( "OnVScroll from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnVScroll from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - if (!win->HasVMT()) return; + if (!win->HasVMT()) return; - float diff = win->m_vAdjust->value - win->m_oldVerticalPos; - if (fabs(diff) < 0.2) return; + float diff = win->m_vAdjust->value - win->m_oldVerticalPos; + if (fabs(diff) < 0.2) return; - wxEventType command = wxEVT_NULL; + wxEventType command = wxEVT_NULL; - float line_step = win->m_vAdjust->step_increment; - float page_step = win->m_vAdjust->page_increment; + float line_step = win->m_vAdjust->step_increment; + float page_step = win->m_vAdjust->page_increment; - if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; - else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; - else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; - else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; - else command = wxEVT_SCROLL_THUMBTRACK; + if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; + else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; + else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; + else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; + else command = wxEVT_SCROLL_THUMBTRACK; - int value = (int)(win->m_vAdjust->value+0.5); + int value = (int)(win->m_vAdjust->value+0.5); - wxScrollEvent event( command, win->GetId(), value, wxVERTICAL ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + wxScrollEvent event( command, win->GetId(), value, wxVERTICAL ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- @@ -719,36 +732,36 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow *win ) { - if (g_blockEventsOnDrag) return; + if (g_blockEventsOnDrag) return; /* - printf( "OnHScroll from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnHScroll from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - if (!win->HasVMT()) return; + if (!win->HasVMT()) return; - float diff = win->m_hAdjust->value - win->m_oldHorizontalPos; - if (fabs(diff) < 0.2) return; + float diff = win->m_hAdjust->value - win->m_oldHorizontalPos; + if (fabs(diff) < 0.2) return; - wxEventType command = wxEVT_NULL; + wxEventType command = wxEVT_NULL; - float line_step = win->m_hAdjust->step_increment; - float page_step = win->m_hAdjust->page_increment; + float line_step = win->m_hAdjust->step_increment; + float page_step = win->m_hAdjust->page_increment; - if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; - else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; - else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; - else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; - else command = wxEVT_SCROLL_THUMBTRACK; + if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; + else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; + else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; + else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; + else command = wxEVT_SCROLL_THUMBTRACK; - int value = (int)(win->m_hAdjust->value+0.5); + int value = (int)(win->m_hAdjust->value+0.5); - wxScrollEvent event( command, win->GetId(), value, wxHORIZONTAL ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + wxScrollEvent event( command, win->GetId(), value, wxHORIZONTAL ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- @@ -757,23 +770,23 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * static void gtk_window_vscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow *win ) { - if (g_blockEventsOnDrag) return; + if (g_blockEventsOnDrag) return; /* - printf( "OnVScroll change from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnVScroll change from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - if (!win->HasVMT()) return; + if (!win->HasVMT()) return; - wxEventType command = wxEVT_SCROLL_THUMBTRACK; - int value = (int)(win->m_vAdjust->value+0.5); + wxEventType command = wxEVT_SCROLL_THUMBTRACK; + int value = (int)(win->m_vAdjust->value+0.5); - wxScrollEvent event( command, win->GetId(), value, wxVERTICAL ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + wxScrollEvent event( command, win->GetId(), value, wxVERTICAL ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- @@ -782,23 +795,23 @@ static void gtk_window_vscroll_change_callback( GtkWidget *WXUNUSED(widget), wxW static void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow *win ) { - if (g_blockEventsOnDrag) return; + if (g_blockEventsOnDrag) return; /* - printf( "OnHScroll change from " ); - if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) - printf( win->GetClassInfo()->GetClassName() ); - printf( ".\n" ); + printf( "OnHScroll change from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); */ - if (!win->HasVMT()) return; + if (!win->HasVMT()) return; - wxEventType command = wxEVT_SCROLL_THUMBTRACK; - int value = (int)(win->m_hAdjust->value+0.5); + wxEventType command = wxEVT_SCROLL_THUMBTRACK; + int value = (int)(win->m_hAdjust->value+0.5); - wxScrollEvent event( command, win->GetId(), value, wxHORIZONTAL ); - event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + wxScrollEvent event( command, win->GetId(), value, wxHORIZONTAL ); + event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- @@ -807,11 +820,11 @@ static void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxW static gint gtk_scrollbar_button_press_callback( GtkRange *widget, GdkEventButton *gdk_event, wxWindow *win ) { - if (gdk_event->window != widget->slider) return FALSE; + if (gdk_event->window != widget->slider) return FALSE; - win->m_isScrolling = TRUE; + win->m_isScrolling = TRUE; - return FALSE; + return FALSE; } //----------------------------------------------------------------------------- @@ -820,37 +833,42 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *widget, GdkEventButto static gint gtk_scrollbar_button_release_callback( GtkRange *widget, GdkEventButton *gdk_event, wxWindow *win ) { - if (gdk_event->window != widget->slider) return FALSE; + if (gdk_event->window != widget->slider) return FALSE; - GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(win->m_widget); + GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(win->m_widget); - if (widget == GTK_RANGE(s_window->vscrollbar)) - gtk_signal_emit_by_name( GTK_OBJECT(win->m_hAdjust), "value_changed" ); - else - gtk_signal_emit_by_name( GTK_OBJECT(win->m_vAdjust), "value_changed" ); + if (widget == GTK_RANGE(s_window->vscrollbar)) + gtk_signal_emit_by_name( GTK_OBJECT(win->m_hAdjust), "value_changed" ); + else + gtk_signal_emit_by_name( GTK_OBJECT(win->m_vAdjust), "value_changed" ); - win->m_isScrolling = FALSE; + win->m_isScrolling = FALSE; - return FALSE; + return FALSE; } + +#ifdef NEW_GTK_DND_CODE + +#else + //----------------------------------------------------------------------------- // "drop_data_available_event" //----------------------------------------------------------------------------- static void gtk_window_drop_callback( GtkWidget *widget, GdkEventDropDataAvailable *event, wxWindow *win ) { - if (!win->HasVMT()) return; + if (!win->HasVMT()) return; - if (win->GetDropTarget()) - { - int x = 0; - int y = 0; - gdk_window_get_pointer( widget->window, &x, &y, (GdkModifierType *) NULL ); + if (win->GetDropTarget()) + { + int x = 0; + int y = 0; + gdk_window_get_pointer( widget->window, &x, &y, (GdkModifierType *) NULL ); - printf( "Drop data is of type %s.\n", event->data_type ); + printf( "Drop data is of type %s.\n", event->data_type ); - win->GetDropTarget()->OnDrop( x, y, (const void*)event->data, (size_t)event->data_numbytes ); + win->GetDropTarget()->OnDrop( x, y, (const void*)event->data, (size_t)event->data_numbytes ); } /* @@ -859,6 +877,9 @@ static void gtk_window_drop_callback( GtkWidget *widget, GdkEventDropDataAvailab */ } +#endif + // NEW_GTK_DND_CODE + //----------------------------------------------------------------------------- // InsertChild for wxWindow. //----------------------------------------------------------------------------- @@ -889,525 +910,507 @@ static void wxInsertChildInWindow( wxWindow* parent, wxWindow* child ) IMPLEMENT_DYNAMIC_CLASS(wxWindow,wxEvtHandler) BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) - EVT_SIZE(wxWindow::OnSize) - EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) - EVT_INIT_DIALOG(wxWindow::OnInitDialog) - EVT_IDLE(wxWindow::OnIdle) + EVT_SIZE(wxWindow::OnSize) + EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) + EVT_INIT_DIALOG(wxWindow::OnInitDialog) + EVT_IDLE(wxWindow::OnIdle) END_EVENT_TABLE() wxWindow::wxWindow() { - m_widget = (GtkWidget *) NULL; - m_wxwindow = (GtkWidget *) NULL; - m_parent = (wxWindow *) NULL; - m_children.DeleteContents( FALSE ); + m_widget = (GtkWidget *) NULL; + m_wxwindow = (GtkWidget *) NULL; + m_parent = (wxWindow *) NULL; + m_children.DeleteContents( FALSE ); - m_x = 0; - m_y = 0; - m_width = 0; - m_height = 0; - m_minWidth = -1; - m_minHeight = -1; - m_maxWidth = -1; - m_maxHeight = -1; + m_x = 0; + m_y = 0; + m_width = 0; + m_height = 0; + m_minWidth = -1; + m_minHeight = -1; + m_maxWidth = -1; + m_maxHeight = -1; - m_retCode = 0; + m_retCode = 0; - m_eventHandler = this; - m_windowValidator = (wxValidator *) NULL; + m_eventHandler = this; + m_windowValidator = (wxValidator *) NULL; - m_windowId = -1; + m_windowId = -1; - m_cursor = (wxCursor *) NULL; - m_font = *wxSWISS_FONT; - m_windowStyle = 0; - m_windowName = "noname"; + m_cursor = (wxCursor *) NULL; + m_font = *wxSWISS_FONT; + m_windowStyle = 0; + m_windowName = "noname"; - m_constraints = (wxLayoutConstraints *) NULL; - m_constraintsInvolvedIn = (wxList *) NULL; - m_windowSizer = (wxSizer *) NULL; - m_sizerParent = (wxWindow *) NULL; - m_autoLayout = FALSE; + m_constraints = (wxLayoutConstraints *) NULL; + m_constraintsInvolvedIn = (wxList *) NULL; + m_windowSizer = (wxSizer *) NULL; + m_sizerParent = (wxWindow *) NULL; + m_autoLayout = FALSE; - m_sizeSet = FALSE; - m_hasVMT = FALSE; - m_needParent = TRUE; + m_sizeSet = FALSE; + m_hasVMT = FALSE; + m_needParent = TRUE; - m_hasScrolling = FALSE; - m_isScrolling = FALSE; - m_hAdjust = (GtkAdjustment*) NULL; - m_vAdjust = (GtkAdjustment*) NULL; - m_oldHorizontalPos = 0.0; - m_oldVerticalPos = 0.0; + m_hasScrolling = FALSE; + m_isScrolling = FALSE; + m_hAdjust = (GtkAdjustment*) NULL; + m_vAdjust = (GtkAdjustment*) NULL; + m_oldHorizontalPos = 0.0; + m_oldVerticalPos = 0.0; - m_isShown = FALSE; - m_isEnabled = TRUE; + m_isShown = FALSE; + m_isEnabled = TRUE; - m_dropTarget = (wxDropTarget*) NULL; - m_resizing = FALSE; - m_scrollGC = (GdkGC*) NULL; - m_widgetStyle = (GtkStyle*) NULL; + m_dropTarget = (wxDropTarget*) NULL; + m_resizing = FALSE; + m_scrollGC = (GdkGC*) NULL; + m_widgetStyle = (GtkStyle*) NULL; - m_insertCallback = wxInsertChildInWindow; + m_insertCallback = wxInsertChildInWindow; - m_clientObject = (wxClientData*) NULL; - m_clientData = NULL; + m_clientObject = (wxClientData*) NULL; + m_clientData = NULL; } wxWindow::wxWindow( wxWindow *parent, wxWindowID id, - const wxPoint &pos, const wxSize &size, - long style, const wxString &name ) + const wxPoint &pos, const wxSize &size, + long style, const wxString &name ) { - m_insertCallback = wxInsertChildInWindow; - Create( parent, id, pos, size, style, name ); + m_insertCallback = wxInsertChildInWindow; + Create( parent, id, pos, size, style, name ); } bool wxWindow::Create( wxWindow *parent, wxWindowID id, - const wxPoint &pos, const wxSize &size, - long style, const wxString &name ) + const wxPoint &pos, const wxSize &size, + long style, const wxString &name ) { - m_isShown = FALSE; - m_isEnabled = TRUE; - m_needParent = TRUE; + m_isShown = FALSE; + m_isEnabled = TRUE; + m_needParent = TRUE; - PreCreation( parent, id, pos, size, style, name ); + PreCreation( parent, id, pos, size, style, name ); - m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); - m_hasScrolling = TRUE; + m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); + m_hasScrolling = TRUE; - GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(m_widget); + GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(m_widget); - gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_press_event", + gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_press_event", (GtkSignalFunc)gtk_scrollbar_button_press_callback, (gpointer) this ); - gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_press_event", + gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_press_event", (GtkSignalFunc)gtk_scrollbar_button_press_callback, (gpointer) this ); - gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_release_event", + gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_release_event", (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this ); - gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_release_event", + gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_release_event", (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this ); - GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); - scroll_class->scrollbar_spacing = 0; + GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); + scroll_class->scrollbar_spacing = 0; - gtk_scrolled_window_set_policy( s_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + gtk_scrolled_window_set_policy( s_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); - m_oldHorizontalPos = 0.0; - m_oldVerticalPos = 0.0; + m_oldHorizontalPos = 0.0; + m_oldVerticalPos = 0.0; - m_hAdjust = gtk_range_get_adjustment( GTK_RANGE(s_window->hscrollbar) ); - m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(s_window->vscrollbar) ); + m_hAdjust = gtk_range_get_adjustment( GTK_RANGE(s_window->hscrollbar) ); + m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(s_window->vscrollbar) ); - gtk_signal_connect( GTK_OBJECT(m_hAdjust), "value_changed", + gtk_signal_connect( GTK_OBJECT(m_hAdjust), "value_changed", (GtkSignalFunc) gtk_window_hscroll_callback, (gpointer) this ); - gtk_signal_connect( GTK_OBJECT(m_vAdjust), "value_changed", + gtk_signal_connect( GTK_OBJECT(m_vAdjust), "value_changed", (GtkSignalFunc) gtk_window_vscroll_callback, (gpointer) this ); - gtk_signal_connect( GTK_OBJECT(m_hAdjust), "changed", + gtk_signal_connect( GTK_OBJECT(m_hAdjust), "changed", (GtkSignalFunc) gtk_window_hscroll_change_callback, (gpointer) this ); - gtk_signal_connect(GTK_OBJECT(m_vAdjust), "changed", + gtk_signal_connect(GTK_OBJECT(m_vAdjust), "changed", (GtkSignalFunc) gtk_window_vscroll_change_callback, (gpointer) this ); - GtkViewport *viewport = GTK_VIEWPORT(s_window->viewport); + GtkViewport *viewport = GTK_VIEWPORT(s_window->viewport); - if (m_windowStyle & wxRAISED_BORDER) - { - gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_OUT ); - } - else if (m_windowStyle & wxSUNKEN_BORDER) - { - gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_IN ); - } - else - { - gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_NONE ); - } + if (m_windowStyle & wxRAISED_BORDER) + { + gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_OUT ); + } + else if (m_windowStyle & wxSUNKEN_BORDER) + { + gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_IN ); + } + else + { + gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_NONE ); + } - m_wxwindow = gtk_myfixed_new(); + m_wxwindow = gtk_myfixed_new(); - GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); + GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); - if (m_windowStyle & wxTAB_TRAVERSAL == wxTAB_TRAVERSAL) - GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); - else - GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); - - gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); - - // shut the viewport up - gtk_viewport_set_hadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ); - gtk_viewport_set_vadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ); - - // I _really_ don't want scrollbars in the beginning - m_vAdjust->lower = 0.0; - m_vAdjust->upper = 1.0; - m_vAdjust->value = 0.0; - m_vAdjust->step_increment = 1.0; - m_vAdjust->page_increment = 1.0; - m_vAdjust->page_size = 5.0; - gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "changed" ); - m_hAdjust->lower = 0.0; - m_hAdjust->upper = 1.0; - m_hAdjust->value = 0.0; - m_hAdjust->step_increment = 1.0; - m_hAdjust->page_increment = 1.0; - m_hAdjust->page_size = 5.0; - gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); - - gtk_widget_show( m_wxwindow ); + if (m_windowStyle & wxTAB_TRAVERSAL == wxTAB_TRAVERSAL) + GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); + else + GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); + + gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); + + // shut the viewport up + gtk_viewport_set_hadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ); + gtk_viewport_set_vadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ); + + // I _really_ don't want scrollbars in the beginning + m_vAdjust->lower = 0.0; + m_vAdjust->upper = 1.0; + m_vAdjust->value = 0.0; + m_vAdjust->step_increment = 1.0; + m_vAdjust->page_increment = 1.0; + m_vAdjust->page_size = 5.0; + gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "changed" ); + m_hAdjust->lower = 0.0; + m_hAdjust->upper = 1.0; + m_hAdjust->value = 0.0; + m_hAdjust->step_increment = 1.0; + m_hAdjust->page_increment = 1.0; + m_hAdjust->page_size = 5.0; + gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); + + gtk_widget_show( m_wxwindow ); - if (m_parent) m_parent->AddChild( this ); + if (m_parent) m_parent->AddChild( this ); - (m_parent->m_insertCallback)( m_parent, this ); + (m_parent->m_insertCallback)( m_parent, this ); - PostCreation(); + PostCreation(); - Show( TRUE ); + Show( TRUE ); - return TRUE; + return TRUE; } wxWindow::~wxWindow() { - m_hasVMT = FALSE; + m_hasVMT = FALSE; - if (m_dropTarget) delete m_dropTarget; + if (m_dropTarget) delete m_dropTarget; - if (m_parent) m_parent->RemoveChild( this ); - if (m_widget) Show( FALSE ); + if (m_parent) m_parent->RemoveChild( this ); + if (m_widget) Show( FALSE ); - DestroyChildren(); + DestroyChildren(); - if (m_widgetStyle) gtk_style_unref( m_widgetStyle ); + if (m_widgetStyle) gtk_style_unref( m_widgetStyle ); - if (m_scrollGC) gdk_gc_unref( m_scrollGC ); + if (m_scrollGC) gdk_gc_unref( m_scrollGC ); - if (m_wxwindow) gtk_widget_destroy( m_wxwindow ); + if (m_wxwindow) gtk_widget_destroy( m_wxwindow ); - if (m_widget) gtk_widget_destroy( m_widget ); + if (m_widget) gtk_widget_destroy( m_widget ); - wxDELETE(m_cursor); + if (m_cursor) delete m_cursor; - DeleteRelatedConstraints(); - if (m_constraints) - { - // This removes any dangling pointers to this window - // in other windows' constraintsInvolvedIn lists. - UnsetConstraints(m_constraints); - delete m_constraints; - m_constraints = (wxLayoutConstraints *) NULL; - } - if (m_windowSizer) - { - delete m_windowSizer; - m_windowSizer = (wxSizer *) NULL; - } - // If this is a child of a sizer, remove self from parent - if (m_sizerParent) m_sizerParent->RemoveChild((wxWindow *)this); + DeleteRelatedConstraints(); + if (m_constraints) + { + // This removes any dangling pointers to this window + // in other windows' constraintsInvolvedIn lists. + UnsetConstraints(m_constraints); + delete m_constraints; + m_constraints = (wxLayoutConstraints *) NULL; + } + if (m_windowSizer) + { + delete m_windowSizer; + m_windowSizer = (wxSizer *) NULL; + } + // If this is a child of a sizer, remove self from parent + if (m_sizerParent) m_sizerParent->RemoveChild((wxWindow *)this); - // Just in case the window has been Closed, but - // we're then deleting immediately: don't leave - // dangling pointers. - wxPendingDelete.DeleteObject(this); + // Just in case the window has been Closed, but + // we're then deleting immediately: don't leave + // dangling pointers. + wxPendingDelete.DeleteObject(this); - // Just in case we've loaded a top-level window via - // wxWindow::LoadNativeDialog but we weren't a dialog - // class - wxTopLevelWindows.DeleteObject(this); + // Just in case we've loaded a top-level window via + // wxWindow::LoadNativeDialog but we weren't a dialog + // class + wxTopLevelWindows.DeleteObject(this); - if (m_windowValidator) delete m_windowValidator; + if (m_windowValidator) delete m_windowValidator; - if (m_clientObject) delete m_clientObject; + if (m_clientObject) delete m_clientObject; } void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { - if (m_needParent && (parent == NULL)) - wxFatalError( "Need complete parent.", name ); + if (m_needParent && (parent == NULL)) + wxFatalError( "Need complete parent.", name ); - m_widget = (GtkWidget*) NULL; - m_wxwindow = (GtkWidget*) NULL; - m_hasVMT = FALSE; - m_parent = parent; - m_children.DeleteContents( FALSE ); + m_widget = (GtkWidget*) NULL; + m_wxwindow = (GtkWidget*) NULL; + m_hasVMT = FALSE; + m_parent = parent; + m_children.DeleteContents( FALSE ); - m_width = size.x; - if (m_width == -1) m_width = 20; - m_height = size.y; - if (m_height == -1) m_height = 20; + m_width = size.x; + if (m_width == -1) m_width = 20; + m_height = size.y; + if (m_height == -1) m_height = 20; - m_x = (int)pos.x; - m_y = (int)pos.y; + m_x = (int)pos.x; + m_y = (int)pos.y; - if (!m_needParent) // some reasonable defaults - { - if (m_x == -1) - { - m_x = (gdk_screen_width () - m_width) / 2; - if (m_x < 10) m_x = 10; - } - if (m_y == -1) + if (!m_needParent) // some reasonable defaults { - m_y = (gdk_screen_height () - m_height) / 2; - if (m_y < 10) m_y = 10; + if (m_x == -1) + { + m_x = (gdk_screen_width () - m_width) / 2; + if (m_x < 10) m_x = 10; + } + if (m_y == -1) + { + m_y = (gdk_screen_height () - m_height) / 2; + if (m_y < 10) m_y = 10; + } } - } - m_minWidth = -1; - m_minHeight = -1; - m_maxWidth = -1; - m_maxHeight = -1; + m_minWidth = -1; + m_minHeight = -1; + m_maxWidth = -1; + m_maxHeight = -1; - m_retCode = 0; + m_retCode = 0; - m_eventHandler = this; + m_eventHandler = this; - m_windowId = id; + m_windowId = id; - m_sizeSet = FALSE; + m_sizeSet = FALSE; - m_cursor = new wxCursor( wxCURSOR_ARROW ); - m_font = *wxSWISS_FONT; + m_cursor = new wxCursor( wxCURSOR_ARROW ); + m_font = *wxSWISS_FONT; // m_backgroundColour = wxWHITE; // m_foregroundColour = wxBLACK; - m_windowStyle = style; - m_windowName = name; + m_windowStyle = style; + m_windowName = name; - m_constraints = (wxLayoutConstraints *) NULL; - m_constraintsInvolvedIn = (wxList *) NULL; - m_windowSizer = (wxSizer *) NULL; - m_sizerParent = (wxWindow *) NULL; - m_autoLayout = FALSE; + m_constraints = (wxLayoutConstraints *) NULL; + m_constraintsInvolvedIn = (wxList *) NULL; + m_windowSizer = (wxSizer *) NULL; + m_sizerParent = (wxWindow *) NULL; + m_autoLayout = FALSE; - m_hasScrolling = FALSE; - m_isScrolling = FALSE; - m_hAdjust = (GtkAdjustment *) NULL; - m_vAdjust = (GtkAdjustment *) NULL; - m_oldHorizontalPos = 0.0; - m_oldVerticalPos = 0.0; + m_hasScrolling = FALSE; + m_isScrolling = FALSE; + m_hAdjust = (GtkAdjustment *) NULL; + m_vAdjust = (GtkAdjustment *) NULL; + m_oldHorizontalPos = 0.0; + m_oldVerticalPos = 0.0; - m_isShown = FALSE; - m_isEnabled = TRUE; + m_isShown = FALSE; + m_isEnabled = TRUE; - m_dropTarget = (wxDropTarget *) NULL; - m_resizing = FALSE; - m_windowValidator = (wxValidator *) NULL; - m_scrollGC = (GdkGC*) NULL; - m_widgetStyle = (GtkStyle*) NULL; + m_dropTarget = (wxDropTarget *) NULL; + m_resizing = FALSE; + m_windowValidator = (wxValidator *) NULL; + m_scrollGC = (GdkGC*) NULL; + m_widgetStyle = (GtkStyle*) NULL; - m_clientObject = (wxClientData*)NULL; - m_clientData = NULL; + m_clientObject = (wxClientData*)NULL; + m_clientData = NULL; } void wxWindow::PostCreation() { - if (m_wxwindow) - { - gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event", - GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this ); + if (m_wxwindow) + { + gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event", + GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw", - GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); - } + gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw", + GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); + } - ConnectWidget( GetConnectWidget() ); + ConnectWidget( GetConnectWidget() ); - if (m_widget && m_parent) gtk_widget_realize( m_widget ); + if (m_widget && m_parent) gtk_widget_realize( m_widget ); - if (m_wxwindow) gtk_widget_realize( m_wxwindow ); + if (m_wxwindow) gtk_widget_realize( m_wxwindow ); - SetCursor( *wxSTANDARD_CURSOR ); + SetCursor( *wxSTANDARD_CURSOR ); - m_hasVMT = TRUE; + m_hasVMT = TRUE; } void wxWindow::ConnectWidget( GtkWidget *widget ) { - gtk_signal_connect( GTK_OBJECT(widget), "key_press_event", - GTK_SIGNAL_FUNC(gtk_window_key_press_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "key_press_event", + GTK_SIGNAL_FUNC(gtk_window_key_press_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "button_press_event", - GTK_SIGNAL_FUNC(gtk_window_button_press_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "button_press_event", + GTK_SIGNAL_FUNC(gtk_window_button_press_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "button_release_event", - GTK_SIGNAL_FUNC(gtk_window_button_release_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "button_release_event", + GTK_SIGNAL_FUNC(gtk_window_button_release_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "motion_notify_event", - GTK_SIGNAL_FUNC(gtk_window_motion_notify_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "motion_notify_event", + GTK_SIGNAL_FUNC(gtk_window_motion_notify_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "focus_in_event", - GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "focus_in_event", + GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "focus_out_event", - GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "focus_out_event", + GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "enter_notify_event", - GTK_SIGNAL_FUNC(gtk_window_enter_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "enter_notify_event", + GTK_SIGNAL_FUNC(gtk_window_enter_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(widget), "leave_notify_event", - GTK_SIGNAL_FUNC(gtk_window_leave_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(widget), "leave_notify_event", + GTK_SIGNAL_FUNC(gtk_window_leave_callback), (gpointer)this ); } bool wxWindow::HasVMT() { - return m_hasVMT; + return m_hasVMT; } bool wxWindow::Close( bool force ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId); - event.SetEventObject(this); - event.SetForce(force); + wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId); + event.SetEventObject(this); + event.SetForce(force); - return GetEventHandler()->ProcessEvent(event); + return GetEventHandler()->ProcessEvent(event); } bool wxWindow::Destroy() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - m_hasVMT = FALSE; - delete this; - return TRUE; + m_hasVMT = FALSE; + delete this; + return TRUE; } bool wxWindow::DestroyChildren() { - if (GetChildren()) - { - wxNode *node; - while ((node = GetChildren()->First()) != (wxNode *)NULL) + if (GetChildren()) { - wxWindow *child; - if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) - { - delete child; - if (GetChildren()->Member(child)) delete node; - } + wxNode *node; + while ((node = GetChildren()->First()) != (wxNode *)NULL) + { + wxWindow *child; + if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) + { + delete child; + if (GetChildren()->Member(child)) delete node; + } + } } - } - return TRUE; + return TRUE; } void wxWindow::PrepareDC( wxDC &WXUNUSED(dc) ) { - // are we to set fonts here ? + // are we to set fonts here ? } wxPoint wxWindow::GetClientAreaOrigin() const { - return wxPoint(0,0); + return wxPoint(0,0); } void wxWindow::AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ) { - if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent()) - { - wxPoint pt(GetParent()->GetClientAreaOrigin()); - x += pt.x; - y += pt.y; - } -} - -void wxWindow::ImplementSetSize() -{ - if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; - if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; - if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_minWidth; - if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_minHeight; - gtk_widget_set_usize( m_widget, m_width, m_height ); -} - -void wxWindow::ImplementSetPosition() -{ - if (!m_parent) - { - wxFAIL_MSG( "wxWindow::SetSize error.\n" ); - return; - } - - if ((m_parent) && (m_parent->m_wxwindow)) - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x, m_y ); - - // Don't do anything for children of wxNotebook and wxMDIChildFrame + if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent()) + { + wxPoint pt(GetParent()->GetClientAreaOrigin()); + x += pt.x; + y += pt.y; + } } void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - - if (m_resizing) return; // I don't like recursions - m_resizing = TRUE; + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_parent != NULL), "wxWindow::SetSize requires parent.\n" ); + + // Don't do anything for children of wxNotebook + if (m_parent->m_wxwindow == NULL) return; - int newX = x; - int newY = y; - int newW = width; - int newH = height; + if (m_resizing) return; // I don't like recursions + m_resizing = TRUE; - if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING) - { - if (newX == -1) newX = m_x; - if (newY == -1) newY = m_y; - if (newW == -1) newW = m_width; - if (newH == -1) newH = m_height; - } + int old_width = m_width; + int old_height = m_height; + + if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING) + { + if (x != -1) m_x = x; + if (y != -1) m_y = y; + if (width != -1) m_width = width; + if (height != -1) m_height = height; + } + else + { + m_x = x; + m_y = y; + m_width = width; + m_height = height; + } - if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) - { - if (newW == -1) newW = 80; - } + if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) + { + if (width == -1) m_width = 80; + } - if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT) - { - if (newH == -1) newH = 26; - } + if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT) + { + if (height == -1) m_height = 26; + } + + if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; + if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; + if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_minWidth; + if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_minHeight; - AdjustForParentClientOrigin( newX, newY, sizeFlags ); + wxPoint pt( m_parent->GetClientAreaOrigin() ); + gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x+pt.x, m_y+pt.y ); - if ((m_x != newX) || (m_y != newY) || (!m_sizeSet)) - { - m_x = newX; - m_y = newY; - ImplementSetPosition(); - } + if ((old_width != m_width) || (old_height != m_height)) + gtk_widget_set_usize( m_widget, m_width, m_height ); - if ((m_width != newW) || (m_height != newH) || (!m_sizeSet)) - { - m_width = newW; - m_height = newH; - ImplementSetSize(); - } - m_sizeSet = TRUE; + m_sizeSet = TRUE; - wxSizeEvent event( wxSize(m_width,m_height), GetId() ); - event.SetEventObject( this ); - ProcessEvent( event ); + wxSizeEvent event( wxSize(m_width,m_height), GetId() ); + event.SetEventObject( this ); + ProcessEvent( event ); - m_resizing = FALSE; + m_resizing = FALSE; } void wxWindow::SetSize( int width, int height ) { - SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); + SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); } void wxWindow::Move( int x, int y ) { - SetSize( x, y, -1, -1, wxSIZE_USE_EXISTING ); + SetSize( x, y, -1, -1, wxSIZE_USE_EXISTING ); } void wxWindow::GetSize( int *width, int *height ) const { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - if (width) (*width) = m_width; - if (height) (*height) = m_height; + if (width) (*width) = m_width; + if (height) (*height) = m_height; } void wxWindow::SetClientSize( int width, int height ) @@ -1534,51 +1537,41 @@ void wxWindow::GetClientSize( int *width, int *height ) const void wxWindow::GetPosition( int *x, int *y ) const { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - int xx = m_x; - int yy = m_y; - - if (GetParent()) - { - wxPoint pt(GetParent()->GetClientAreaOrigin()); - xx -= pt.x; - yy -= pt.y; - } - - if (x) (*x) = xx; - if (y) (*y) = yy; + if (x) (*x) = m_x; + if (y) (*y) = m_y; } void wxWindow::ClientToScreen( int *x, int *y ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - GdkWindow *source = (GdkWindow *) NULL; - if (m_wxwindow) - source = m_wxwindow->window; - else - source = m_widget->window; + GdkWindow *source = (GdkWindow *) NULL; + if (m_wxwindow) + source = m_wxwindow->window; + else + source = m_widget->window; - int org_x = 0; - int org_y = 0; - gdk_window_get_origin( source, &org_x, &org_y ); + int org_x = 0; + int org_y = 0; + gdk_window_get_origin( source, &org_x, &org_y ); - if (!m_wxwindow) - { - if (GTK_WIDGET_NO_WINDOW (m_widget)) + if (!m_wxwindow) { - org_x += m_widget->allocation.x; - org_y += m_widget->allocation.y; + if (GTK_WIDGET_NO_WINDOW (m_widget)) + { + org_x += m_widget->allocation.x; + org_y += m_widget->allocation.y; + } } - } - wxPoint pt(GetClientAreaOrigin()); - org_x += pt.x; - org_y += pt.y; + wxPoint pt(GetClientAreaOrigin()); + org_x += pt.x; + org_y += pt.y; - if (x) *x += org_x; - if (y) *y += org_y; + if (x) *x += org_x; + if (y) *y += org_y; } void wxWindow::ScreenToClient( int *x, int *y ) @@ -1616,24 +1609,24 @@ void wxWindow::Centre( int direction ) { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - if (IS_KIND_OF(this,wxDialog) || IS_KIND_OF(this,wxFrame)) - { - if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (gdk_screen_width () - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) m_y = (gdk_screen_height () - m_height) / 2; - ImplementSetPosition(); - } - else + int x = m_x; + int y = m_y; + + if (m_parent) { - if (m_parent) - { int p_w = 0; int p_h = 0; m_parent->GetSize( &p_w, &p_h ); - if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (p_w - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) m_y = (p_h - m_height) / 2; - ImplementSetPosition(); - } + if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (p_w - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) y = (p_h - m_height) / 2; } + else + { + if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2; + } + + Move( x, y ); } void wxWindow::Fit() @@ -2221,18 +2214,32 @@ void wxWindow::ConnectDnDWidget( GtkWidget *widget ) m_dropTarget->RegisterWidget( widget ); +#ifdef NEW_GTK_DND_CODE + +#else + gtk_signal_connect( GTK_OBJECT(widget), "drop_data_available_event", GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); + +#endif + } void wxWindow::DisconnectDnDWidget( GtkWidget *widget ) { if (!m_dropTarget) return; +#ifdef NEW_GTK_DND_CODE + +#else + gtk_signal_disconnect_by_func( GTK_OBJECT(widget), GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); m_dropTarget->UnregisterWidget( widget ); + +#endif + } GtkWidget* wxWindow::GetConnectWidget()