wndsys.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 693 行 · 第 1/2 页

C
693
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  Windowing 'system' routines.
*
****************************************************************************/


#include "dbgdefn.h"
#include "dbgtoggl.h"
#include "dbginfo.h"
#include "dbginp.h"
#include "dbgtoken.h"
#include "dbgerr.h"
#include "dbgwind.h"
#include "dbgadget.h"
#include "dbghook.h"
#include "dbgio.h"
#include <stdio.h>
#include <ctype.h>

extern screen_state     ScrnState;
extern tokens           CurrToken;
extern wnd_posn         WndPosition[ WND_NUM_CLASSES ];
extern void             *SrchHistory;
extern char             *TxtBuff;
extern a_window         *WndMain;
extern gui_rect         WndMainRect;

extern bool             UsrScrnMode( void );
extern bool             UserScreen( void );
extern bool             DebugScreen( void );
extern bool             DebugScreenRecover( void );
extern void             RemoteSetUserScreen( void );
extern void             RemoteSetDebugScreen( void );
extern void             PushCmdList( cmd_list * );
extern void             NewLang( char *lang );
extern void             ProcACmd( void );
extern void             CheckBPErrors( void );
extern void             Ring( void );
extern int              DlgSearch( a_window *, void * );
extern bool             DlgSearchAll( char **, void * );
extern unsigned int     ScanCmd( char * );
extern void             ReqEOC( void );
extern gui_colour_set   *GetWndColours( wnd_class class );
extern bool             ScanItem( bool, char **, unsigned int * );
extern bool             WndDlgTxt( char * );
extern a_window         *WndSrchOpen( char * );
extern void             *GetWndFont( a_window * );
extern bool             AsmOpenGadget( a_window *, wnd_line_piece *, mod_handle );
extern bool             FileOpenGadget( a_window *, wnd_line_piece *, mod_handle );
extern bool             HookPendingPush( void );
extern void             WndPosToRect( wnd_posn*, gui_rect *, gui_coord * );
extern bool             IsInternalMod( mod_handle );
extern void             AccelMenuItem( gui_menu_struct *menu, bool is_main );
extern char             LookUpCtrlKey( unsigned key );
extern bool             MacKeyHit( a_window *wnd, unsigned key );
extern gui_coord        *WndMainClientSize( void );
extern char             *StrCopy( char *src, char *dest );
extern void             FingClose( void );
extern char             *GetCmdName( int );
extern void             SetUpdateFlags( update_list );
extern void             ScrnSpawnStart( void );
extern void             ScrnSpawnEnd( void );

extern void             WndDumpFile( a_window * );
extern void             WndDumpLog( a_window * );
extern void             ProcWndSearch( a_window * );
extern void             ProcWndFindNext( a_window * );
extern void             ProcWndFindPrev( a_window * );
extern void             ProcWndPopUp( a_window * );
extern void             ProcWndTabLeft( a_window * );
extern void             ProcWndTabRight( a_window * );
extern void             ProcPUINYI( a_window * );
extern void             XDumpMenus( void );
static void             WndBadCmd( a_window * );

#include "menudef.h"
char *WndGadgetHint[] =
{
    #define pick( a,b,c,d,e,f ) f,
    #include "gadgets.h"
};

gui_resource WndGadgetArray[] = {
    #define pick( a,b,c,d,e,f ) { b, d },
    #include "gadgets.h"
    #define pick( a,b,c,d,e,f ) { c, e },
    #include "gadgets.h"
    { BITMAP_SPLASH, "splash" },
};
int WndGadgetArraySize = ArraySize( WndGadgetArray );
int WndGadgetSecondary = GADGET_FIRST_SECONDARY;
wnd_attr WndGadgetAttr = WND_HOTSPOT;
int             MaxGadgetLength;

static char WindowNameTab[] =
{
    "CLose\0"
    "CURSORStart\0"
    "CURSOREnd\0"
    "CURSORDown\0"
    "CURSORLeft\0"
    "CURSORRight\0"
    "CURSORUp\0"
    "Dump\0"
    "Log\0"
    "FINDNext\0"
    "FINDPrev\0"
    "Next\0"
    "PAGEDown\0"
    "PAGEUp\0"
    "POpup\0"
    "SEarch\0"
    "SCROLLDown\0"
    "SCROLLUp\0"
    "SCROLLTop\0"
    "SCROLLBottom\0"
    "TABLeft\0"
    "TABRight\0"
    "MAXimize\0"
    "MINimize\0"
    "REStore\0"
    "TIle\0"
    "CAscade\0"
    "Move\0"
    "SIze\0"
    "PRevious\0"
};

static void ToWndChooseNew( a_window *p )
{
    WndChooseNew();
}

