📄 walkmenu_set.c
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)walkmenu_set.c 1.1 92/07/30 Copyright 1985 Sun Micro";#endif#endif/* * Copyright (c) 1985 by Sun Microsystems, Inc. *//*- WALKING MENU PACKAGE walkmenu_set.c, Sun Jun 30 15:38:39 1985 Craig Taylor, Sun Microsystems *//* ------------------------------------------------------------------------- */#include <sys/types.h>#include <stdio.h>#include <varargs.h>#include <pixrect/pixrect.h>#include <pixrect/pixfont.h>#include <pixrect/pr_util.h>#include <pixrect/memvar.h>#include <sunwindow/sun.h> /* for LINT_CAST */#include <suntool/walkmenu_impl.h>/* ------------------------------------------------------------------------- *//* * Public */ /* None *//* * Package private */Pkg_extern struct menu_item *menu_create_item_avlist();Pkg_extern struct menu_ops_vector menu_ops;Pkg_extern struct menu_ops_vector menu_item_ops;/* Pullright arrow pixrect. This really is Pkg_private despite mpr_static. */Private short arrow_data[] = {/* 0x0200, 0x0300, 0x7E80, 0x00C0, 0x7E80, 0x0300, 0x0200, 0x0000 (width=12) */ 0x0080, 0x00C0, 0x1FA0, 0x0030, 0x1FA0, 0x00C0, 0x0080, 0x0000};Private mpr_static(menu_arrow_pr, 14, 8, 1, arrow_data);Pkg_private void menu_sets();Pkg_private void menu_item_sets();Pkg_private void menu_destroys();Pkg_private void menu_item_destroys();/* * Private */Private int extend_item_list();Private int remove_item();Private int replace_item();Private int insert_item();Private int lookup();/* * Private defs */ /* None *//* ------------------------------------------------------------------------- */Pkg_private voidmenu_sets(m, attrs) register struct menu *m; register Menu_attribute *attrs;{ for (; *attrs; attrs = menu_attr_next(attrs)) switch (attrs[0]) { case MENU_ACTION_IMAGE: case MENU_ACTION_ITEM: case MENU_GEN_PULLRIGHT_IMAGE: case MENU_GEN_PULLRIGHT_ITEM: case MENU_GEN_PROC_IMAGE: case MENU_GEN_PROC_ITEM: case MENU_IMAGE_ITEM: case MENU_PULLRIGHT_IMAGE: case MENU_PULLRIGHT_ITEM: case MENU_STRING_ITEM: if (m->nitems < m->max_nitems || extend_item_list(m)) { m->item_list[m->nitems++] = (struct menu_item *)LINT_CAST( menu_create_item(LINT_CAST(MENU_RELEASE), attrs[0], attrs[1], attrs[2], 0)); } break; case MENU_APPEND_ITEM: if (m->nitems < m->max_nitems || extend_item_list(m)) m->item_list[m->nitems++] = (struct menu_item *)attrs[1]; break; case MENU_BOXED: (void) image_set(&m->default_image, IMAGE_BOXED, attrs[1], 0); break; case MENU_CENTER: (void) image_set(&m->default_image, IMAGE_CENTER, attrs[1], 0); break; case MENU_CLIENT_DATA: m->client_data = (caddr_t)attrs[1]; break; case HELP_DATA: m->help_data = (caddr_t)attrs[1]; break; case MENU_COLUMN_MAJOR: m->column_major = (int)attrs[1]; break; case MENU_DEFAULT: m->default_position = (int)attrs[1]; break; case MENU_DEFAULT_ITEM: m->default_position = lookup(m->item_list, m->nitems, (struct menu_item *)LINT_CAST(attrs[1])); break; case MENU_DEFAULT_IMAGE: if (attrs[1]) m->default_image = *(struct image *)attrs[1]; break; case MENU_DEFAULT_SELECTION: m->default_selection = (Menu_attribute)attrs[1]; break; case MENU_FONT: (void) image_set(&m->default_image, IMAGE_FONT, attrs[1], 0); break; case MENU_GEN_PROC: m->gen_proc = (struct menu *(*)())attrs[1]; break; case MENU_HEIGHT: m->height = (int)attrs[1]; break; case MENU_IMAGES: { char **a = (char **)&attrs[1]; while (*a) { if (m->nitems < m->max_nitems || extend_item_list(m)) { m->item_list[m->nitems] = (struct menu_item *)LINT_CAST( menu_create_item(LINT_CAST(MENU_RELEASE), MENU_IMAGE_ITEM, *a++, m->nitems + 1, 0)); } m->nitems++; } } break; case MENU_INITIAL_SELECTION: /* case MENU_ACCELERATED_SELECTION: Obsolete */ m->initial_selection = (Menu_attribute)attrs[1]; break; case MENU_INITIAL_SELECTION_EXPANDED: m->display_one_level = !(int)attrs[1]; break; case MENU_INITIAL_SELECTION_SELECTED: m->stand_off = !(int)attrs[1]; break; case MENU_JUMP_AFTER_SELECTION: m->jump_after_selection = (int)attrs[1]; break; case MENU_JUMP_AFTER_NO_SELECTION: m->jump_after_no_selection = (int)attrs[1]; break; case MENU_INSERT: if (++m->nitems < m->max_nitems || extend_item_list(m)) { if (!insert_item(m->item_list, m->nitems, (int)attrs[1], (struct menu_item *)attrs[2])) --m->nitems; } break; case MENU_INSERT_ITEM: if (++m->nitems < m->max_nitems || extend_item_list(m)) { if (!insert_item(m->item_list, m->nitems, lookup(m->item_list, m->nitems, (struct menu_item *)LINT_CAST(attrs[1])), (struct menu_item *)attrs[2])) --m->nitems; } break; case MENU_ITEM: if (m->nitems < m->max_nitems || extend_item_list(m)) { m->item_list[m->nitems] = menu_create_item_avlist(&attrs[1]); } (void)menu_set((caddr_t)m->item_list[m->nitems++], MENU_RELEASE, 0); break; case MENU_LEFT_MARGIN: (void) image_set(&m->default_image, IMAGE_LEFT_MARGIN, attrs[1], 0); break; case MENU_MARGIN: (void) image_set(&m->default_image, IMAGE_MARGIN, attrs[1], 0); break; case MENU_NCOLS: m->ncols = imax(0, (int)attrs[1]); break; case MENU_NROWS: m->nrows = imax(0, (int)attrs[1]); break; case MENU_NOTIFY_PROC: m->notify_proc = (caddr_t (*)())attrs[1]; if (!m->notify_proc) m->notify_proc = MENU_DEFAULT_NOTIFY_PROC; break; case MENU_PULLRIGHT_DELTA: m->pullright_delta = (int)attrs[1]; if (m->pullright_delta < 0) m->pullright_delta = MENU_DEFAULT_PULLRIGHT_DELTA; break; case MENU_REMOVE: if (remove_item(m->item_list, m->nitems, (int)attrs[1])) --m->nitems; break; case MENU_REMOVE_ITEM: if (remove_item(m->item_list, m->nitems, lookup(m->item_list, m->nitems, (struct menu_item *)LINT_CAST(attrs[1])))) --m->nitems; break; case MENU_REPLACE: (void) replace_item(m->item_list, m->nitems, (int)attrs[1], (struct menu_item *)LINT_CAST(attrs[2])); break; case MENU_REPLACE_ITEM: (void) replace_item(m->item_list, m->nitems, lookup(m->item_list, m->nitems, (struct menu_item *)LINT_CAST(attrs[1])), (struct menu_item *)LINT_CAST(attrs[2])); break; case MENU_RIGHT_MARGIN: (void)image_set(&m->default_image, IMAGE_RIGHT_MARGIN, attrs[1], 0); break; case MENU_SELECTED: m->selected_position = (int)attrs[1]; break; case MENU_SELECTED_ITEM: m->selected_position = lookup(m->item_list,m->nitems, (struct menu_item *)LINT_CAST(attrs[1])); break; case MENU_SHADOW: m->shadow_pr = (struct pixrect *)attrs[1]; break; case MENU_STAY_UP: m->stay_up = (int)attrs[1]; break; case MENU_STRINGS: { char **a = (char **)&attrs[1]; while (*a) { if (m->nitems < m->max_nitems || extend_item_list(m)) { m->item_list[m->nitems] = (struct menu_item *) LINT_CAST(menu_create_item(LINT_CAST(MENU_RELEASE), MENU_STRING_ITEM, *a++, m->nitems + 1, 0)); } m->nitems++; } } break; case MENU_TITLE_ITEM: case MENU_TITLE_IMAGE: if (m->nitems < m->max_nitems || extend_item_list(m)) m->item_list[m->nitems++] = (struct menu_item *)LINT_CAST( menu_create_item(LINT_CAST(((MENU_TITLE_ITEM == attrs[0]) ? MENU_STRING : MENU_IMAGE)), attrs[1], MENU_INVERT, TRUE, MENU_FEEDBACK, FALSE, MENU_BOXED, TRUE, MENU_RELEASE, MENU_NOTIFY_PROC, menu_return_no_value, 0)); break; case MENU_VALID_RESULT: m->valid_result = (int)attrs[1]; break; case MENU_WIDTH: m->width = (int)attrs[1]; break; case MENU_LINE_AFTER_ITEM: switch ((int)attrs[1]) { case MENU_HORIZONTAL_LINE: m->h_line = 1; break; case MENU_VERTICAL_LINE: m->v_line = 1; break; default: (void) fprintf(stderr, "Invalid argument for attribute MENU_LINE_AFTER_ITEM: %d\n",(int)attrs[1]); } break; case MENU_NOP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -