use crate::geometry::Point;
use crate::window::Window;
use std::boxed::Box;
use std::ffi::CStr;
use std::ffi::c_void;
use wxdragon_sys as ffi;
pub mod app_events;
pub mod button_events;
pub mod event_data;
pub mod macros;
pub mod menu_events;
pub mod scroll_events;
pub mod taskbar_events;
pub mod text_events;
pub mod tree_events;
#[cfg(feature = "webview")]
pub mod webview_events;
pub mod window_events;
pub use window_events::{
IdleEventData, KeyboardEvent, MouseButtonEvent, MouseEnterEvent, MouseLeaveEvent, MouseMotionEvent, WindowEvent,
WindowEventData, WindowEvents, WindowSizeEvent,
};
pub use button_events::{ButtonEvent, ButtonEventData, ButtonEvents};
pub use text_events::{TextEvent, TextEventData, TextEvents};
pub use tree_events::{TreeEvent, TreeEventData, TreeEvents};
pub use scroll_events::{ScrollEvent, ScrollEventType, ScrollEvents};
#[cfg(feature = "webview")]
pub use webview_events::{WebViewEvent, WebViewEventData, WebViewEvents};
pub use menu_events::{MenuEvent, MenuEventData, MenuEvents};
#[cfg(any(target_os = "windows", target_os = "linux"))]
pub use taskbar_events::{TaskBarIconEvent, TaskBarIconEventData};
pub use app_events::AppEvents;
pub use ffi::WXDEventTypeCEnum;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct EventToken(usize);
impl From<usize> for EventToken {
fn from(value: usize) -> Self {
EventToken(value)
}
}
impl From<EventToken> for usize {
fn from(token: EventToken) -> Self {
token.0
}
}
impl EventToken {
pub fn is_valid(&self) -> bool {
*self != Self::INVALID_TOKEN
}
pub const INVALID_TOKEN: EventToken = EventToken(0);
}
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(transparent)] pub struct EventType: ffi::WXDEventTypeCEnum { const COMMAND_BUTTON_CLICKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_BUTTON_CLICKED;
const CLOSE_WINDOW = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CLOSE_WINDOW;
const CHECKBOX = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CHECKBOX;
const TEXT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TEXT;
const TEXT_ENTER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TEXT_ENTER;
const SIZE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SIZE;
const MENU = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MENU;
const MENU_OPEN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MENU_OPEN;
const MENU_CLOSE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MENU_CLOSE;
const MENU_HIGHLIGHT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MENU_HIGHLIGHT;
const CONTEXT_MENU = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CONTEXT_MENU;
const LEFT_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LEFT_DOWN;
const LEFT_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LEFT_UP;
const RIGHT_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RIGHT_DOWN;
const RIGHT_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RIGHT_UP;
const MIDDLE_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MIDDLE_DOWN;
const MIDDLE_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MIDDLE_UP;
const MOTION = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MOTION;
const MOUSEWHEEL = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MOUSEWHEEL;
const ENTER_WINDOW = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_ENTER_WINDOW;
const LEAVE_WINDOW = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LEAVE_WINDOW;
const KEY_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_KEY_DOWN;
const KEY_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_KEY_UP;
const CHAR = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CHAR;
const COMMAND_RADIOBUTTON_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_RADIOBUTTON_SELECTED;
const COMMAND_RADIOBOX_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_RADIOBOX_SELECTED;
const COMMAND_LISTBOX_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_LISTBOX_SELECTED;
const COMMAND_CHOICE_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_CHOICE_SELECTED;
const COMMAND_COMBOBOX_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_COMBOBOX_SELECTED;
const COMMAND_CHECKLISTBOX_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_CHECKLISTBOX_SELECTED;
const COMMAND_LISTBOX_DOUBLECLICKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_LISTBOX_DOUBLECLICKED;
const COMMAND_TOGGLEBUTTON_CLICKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_TOGGLEBUTTON_CLICKED;
const COMMAND_REARRANGE_LIST = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_REARRANGE_LIST;
const COLLAPSIBLEPANE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COLLAPSIBLEPANE_CHANGED;
const TREE_BEGIN_LABEL_EDIT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_BEGIN_LABEL_EDIT;
const TREE_END_LABEL_EDIT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_END_LABEL_EDIT;
const TREE_SEL_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_SEL_CHANGED;
const TREE_ITEM_ACTIVATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_ACTIVATED;
const TREELIST_SELECTION_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREELIST_SELECTION_CHANGED;
const TREELIST_ITEM_CHECKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREELIST_ITEM_CHECKED;
const TREELIST_ITEM_ACTIVATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREELIST_ITEM_ACTIVATED;
const TREELIST_COLUMN_SORTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREELIST_COLUMN_SORTED;
const TREELIST_ITEM_EXPANDING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREELIST_ITEM_EXPANDING;
const TREELIST_ITEM_EXPANDED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREELIST_ITEM_EXPANDED;
const SLIDER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SLIDER;
const SPINCTRL = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPINCTRL;
const SPIN_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPIN_UP;
const SPIN_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPIN_DOWN;
const SPIN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPIN;
const NOTEBOOK_PAGE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_NOTEBOOK_PAGE_CHANGED;
const SPLITTER_SASH_POS_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPLITTER_SASH_POS_CHANGED;
const SPLITTER_SASH_POS_CHANGING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPLITTER_SASH_POS_CHANGING;
const SPLITTER_DOUBLECLICKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPLITTER_DOUBLECLICKED;
const SPLITTER_UNSPLIT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPLITTER_UNSPLIT;
const LIST_ITEM_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_ITEM_SELECTED;
const LIST_ITEM_ACTIVATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_ITEM_ACTIVATED;
const LIST_COL_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_COL_CLICK;
const LIST_BEGIN_LABEL_EDIT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_BEGIN_LABEL_EDIT;
const LIST_END_LABEL_EDIT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_END_LABEL_EDIT;
const LIST_BEGIN_DRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_BEGIN_DRAG;
const LIST_BEGIN_RDRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_BEGIN_RDRAG;
const LIST_DELETE_ITEM = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_DELETE_ITEM;
const LIST_DELETE_ALL_ITEMS = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_DELETE_ALL_ITEMS;
const LIST_ITEM_DESELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_ITEM_DESELECTED;
const LIST_ITEM_FOCUSED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_ITEM_FOCUSED;
const LIST_ITEM_MIDDLE_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_ITEM_MIDDLE_CLICK;
const LIST_ITEM_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_ITEM_RIGHT_CLICK;
const LIST_KEY_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_KEY_DOWN;
const LIST_INSERT_ITEM = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_INSERT_ITEM;
const LIST_COL_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_COL_RIGHT_CLICK;
const LIST_COL_BEGIN_DRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_LIST_COL_BEGIN_DRAG;
const COLOURPICKER_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COLOURPICKER_CHANGED;
const DATE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATE_CHANGED;
const TIME_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TIME_CHANGED;
const TREEBOOK_PAGE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREEBOOK_PAGE_CHANGED;
const TREEBOOK_PAGE_CHANGING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREEBOOK_PAGE_CHANGING;
const TREEBOOK_NODE_EXPANDED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREEBOOK_NODE_EXPANDED;
const TREEBOOK_NODE_COLLAPSED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREEBOOK_NODE_COLLAPSED;
const COMMAND_SEARCHCTRL_SEARCH_BTN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_SEARCHCTRL_SEARCH_BTN;
const COMMAND_SEARCHCTRL_CANCEL_BTN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_SEARCHCTRL_CANCEL_BTN;
const COMMAND_HYPERLINK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_COMMAND_HYPERLINK;
const SPINCTRLDOUBLE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SPINCTRLDOUBLE;
const CALENDAR_SEL_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CALENDAR_SEL_CHANGED;
const CALENDAR_DOUBLECLICKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CALENDAR_DOUBLECLICKED;
const CALENDAR_MONTH_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CALENDAR_MONTH_CHANGED;
const CALENDAR_YEAR_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CALENDAR_YEAR_CHANGED;
const CALENDAR_WEEKDAY_CLICKED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_CALENDAR_WEEKDAY_CLICKED;
const SCROLL_TOP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_TOP;
const SCROLL_BOTTOM = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_BOTTOM;
const SCROLL_LINEUP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_LINEUP;
const SCROLL_LINEDOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_LINEDOWN;
const SCROLL_PAGEUP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_PAGEUP;
const SCROLL_PAGEDOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_PAGEDOWN;
const SCROLL_THUMBTRACK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_THUMBTRACK;
const SCROLL_THUMBRELEASE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_THUMBRELEASE;
const SCROLL_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SCROLL_CHANGED;
const FILE_PICKER_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_FILEPICKER_CHANGED;
const DIR_PICKER_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DIRPICKER_CHANGED;
const FONT_PICKER_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_FONTPICKER_CHANGED;
const NOTIFICATION_MESSAGE_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_NOTIFICATION_MESSAGE_CLICK;
const NOTIFICATION_MESSAGE_DISMISSED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_NOTIFICATION_MESSAGE_DISMISSED;
const NOTIFICATION_MESSAGE_ACTION = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_NOTIFICATION_MESSAGE_ACTION;
#[cfg(feature = "media-ctrl")]
const MEDIA_LOADED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MEDIA_LOADED;
#[cfg(feature = "media-ctrl")]
const MEDIA_STOP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MEDIA_STOP;
#[cfg(feature = "media-ctrl")]
const MEDIA_FINISHED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MEDIA_FINISHED;
#[cfg(feature = "media-ctrl")]
const MEDIA_STATECHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MEDIA_STATECHANGED;
#[cfg(feature = "media-ctrl")]
const MEDIA_PLAY = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MEDIA_PLAY;
#[cfg(feature = "media-ctrl")]
const MEDIA_PAUSE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MEDIA_PAUSE;
const EVT_DATE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATE_CHANGED;
const IDLE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_IDLE;
const DROP_FILES = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DROP_FILES;
const PAINT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_PAINT;
const DESTROY = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DESTROY;
const MOVE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_MOVE;
const ERASE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_ERASE;
const SET_FOCUS = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_SET_FOCUS;
const KILL_FOCUS = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_KILL_FOCUS;
const DATAVIEW_SELECTION_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_SELECTION_CHANGED;
const DATAVIEW_ITEM_ACTIVATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_ACTIVATED;
const DATAVIEW_ITEM_EDITING_STARTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_EDITING_STARTED;
const DATAVIEW_ITEM_EDITING_DONE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_EDITING_DONE;
const DATAVIEW_ITEM_COLLAPSING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_COLLAPSING;
const DATAVIEW_ITEM_COLLAPSED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_COLLAPSED;
const DATAVIEW_ITEM_EXPANDING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_EXPANDING;
const DATAVIEW_ITEM_EXPANDED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_EXPANDED;
const DATAVIEW_COLUMN_HEADER_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_COLUMN_HEADER_CLICK;
const DATAVIEW_COLUMN_HEADER_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK;
const DATAVIEW_COLUMN_SORTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_COLUMN_SORTED;
const DATAVIEW_COLUMN_REORDERED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_COLUMN_REORDERED;
const DATAVIEW_ITEM_CONTEXT_MENU = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_DATAVIEW_ITEM_CONTEXT_MENU;
const TREE_SEL_CHANGING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_SEL_CHANGING;
const TREE_ITEM_COLLAPSING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_COLLAPSING;
const TREE_ITEM_COLLAPSED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_COLLAPSED;
const TREE_ITEM_EXPANDING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_EXPANDING;
const TREE_ITEM_EXPANDED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_EXPANDED;
const TREE_ITEM_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_RIGHT_CLICK;
const TREE_ITEM_MIDDLE_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_MIDDLE_CLICK;
const TREE_KEY_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_KEY_DOWN;
const TREE_DELETE_ITEM = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_DELETE_ITEM;
const TREE_ITEM_MENU = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_MENU;
const TREE_BEGIN_DRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_BEGIN_DRAG;
const TREE_BEGIN_RDRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_BEGIN_RDRAG;
const TREE_END_DRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_END_DRAG;
const TREE_STATE_IMAGE_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_STATE_IMAGE_CLICK;
const TOOL = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TOOL;
const TOOL_ENTER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TOOL_ENTER;
const TREE_ITEM_GETTOOLTIP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TREE_ITEM_GETTOOLTIP;
const ANY = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_ANY;
const INVALID = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_INVALID;
const NONE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_NULL;
#[cfg(feature = "aui")]
const AUI_PANE_BUTTON = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_AUI_PANE_BUTTON;
#[cfg(feature = "aui")]
const AUI_PANE_CLOSE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_AUI_PANE_CLOSE;
#[cfg(feature = "aui")]
const AUI_PANE_MAXIMIZE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_AUI_PANE_MAXIMIZE;
#[cfg(feature = "aui")]
const AUI_PANE_RESTORE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_AUI_PANE_RESTORE;
#[cfg(feature = "aui")]
const AUI_PANE_ACTIVATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_AUI_PANE_ACTIVATED;
#[cfg(feature = "aui")]
const AUI_RENDER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_AUI_RENDER;
const TIMER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TIMER;
#[cfg(feature = "stc")]
const STC_CHANGE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_CHANGE;
#[cfg(feature = "stc")]
const STC_STYLENEEDED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_STYLENEEDED;
#[cfg(feature = "stc")]
const STC_CHARADDED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_CHARADDED;
#[cfg(feature = "stc")]
const STC_SAVEPOINTREACHED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_SAVEPOINTREACHED;
#[cfg(feature = "stc")]
const STC_SAVEPOINTLEFT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_SAVEPOINTLEFT;
#[cfg(feature = "stc")]
const STC_ROMODIFYATTEMPT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_ROMODIFYATTEMPT;
#[cfg(feature = "stc")]
const STC_DOUBLECLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_DOUBLECLICK;
#[cfg(feature = "stc")]
const STC_UPDATEUI = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_UPDATEUI;
#[cfg(feature = "stc")]
const STC_MODIFIED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_MODIFIED;
#[cfg(feature = "stc")]
const STC_MACRORECORD = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_MACRORECORD;
#[cfg(feature = "stc")]
const STC_MARGINCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_MARGINCLICK;
#[cfg(feature = "stc")]
const STC_NEEDSHOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_NEEDSHOWN;
#[cfg(feature = "stc")]
const STC_PAINTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_PAINTED;
#[cfg(feature = "stc")]
const STC_USERLISTSELECTION = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_USERLISTSELECTION;
#[cfg(feature = "stc")]
const STC_DWELLSTART = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_DWELLSTART;
#[cfg(feature = "stc")]
const STC_DWELLEND = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_DWELLEND;
#[cfg(feature = "stc")]
const STC_START_DRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_START_DRAG;
#[cfg(feature = "stc")]
const STC_DRAG_OVER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_DRAG_OVER;
#[cfg(feature = "stc")]
const STC_DO_DROP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_DO_DROP;
#[cfg(feature = "stc")]
const STC_ZOOM = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_ZOOM;
#[cfg(feature = "stc")]
const STC_HOTSPOT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_HOTSPOT_CLICK;
#[cfg(feature = "stc")]
const STC_HOTSPOT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_HOTSPOT_DCLICK;
#[cfg(feature = "stc")]
const STC_CALLTIP_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_CALLTIP_CLICK;
#[cfg(feature = "stc")]
const STC_AUTOCOMP_SELECTION = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_AUTOCOMP_SELECTION;
#[cfg(feature = "stc")]
const STC_INDICATOR_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_INDICATOR_CLICK;
#[cfg(feature = "stc")]
const STC_INDICATOR_RELEASE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_INDICATOR_RELEASE;
#[cfg(feature = "stc")]
const STC_AUTOCOMP_CANCELLED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_AUTOCOMP_CANCELLED;
#[cfg(feature = "stc")]
const STC_AUTOCOMP_CHAR_DELETED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_STC_AUTOCOMP_CHAR_DELETED;
#[cfg(feature = "richtext")]
const RICHTEXT_LEFT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_LEFT_CLICK;
#[cfg(feature = "richtext")]
const RICHTEXT_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_RIGHT_CLICK;
#[cfg(feature = "richtext")]
const RICHTEXT_MIDDLE_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_MIDDLE_CLICK;
#[cfg(feature = "richtext")]
const RICHTEXT_LEFT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_LEFT_DCLICK;
#[cfg(feature = "richtext")]
const RICHTEXT_RETURN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_RETURN;
#[cfg(feature = "richtext")]
const RICHTEXT_CHARACTER = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_CHARACTER;
#[cfg(feature = "richtext")]
const RICHTEXT_DELETE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_DELETE;
#[cfg(feature = "richtext")]
const RICHTEXT_CONTENT_INSERTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_CONTENT_INSERTED;
#[cfg(feature = "richtext")]
const RICHTEXT_CONTENT_DELETED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_CONTENT_DELETED;
#[cfg(feature = "richtext")]
const RICHTEXT_STYLE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_STYLE_CHANGED;
#[cfg(feature = "richtext")]
const RICHTEXT_SELECTION_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_SELECTION_CHANGED;
#[cfg(feature = "richtext")]
const RICHTEXT_STYLESHEET_CHANGING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_STYLESHEET_CHANGING;
#[cfg(feature = "richtext")]
const RICHTEXT_STYLESHEET_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_STYLESHEET_CHANGED;
#[cfg(feature = "richtext")]
const RICHTEXT_STYLESHEET_REPLACING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_STYLESHEET_REPLACING;
#[cfg(feature = "richtext")]
const RICHTEXT_STYLESHEET_REPLACED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_RICHTEXT_STYLESHEET_REPLACED;
#[cfg(feature = "webview")]
const WEBVIEW_CREATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_CREATED;
#[cfg(feature = "webview")]
const WEBVIEW_NAVIGATING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_NAVIGATING;
#[cfg(feature = "webview")]
const WEBVIEW_NAVIGATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_NAVIGATED;
#[cfg(feature = "webview")]
const WEBVIEW_LOADED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_LOADED;
#[cfg(feature = "webview")]
const WEBVIEW_ERROR = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_ERROR;
#[cfg(feature = "webview")]
const WEBVIEW_NEWWINDOW = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_NEWWINDOW;
#[cfg(feature = "webview")]
const WEBVIEW_NEWWINDOW_FEATURES = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_NEWWINDOW_FEATURES;
#[cfg(feature = "webview")]
const WEBVIEW_TITLE_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_TITLE_CHANGED;
#[cfg(feature = "webview")]
const WEBVIEW_FULLSCREEN_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_FULLSCREEN_CHANGED;
#[cfg(feature = "webview")]
const WEBVIEW_SCRIPT_MESSAGE_RECEIVED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_SCRIPT_MESSAGE_RECEIVED;
#[cfg(feature = "webview")]
const WEBVIEW_SCRIPT_RESULT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_SCRIPT_RESULT;
#[cfg(feature = "webview")]
const WEBVIEW_WINDOW_CLOSE_REQUESTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_WINDOW_CLOSE_REQUESTED;
#[cfg(feature = "webview")]
const WEBVIEW_BROWSING_DATA_CLEARED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_WEBVIEW_BROWSING_DATA_CLEARED;
const TASKBAR_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_CLICK;
const TASKBAR_LEFT_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_LEFT_DOWN;
const TASKBAR_LEFT_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_LEFT_UP;
const TASKBAR_RIGHT_DOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_RIGHT_DOWN;
const TASKBAR_RIGHT_UP = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_RIGHT_UP;
const TASKBAR_LEFT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_LEFT_DCLICK;
const TASKBAR_RIGHT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_RIGHT_DCLICK;
#[cfg(target_os = "windows")]
const TASKBAR_MOVE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_MOVE;
#[cfg(target_os = "windows")]
const TASKBAR_BALLOON_TIMEOUT = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_BALLOON_TIMEOUT;
#[cfg(target_os = "windows")]
const TASKBAR_BALLOON_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_TASKBAR_BALLOON_CLICK;
const GRID_CELL_LEFT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_CELL_LEFT_CLICK;
const GRID_CELL_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_CELL_RIGHT_CLICK;
const GRID_CELL_LEFT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_CELL_LEFT_DCLICK;
const GRID_CELL_RIGHT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_CELL_RIGHT_DCLICK;
const GRID_LABEL_LEFT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_LABEL_LEFT_CLICK;
const GRID_LABEL_RIGHT_CLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_LABEL_RIGHT_CLICK;
const GRID_LABEL_LEFT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_LABEL_LEFT_DCLICK;
const GRID_LABEL_RIGHT_DCLICK = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_LABEL_RIGHT_DCLICK;
const GRID_CELL_CHANGED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_CELL_CHANGED;
const GRID_SELECT_CELL = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_SELECT_CELL;
const GRID_EDITOR_SHOWN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_EDITOR_SHOWN;
const GRID_EDITOR_HIDDEN = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_EDITOR_HIDDEN;
const GRID_EDITOR_CREATED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_EDITOR_CREATED;
const GRID_CELL_BEGIN_DRAG = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_CELL_BEGIN_DRAG;
const GRID_ROW_SIZE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_ROW_SIZE;
const GRID_COL_SIZE = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_COL_SIZE;
const GRID_RANGE_SELECTED = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_RANGE_SELECTED;
const GRID_TABBING = ffi::WXDEventTypeCEnum_WXD_EVENT_TYPE_GRID_TABBING;
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum IdleMode {
ProcessAll = 0,
ProcessSpecified = 1,
}
pub struct IdleEvent;
impl IdleEvent {
pub fn set_mode(mode: IdleMode) {
unsafe {
ffi::wxd_IdleEvent_SetMode(mode as i32);
}
}
pub fn get_mode() -> IdleMode {
let mode = unsafe { ffi::wxd_IdleEvent_GetMode() };
match mode {
1 => IdleMode::ProcessSpecified,
_ => IdleMode::ProcessAll,
}
}
}
#[derive(Debug, Clone, Copy)] pub struct Event(pub(crate) *mut ffi::wxd_Event_t);
impl Event {
pub(crate) unsafe fn from_ptr(ptr: *mut ffi::wxd_Event_t) -> Self {
Event(ptr)
}
pub(crate) fn _as_ptr(&self) -> *mut ffi::wxd_Event_t {
self.0
}
pub fn is_null(&self) -> bool {
self.0.is_null()
}
pub fn get_id(&self) -> i32 {
if self.0.is_null() {
return ffi::WXD_ID_ANY as i32;
}
unsafe { ffi::wxd_Event_GetId(self.0) }
}
pub fn get_event_object(&self) -> Option<Window> {
if self.0.is_null() {
return None;
}
let ptr = unsafe { ffi::wxd_Event_GetEventObject(self.0) };
if ptr.is_null() {
None
} else {
Some(unsafe { Window::from_ptr(ptr) })
}
}
pub fn get_event_type(&self) -> Option<EventType> {
if self.0.is_null() {
return None;
}
#[allow(clippy::useless_conversion)]
let event_type_c = unsafe { ffi::wxd_Event_GetEventType(self.0) } as WXDEventTypeCEnum;
use bitflags::Flags;
EventType::iter_defined_names()
.find(|&(_, val)| val.bits() == event_type_c && val != EventType::NONE && val != EventType::INVALID)
.map(|(_, val)| val)
}
pub fn skip(&self, skip: bool) {
if self.0.is_null() {
return;
}
unsafe { ffi::wxd_Event_Skip(self.0, skip) };
}
pub fn get_string(&self) -> Option<String> {
if self.0.is_null() {
return None;
}
let len = unsafe { ffi::wxd_CommandEvent_GetString(self.0, std::ptr::null_mut(), 0) };
if len < 0 {
return None;
}
let mut buf = vec![0; len as usize + 1];
unsafe { ffi::wxd_CommandEvent_GetString(self.0, buf.as_mut_ptr(), buf.len()) };
Some(unsafe { CStr::from_ptr(buf.as_ptr()).to_string_lossy().to_string() })
}
pub fn is_checked(&self) -> Option<bool> {
if self.0.is_null() {
return None;
}
Some(unsafe { ffi::wxd_CommandEvent_IsChecked(self.0) })
}
pub fn get_position(&self) -> Option<Point> {
if self.0.is_null() {
return None;
}
let c_point = unsafe { ffi::wxd_MouseEvent_GetPosition(self.0) };
if c_point.x == -1 && c_point.y == -1 {
None
} else {
Some(Point {
x: c_point.x,
y: c_point.y,
})
}
}
pub fn get_wheel_rotation(&self) -> i32 {
if self.0.is_null() {
return 0;
}
unsafe { ffi::wxd_MouseEvent_GetWheelRotation(self.0) }
}
pub fn get_wheel_delta(&self) -> i32 {
if self.0.is_null() {
return 120; }
unsafe { ffi::wxd_MouseEvent_GetWheelDelta(self.0) }
}
pub fn get_key_code(&self) -> Option<i32> {
if self.0.is_null() {
return None;
}
let key_code = unsafe { ffi::wxd_KeyEvent_GetKeyCode(self.0) };
if key_code == 0 { None } else { Some(key_code) }
}
pub fn get_unicode_key(&self) -> Option<i32> {
if self.0.is_null() {
return None;
}
let key_code = unsafe { ffi::wxd_KeyEvent_GetUnicodeKey(self.0) };
if key_code == 0 { None } else { Some(key_code) }
}
pub fn get_int(&self) -> Option<i32> {
if self.0.is_null() {
return None;
}
let int_val = unsafe { ffi::wxd_CommandEvent_GetInt(self.0) };
if int_val == -1 { None } else { Some(int_val) }
}
pub fn control_down(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_KeyEvent_ControlDown(self.0) }
}
pub fn shift_down(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_KeyEvent_ShiftDown(self.0) }
}
pub fn alt_down(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_KeyEvent_AltDown(self.0) }
}
pub fn meta_down(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_KeyEvent_MetaDown(self.0) }
}
pub fn cmd_down(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_KeyEvent_CmdDown(self.0) }
}
pub fn request_more(&self, need_more: bool) {
if self.0.is_null() {
return;
}
unsafe {
ffi::wxd_IdleEvent_RequestMore(self.0, need_more);
}
}
pub fn more_requested(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_IdleEvent_MoreRequested(self.0) }
}
pub fn can_veto(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_Event_CanVeto(self.0) }
}
pub fn veto(&self) {
if self.0.is_null() {
return;
}
unsafe { ffi::wxd_Event_Veto(self.0) }
}
pub fn is_vetoed(&self) -> bool {
if self.0.is_null() {
return false;
}
unsafe { ffi::wxd_Event_IsVetoed(self.0) }
}
pub fn set_can_veto(&self, can_veto: bool) {
if self.0.is_null() {
return;
}
unsafe { ffi::wxd_Event_SetCanVeto(self.0, can_veto) }
}
}
pub trait WxEvtHandler {
unsafe fn get_event_handler_ptr(&self) -> *mut ffi::wxd_EvtHandler_t;
#[doc(hidden)]
fn bind_internal<F>(&self, event_type: EventType, callback: F) -> EventToken
where
F: FnMut(Event) + 'static,
{
let handler_ptr = unsafe { self.get_event_handler_ptr() };
if handler_ptr.is_null() {
return EventToken::INVALID_TOKEN;
}
let boxed_callback: Box<dyn FnMut(Event) + 'static> = Box::new(callback);
let double_boxed = Box::new(boxed_callback);
let user_data = Box::into_raw(double_boxed) as *mut c_void;
type TrampolineFn = unsafe extern "C" fn(*mut c_void, *mut c_void);
let trampoline_ptr: TrampolineFn = rust_event_handler_trampoline;
let trampoline_c_void = trampoline_ptr as *mut c_void;
let token = EventToken::from(user_data as usize);
let et = event_type.bits();
unsafe { ffi::wxd_EvtHandler_Bind(handler_ptr, et, trampoline_c_void, user_data, token.into()) };
token
}
fn unbind(&self, token: EventToken) -> bool {
let handler_ptr = unsafe { self.get_event_handler_ptr() };
if handler_ptr.is_null() || !token.is_valid() {
return false;
}
unsafe { ffi::wxd_EvtHandler_Unbind(handler_ptr, token.into()) }
}
fn unbind_all(&self) -> usize {
let handler_ptr = unsafe { self.get_event_handler_ptr() };
if handler_ptr.is_null() {
return 0;
}
unsafe { ffi::wxd_EvtHandler_UnbindAll(handler_ptr) as usize }
}
#[doc(hidden)]
fn bind_with_id_internal<F>(&self, event_type: EventType, id: i32, callback: F) -> EventToken
where
F: FnMut(Event) + 'static,
{
let handler_ptr = unsafe { self.get_event_handler_ptr() };
if handler_ptr.is_null() {
return EventToken::INVALID_TOKEN;
}
let boxed_callback: Box<dyn FnMut(Event) + 'static> = Box::new(callback);
let double_boxed = Box::new(boxed_callback);
let user_data = Box::into_raw(double_boxed) as *mut c_void;
type TrampolineFn = unsafe extern "C" fn(*mut c_void, *mut c_void);
let trampoline_ptr: TrampolineFn = rust_event_handler_trampoline;
let trampoline_c_void = trampoline_ptr as *mut c_void;
let token = EventToken::from(user_data as usize);
let et = event_type.bits();
unsafe { ffi::wxd_EvtHandler_BindWithId(handler_ptr, et, id, trampoline_c_void, user_data, token.into()) };
token
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust_event_handler_trampoline(user_data: *mut c_void, event_ptr_cvoid: *mut c_void) {
if user_data.is_null() {
return;
}
let closure_box = unsafe { &mut *(user_data as *mut Box<dyn FnMut(Event) + 'static>) };
let event_ptr = event_ptr_cvoid as *mut ffi::wxd_Event_t;
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
let safe_event = unsafe { Event::from_ptr(event_ptr) };
(*closure_box)(safe_event);
}));
if result.is_err() { }
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn drop_rust_event_closure_box(ptr: *mut c_void) {
if !ptr.is_null() {
log::trace!("Dropping Rust event closure box at ptr: {ptr:?}");
let _ = unsafe { Box::from_raw(ptr as *mut Box<dyn FnMut(Event) + 'static>) };
}
}