dbgwmac.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 640 行 · 第 1/2 页
C
640 行
/****************************************************************************
*
* 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: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include "dbgdefn.h"
#include "dbgwind.h"
#include "dbginfo.h"
#include "dbgadget.h"
#include "guidlg.h"
#include "sortlist.h"
#include "dbgerr.h"
#include "dbgtoggl.h"
#include <string.h>
#include <stddef.h>
#include <ctype.h>
extern char *GetCmdEntry(char *,int ,char *);
extern char *KeyName( unsigned key );
extern wnd_macro *MacAddDel( unsigned key, wnd_class class, cmd_list *cmds );
extern char *StrCopy( char *src, char *dest );
extern void LockCmdList( cmd_list *cmds );
extern char *Format( char *buff, char *fmt, ... );
extern char *GetCmdName( int index );
extern char *GetMenuLabel( unsigned size, gui_menu_struct *menu, unsigned id, char *buff, bool strip_amp );
extern cmd_list *AllocCmdList( char *start, unsigned len );
extern void FreeCmdList(cmd_list *);
extern void FiniMacros( void );
extern void Invoke(char *,int ,char_ring *);
extern char *ReScan( char * );
extern void SetUnderLine( a_window *, wnd_line_piece * );
extern char MainTab[];
extern char *TxtBuff;
extern wnd_info *WndInfoTab[];
extern gui_menu_struct WndMainMenu[];
extern int WndNumMenus;
static char **WndDisplayNames[] = {
#define pick( a,b,c,d,e,f ) LITREF( f ),
#include "wndnames.h"
};
static char **WhatList[] = {
LITREF( mac_popup_menu ),
LITREF( mac_main_menu ),
LITREF( mac_command_string ),
};
#define TITLE_SIZE 2
static char **Titles[] = { LITREF( Key_Name ), LITREF( Mac_Window ),
LITREF( Macro_Type ), LITREF( Definition ) };
enum {
PIECE_KEY,
PIECE_WHERE,
PIECE_WHAT,
PIECE_TEXT,
PIECE_LAST
};
#define MIN_KEY_SIZE( wnd ) (8*WndAvgCharX(wnd)) // something big enough to click on
static gui_ord Indents[PIECE_LAST];
typedef struct {
unsigned last_id;
wnd_row change_row;
unsigned size;
gui_menu_struct *menu;
wnd_macro *mac;
unsigned press_key : 1;
unsigned creating : 1;
unsigned changing : 1;
} mac_window;
#define WndMac( wnd ) ( (mac_window *)WndExtra( wnd ) )
#include "menudef.h"
static gui_menu_struct MacMenu[] = {
#include "menumac.h"
};
static DLGPICKTEXT WndGetName;
static char *WndGetName( void *from, int i )
{
return( *((char ***)from)[i] );
}
#ifdef DEADCODE
wnd_macro *MacFindMac( unsigned key, wnd_class class )
{
wnd_macro *mac;
for( mac = WndMacroList; mac != NULL; mac = mac->link ) {
if( mac->key == key && mac->class == class ) return( mac );
}
return( NULL );
}
#endif
static wnd_macro *MacGetMacro( int row )
{
wnd_macro *mac;
int count;
count = 0;
mac = WndMacroList;
if( row < 0 ) return( NULL );
for( ;; ) {
if( mac == NULL ) break;
if( count == row ) break;
++count;
mac = mac->link;
}
return( mac );
}
static void MacChangeMac( a_window *wnd, wnd_macro *mac, unsigned key,
wnd_class class, wnd_row row )
{
cmd_list *cmds;
wnd_macro **owner,*curr;
wnd_row i;
cmds = mac->cmd;
LockCmdList( cmds );
MacAddDel( mac->key, mac->class, NULL );
curr = MacAddDel( key, class, cmds );
for( owner = &WndMacroList; *owner; owner = &(*owner)->link ) {
if( *owner == curr ) break;
}
*owner = curr->link;
i = 0;
for( owner = &WndMacroList; *owner; owner = &(*owner)->link ) {
if( i == row ) break;
++i;
}
curr->link = *owner;
*owner = curr;
WndNewCurrent( wnd, i, PIECE_KEY );
}
static void MacModify( a_window *wnd, int row, int piece );
static bool MacModWhat( a_window *wnd, wnd_row row )
{
int new;
int old;
wnd_macro *mac = MacGetMacro( row );
wnd=wnd;
old = mac->type;
if( mac->class == WND_ALL ) {
new = DlgPickWithRtn( LIT( Macro_Type ), WhatList+1,
mac->type == MACRO_COMMAND, WndGetName, ArraySize( WhatList )-1 );
if( new != -1 ) ++new;
} else {
new = DlgPickWithRtn( LIT( Macro_Type ), WhatList,
mac->type, WndGetName, ArraySize( WhatList ) );
}
if( new != -1 ) {
mac->type = new;
if( new != old ) {
MacModify( wnd, row, PIECE_TEXT );
}
return( TRUE );
} else {
return( FALSE );
}
}
bool MacKeyHit( a_window *wnd, unsigned key )
{
mac_window *wndmac = WndMac( wnd );
wnd_macro *mac,*curr;
wnd_row row;
int new;
if( wndmac->press_key ) {
if( KeyName( key ) == NULL ) {
Ring();
return( TRUE );
}
wndmac->press_key = FALSE;
WndZapped( wnd );
if ( key == GUI_KEY_ESCAPE ) return( TRUE );
if( wndmac->changing ) {
wndmac->changing = FALSE;
mac = MacGetMacro( wndmac->change_row );
MacChangeMac( wnd, mac, key, mac->class, wndmac->change_row );
} else if( wndmac->creating ) {
wndmac->creating = FALSE;
new = DlgPickWithRtn( LIT( Enter_Window ), WndDisplayNames, WND_ALL, WndGetName, WND_CURRENT );
if( new == -1 ) return( TRUE );
curr = MacAddDel( key, new, AllocCmdList( LIT( Quest_Marks ),
strlen( LIT( Quest_Marks ) ) ) );
row = 0;
for( mac = WndMacroList; mac != curr; mac = mac->link ) {
++row;
}
curr->type = -1;
if( !MacModWhat( wnd, row ) ) {
mac->type = MACRO_COMMAND;
}
WndScrollAbs( wnd, row );
WndNewCurrent( wnd, row, PIECE_WHAT );
}
return( TRUE );
} else {
return( FALSE );
}
}
static WNDCLICKHOOK MacPopupClicked;
static bool MacPopupClicked( a_window *wnd, unsigned id )
{
char *p;
int main_id;
mac_window *wndmac;
cmd_list *cmds;
WndInstallClickHook( NULL );
if( wnd == NULL || WndClass( wnd ) != WND_MACRO ) return( FALSE );
wndmac = WndMac( wnd );
if( wndmac->mac == NULL ) return( FALSE );
p = StrCopy( GetCmdName( CMD_ACCEL ), TxtBuff );
*p++ = ' ';
if( wndmac->mac->type == MACRO_MAIN_MENU ) {
p = GetCmdEntry( MainTab, 1, p );
*p++ = ' ';
main_id = id - id % MAIN_MENU_MULT;
*p++ = '{';
p = GetMenuLabel( wndmac->size, wndmac->menu, main_id, p, FALSE );
*p++ = '}';
*p++ = ' ';
*p++ = '{';
p = GetMenuLabel( wndmac->size, wndmac->menu, id, p, FALSE );
} else {
*p++ = '{';
p = GetMenuLabel( wndmac->size, wndmac->menu, id, p, FALSE );
}
if( p != NULL ) {
*p++ = '}';
*p++ = '\0';
cmds = AllocCmdList( TxtBuff, p-TxtBuff );
MacAddDel( wndmac->mac->key, wndmac->mac->class, cmds );
}
return( TRUE );
}
static void MacModMenu( a_window *wnd, wnd_row row )
{
wnd_info *info;
gui_point point;
int dummy;
mac_window *wndmac= WndMac( wnd );
wnd_macro *mac = MacGetMacro( row );
info = WndInfoTab[ mac->class ];
WndCurrToGUIPoint( wnd, &point );
WndInstallClickHook( MacPopupClicked );
if( mac->type == MACRO_MAIN_MENU ) {
wndmac->last_id = 0;
wndmac->menu = WndMainMenu;
wndmac->size = WndNumMenus-2;
wndmac->mac = mac;
WndCreateFloatingPopup( wnd, &point, wndmac->size, wndmac->menu, &dummy );
} else {
wndmac->last_id = 0;
wndmac->menu = info->popupmenu;
wndmac->size = info->num_popups;
wndmac->mac = mac;
WndChangeMenuAll( info->popupmenu, info->num_popups, FALSE, GUI_GRAYED );
WndCreateFloatingPopup( wnd, &point, wndmac->size, wndmac->menu, &dummy );
}
}
static void MacModWhere( a_window *wnd, wnd_row row )
{
int new;
wnd_macro *mac = MacGetMacro( row );
wnd_class def;
wnd=wnd;
def = mac->class == WND_NO_CLASS ? WND_ALL : mac->class;
new = DlgPickWithRtn( LIT( Enter_Window ), WndDisplayNames, def, WndGetName, WND_CURRENT );
if( new == -1 ) return;
// WndRepaint( wnd );
MacChangeMac( wnd, mac, mac->key, new, row );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?