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

📄 panel_create.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic	char sccsid[] = "@(#)panel_create.c 1.1 92/07/30 Copyr 1984 Sun Micro";#endif#endif/*               Copyright (c) 1986 by Sun Microsystems, Inc.                */#include <sunwindow/sun.h>#include <varargs.h>#include <suntool/panel_impl.h>#include <suntool/window.h>#include <sunwindow/win_keymap.h>#include "sunwindow/sv_malloc.h"#define		FOREGROUND	-1Bool	defaults_get_boolean();static short menu_on_image[] = {#include <images/panel_menu_on.pr>};static mpr_static(panel_menu_on, 16, 16, 1, menu_on_image);static short caret_image[7]={	0x1000, 0x3800, 0x3800, 0x7C00, 0x7C00, 0xFE00, 0xFE00	};static mpr_static(panel_caret_pr, 7, 7, 1, caret_image);static short ghost_caret[7]={	0x1000, 0x2800, 0x5400, 0xAA00, 0x5400, 0x2800, 0x1000};mpr_static(panel_ghost_caret_pr, 7, 7, 1, ghost_caret);/* default timer value */static struct timeval PANEL_TIMER = { 0, 500000 };/* Note that this must be modified when the  * ops structure is modified.  */static struct panel_ops null_ops = {   panel_nullproc,     			/* handle_event() */   panel_nullproc,     			/* begin_preview() */   panel_nullproc,     			/* update_preview() */   panel_nullproc,     			/* cancel_preview() */   panel_nullproc,     			/* accept_preview() */   panel_nullproc,     			/* accept_menu() */   panel_nullproc,     			/* accept_key() */   panel_nullproc,     			/* paint() */   panel_nullproc,     			/* destroy() */   (caddr_t (*)()) panel_nullproc, 	/* get_attr() */   panel_nullproc,     			/* set_attr() */   (caddr_t (*)()) panel_nullproc, 	/* remove() */   (caddr_t (*)()) panel_nullproc, 	/* restore() */   panel_nullproc     			/* layout() */};static         free_panel(), shrink_to_fit();/* Note that this must be modified when the ops structure is modified. */static struct panel_ops default_panel_ops = {   panel_default_handle_event,		/* handle_event() */   panel_nullproc,     			/* begin_preview() */   panel_nullproc,     			/* update_preview() */   panel_nullproc,     			/* cancel_preview() */   panel_nullproc,     			/* accept_preview() */   panel_nullproc,     			/* accept_menu() */   panel_nullproc,     			/* accept_key() */   (int (*)()) panel_display,     	/* paint() */   free_panel,     			/* destroy() */   panel_get_panel,			/* get_attr() */   panel_set_panel,     		/* set_attr() */   (caddr_t (*)()) panel_nullproc, 	/* remove() */   (caddr_t (*)()) panel_nullproc, 	/* restore() */   panel_nullproc     			/* layout() */};/*****************************************************************************//* panel_create_item                                                         *//*****************************************************************************//* VARARGS2 */Panel_itempanel_create_item(client_panel, create_proc, va_alist)Panel		client_panel;Panel_item	(*create_proc)();va_dcl{   register panel_handle	panel = PANEL_CAST(client_panel);   caddr_t 			avlist[ATTR_STANDARD_SIZE];   register panel_item_handle	ip;   va_list			valist;   va_start(valist);   (void)attr_make(avlist, ATTR_STANDARD_SIZE,  valist);   va_end(valist);   if (!(ip = (panel_item_handle)LINT_CAST(calloc(1, sizeof(struct panel_item)))))      return(NULL);    ip->panel                = panel;   ip->next                 = NULL;   ip->flags                = IS_ITEM | panel->flags; /* get panel-wide attrs */   ip->flags               &= ~IS_PANEL;	/* this is not a panel */   ip->flags               &= ~OPS_SET;		/* ops vector is not altered */   ip->layout               = panel->layout;   ip->notify               = panel_nullproc;   ip->ops                  = &null_ops;   ip->repaint              = panel->repaint;    /* default painting behavior */   ip->color_index	    = FOREGROUND;	 /* default color is foreground color */   image_set_type(&ip->label, IM_STRING);   image_set_string(&ip->label, panel_strsave(""));   image_set_font(&ip->label, ip->panel->font);   image_set_bold(&ip->label, label_bold_flag(ip));   image_set_shaded(&ip->label, label_shaded_flag(ip));   /* nothing is painted yet */   rect_construct(&ip->painted_rect, 0, 0, 0, 0)   /* start the item, label & value rects at the default position */   rect_construct(&ip->rect, ip->panel->item_x, ip->panel->item_y, 0, 0);   ip->label_rect = ip->rect;   ip->value_rect = ip->rect;   /* set up the menu */   ip->menu	         = NULL;            /* no menu */   ip->menu_title        = ip->label;   image_set_string(&ip->menu_title, panel_strsave(""));   ip->menu_choices      = NULL;	    /* no menu choices */   ip->menu_last         = -1;	            /* no last slot */   ip->menu_choices_bold = FALSE;	    /* regular choice strings */   ip->menu_values       = NULL;	    /* no values */   ip->menu_type_pr      = NULL;	    /* no type indication yet */   ip->menu_mark_on      = &panel_menu_on;  /* for PANEL_MARKED menu feedback */   ip->menu_mark_off     = &panel_empty_pr; /* for PANEL_MARKED menu feedback */   ip->menu_mark_width =       max(ip->menu_mark_on->pr_width, ip->menu_mark_off->pr_width);   ip->menu_mark_height =       max(ip->menu_mark_on->pr_height, ip->menu_mark_off->pr_height);    ip->menu_max_width = 0;		    /* menu is zero wide */   /* set the generic attributes */   (void) panel_set_generic(ip, avlist);   /* create the item */   (void) (*create_proc)(ip, avlist);   if (panel->event_proc) {      panel_ops_handle	new_ops;      if (!ops_set(ip)) {	   new_ops = (panel_ops_handle) 	       LINT_CAST(sv_malloc(sizeof(struct panel_ops)));	   *new_ops = *ip->ops;	   ip->ops = new_ops;	   ip->flags |= OPS_SET;	}	ip->ops->handle_event = panel->event_proc;   }   /* set the menu attributes */   (void) panel_set_menu(ip, avlist);   /* set the ops vector attributes */   (void)panel_set_ops(ip, avlist);   return (Panel_item) ip;}/* ARGSUSED */panel_handlepanel_create_panel_struct(win, windowfd)caddr_t		win;int 		windowfd;{   register panel_handle		panel;   if (!(panel = (panel_handle) LINT_CAST(calloc(1,sizeof(struct panel)))))      return NULL;   panel->windowfd         = windowfd;   panel->flags            = IS_PANEL;   panel->ops	   	   = &default_panel_ops;   panel->mouse_state	   = PANEL_NONE_DOWN;   panel->layout           = PANEL_HORIZONTAL;   panel->timer_proc       = NULL;   panel->event_proc       = NULL;   panel->status           = 0;	   /* Note that the defaults database is also referenced in panel_text.c. */   if (defaults_get_boolean("/Text/Blink_caret", (Bool)(LINT_CAST(1)),    		(int *)NULL)) {      panel->status        |= BLINKING;	   }/* bug 1028688: set default for Adjust_is-pending_delete to FALSE */   if (defaults_get_boolean("/Text/Adjust_is_pending_delete",      (Bool)(LINT_CAST(FALSE)), (int *) NULL))      panel->status           |= ADJUST_IS_PENDING_DELETE;   panel->caret_on         = FALSE;   panel->caret_pr	   = &panel_ghost_caret_pr;   panel->timer_full       = PANEL_TIMER;   panel->item_x_offset    = ITEM_X_GAP;   panel->item_y_offset    = ITEM_Y_GAP;   panel->item_x           = PANEL_ITEM_X_START;   panel->item_y           = PANEL_ITEM_Y_START;   panel->repaint          = PANEL_CLEAR;   panel->help_data	   = "sunview:panel";   panel->v_margin         = 4;   panel->h_margin         = 4;   /* these are zero from the calloc()   panel->max_item_y       = 0;   panel->v_scrollbar      = 0;   panel->h_scrollbar      = 0;   panel->v_bar_width      = 0;   panel->h_bar_width      = 0;   panel->v_offset         = 0;   panel->h_offset         = 0;   panel->v_end            = 0;   panel->h_end            = 0;   */   (void)win_getsize(windowfd, &panel->rect);   return panel;}panel_set_inputmask(panel, windowfd)   panel_handle panel;   int windowfd;{   struct inputmask mask;   /* Initialize and set kbd input mask */   (void)input_imnull(&mask);   mask.im_flags |= IM_EUC | IM_NEGEVENT | IM_META | IM_NEGMETA | IM_ISO;      win_keymap_set_smask_class(windowfd, KEYMAP_EDIT_KEYS);   /* Note: KEY_NEXT not apparently used in panel package */   win_keymap_set_smask(windowfd, KEY_NEXT);   win_keymap_set_smask(windowfd, PUT_KEY);   win_keymap_set_smask(windowfd, GET_KEY);   win_keymap_set_smask(windowfd, FIND_KEY);   win_keymap_set_smask(windowfd, DELETE_KEY);   win_keymap_set_imask_from_std_bind(&mask, KEY_NEXT);   win_keymap_set_imask_from_std_bind(&mask, PUT_KEY);   win_keymap_set_imask_from_std_bind(&mask, GET_KEY);   win_keymap_set_imask_from_std_bind(&mask, FIND_KEY);   win_keymap_set_imask_from_std_bind(&mask, DELETE_KEY);   /* Note: AGAIN_KEY not apparently use in panel package */   win_keymap_set_smask(windowfd, AGAIN_KEY);   win_keymap_set_imask_from_std_bind(&mask, AGAIN_KEY);   win_setinputcodebit(&mask, KBD_USE);   win_setinputcodebit(&mask, KBD_DONE);   win_setinputcodebit(&mask, KEY_RIGHT(8));   win_setinputcodebit(&mask, KEY_RIGHT(10));   win_setinputcodebit(&mask, KEY_RIGHT(12));   win_setinputcodebit(&mask, KEY_RIGHT(14));   (void)win_set_kbd_mask(windowfd, &mask);   /* Initialize and set kbd input mask */   (void)input_imnull(&mask);   mask.im_flags |= IM_NEGEVENT;   win_setinputcodebit(&mask, MS_LEFT);   win_setinputcodebit(&mask, MS_MIDDLE);   win_setinputcodebit(&mask, MS_RIGHT);   win_setinputcodebit(&mask, LOC_DRAG);   win_keymap_set_smask(windowfd, TOP_KEY);   win_keymap_set_smask(windowfd, BOTTOM_KEY);   win_keymap_set_smask(windowfd, OPEN_KEY);   win_keymap_set_smask(windowfd, CLOSE_KEY);   win_keymap_set_smask(windowfd, PROPS_KEY);   win_keymap_set_smask(windowfd, HELP_KEY);   win_keymap_set_imask_from_std_bind(&mask, TOP_KEY);   win_keymap_set_imask_from_std_bind(&mask, BOTTOM_KEY);   win_keymap_set_imask_from_std_bind(&mask, OPEN_KEY);   win_keymap_set_imask_from_std_bind(&mask, CLOSE_KEY);   win_keymap_set_imask_from_std_bind(&mask, PROPS_KEY);   win_keymap_set_imask_from_std_bind(&mask, HELP_KEY);   win_setinputcodebit(&mask, LOC_WINENTER);   win_setinputcodebit(&mask, LOC_WINEXIT);   win_setinputcodebit(&mask, KBD_REQUEST);   if (has_scrollbar(panel) || has_background_proc(panel))     win_setinputcodebit(&mask, LOC_MOVE);   (void)win_set_pick_mask(windowfd, &mask);}/*****************************************************************************//* panel_destroy_item()                                                      *//* added in SunView 1.5.                                                     *//*****************************************************************************/panel_destroy_item(client_item)Panel_item	client_item;{   panel_item_handle item = PANEL_ITEM_CAST(client_item);   if (is_item(item))      free_item(item);}/*****************************************************************************//* panel_free()                                                              *//* calls either free_panel() or free_item(), as appropriate.                 *//* Documented through SunView 1.0.  Superceded in SunView 1.5 by             *//* panel_destroy_item().                                                     *//*****************************************************************************/panel_free(client_object)Panel	client_object;{   panel_handle object = PANEL_CAST(client_object);   if (is_panel(object))      (*object->ops->destroy)(object);   else      /* this is a hack to allow pre and post free actions for       * all the items.       */      free_item((panel_item_handle)object);}staticfree_panel(panel)register panel_handle panel;{   register panel_item_handle ip, oldip;   /* free item storage */   ip = panel->items;   while (ip) {      free_item_storage(ip);      oldip = ip;      ip    = ip->next;      free((char *) oldip);   }   /* free any scrollbars */   /*   if (panel->v_scrollbar)      scrollbar_free(panel->v_scrollbar);   if (panel->h_scrollbar)      scrollbar_free(panel->h_scrollbar);   */   /* clean up with selection service */   panel_seln_destroy(panel);      /* free the ops vector storage */   if (ops_set(panel))      free((char *) panel->ops);   if (panel->view_pixwin)      (void)pw_close(panel->view_pixwin);         free((char *) panel);   (void)pw_pfsysclose();}staticfree_item(ip)register panel_item_handle ip;{   register panel_handle	panel = ip->panel;   register panel_item_handle	prev_ip, cur_ip;   /* freed item is no longer current */   if (panel->current == ip)      panel->current = (panel_item_handle) NULL;   /* remove from any private list */   (*ip->ops->remove)(ip);   /* free item storage */   free_item_storage(ip);   /* find the previous item */   for (prev_ip = (panel_item_handle) NULL, cur_ip = panel->items;	cur_ip != ip; prev_ip = cur_ip, cur_ip = cur_ip->next);   /* unlink ip */   if (prev_ip)      prev_ip->next = ip->next;   else      panel->items = ip->next;   free((char *) ip);   /* update the default position of the next created item */   (void)panel_find_default_xy(panel);}staticfree_item_storage(ip)register panel_item_handle ip;{   /* destroy private data */   (*ip->ops->destroy)(ip->data);   /* free the label storage */   if (is_string(&ip->label))      free((char *) image_string(&ip->label));   /* free the menu storage */   (void)panel_free_menu(ip);   /* free the ops vector storage */   if (ops_set(ip))      free((char *) ip->ops);}

⌨️ 快捷键说明

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