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

📄 font_menu.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*****************************************************************************/#ifndef lintstatic char sccsid[] = "@(#)font_menu.c 1.1 92/07/30 Copyr 1986 Sun Micro";#endif/*****************************************************************************/#include <suntool/sunview.h>#include <suntool/panel.h>#include <suntool/walkmenu.h>void set_family(), set_size(), set_on_off(), toggle_on_off(), open_fonts();Menu new_menu(), initialize_on_off();char *int_to_str();extern char * sprintf();extern char * malloc();Panel_item feedback_item;char *family, *size, *bold, *italic;Pixfont *cour, *serif, *apl, *cmr, *screen;/*****************************************************************************//* main                                                                      *//* First create the base frame, the feedback panel and feedback item. The    *//* feedback item is initialized to "gallant 8".                              *//* Then get the frame's menu, call new_menu() to create a new menu with the  *//* original frame menu as a pullright, and give the new menu to the frame.   *//*****************************************************************************/main(argc, argv)	int argc;	char *argv[];{       Frame frame;    Panel panel;    Menu  menu;    int   defaults;        frame = window_create(NULL, FRAME, FRAME_LABEL, "Menu Test -- Try frame menu.", 0);    panel = window_create(frame, PANEL, WIN_ROWS, 1, 0);    feedback_item = panel_create_item(panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "", 0);   family = "Gallant", size = "8", bold = italic = "";   update_feedback();        /* remember if user gave -d flag */    if (argc >= 2) defaults = strcmp(argv[1], "-d") == 0;    menu = (Menu)window_get(frame, WIN_MENU);    menu = new_menu(menu, defaults);    window_set(frame, WIN_MENU, menu, 0);        window_main_loop(frame);	exit(0);	/* NOTREACHED */}/*****************************************************************************//* new_menu -- returns a new menu with 'original menu' as a pullright.       *//*****************************************************************************/Menunew_menu(original_menu, defaults)	Menu original_menu;	int defaults;{       Menu new_menu, family_menu, size_menu, on_off_menu;    int i;        /* create the on-off menu, which will be used as a pullright     * for both the bold and italic items to the new menu.     */    on_off_menu = menu_create(MENU_STRING_ITEM, "On", 1,			 MENU_STRING_ITEM,      "Off", 0, 			 MENU_GEN_PROC,         initialize_on_off, 			 MENU_NOTIFY_PROC,      set_on_off, 			 0);			     /* create the new menu which will eventually be returned */    open_fonts(); /* first open the needed fonts */    new_menu = menu_create(		     MENU_PULLRIGHT_ITEM,		       "Frame", 		       original_menu,		     MENU_PULLRIGHT_ITEM, 		       "Family",		       family_menu = menu_create(			 MENU_ITEM,			    MENU_STRING, "Courier",			    MENU_FONT,   cour,                             0, 			 MENU_ITEM,			    MENU_STRING, "Serif",			    MENU_FONT,   serif,			    0, 			 MENU_ITEM,			    MENU_STRING, "aplAPLGIJ",			    MENU_FONT,   apl,			    0,			 MENU_ITEM,			    MENU_STRING, "CMR",			    MENU_FONT,   cmr,			    0, 			 MENU_ITEM,			    MENU_STRING, "Screen",			    MENU_FONT,   screen,			    0,			 MENU_NOTIFY_PROC, set_family,		       0),		     MENU_PULLRIGHT_ITEM,		       "Size", size_menu = menu_create(0), 		     MENU_ITEM,		       MENU_STRING,      "Bold",		       MENU_PULLRIGHT,   on_off_menu, 		       MENU_NOTIFY_PROC, toggle_on_off,		       MENU_CLIENT_DATA, &bold, 		       0, 		     MENU_ITEM,		       MENU_STRING,      "Italic",		       MENU_PULLRIGHT,   on_off_menu, 		       MENU_NOTIFY_PROC, toggle_on_off,		       MENU_CLIENT_DATA, &italic,		       0,		     0);    /* give each item in the family menu the size menu as a pullright */     for (i = (int)menu_get(family_menu, MENU_NITEMS); i > 0; --i)        menu_set(menu_get(family_menu, MENU_NTH_ITEM, i), 		 MENU_PULLRIGHT, size_menu, 0);	    /* put non-selectable lines inbetween groups of items in family menu */    menu_set(family_menu,	     MENU_INSERT, 2, menu_create_item(MENU_STRING,     "-------",					      MENU_INACTIVE,   TRUE, 					      0), 	     0);    menu_set(family_menu, 	     MENU_INSERT, 5, menu_get(family_menu, MENU_NTH_ITEM, 3),	     0);        /* The size menu was created with no items.  Now give it items representing */    /*  the point sizes 8, 10, 12, 14, 16, and 18.                          */    for (i = 8; i <= 18; i += 2)         menu_set(size_menu, MENU_STRING_ITEM, int_to_str(i), i, 0);    /* give the size menu a notify proc to update the feedback */    menu_set(size_menu, MENU_NOTIFY_PROC, set_size, 0);    /* if the user did not give the -d flag, make all the menus come     * up with the initial and default selections the last selected     * item, and the initial selection selected.    */    if (!defaults) {        menu_set(new_menu,		 MENU_DEFAULT_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION_SELECTED, TRUE, 		 0);        menu_set(family_menu,		 MENU_DEFAULT_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION_SELECTED, TRUE, 		 0);        menu_set(size_menu,		 MENU_DEFAULT_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION_SELECTED, TRUE, 		 0);        menu_set(on_off_menu,		 MENU_DEFAULT_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION, MENU_SELECTED,		 MENU_INITIAL_SELECTION_SELECTED, TRUE, 		 0);    }    return (new_menu);    }/*****************************************************************************//* set_family -- notify proc for family menu.  Get the current family and    *//* display it in the feedback panel.  Note that we first get the value       *//* of the menu item.  This has the side effect of causing any pullrights     *//* further to the right of mi to be evaluated.  Specifically, the value of   *//* each family item is the value of its pullright -- namely the size menu.   *//* When the size menu is evaluated, the notify proc set_size() is called,    *//* which updates the feedback for the size.                                  *//*****************************************************************************//*ARGSUSED*/voidset_family(m, mi)	Menu m;	Menu_item mi;{       menu_get(mi, MENU_VALUE);  /* force pullrights to be evaluated */    family = menu_get(mi, MENU_STRING);    update_feedback();}/*****************************************************************************//* set_size -- notify proc for the size menu.                                *//*****************************************************************************//*ARGSUSED*/voidset_size(m, mi)	Menu m;	Menu_item mi;{       size =  menu_get(mi, MENU_STRING);    update_feedback();}/****************************************************************************//* initialize_on_off -- generate proc for the on_off menu.                   *//* The on-off menu is a pullright of both the bold and the italic menus.     *//* We want it to toggle -- if its parent was on, it should come up with      *//* "Off" selected, and vice-versa.  We can do that by first getting the      *//* parent menu item, then, indirectly through its client data attribute,     *//* seeing if the string representing the bold or italic state is null.       *//* If the string was null, we set the first item ("On") to be selected,      *//* else we set the second item ("Off") to be selected.                       *//*****************************************************************************/Menuinitialize_on_off(m, op)	Menu m; Menu_generate op;{       Menu_item parent_mi;    char **name;        if (op != MENU_DISPLAY) return (m);	    parent_mi =	(Menu_item)menu_get(m, MENU_PARENT);    name = (char **)menu_get(parent_mi, MENU_CLIENT_DATA);    if (**name == NULL)        menu_set(m, MENU_SELECTED, 1, 0);    else        menu_set(m, MENU_SELECTED, 2, 0);    return (m);	}/*****************************************************************************//* set_on_off -- notify proc for on-off menu.                                *//* Set the feedback string -- italic or bold -- appropriately depending on   *//* the current setting.  Note that the "On" item was created to return a     *//* value of 1, and the "Off" item will return a value of 0.                  *//*****************************************************************************/voidset_on_off(m, mi)	Menu m; Menu_item mi;{       Menu_item parent_mi;    char **name;        parent_mi =	(Menu_item)menu_get(m, MENU_PARENT);    name = (char **)menu_get(parent_mi, MENU_CLIENT_DATA);    if (menu_get(mi, MENU_VALUE))        *name = (char *)menu_get(parent_mi, MENU_STRING);    else        *name = "";    update_feedback();}/*****************************************************************************//* toggle_on_off -- notify proc for the "Bold" and "Italic" menu items.      *//* Using a notify proc for the menu item allows toggling without bringing    *//* up the on-off pullright.                                                  *//*****************************************************************************//*ARGSUSED*/voidtoggle_on_off(m, mi)	Menu m;	Menu_item mi;{       char **name;    name = (char **)menu_get(mi, MENU_CLIENT_DATA);    if (**name == NULL)	*name = (char *)menu_get(mi, MENU_STRING);    else	*name = "";    update_feedback();}update_feedback(){       char buf[30];        sprintf(buf, "%s %s %s %s", bold, italic, family, size);    panel_set(feedback_item, PANEL_LABEL_STRING, buf, 0);}char *int_to_str(n){       char *r = malloc(4);    sprintf(r, "%d", n);    return (r);}voidopen_fonts(){       cour = pf_open("/usr/lib/fonts/fixedwidthfonts/cour.r.10");    serif = pf_open("/usr/lib/fonts/fixedwidthfonts/serif.r.10");    apl = pf_open("/usr/lib/fonts/fixedwidthfonts/apl.r.10");    cmr = pf_open("/usr/lib/fonts/fixedwidthfonts/cmr.b.8");    screen = pf_open("/usr/lib/fonts/fixedwidthfonts/screen.r.11");}

⌨️ 快捷键说明

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