guixloop.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 772 行 · 第 1/2 页
C
772 行
break;
case EV_SCROLL_DOWN :
events = GUICurrWnd->style & GUI_VSCROLL_EVENTS;
gui_ev = GUI_SCROLL_DOWN;
diff = 1;
gadget = GUICurrWnd->vgadget;
break;
case EV_SCROLL_PAGE_UP :
events = GUICurrWnd->style & GUI_VSCROLL_EVENTS;
gui_ev = GUI_SCROLL_PAGE_UP;
diff = -GUICurrWnd->use.height;
gadget = GUICurrWnd->vgadget;
break;
case EV_SCROLL_PAGE_DOWN :
events = GUICurrWnd->style & GUI_VSCROLL_EVENTS;
gui_ev = GUI_SCROLL_PAGE_DOWN;
diff = GUICurrWnd->use.height;
gadget = GUICurrWnd->vgadget;
break;
case EV_SCROLL_LEFT :
events = GUICurrWnd->style & GUI_HSCROLL_EVENTS;
gui_ev = GUI_SCROLL_LEFT;
diff = -1;
gadget = GUICurrWnd->hgadget;
break;
case EV_SCROLL_RIGHT :
events = GUICurrWnd->style & GUI_HSCROLL_EVENTS;
gui_ev = GUI_SCROLL_RIGHT;
diff = 1;
gadget = GUICurrWnd->hgadget;
break;
case EV_SCROLL_LEFT_PAGE :
events = GUICurrWnd->style & GUI_HSCROLL_EVENTS;
gui_ev = GUI_SCROLL_PAGE_LEFT;
diff = -GUICurrWnd->use.width;
gadget = GUICurrWnd->hgadget;
break;
case EV_SCROLL_RIGHT_PAGE :
events = GUICurrWnd->style & GUI_HSCROLL_EVENTS;
gui_ev = GUI_SCROLL_PAGE_RIGHT;
diff = GUICurrWnd->use.width;
gadget = GUICurrWnd->hgadget;
break;
}
if( events ) {
GUIEVENTWND( GUICurrWnd, gui_ev, NULL );
} else {
GUIScroll( diff, gadget );
if( gadget->dir == HORIZONTAL ) {
notify = GUI_HSCROLL_NOTIFY;
} else {
notify = GUI_VSCROLL_NOTIFY;
}
GUIEVENTWND( GUICurrWnd, notify, NULL );
}
}
static bool SetCurrWnd( EVENT ev, gui_window *curr )
{
switch( ev ) {
case EV_MOUSE_DCLICK_R :
case EV_MOUSE_PRESS_R :
case EV_MOUSE_PRESS :
case EV_MOUSE_DCLICK :
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_PAGE_LEFT :
case EV_PAGE_RIGHT :
case EV_SCROLL_VERTICAL :
case EV_SCROLL_HORIZONTAL :
if( ( curr != GUICurrWnd ) && ( curr != NULL ) ) {
GUIBringToFront( curr );
return( TRUE );
}
break;
}
return( FALSE );
}
gui_window *GUIGetMenuWindow( void )
{
gui_window *menu_window;
menu_window = GUIGetFront();
if( menu_window != NULL ) {
menu_window = GUIGetTopWnd( menu_window );
if( menu_window->vbarmenu == NULL ) {
menu_window = NULL;
}
}
return( menu_window );
}
static void DoScrollDrag( p_gadget gadget, int prev, int diff )
{
gui_event top;
gui_event bottom;
gui_event scroll;
prev = prev;
if( gadget->dir == VERTICAL ) {
top = GUI_SCROLL_TOP;
bottom = GUI_SCROLL_BOTTOM;
scroll = GUI_SCROLL_VERTICAL;
} else {
top = GUI_SCROLL_FULL_LEFT;
bottom = GUI_SCROLL_FULL_RIGHT;
scroll = GUI_SCROLL_HORIZONTAL;
}
uisetgadgetnodraw( gadget, gadget->pos - diff );
if( prev + diff == 0 ) {
GUIEVENTWND( GUICurrWnd, top, NULL );
} else if( ( prev + diff ) == ( gadget->total_size - gadget->page_size ) ) {
GUIEVENTWND( GUICurrWnd, bottom, NULL );
} else {
GUIEVENTWND( GUICurrWnd, scroll, &diff );
}
}
/*
* CheckPrevEvent -- this routine causes the sequence of mouse events :
* P-U-D-U-D-U-D-U to come out P-U-D-U P-U-D-U
* where P is Press, U is Up and D is dclick.
* This is for consistency with windows.
*/
static EVENT CheckPrevEvent( EVENT ev )
{
switch( ev ) {
case EV_MOUSE_PRESS :
case EV_MOUSE_PRESS_R :
PrevMouseEvent = ev;
break;
case EV_MOUSE_DCLICK :
if( ev == PrevMouseEvent ) {
ev = EV_MOUSE_PRESS;
}
PrevMouseEvent = ev;
break;
case EV_MOUSE_DCLICK_R :
if( ev == PrevMouseEvent ) {
ev = EV_MOUSE_PRESS_R;
}
PrevMouseEvent = ev;
}
return( ev );
}
static EVENT MapMiddleToRight( EVENT ev )
{
switch( ev ) {
case EV_MOUSE_PRESS_M :
ev = EV_MOUSE_PRESS_R;
break;
case EV_MOUSE_DRAG_M :
ev = EV_MOUSE_DRAG_R;
break;
case EV_MOUSE_RELEASE_M :
ev = EV_MOUSE_RELEASE_R;
break;
case EV_MOUSE_DCLICK_M :
ev = EV_MOUSE_DCLICK_R;
break;
case EV_MOUSE_REPEAT_M :
ev = EV_MOUSE_REPEAT_R;
break;
case EV_MOUSE_HOLD_M :
ev = EV_MOUSE_HOLD_R;
break;
}
return( ev );
}
/*
* GUIProcessEvent -- Main event loop to process UI events
*/
bool GUIProcessEvent( EVENT ev )
{
gui_event gui_ev;
ORD row, col;
gui_window *wnd;
int prev;
int diff;
unsigned id;
gui_window *menu_window;
bool new_curr_wnd;
VSCREEN *vscreen;
// 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 );
if( uimouseinstalled() ) {
wnd = (gui_window *)uivmousepos( NULL, &row, &col );
if( wnd != NULL ) {
vscreen = (VSCREEN *)wnd;
if( !( vscreen->flags & GUI_WINDOW ) ) {
wnd = NULL;
}
}
} else {
wnd = NULL;
}
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( ( ev < GUI_FIRST_USER_EVENT ) && ( 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( ( GUICurrWnd != NULL ) && GUIIsOpen( GUICurrWnd ) && ( ev < GUI_FIRST_USER_EVENT ) ) {
/* 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( ev >= GUI_FIRST_USER_EVENT ) {
if( !GUIMDIProcessEvent( ev ) ) {
menu_window = GUIGetMenuWindow();
if( menu_window != NULL ) {
id = ev - GUI_FIRST_USER_EVENT;
GUIEVENTWND( menu_window, GUI_CLICKED, &id );
}
}
return( TRUE );
}
break;
}
if( ( GUICurrWnd != NULL ) && (gui_ev != GUI_NO_EVENT ) ) {
GUIEVENTWND( GUICurrWnd, gui_ev, NULL );
}
return( TRUE );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?