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 + -
显示快捷键?