static void gtk_notebook_realized_callback( GtkWidget * WXUNUSED(widget), wxWindow *win ) { if (g_isIdle) wxapp_install_idle_handler(); /* GTK 1.2 up to version 1.2.5 is broken so that we have to call a queue_resize here in order to make repositioning before showing to take effect. */ gtk_widget_queue_resize( win->m_widget ); }
static void gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) { if (!win->m_hasVMT) return; if (g_isIdle) wxapp_install_idle_handler(); win->CalculateScrollbar(); }
static gint gtk_dnd_window_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxDropSource *source ) { if (g_isIdle) wxapp_install_idle_handler(); source->GiveFeedback( ConvertFromGTK(source->m_dragContext->action) ); return 0; }
static void source_drag_end( GtkWidget *WXUNUSED(widget), GdkDragContext *WXUNUSED(context), wxDropSource *drop_source ) { if (g_isIdle) wxapp_install_idle_handler(); // printf( "Drag source: drag_end.\n" ); drop_source->m_waiting = false; }
static gboolean gtk_frame_focus_callback( GtkWidget *WXUNUSED(widget), GtkDirectionType WXUNUSED(d), wxWindow *WXUNUSED(win) ) { if (g_isIdle) wxapp_install_idle_handler(); // This disables GTK's tab traversal return TRUE; }
static void gtk_fontdialog_cancel_callback( GtkWidget *WXUNUSED(w), wxFontDialog *dialog ) { if (g_isIdle) wxapp_install_idle_handler(); wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); event.SetEventObject( dialog ); dialog->GetEventHandler()->ProcessEvent( event ); }
static void gtk_fontdialog_cancel_callback( GtkWidget *WXUNUSED(w), wxFontDialog *dialog ) { if (g_isIdle) wxapp_install_idle_handler(); wxCommandEvent event(wxEVT_BUTTON, wxID_CANCEL); event.SetEventObject( dialog ); dialog->HandleWindowEvent( event ); }
static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *win ) { if (g_isIdle) wxapp_install_idle_handler(); if (!win->m_hasVMT) return; if (g_blockEventsOnDrag) return; float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < sensitivity) return; wxEventType command = wxEVT_NULL; float line_step = win->m_adjust->step_increment; if (fabs(diff-line_step) < sensitivity) command = wxEVT_SCROLL_LINEUP; else if (fabs(diff+line_step) < sensitivity) command = wxEVT_SCROLL_LINEDOWN; else command = wxEVT_SCROLL_THUMBTRACK; int value = (int)ceil(win->m_adjust->value); wxSpinEvent event( command, win->GetId()); event.SetPosition( value ); event.SetEventObject( win ); if ((win->HandleWindowEvent( event )) && !event.IsAllowed() ) { /* program has vetoed */ win->m_adjust->value = win->m_oldPos; gtk_signal_disconnect_by_func( GTK_OBJECT (win->m_adjust), (GtkSignalFunc) gtk_spinbutt_callback, (gpointer) win ); gtk_signal_emit_by_name( GTK_OBJECT(win->m_adjust), "value_changed" ); gtk_signal_connect( GTK_OBJECT (win->m_adjust), "value_changed", (GtkSignalFunc) gtk_spinbutt_callback, (gpointer) win ); return; } win->m_oldPos = win->m_adjust->value; /* always send a thumbtrack event */ if (command != wxEVT_SCROLL_THUMBTRACK) { command = wxEVT_SCROLL_THUMBTRACK; wxSpinEvent event2( command, win->GetId()); event2.SetPosition( value ); event2.SetEventObject( win ); win->HandleWindowEvent( event2 ); } }
static void target_drag_data_received( GtkWidget *WXUNUSED(widget), GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint WXUNUSED(info), guint time, wxDropTarget *drop_target ) { if (g_isIdle) wxapp_install_idle_handler(); /* Owen Taylor: "call gtk_drag_finish() with success == TRUE" */ if ((data->length <= 0) || (data->format != 8)) { /* negative data length and non 8-bit data format qualifies for junk */ gtk_drag_finish (context, FALSE, FALSE, time); return; } #ifdef __WXDEBUG__ wxLogTrace(TRACE_DND, wxT( "Drop target: data received event") ); #endif /* inform the wxDropTarget about the current GtkSelectionData. this is only valid for the duration of this call */ drop_target->SetDragData( data ); wxDragResult result = ConvertFromGTK(context->action); if ( wxIsDragResultOk( drop_target->OnData( x, y, result ) ) ) { #ifdef __WXDEBUG__ wxLogTrace(TRACE_DND, wxT( "Drop target: OnData returned true") ); #endif /* tell GTK that data transfer was successful */ gtk_drag_finish( context, TRUE, FALSE, time ); } else { #ifdef __WXDEBUG__ wxLogTrace(TRACE_DND, wxT( "Drop target: OnData returned FALSE") ); #endif /* tell GTK that data transfer was not successful */ gtk_drag_finish( context, FALSE, FALSE, time ); } /* after this, invalidate the drop_target's drag data */ drop_target->SetDragData( (GtkSelectionData*) NULL ); }
static void gtk_glwindow_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxGLCanvas *win ) { if (g_isIdle) wxapp_install_idle_handler(); win->m_exposed = TRUE; win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); }
static void gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxGLCanvas *win ) { if (g_isIdle) wxapp_install_idle_handler(); win->GetUpdateRegion().Union( gdk_event->area.x, gdk_event->area.y, gdk_event->area.width, gdk_event->area.height ); }
static void gtk_dirdialog_response_callback(GtkWidget *w, gint response, wxDirDialog *dialog) { wxapp_install_idle_handler(); if (response == GTK_RESPONSE_ACCEPT) gtk_dirdialog_ok_callback(w, dialog); else // GTK_RESPONSE_CANCEL or GTK_RESPONSE_NONE gtk_dirdialog_cancel_callback(w, dialog); }
static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxTopLevelWindowGTK *win ) { if (g_isIdle) wxapp_install_idle_handler(); if (win->IsEnabled() && (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) || win->IsGrabbed())) win->Close(); return TRUE; }
static gint gtk_listbox_realized_callback( GtkWidget *m_widget, wxListBox *win ) { if (g_isIdle) wxapp_install_idle_handler(); GList *child = win->m_list->children; for (child = win->m_list->children; child != NULL; child = child->next) gtk_widget_show( GTK_WIDGET(child->data) ); return false; }
static void gtkcombobox_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { if (g_isIdle) wxapp_install_idle_handler(); if (!combo->m_hasVMT) return; wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); event.SetString( combo->GetValue() ); event.SetEventObject( combo ); combo->GetEventHandler()->ProcessEvent( event ); }
static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxButton *button ) { if (g_isIdle) wxapp_install_idle_handler(); if (!button->m_hasVMT) return; if (g_blockEventsOnDrag) return; wxCommandEvent event(wxEVT_BUTTON, button->GetId()); event.SetEventObject(button); button->HandleWindowEvent(event); }
static void gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget), GtkNotebookPage *page, gint WXUNUSED(page_num), wxMDIParentFrame *parent ) { if (g_isIdle) wxapp_install_idle_handler(); // send deactivate event to old child wxMDIChildFrame *child = parent->GetActiveChild(); if (child) { wxActivateEvent event1( wxEVT_ACTIVATE, false, child->GetId() ); event1.SetEventObject( child); child->GetEventHandler()->ProcessEvent( event1 ); } // send activate event to new child wxMDIClientWindow *client_window = parent->GetClientWindow(); if (!client_window) return; child = (wxMDIChildFrame*) NULL; wxWindowList::compatibility_iterator node = client_window->GetChildren().GetFirst(); while (node) { wxMDIChildFrame *child_frame = wxDynamicCast( node->GetData(), wxMDIChildFrame ); // CE: we come here in the destructor with a null child_frame - I think because // gtk_signal_connect( GTK_OBJECT(m_widget), "switch_page", (see below) // isn't deleted early enough if (!child_frame) return ; if (child_frame->m_page == page) { child = child_frame; break; } node = node->GetNext(); } if (!child) return; wxActivateEvent event2( wxEVT_ACTIVATE, true, child->GetId() ); event2.SetEventObject( child); child->GetEventHandler()->ProcessEvent( event2 ); }
static void gtk_value_changed(GtkSpinButton* spinbutton, wxSpinCtrl* win) { if (g_isIdle) wxapp_install_idle_handler(); if (!win->m_hasVMT || g_blockEventsOnDrag || win->m_blockScrollEvent) return; wxCommandEvent event( wxEVT_COMMAND_SPINCTRL_UPDATED, win->GetId()); event.SetEventObject( win ); event.SetInt(win->GetValue()); win->GetEventHandler()->ProcessEvent( event ); }
static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust, SCROLLBAR_CBACK_ARG wxScrolledWindow *win ) { if (g_isIdle) wxapp_install_idle_handler(); if (g_blockEventsOnDrag) return; if (!win->m_hasVMT) return; win->GtkHScroll( adjust->value, GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->hscrollbar) ); }
static void gtk_glcanvas_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxGLCanvas *win ) { if (g_isIdle) wxapp_install_idle_handler(); if (!win->m_hasVMT) return; wxSizeEvent event( wxSize(win->m_width,win->m_height), win->GetId() ); event.SetEventObject( win ); win->GetEventHandler()->ProcessEvent( event ); }
static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win ) { if (g_isIdle) wxapp_install_idle_handler(); if (!win->m_hasVMT) return; // Raise the client area area gdk_window_raise( win->m_wxwindow->window ); win->m_menuBarDetached = true; win->GtkUpdateSize(); }
wxApp::wxApp() { #ifdef __WXDEBUG__ m_isInAssert = false; #endif // __WXDEBUG__ m_idleTag = 0; g_isIdle = true; wxapp_install_idle_handler(); // this is NULL for a "regular" wxApp, but is set (and freed) by a wxGLApp m_glVisualInfo = (void *) NULL; m_glFBCInfo = (void *) NULL; }
static void gtkcombo_combo_select_child_callback( GtkList *WXUNUSED(list), GtkWidget *WXUNUSED(widget), wxComboBox *combo ) { if (g_isIdle) wxapp_install_idle_handler(); if (!combo->m_hasVMT) return; if (g_blockEventsOnDrag) return; int curSelection = combo->GetCurrentSelection(); if (combo->m_prevSelection == curSelection) return; GtkWidget *list = GTK_COMBO(combo->m_widget)->list; gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection ); combo->m_prevSelection = curSelection; // Quickly set the value of the combo box // as GTK+ does that only AFTER the event // is sent. g_signal_handlers_disconnect_by_func (GTK_COMBO (combo->GetHandle())->entry, (gpointer) gtkcombo_text_changed_callback, combo); combo->SetValue( combo->GetStringSelection() ); g_signal_connect_after (GTK_COMBO (combo->GetHandle())->entry, "changed", G_CALLBACK (gtkcombo_text_changed_callback), combo); // throw a SELECTED event only if the combobox popup is hidden (wxID_NONE) // because when combobox popup is shown, gtkcombo_combo_select_child_callback is // called each times the mouse is over an item with a pressed button so a lot // of SELECTED event could be generated if the user keep the mouse button down // and select other items ... if (g_SelectionBeforePopup == wxID_NONE) { wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() ); event.SetInt( curSelection ); event.SetString( combo->GetStringSelection() ); event.SetEventObject( combo ); combo->GetEventHandler()->ProcessEvent( event ); // for consistency with the other ports, don't generate text update // events while the user is browsing the combobox neither wxCommandEvent event2( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() ); event2.SetString( combo->GetValue() ); event2.SetEventObject( combo ); combo->GetEventHandler()->ProcessEvent( event2 ); } }
static gint gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox ) { if (g_isIdle) wxapp_install_idle_handler(); if (g_blockEventsOnDrag) return FALSE; if (g_blockEventsOnScroll) return FALSE; if (!listbox->m_hasVMT) return FALSE; int sel = listbox->GtkGetIndex( widget ); #if wxUSE_CHECKLISTBOX if ((listbox->m_hasCheckBoxes) && (gdk_event->x < 15) && (gdk_event->type != GDK_2BUTTON_PRESS)) { wxCheckListBox *clb = (wxCheckListBox *)listbox; clb->Check( sel, !clb->IsChecked(sel) ); wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, listbox->GetId() ); event.SetEventObject( listbox ); event.SetInt( sel ); listbox->GetEventHandler()->ProcessEvent( event ); } #endif // wxUSE_CHECKLISTBOX if ((gdk_event->state == 0) && (((listbox->GetWindowStyleFlag() & wxLB_MULTIPLE) != 0) || ((listbox->GetWindowStyleFlag() & wxLB_EXTENDED) != 0)) ) { listbox->m_blockEvent = true; int i; for (i = 0; i < (int)listbox->GetCount(); i++) if (i != sel) gtk_list_unselect_item( GTK_LIST(listbox->m_list), i ); listbox->m_blockEvent = false; return false; } /* emit wxEVT_COMMAND_LISTBOX_DOUBLECLICKED later */ g_hasDoubleClicked = (gdk_event->type == GDK_2BUTTON_PRESS); return FALSE; }
static void gtk_listitem_select_cb( GtkWidget *widget, wxListBox *listbox, bool is_selection ) { if (g_isIdle) wxapp_install_idle_handler(); if (!listbox->m_hasVMT) return; if (g_blockEventsOnDrag) return; if (listbox->m_blockEvent) return; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); event.SetEventObject( listbox ); // indicate whether this is a selection or a deselection event.SetExtraLong( is_selection ); if ((listbox->GetWindowStyleFlag() & wxLB_SINGLE) != 0) { int sel = listbox->GtkGetIndex( widget ); if (listbox->m_prevSelection != sel) gtk_list_unselect_item( listbox->m_list, listbox->m_prevSelection ); listbox->m_prevSelection = sel; } wxArrayInt aSelections; int n, count = listbox->GetSelections(aSelections); if ( count > 0 ) { n = aSelections[0]; if ( listbox->HasClientObjectData() ) event.SetClientObject( listbox->GetClientObject(n) ); else if ( listbox->HasClientUntypedData() ) event.SetClientData( listbox->GetClientData(n) ); event.SetString( listbox->GetString(n) ); } else { n = -1; } event.SetInt(n); // No longer required with new code in wxLB_SINGLE // listbox->GetEventHandler()->AddPendingEvent( event ); listbox->GetEventHandler()->ProcessEvent( event ); }
static void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dialog ) { if (g_isIdle) wxapp_install_idle_handler(); GtkFontSelectionDialog *fontdlg = GTK_FONT_SELECTION_DIALOG(dialog->m_widget); wxGtkString fontname(gtk_font_selection_dialog_get_font_name(fontdlg)); dialog->SetChosenFont( fontname); wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); event.SetEventObject( dialog ); dialog->GetEventHandler()->ProcessEvent( event ); }
static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win ) { if (g_isIdle) wxapp_install_idle_handler(); if ((win->m_x == alloc->x) && (win->m_y == alloc->y) && (win->m_width == alloc->width) && (win->m_height == alloc->height) && (win->m_sizeSet)) { return; } win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height ); }
static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBox *rb ) { if (g_isIdle) wxapp_install_idle_handler(); if (!rb->m_hasVMT) return; if (g_blockEventsOnDrag) return; if (!button->active) return; wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, rb->GetId() ); event.SetInt( rb->GetSelection() ); event.SetString( rb->GetStringSelection() ); event.SetEventObject( rb ); rb->GetEventHandler()->ProcessEvent(event); }
static void gtk_spinctrl_text_changed_callback( GtkWidget *WXUNUSED(widget), wxSpinCtrl *win ) { if (!win->m_hasVMT) return; if (g_isIdle) wxapp_install_idle_handler(); wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); event.SetEventObject( win ); // see above event.SetInt( (int)ceil(win->m_adjust->value) ); win->GetEventHandler()->ProcessEvent( event ); }
static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event) { if (g_isIdle) wxapp_install_idle_handler(); event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); if (handler && handler->ProcessEvent(event)) return; wxWindow *win = menu->GetWindow(); if (win) win->HandleWindowEvent( event ); }