⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 源码,标准c++用力
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $XConsortium: menu.c,v 1.62 93/02/25 17:21:30 gildea Exp $ *//*Copyright 1989 Massachusetts Institute of TechnologyPermission to use, copy, modify, distribute, and sell this software and itsdocumentation for any purpose is hereby granted without fee, provided thatthe above copyright notice appear in all copies and that both thatcopyright notice and this permission notice appear in supportingdocumentation, and that the name of M.I.T. not be used in advertising orpublicity pertaining to distribution of the software without specific,written prior permission.  M.I.T. makes no representations about thesuitability of this software for any purpose.  It is provided "as is"without express or implied warranty.*/#include "ptyx.h"#include "data.h"#include "menu.h"#include <X11/StringDefs.h>#include <X11/Shell.h>#include <X11/Xmu/CharSet.h>#include <X11/Xaw/SimpleMenu.h>#include <X11/Xaw/SmeBSB.h>#include <X11/Xaw/SmeLine.h>#include <stdio.h>#include <signal.h>extern void FindFontSelection();Arg menuArgs[2] = {{ XtNleftBitmap, (XtArgVal) 0 },		   { XtNsensitive, (XtArgVal) 0 }};void do_hangup();static void do_securekbd(), do_allowsends(), do_visualbell(),#ifdef ALLOWLOGGING    do_logging(),#endif    do_redraw(), do_suspend(), do_continue(), do_interrupt(),     do_terminate(), do_kill(), do_quit(), do_scrollbar(), do_jumpscroll(),    do_reversevideo(), do_autowrap(), do_reversewrap(), do_autolinefeed(),    do_appcursor(), do_appkeypad(), do_scrollkey(), do_scrollttyoutput(),    do_allow132(), do_cursesemul(), do_marginbell(), do_tekshow(),     do_altscreen(), do_softreset(), do_hardreset(), do_clearsavedlines(),    do_tekmode(), do_vthide(),     do_tektextlarge(), do_tektext2(), do_tektext3(), do_tektextsmall(),     do_tekpage(), do_tekreset(), do_tekcopy(), do_vtshow(), do_vtmode(),     do_tekhide(), do_vtfont();/* * The order entries MUST match the values given in menu.h */MenuEntry mainMenuEntries[] = {    { "securekbd",	do_securekbd, NULL },		/*  0 */    { "allowsends",	do_allowsends, NULL },		/*  1 */#ifdef ALLOWLOGGING    { "logging",	do_logging, NULL },		/*  2 */#endif    { "redraw",		do_redraw, NULL },		/*  3 */    { "line1",		NULL, NULL },			/*  4 */    { "suspend",	do_suspend, NULL },		/*  5 */    { "continue",	do_continue, NULL },		/*  6 */    { "interrupt",	do_interrupt, NULL },		/*  7 */    { "hangup",		do_hangup, NULL },		/*  8 */    { "terminate",	do_terminate, NULL },		/*  9 */    { "kill",		do_kill, NULL },		/* 10 */    { "line2",		NULL, NULL },			/* 11 */    { "quit",		do_quit, NULL }};		/* 12 */MenuEntry vtMenuEntries[] = {    { "scrollbar",	do_scrollbar, NULL },		/*  0 */    { "jumpscroll",	do_jumpscroll, NULL },		/*  1 */    { "reversevideo",	do_reversevideo, NULL },	/*  2 */    { "autowrap",	do_autowrap, NULL },		/*  3 */    { "reversewrap",	do_reversewrap, NULL },		/*  4 */    { "autolinefeed",	do_autolinefeed, NULL },	/*  5 */    { "appcursor",	do_appcursor, NULL },		/*  6 */    { "appkeypad",	do_appkeypad, NULL },		/*  7 */    { "scrollkey",	do_scrollkey, NULL },		/*  8 */    { "scrollttyoutput",do_scrollttyoutput, NULL },	/*  9 */    { "allow132",	do_allow132, NULL },		/* 10 */    { "cursesemul",	do_cursesemul, NULL },		/* 11 */    { "visualbell",	do_visualbell, NULL },		/* 12 */    { "marginbell",	do_marginbell, NULL },		/* 13 */    { "altscreen",	do_altscreen, NULL },		/* 14 */    { "line1",		NULL, NULL },			/* 15 */    { "softreset",	do_softreset, NULL },		/* 16 */    { "hardreset",	do_hardreset, NULL },		/* 17 */    { "clearsavedlines",do_clearsavedlines, NULL },	/* 18 */    { "line2",		NULL, NULL },			/* 19 */    { "tekshow",	do_tekshow, NULL },		/* 20 */    { "tekmode",	do_tekmode, NULL },		/* 21 */    { "vthide",		do_vthide, NULL }};		/* 22 */MenuEntry fontMenuEntries[] = {    { "fontdefault",	do_vtfont, NULL },		/*  0 */    { "font1",		do_vtfont, NULL },		/*  1 */    { "font2",		do_vtfont, NULL },		/*  2 */    { "font3",		do_vtfont, NULL },		/*  3 */    { "font4",		do_vtfont, NULL },		/*  4 */    { "font5",		do_vtfont, NULL },		/*  5 */    { "font6",		do_vtfont, NULL },		/*  6 */	{ "font7",		do_vtfont, NULL },		/*  7 */	{ "fontescape",	do_vtfont, NULL },		/*  8 */	{ "fontold",	do_vtfont, NULL },		/*  9 */	{ "fontsel",	do_vtfont, NULL }};		/* 10 */    /* this should match NMENUFONTS in ptyx.h */MenuEntry tekMenuEntries[] = {    { "tektextlarge",	do_tektextlarge, NULL },	/*  0 */    { "tektext2",	do_tektext2, NULL },		/*  1 */    { "tektext3",	do_tektext3, NULL },		/*  2 */    { "tektextsmall",	do_tektextsmall, NULL },	/*  3 */    { "line1",		NULL, NULL },			/*  4 */    { "tekpage",	do_tekpage, NULL },		/*  5 */    { "tekreset",	do_tekreset, NULL },		/*  6 */    { "tekcopy",	do_tekcopy, NULL },		/*  7 */    { "line2",		NULL, NULL },			/*  8 */    { "vtshow",		do_vtshow, NULL },		/*  9 */    { "vtmode",		do_vtmode, NULL },		/* 10 */    { "tekhide",	do_tekhide, NULL }};		/* 11 */static Widget create_menu();extern Widget toplevel;/* * we really want to do these dynamically */#define check_width 9#define check_height 8static unsigned char check_bits[] = {   0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00,   0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00};/* * public interfaces *//* ARGSUSED */static Bool domenu (w, event, params, param_count)    Widget w;    XEvent *event;              /* unused */    String *params;             /* mainMenu, vtMenu, or tekMenu */    Cardinal *param_count;      /* 0 or 1 */{    TScreen *screen = &term->screen;    if (*param_count != 1) {	XBell (XtDisplay(w), 0);	return False;    }    switch (params[0][0]) {      case 'm':	if (!screen->mainMenu) {	    screen->mainMenu = create_menu (term, toplevel, "mainMenu",					    mainMenuEntries,					    XtNumber(mainMenuEntries));	    update_securekbd();	    update_allowsends();#ifdef ALLOWLOGGING	    update_logging();#endif#ifndef SIGTSTP	    set_sensitivity (screen->mainMenu,			     mainMenuEntries[mainMenu_suspend].widget, FALSE);#endif#ifndef SIGCONT	    set_sensitivity (screen->mainMenu, 			     mainMenuEntries[mainMenu_continue].widget, FALSE);#endif	}	break;      case 'v':	if (!screen->vtMenu) {	    screen->vtMenu = create_menu (term, toplevel, "vtMenu",					  vtMenuEntries,					  XtNumber(vtMenuEntries));	    /* and turn off the alternate screen entry */	    set_altscreen_sensitivity (FALSE);	    update_scrollbar();	    update_jumpscroll();	    update_reversevideo();	    update_autowrap();	    update_reversewrap();	    update_autolinefeed();	    update_appcursor();	    update_appkeypad();	    update_scrollkey();	    update_scrollttyoutput();	    update_allow132();	    update_cursesemul();	    update_visualbell();	    update_marginbell();	}	break;      case 'f':	if (!screen->fontMenu) {	    screen->fontMenu = create_menu (term, toplevel, "fontMenu",					    fontMenuEntries,					    NMENUFONTS);  	    set_menu_font (True);	    set_sensitivity (screen->fontMenu,			     fontMenuEntries[fontMenu_fontescape].widget,			     (screen->menu_font_names[fontMenu_fontescape]			      ? TRUE : FALSE));		set_sensitivity (screen->fontMenu,				fontMenuEntries[fontMenu_fontold].widget,				(screen->menu_font_names[fontMenu_fontold]				? TRUE : FALSE));	}	FindFontSelection (NULL, True);	set_sensitivity (screen->fontMenu,			 fontMenuEntries[fontMenu_fontsel].widget,			 (screen->menu_font_names[fontMenu_fontsel]			  ? TRUE : FALSE));	break;      case 't':	if (!screen->tekMenu) {	    screen->tekMenu = create_menu (term, toplevel, "tekMenu",					   tekMenuEntries,					   XtNumber(tekMenuEntries));	    set_tekfont_menu_item (screen->cur.fontsize, TRUE);	}	break;      default:	XBell (XtDisplay(w), 0);	return False;    }    return True;}void HandleCreateMenu (w, event, params, param_count)    Widget w;    XEvent *event;              /* unused */    String *params;             /* mainMenu, vtMenu, or tekMenu */    Cardinal *param_count;      /* 0 or 1 */{    (void) domenu (w, event, params, param_count);}void HandlePopupMenu (w, event, params, param_count)    Widget w;    XEvent *event;              /* unused */    String *params;             /* mainMenu, vtMenu, or tekMenu */    Cardinal *param_count;      /* 0 or 1 */{    if (domenu (w, event, params, param_count)) {	XtCallActionProc (w, "XawPositionSimpleMenu", event, params, 1);	XtCallActionProc (w, "MenuPopup", event, params, 1);    }}/* * private interfaces - keep out! *//* * create_menu - create a popup shell and stuff the menu into it. */static Widget create_menu (xtw, toplevelw, name, entries, nentries)    XtermWidget xtw;    Widget toplevelw;    char *name;    struct _MenuEntry *entries;    int nentries;{    Widget m;    TScreen *screen = &xtw->screen;    static XtCallbackRec cb[2] = { { NULL, NULL }, { NULL, NULL }};    static Arg arg = { XtNcallback, (XtArgVal) cb };    if (screen->menu_item_bitmap == None) {	screen->menu_item_bitmap =	  XCreateBitmapFromData (XtDisplay(xtw),				 RootWindowOfScreen(XtScreen(xtw)),				 (char *)check_bits, check_width, check_height);    }    m = XtCreatePopupShell (name, simpleMenuWidgetClass, toplevelw, NULL, 0);    for (; nentries > 0; nentries--, entries++) {	cb[0].callback = (XtCallbackProc) entries->function;	cb[0].closure = (caddr_t) entries->name;	entries->widget = XtCreateManagedWidget (entries->name, 						 (entries->function ?						  smeBSBObjectClass :						  smeLineObjectClass), m,						 &arg, (Cardinal) 1);    }    /* do not realize at this point */    return m;}/* ARGSUSED */static void handle_send_signal (gw, sig)    Widget gw;    int sig;{    register TScreen *screen = &term->screen;    if (screen->pid > 1) kill_process_group (screen->pid, sig);}/* * action routines *//* ARGSUSED */void DoSecureKeyboard (time)    Time time;{    do_securekbd (term->screen.mainMenu, NULL, NULL);}static void do_securekbd (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    Time time = CurrentTime;		/* XXX - wrong */    if (screen->grabbedKbd) {	XUngrabKeyboard (screen->display, time);	ReverseVideo (term);	screen->grabbedKbd = FALSE;    } else {	if (XGrabKeyboard (screen->display, term->core.window,			   True, GrabModeAsync, GrabModeAsync, time)	    != GrabSuccess) {	    XBell (screen->display, 100);	} else {	    ReverseVideo (term);	    screen->grabbedKbd = TRUE;	}    }    update_securekbd();}static void do_allowsends (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    screen->allowSendEvents = !screen->allowSendEvents;    update_allowsends ();}static void do_visualbell (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    screen->visualbell = !screen->visualbell;    update_visualbell();}#ifdef ALLOWLOGGINGstatic void do_logging (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    if (screen->logging) {	CloseLog (screen);    } else {	StartLog (screen);    }    /* update_logging done by CloseLog and StartLog */}#endifstatic void do_redraw (gw, closure, data)    Widget gw;    caddr_t closure, data;{    Redraw ();}/* * The following cases use the pid instead of the process group so that we * don't get hosed by programs that change their process group *//* ARGSUSED */static void do_suspend (gw, closure, data)    Widget gw;    caddr_t closure, data;{#ifdef SIGTSTP    handle_send_signal (gw, SIGTSTP);#endif}/* ARGSUSED */static void do_continue (gw, closure, data)    Widget gw;    caddr_t closure, data;{#ifdef SIGCONT    handle_send_signal (gw, SIGCONT);#endif}/* ARGSUSED */static void do_interrupt (gw, closure, data)    Widget gw;    caddr_t closure, data;{    handle_send_signal (gw, SIGINT);}/* ARGSUSED */void do_hangup (gw, closure, data)    Widget gw;    caddr_t closure, data;{    handle_send_signal (gw, SIGHUP);}/* ARGSUSED */static void do_terminate (gw, closure, data)    Widget gw;    caddr_t closure, data;{    handle_send_signal (gw, SIGTERM);}/* ARGSUSED */static void do_kill (gw, closure, data)    Widget gw;    caddr_t closure, data;{    handle_send_signal (gw, SIGKILL);}static void do_quit (gw, closure, data)    Widget gw;    caddr_t closure, data;{    Cleanup (0);}/* * vt menu callbacks */static void do_scrollbar (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    if (screen->scrollbar) {	ScrollBarOff (screen);    } else {	ScrollBarOn (term, FALSE, FALSE);    }    update_scrollbar();}static void do_jumpscroll (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    term->flags ^= SMOOTHSCROLL;    if (term->flags & SMOOTHSCROLL) {	screen->jumpscroll = FALSE;	if (screen->scroll_amt) FlushScroll(screen);    } else {	screen->jumpscroll = TRUE;    }    update_jumpscroll();}static void do_reversevideo (gw, closure, data)    Widget gw;    caddr_t closure, data;{    term->flags ^= REVERSE_VIDEO;    ReverseVideo (term);    /* update_reversevideo done in ReverseVideo */}static void do_autowrap (gw, closure, data)    Widget gw;    caddr_t closure, data;{    term->flags ^= WRAPAROUND;    update_autowrap();}static void do_reversewrap (gw, closure, data)    Widget gw;    caddr_t closure, data;{    term->flags ^= REVERSEWRAP;    update_reversewrap();}static void do_autolinefeed (gw, closure, data)    Widget gw;    caddr_t closure, data;{    term->flags ^= LINEFEED;    update_autolinefeed();}static void do_appcursor (gw, closure, data)    Widget gw;    caddr_t closure, data;{    term->keyboard.flags ^= CURSOR_APL;    update_appcursor();}static void do_appkeypad (gw, closure, data)    Widget gw;    caddr_t closure, data;{    term->keyboard.flags ^= KYPD_APL;    update_appkeypad();}static void do_scrollkey (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    screen->scrollkey = !screen->scrollkey;    update_scrollkey();}static void do_scrollttyoutput (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    screen->scrollttyoutput = !screen->scrollttyoutput;    update_scrollttyoutput();}static void do_allow132 (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    screen->c132 = !screen->c132;    update_allow132();}static void do_cursesemul (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    screen->curses = !screen->curses;    update_cursesemul();}static void do_marginbell (gw, closure, data)    Widget gw;    caddr_t closure, data;{    register TScreen *screen = &term->screen;    if (!(screen->marginbell = !screen->marginbell)) screen->bellarmed = -1;    update_marginbell();}static void handle_tekshow (gw, allowswitch)    Widget gw;    Bool allowswitch;{    register TScreen *screen = &term->screen;    if (!screen->Tshow) {		/* not showing, turn on */	set_tek_visibility (TRUE);    } else if (screen->Vshow || allowswitch) {  /* is showing, turn off */	set_tek_visibility (FALSE);	end_tek_mode ();		/* WARNING: this does a longjmp */    } else      Bell();

⌨️ 快捷键说明

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