static void (*WndJmpTab[])( a_window * ) =
{
    &WndBadCmd,
    &WndClose,
    &WndCursorStart,
    &WndCursorEnd,
    &WndCursorDown,
    &WndCursorLeft,
    &WndCursorRight,
    &WndCursorUp,
    &WndDumpFile,
    &WndDumpLog,
    &ProcWndFindNext,
    &ProcWndFindPrev,
    &ToWndChooseNew,
    &WndPageDown,
    &WndPageUp,
    &ProcWndPopUp,
    &ProcWndSearch,
    &WndScrollDown,
    &WndScrollUp,
    &WndScrollTop,
    &WndScrollBottom,
    &ProcWndTabLeft,
    &ProcWndTabRight,
    &WndMaximizeWindow,
    &WndMinimizeWindow,
    &WndRestoreWindow,
    &ProcPUINYI,
    &ProcPUINYI,
    &ProcPUINYI,
    &ProcPUINYI,
    &ProcPUINYI,
};

wnd_metrics WndNormal =      { 5, 25,  0,  0 };
wnd_metrics WndLong =        { 5, 25, 20,  0 };
wnd_metrics WndMemMetrics =  { 5, 25,  5,  0 };
wnd_metrics WndWide =        { 5, 25,  0, 60 };
wnd_metrics WndWideLong =    { 5, 25, 20, 60 };
wnd_metrics WndFileMetrics = { 5, 25, 70, 70 };

wnd_metrics *WndMetrics[] = {
    #define pick(a,b,c,d,e,f) &e,
    #include "wndnames.h"
};

wnd_metrics NoMetrics = { 0, 0, 0, 0 };

bool DbgWndSearch( a_window * wnd, bool from_top, int direction )
{
    bool        rc;

    rc = WndSearch( wnd, from_top, direction );
    return( rc );
}

void ProcPUINYI( a_window *wnd )
{
    wnd=wnd;
    Say( "NYI" );
}

void ProcWndSearch( a_window *wnd )
{
    DbgWndSearch( wnd, FALSE, DlgSearch( wnd, SrchHistory ) );
}

void ProcWndTabLeft( a_window *wnd )
{
    WndTabLeft( wnd, TRUE );
}

void ProcWndTabRight( a_window *wnd )
{
    WndTabRight( wnd, TRUE );
}

void ProcSearchAll( void )
{
    char        *expr;

    if( !DlgSearchAll( &expr, SrchHistory ) ) return;
    WndSrchOpen( expr );
}

void ProcWndPopUp( a_window *wnd )
{
    WndKeyPopUp( wnd, NULL );
}

void ProcWndFindNext( a_window *wnd )
{
    DbgWndSearch( wnd, FALSE, 1 );
}

void ProcWndFindPrev( a_window *wnd )
{
    DbgWndSearch( wnd, FALSE, -1 );
}

static void WndBadCmd( a_window *wnd )
{
    wnd=wnd;
    Error( ERR_LOC, LIT( ERR_BAD_SUBCOMMAND ), GetCmdName( CMD_WINDOW ) );
}

void ProcWindow( void )
{
    a_window    *wnd = WndFindActive();
    unsigned    cmd;

    cmd = ScanCmd( &WindowNameTab );
    ReqEOC();
    if( wnd != NULL ) {
        WndJmpTab[ cmd ]( wnd );
    }
}


void WndSysStart( void )
{
#if defined(__UNIX__)
    ScrnSpawnStart();
#endif
    GUISpawnStart();
}


void WndSysEnd( bool pause )
{
    GUISpawnEnd();
#if defined(__UNIX__)
    ScrnSpawnEnd();
#endif
    pause=pause; // NYI - PUI
}


static bool DoScreenSwap( void )
{
#if defined(__GUI__) && defined(__WINDOWS__)
    return( FALSE );
#else
    return( _IsOff( SW_REMOTE_LINK ) );
#endif
}


void WndStop( void )
{
    if( DoScreenSwap() ) {
        WndUser();
    }
}

void WndUser( void )
{
    if( !(ScrnState & USR_SCRN_ACTIVE) ) {
        if( !(ScrnState & USR_SCRN_VISIBLE) ) RemoteSetUserScreen();
        ScrnState |= USR_SCRN_ACTIVE | USR_SCRN_VISIBLE;
        GUIGMouseOff();
        if( UserScreen() ) {
            ScrnState |= DBG_SCRN_VISIBLE;
        } else {
            ScrnState &= ~DBG_SCRN_VISIBLE;
        }
    }
    ScrnState &= ~DBG_SCRN_ACTIVE;
}


void WndDebug( void )
{
    if( _IsOn( SW_MIGHT_HAVE_LOST_DISPLAY ) ) {
        if( ScrnState & DBG_SCRN_ACTIVE ) {
            if( !DebugScreenRecover() ) {
                ScrnState &= ~DBG_SCRN_ACTIVE;
            }
        }
        _SwitchOff( SW_MIGHT_HAVE_LOST_DISPLAY );
    }
    if( !(ScrnState & DBG_SCRN_ACTIVE) ) {
        if( !(ScrnState & DBG_SCRN_VISIBLE) ) RemoteSetDebugScreen();
        ScrnState |= DBG_SCRN_ACTIVE | DBG_SCRN_VISIBLE;
        if( DebugScreen() ) {
            ScrnState |= USR_SCRN_VISIBLE;
        } else {
            ScrnState &= ~USR_SCRN_VISIBLE;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?