From efaeb275f78e18d594d9ee8ff04eccd2dc59512c Mon Sep 17 00:00:00 2001 From: truelight Date: Mon, 9 Aug 2004 17:04:08 +0000 Subject: (svn r1) Import of revision 975 of old (crashed) SVN --- window.h | 458 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 window.h (limited to 'window.h') diff --git a/window.h b/window.h new file mode 100644 index 000000000..1117fad60 --- /dev/null +++ b/window.h @@ -0,0 +1,458 @@ +#ifndef WINDOW_H +#define WINDOW_H + +typedef union WindowEvent WindowEvent; + +//typedef void WindowProc(Window *w, int event, int wparam, long lparam); + +typedef void WindowProc(Window *w, WindowEvent *e); + +typedef struct Widget { + byte type; + byte color; + uint16 left, right, top, bottom; + uint16 unkA; + uint16 tooltips; +} Widget; + +union WindowEvent { + byte event; + struct { + byte event; + Point pt; + int widget; + } click; + + struct { + byte event; + Point pt; + uint tile; + uint starttile; + int userdata; + } place; + + struct { + byte event; + Point pt; + int widget; + } dragdrop; + + struct { + byte event; + byte *str; + } edittext; + + struct { + byte event; + Point pt; + } popupmenu; + + struct { + byte event; + int button; + int index; + } dropdown; + + struct { + byte event; + bool cont; // continue the search? (default true) + byte ascii; // 8-bit ASCII-value of the key + uint16 keycode;// untranslated key (including shift-state) + } keypress; +}; + +enum WindowKeyCodes { + WKC_SHIFT = 0x8000, + WKC_CTRL = 0x4000, + WKC_ALT = 0x2000, + WKC_META = 0x1000, + + // Special ones + WKC_NONE = 0, + WKC_ESC=1, + WKC_BACKSPACE = 2, + WKC_INSERT = 3, + WKC_DELETE = 4, + + WKC_PAGEUP = 5, + WKC_PAGEDOWN = 6, + WKC_END = 7, + WKC_HOME = 8, + + // Arrow keys + WKC_LEFT = 9, + WKC_UP = 10, + WKC_RIGHT = 11, + WKC_DOWN = 12, + + // Return & tab + WKC_RETURN = 13, + WKC_TAB = 14, + + // Numerical keyboard + WKC_NUM_0 = 16, + WKC_NUM_1 = 17, + WKC_NUM_2 = 18, + WKC_NUM_3 = 19, + WKC_NUM_4 = 20, + WKC_NUM_5 = 21, + WKC_NUM_6 = 22, + WKC_NUM_7 = 23, + WKC_NUM_8 = 24, + WKC_NUM_9 = 25, + WKC_NUM_DIV = 26, + WKC_NUM_MUL = 27, + WKC_NUM_MINUS = 28, + WKC_NUM_PLUS = 29, + WKC_NUM_ENTER = 30, + WKC_NUM_DECIMAL = 31, + + // Space + WKC_SPACE = 32, + + // Function keys + WKC_F1 = 33, + WKC_F2 = 34, + WKC_F3 = 35, + WKC_F4 = 36, + WKC_F5 = 37, + WKC_F6 = 38, + WKC_F7 = 39, + WKC_F8 = 40, + WKC_F9 = 41, + WKC_F10 = 42, + WKC_F11 = 43, + WKC_F12 = 44, + + // Required for french keyboard + WKC_AMPERSAND = 45, + + // 0-9 are mapped to 48-57 + // A-Z are mapped to 65-90 + // a-z are mapped to 97-122 + + + //WKC_UNKNOWN = 0xFF, + +}; + +typedef struct WindowDesc { + int16 left, top, width, height; + byte cls; + byte parent_cls; + uint32 flags; + const Widget *widgets; + WindowProc *proc; +} WindowDesc; + +enum { + WDF_STD_TOOLTIPS = 1, /* use standard routine when displaying tooltips */ + WDF_DEF_WIDGET = 2, /* default widget control for some widgets in the on click event */ + WDF_STD_BTN = 4, /* default handling for close and drag widgets (widget no 0 and 1) */ + WDF_RESTORE_DPARAM = 8, /* when drawing widgets, restore the dparam so all widgets recieve the same set of them */ + WDF_UNCLICK_BUTTONS=16, /* Unclick buttons when the window event times out */ +}; + +/* can be used as x or y coordinates to cause a specific placement */ +enum { + WDP_AUTO = -1, + WDP_CENTER = -2, +}; + +#define WP(ptr,str) (*(str*)(ptr)->custom) + +typedef struct { + byte count, cap, pos; +} Scrollbar; + +struct Window { + uint16 flags4; + WindowClass window_class; + WindowNumber window_number; + + int left,top; + int width,height; + + Scrollbar hscroll, vscroll; + + byte caption_color; + + uint32 click_state, disabled_state, hidden_state; + WindowProc *wndproc; + ViewPort *viewport; + const Widget *widget; + //const WindowDesc *desc; + uint32 desc_flags; + + byte custom[16]; +}; + +typedef struct { + byte item_count; /* follow_vehicle */ + byte sel_index; /* scrollpos_x */ + byte main_button; /* scrollpos_y */ + byte action_id; + StringID string_id; /* unk30 */ + uint16 checked_items; /* unk32 */ +} menu_d; + +typedef struct { + int16 data_1, data_2, data_3; + int16 data_4, data_5; + bool close; /* scrollpos_y */ + byte byte_1; +} def_d; + +typedef struct { + void *data; +} void_d; + +typedef struct { + uint16 base; /* follow_vehicle */ + uint16 count;/* scrollpos_x */ +} tree_d; + +typedef struct { + byte refresh_counter; /* follow_vehicle */ +} plstations_d; + +typedef struct { + StringID string_id; +} tooltips_d; + +typedef struct { + byte railtype; + byte sel_index; + int16 sel_engine; + int16 rename_engine; +} buildtrain_d; + +typedef struct { + VehicleID sel; +} traindepot_d; + +typedef struct { + int sel; +} order_d; + +typedef struct { + byte tab; +} traindetails_d; + +typedef struct { + int16 scroll_x, scroll_y, subscroll; +} smallmap_d; + +typedef struct { + uint32 face; + byte gender; +} facesel_d; + +typedef struct { + StringID caption; + bool caret; + WindowClass wnd_class; + WindowNumber wnd_num; + uint16 maxlen, maxwidth; + byte *buf; +} querystr_d; + +typedef struct { + int sel; + byte cargo; +} refit_d; + +typedef struct { + uint16 follow_vehicle; + int16 scrollpos_x, scrollpos_y; +} vp_d; + +typedef struct { + uint16 follow_vehicle; + int16 scrollpos_x, scrollpos_y; + NewsItem *ni; +} news_d; + +enum WindowEvents { + WE_CLICK = 0, + WE_PAINT = 1, + WE_MOUSELOOP = 2, + WE_TICK = 3, + WE_4 = 4, + WE_TIMEOUT = 5, + WE_PLACE_OBJ = 6, + WE_ABORT_PLACE_OBJ = 7, + WE_DESTROY = 8, + WE_ON_EDIT_TEXT = 9, + WE_POPUPMENU_SELECT = 10, + WE_POPUPMENU_OVER = 11, + WE_DRAGDROP = 12, + WE_PLACE_DRAG = 13, + WE_PLACE_MOUSEUP = 14, + WE_PLACE_PRESIZE = 15, + WE_DROPDOWN_SELECT = 16, + WE_RCLICK = 17, + WE_KEYPRESS = 18, +}; + + +/****************** THESE ARE NOT WIDGET TYPES!!!!! *******************/ +enum WindowWidgetBehaviours { + WWB_PUSHBUTTON = 1 << 5, + WWB_NODISBUTTON = 2 << 5, +}; + + +enum WindowWidgetTypes { + WWT_EMPTY = 0, + + WWT_IMGBTN = 1, /* button with image */ + WWT_PANEL = WWT_IMGBTN, + WWT_PANEL_2 = 2,/* button with diff image when clicked */ + + WWT_TEXTBTN = 3,/* button with text */ + WWT_CLOSEBOX = WWT_TEXTBTN, + WWT_4 = 4, /* button with diff text when clicked */ + WWT_5 = 5, /* label */ + WWT_6 = 6, /* combo box text area */ + WWT_MATRIX = 7, + WWT_SCROLLBAR = 8, + WWT_FRAME = 9, /* frame */ + WWT_CAPTION = 10, + + WWT_HSCROLLBAR = 11, + WWT_LAST = 12, + + WWT_MASK = 31, + + WWT_PUSHTXTBTN = WWT_TEXTBTN | WWB_PUSHBUTTON, + WWT_PUSHIMGBTN = WWT_IMGBTN | WWB_PUSHBUTTON, + WWT_NODISTXTBTN = WWT_TEXTBTN | WWB_NODISBUTTON, +}; + +enum WindowFlags { + WF_TIMEOUT_SHL = 0, + WF_TIMEOUT_MASK = 7, + WF_DRAGGING = 1 << 3, + WF_SCROLL_UP = 1 << 4, + WF_SCROLL_DOWN = 1 << 5, + WF_SCROLL_MIDDLE = 1 << 6, + WF_HSCROLL = 1 << 7, + WF_SIZING = 1 << 8, + + WF_DISABLE_VP_SCROLL = 1 << 10, + + WF_WHITE_BORDER_ONE = 1 << 11, + WF_WHITE_BORDER_MASK = 3 << 11, +}; + + +void DispatchLeftClickEvent(Window *w, int x, int y); +void DispatchRightClickEvent(Window *w, int x, int y); +void DispatchMouseWheelEvent(Window *w, int wheel); + +/* window.c */ +void DrawOverlappedWindow(Window *w, int left, int top, int right, int bottom); +void CallWindowEventNP(Window *w, int event); +void CallWindowTickEvent(); +void DrawDirtyBlocks(); +void SetDirtyBlocks(int left, int top, int right, int bottom); +void SetWindowDirty(Window *w); + +Window *FindWindowById(WindowClass cls, WindowNumber number); +void DeleteWindow(Window *w); +Window *BringWindowToFrontById(WindowClass cls, WindowNumber number); +Window *BringWindowToFront(Window *w); +Window *StartWindowDrag(Window *w); +Window *StartWindowSizing(Window *w); +Window *FindWindowFromPt(int x, int y); + +Window *AllocateWindow( + int x, + int y, + int width, + int height, + WindowProc *proc, + WindowClass cls, + const Widget *widget); + +Window *AllocateWindowDesc(const WindowDesc *desc); +Window *AllocateWindowDescFront(const WindowDesc *desc, int value); + +Window *AllocateWindowAutoPlace( + int width, + int height, + WindowProc *proc, + WindowClass cls, + const Widget *widget); + +Window *AllocateWindowAutoPlace2( + WindowClass exist_class, + WindowNumber exist_num, + int width, + int height, + WindowProc *proc, + WindowClass cls, + const Widget *widget); + +void DrawWindowViewport(Window *w); + +void InitWindowSystem(); +int GetMenuItemIndex(Window *w, int x, int y); +void MouseLoop(); +void UpdateWindows(); +void InvalidateWidget(Window *w, byte widget_index); + +void GuiShowTooltips(uint16 string_id); + +void UnclickWindowButtons(Window *w); +void UnclickSomeWindowButtons(Window *w, uint32 mask); +void RelocateAllWindows(int neww, int newh); + +/* widget.c */ +int GetWidgetFromPos(Window *w, int x, int y); +void DrawWindowWidgets(Window *w); + +void HandleButtonClick(Window *w, byte widget); + +Window *GetCallbackWnd(); +void DeleteNonVitalWindows(); + +/* window.c */ +VARDEF Window _windows[20]; +VARDEF Window *_last_window; + +VARDEF Point _cursorpos_drag_start; + +VARDEF bool _left_button_down; +VARDEF bool _left_button_clicked; + +VARDEF bool _right_button_down; +VARDEF bool _right_button_clicked; + +VARDEF int _alloc_wnd_parent_num; + +VARDEF int _scrollbar_start_pos; +VARDEF int _scrollbar_size; +VARDEF bool _demo_mode; +VARDEF byte _scroller_click_timeout; + +VARDEF bool _dragging_window; +VARDEF bool _scrolling_scrollbar; +VARDEF bool _scrolling_viewport; +VARDEF bool _popup_menu_active; +//VARDEF bool _dragdrop_active; + +VARDEF Point _fix_mouse_at; + +VARDEF byte _special_mouse_mode; +enum SpecialMouseMode { + WSM_NONE = 0, + WSM_DRAGDROP = 1, + WSM_SIZING = 2, + WSM_PRESIZE = 3, +}; + +void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y); + +#endif /* WINDOW_H */ -- cgit v1.2.3-54-g00ecf