static EVENT uicheckmove( EVENT ev, a_dialog *info ) { EVENT new_ev; ORD row; ORD col; SAREA new_area; VSCREEN *vs; int prev_row; int prev_col; new_ev = ev; switch( ev ) { case EV_MOUSE_PRESS : if( uivmousepos( NULL, &row, &col ) == info->vs ) { vs = (VSCREEN *)info->vs; if( ( row + 1 ) == vs->area.row ) { /* because it's framed */ PrevRow = row; PrevCol = col; info->moving = TRUE; new_ev = EV_NO_EVENT; } } break; case EV_MOUSE_DRAG : if( info->moving ) { uivmousepos( NULL, &row, &col ); if( ( row != PrevRow ) || ( col != PrevCol ) ) { vs = (VSCREEN *)info->vs; if( vs->area.row + row < PrevRow ) { new_area.row = 0; } else { new_area.row = vs->area.row + row - PrevRow; } if( vs->area.col + col < PrevCol ) { new_area.col = 0; } else { new_area.col = vs->area.col + col - PrevCol; } new_area.width = vs->area.width; new_area.height = vs->area.height; prev_row = vs->area.row; prev_col = vs->area.col; uiresizedialog( info, &new_area ); /* new_area may have been adjusted */ PrevRow += new_area.row - prev_row; PrevCol += new_area.col - prev_col; } new_ev = EV_NO_EVENT; } break; case EV_MOUSE_RELEASE : if( info->moving ) { info->moving = FALSE; new_ev = EV_NO_EVENT; } } return( new_ev ); }
void GUIGMouseOn( void ) { ORD row; ORD col; if( !GMouseOn && GraphicsMouse ) { uivmousepos( NULL, &row, &col ); GUIInitMouse( Param ); uisetmouseposn( row, col ); } }
static EVENT uitabkey( EVENT ev, a_dialog *info ) { VFIELD *curr, *fld; ORD row, col; SAREA area; EVENT newev; if( info->first == NULL ) return( FALSE ); curr = info->curr; newev = ev; switch( ev ){ case EV_MOUSE_DCLICK: case EV_MOUSE_PRESS: { a_combo_box *combo; a_list *list; VSCREEN *mousevs; mousevs = uivmousepos( info->vs, &row, &col ); fld = info->first; while( fld != NULL ) { list = NULL; area = fld->area; if( fld->typ == FLD_PULLDOWN ) { list = fld->ptr; area.height = 1; area.width += 1; /* pulldown button */ } else if( fld->typ == FLD_LISTBOX ) { list = fld->ptr; } else if( fld->typ == FLD_EDIT_MLE ) { list = fld->ptr; } else if( fld->typ == FLD_COMBOBOX ) { area.height = 1; area.width += 2; /* pulldown button */ combo = fld->ptr; list = &combo->list; } if( mousevs != info->vs ) { if( list != NULL && list->box != NULL ) { if( list->box->vs == mousevs ) { break; } } } else if( row >= area.row && row < area.row + area.height && col >= area.col && col < area.col + area.width ) { break; } fld = nextfield( fld ); } /* check boxes don't get mouse events unless mouse over them */ if( fld == NULL && curr != NULL && curr->typ == FLD_CHECK ) { newev = EV_NO_EVENT; } else { curr = fld; } break; } case EV_TAB_FORWARD : curr = forwardtab( info ); break; case EV_TAB_BACKWARD : curr = backwardtab( info ); break; case EV_CURSOR_RIGHT : case EV_CURSOR_DOWN : { a_radio *r1, *r2; if( curr!= NULL && curr->typ == FLD_RADIO ) { fld = nextfield( curr ); if( fld != NULL ) { r1 = curr->ptr; r2 = fld->ptr; if( r1->group == r2->group ) { curr = fld; do_radio( info, fld ); newev = EV_CHECK_BOX_CLICK; } } } break; } case EV_CURSOR_LEFT : case EV_CURSOR_UP : { a_radio *r1, *r2; if( curr!= NULL && curr->typ == FLD_RADIO ) { if( curr != info->first ) { fld = curr - 1; r1 = curr->ptr; r2 = fld->ptr; if( r1->group == r2->group ) { curr = fld; do_radio( info, fld ); newev = EV_CHECK_BOX_CLICK; } } } break; } } if( info->curr != curr ) { uidialogsetcurr( info, curr ); } return( newev ); }
EVENT pulldownfilter( EVENT ev, a_dialog *info ) { a_list *list = NULL; a_combo_box *combo; VSCREEN *vs; SAREA area; VFIELD *fld; fld = info->curr; if( fld->typ == FLD_PULLDOWN ) { list = fld->ptr; } else if( fld->typ == FLD_COMBOBOX ) { combo = fld->ptr; list = &combo->list; } if( list->get == NULL ) { list->get = ( bool (*) ( void *, unsigned, char *, unsigned ) ) uigetlistelement; // set get_element function } switch( ev ) { case EV_MOUSE_DCLICK: case EV_MOUSE_PRESS: { ORD row, col; uivmousepos( info->vs, &row, &col ); area = fld->area; area.width += 1; /* extra column for button */ if( fld->typ == FLD_COMBOBOX ) { /* mouse press must be on little button at right */ area.col += area.width; area.width = 1; } if( fld->typ == FLD_COMBOBOX || fld->typ == FLD_PULLDOWN ) { /* mouse press must be on top line */ area.height = 1; } if( row < area.row || row >= area.row + area.height ) break; if( col < area.col || col >= area.col + area.width ) break; /* FALLS into next case */ } case EV_CURSOR_DOWN: case EV_ALT_CURSOR_DOWN: /* list->box must be null */ area = fld->area; vs = info->vs; area.row += ( vs->area.row + 2 ); area.col += vs->area.col; if( fld->typ == FLD_COMBOBOX ) { area.col++; } if( area.row + area.height >= UIData->height ) { area.row -= area.height + 3; } vs = uiopen( &area, NULL, V_DIALOGUE | V_LISTBOX ); area.row = 0; area.col = 0; list->box = uibeglistbox( vs, &area, list ); if( ev != EV_MOUSE_PRESS && ev != EV_MOUSE_DCLICK && fld->typ == FLD_COMBOBOX ) { info->dirty = TRUE; setcombobuffer( info, fld ); print_field( info->vs, fld, TRUE ); } break; } return( ev ); }
static ui_event pulldownfilter( ui_event ui_ev, a_dialog *ui_dlg_info ) { a_list *list = NULL; a_combo_box *combo; VSCREEN *vs; SAREA area; VFIELD *fld; fld = ui_dlg_info->curr; if( fld->typ == FLD_PULLDOWN ) { list = fld->u.list; } else if( fld->typ == FLD_COMBOBOX ) { combo = fld->u.combo; list = &combo->list; } switch( ui_ev ) { case EV_MOUSE_DCLICK: case EV_MOUSE_PRESS: { ORD row, col; uivmousepos( ui_dlg_info->vs, &row, &col ); area = fld->area; area.width += 1; /* extra column for button */ if( fld->typ == FLD_COMBOBOX ) { /* mouse press must be on little button at right */ area.col += area.width; area.width = 1; } if( fld->typ == FLD_COMBOBOX || fld->typ == FLD_PULLDOWN ) { /* mouse press must be on top line */ area.height = 1; } if( row < area.row || row >= area.row + area.height ) break; if( col < area.col || col >= area.col + area.width ) { break; } /* FALLS into next case */ } case EV_CURSOR_DOWN: case EV_ALT_CURSOR_DOWN: /* list->box must be null */ area = fld->area; vs = ui_dlg_info->vs; area.row += ( vs->area.row + 2 ); area.col += vs->area.col; if( fld->typ == FLD_COMBOBOX ) { area.col++; } if( area.row + area.height >= UIData->height ) { area.row -= area.height + 3; } vs = uiopen( &area, NULL, V_DIALOGUE | V_LISTBOX ); area.row = 0; area.col = 0; list->box = uibeglistbox( vs, &area, list ); if( ui_ev != EV_MOUSE_PRESS && ui_ev != EV_MOUSE_DCLICK && fld->typ == FLD_COMBOBOX ) { ui_dlg_info->dirty = true; setcombobuffer( ui_dlg_info, fld ); print_field( ui_dlg_info->vs, fld, true ); } break; } return( ui_ev ); }
bool GUIProcessEvent( EVENT ev ) { gui_event gui_ev; ORD row, col; gui_window *wnd; int prev; int diff; gui_ctl_id id; gui_window *menu_window; bool new_curr_wnd; VSCREEN *screen; // this is processed before all others and signals the end for all // GUI UI windows ( unconditional ) if( ev == EV_KILL_UI ) { GUIDestroyWnd( NULL ); return( false ); } ev = MapMiddleToRight( ev ); ev = CheckPrevEvent( ev ); wnd = NULL; if( uimouseinstalled() ) { screen = uivmousepos( NULL, &row, &col ); if( screen != NULL && (screen->flags & V_GUI_WINDOW) != 0 ) { wnd = (gui_window *)((char *)screen - offsetof( gui_window, screen )); } } if( GUIDoKeyboardMoveResize( ev ) ) { return( true ); } if( MouseState == MOUSE_MOVE || MouseState == MOUSE_SIZE ) { if( GUIDoMoveResizeCheck( GUIMouseWnd, ev, row, col ) ) { MouseState = MOUSE_FREE; return( true ); } if( GUI_WND_MINIMIZED( GUIMouseWnd ) ) { switch( ev ) { case EV_MOUSE_DCLICK : case EV_MOUSE_RELEASE : case EV_MOUSE_DRAG : ProcessMinimizedMouseEvent( ev, row, col ); } } else { switch( ev ) { case EV_MOUSE_RELEASE : case EV_MOUSE_DRAG : case EV_MOUSE_DRAG_R : ProcessMouseReleaseDrag( ev, GUI_LBUTTONUP, row, col ); } } return( true ); } new_curr_wnd = SetCurrWnd( ev, wnd ); if( GUIProcessAltMenuEvent( ev ) ) { return( true ); } /* Only deal with press and dclick events for minimized windows. * All other non-menu events are ingored. */ if( !IS_CTLEVENT( ev ) && ( GUICurrWnd != NULL ) && GUI_WND_MINIMIZED( GUICurrWnd ) ) { /* ignore event if mouse not in minimized current window */ if( GUICurrWnd == wnd ) { switch( ev ) { case EV_MOUSE_PRESS : case EV_MOUSE_DCLICK : case EV_MOUSE_RELEASE : GUIMouseWnd = GUICurrWnd; ProcessMinimizedMouseEvent( ev, row, col ); break; } } return( true ); } if( !IS_CTLEVENT( ev ) && ( GUICurrWnd != NULL ) && GUIIsOpen( GUICurrWnd ) ) { /* see if any of the controls in the window consume the event */ ev = GUIProcessControlEvent( GUICurrWnd, ev, row, col ); /* See if the event is for on of the scroll bars. */ /* Diff and prev are used if the event return is */ /* EV_SCROLL_HORIZONTAL or EV_SCROLL_VERTICAL. */ if( !new_curr_wnd || ( GUIGetWindowStyles() & ( GUI_INACT_GADGETS+GUI_INACT_SAME ) ) ) { ev = GUIGadgetFilter( GUICurrWnd, ev, &prev, &diff ); } if( ev == EV_NO_EVENT ) { return( true ); } } gui_ev = GUI_NO_EVENT; ev = GUIMapKeys( ev ); switch( ev ) { case EV_MOUSE_DCLICK_R : ProcessMousePos( GUI_RBUTTONDBLCLK, row, col, wnd ); return( true ); break; case EV_MOUSE_RELEASE_R : ProcessMouseReleaseDrag( ev, GUI_RBUTTONUP, row, col ); return( true ); break; case EV_MOUSE_DRAG_R : if( GUICurrWnd != GUIMouseWnd ) { /* got drag without press first */ ProcessMousePress( EV_MOUSE_PRESS_R, GUI_LBUTTONDOWN, row, col, new_curr_wnd ); } case EV_MOUSE_MOVE : ProcessMousePos( GUI_MOUSEMOVE, row, col, wnd ); return( true ); break; case EV_MOUSE_RELEASE : ProcessMouseReleaseDrag( ev, GUI_LBUTTONUP, row, col ); return( true ); break; case EV_MOUSE_DRAG : if( GUICurrWnd != GUIMouseWnd ) { /* got drag without press first */ ProcessMousePress( EV_MOUSE_PRESS, GUI_LBUTTONDOWN, row, col, new_curr_wnd ); } ProcessMouseReleaseDrag( ev, GUI_MOUSEMOVE, row, col ); return( true ); break; case EV_MOUSE_PRESS_R : ProcessMousePress( ev, GUI_RBUTTONDOWN, row, col, new_curr_wnd ); return( true ); break; case EV_MOUSE_PRESS : ProcessMousePress( ev, GUI_LBUTTONDOWN, row, col, new_curr_wnd ); return( true ); break; case EV_MOUSE_DCLICK : ProcessMousePress( ev, GUI_LBUTTONDBLCLK, row, col, new_curr_wnd ); return( true ); break; case EV_NO_EVENT : gui_ev = GUI_NO_EVENT; break; case EV_SCROLL_UP : case EV_SCROLL_DOWN : case EV_SCROLL_PAGE_UP : case EV_SCROLL_PAGE_DOWN : case EV_SCROLL_LEFT : case EV_SCROLL_RIGHT : case EV_SCROLL_LEFT_PAGE : case EV_SCROLL_RIGHT_PAGE : if( GUICurrWnd != NULL ) { ProcessScrollEvent( ev ); return( true ); } break; case EV_SCROLL_VERTICAL : if( GUI_VSCROLL_EVENTS_SET( GUICurrWnd ) ) { DoScrollDrag( GUICurrWnd->vgadget, prev, diff ); } else { GUIWholeWndDirty( GUICurrWnd ); } return( true ); break; case EV_SCROLL_HORIZONTAL : if( GUI_HSCROLL_EVENTS_SET( GUICurrWnd ) ) { DoScrollDrag( GUICurrWnd->hgadget, prev, diff ); } else { GUIWholeWndDirty( GUICurrWnd ); } return( true ); break; case EV_MENU_INITPOPUP : ProcessInitPopupEvent(); return( true ); break; #if 0 case EV_BACKGROUND_RESIZE : { gui_window *root; root = GUIGetRootWindow(); if( root != NULL ) { GUIZoomWnd( root, GUI_NONE ); } } return( true ); break; #endif default : if( IS_CTLEVENT( ev ) ) { if( !GUIMDIProcessEvent( ev ) ) { menu_window = GUIGetMenuWindow(); if( menu_window != NULL ) { id = EV2ID( ev ); GUIEVENTWND( menu_window, GUI_CLICKED, &id ); } } return( true ); } break; } if( ( GUICurrWnd != NULL ) && (gui_ev != GUI_NO_EVENT ) ) { GUIEVENTWND( GUICurrWnd, gui_ev, NULL ); } return( true ); }