📄 panel_attr.c
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)panel_attr.c 1.1 92/07/30 Copyr 1984 Sun Micro";#endif#endif/*****************************************************************************//* panel_attr.c *//* Copyright (c) 1985 by Sun Microsystems, Inc. *//*****************************************************************************/#include <suntool/panel_impl.h>#include <suntool/window.h>#include "sunwindow/sv_malloc.h"void window_rc_units_to_pixels();/*****************************************************************************//* panel_set_generic *//*****************************************************************************/panel_set_generic(ip, avlist)register panel_item_handle ip;register Attr_avlist avlist;{ register Panel_attribute attr; register panel_handle panel = ip->panel; register panel_image_handle label = &ip->label; int item_x, item_y; int label_x, label_y; int value_x, value_y; short item_x_changed = FALSE; short item_y_changed = FALSE; short label_size_changed = FALSE; short label_x_changed = FALSE; short label_y_changed = FALSE; short value_x_changed = FALSE; short value_y_changed = FALSE; short layout_changed = FALSE; short label_bold_changed = FALSE; short label_font_changed = FALSE; int label_type = -1; /* no new label yet */ struct pixfont *label_font = panel->font; int label_bold = label_bold_flag(panel); int label_shaded = image_shaded(label); struct pr_size label_size; caddr_t label_data; Rect deltas; short potential_new_rect = FALSE; if (using_wrapper(panel)) window_rc_units_to_pixels((Window)(LINT_CAST(panel)), (Window_attribute *)(LINT_CAST(avlist))); else attr_replace_cu(avlist, panel->font, PANEL_ITEM_X_START, panel->item_y_offset, panel->item_y_offset); /* use the current font & boldness */ if (is_string(label)) { label_font = image_font(label); label_bold = image_bold(label); } while(attr = (Panel_attribute) *avlist++) { switch (attr) { case PANEL_SHOW_ITEM: if ((int) *avlist++) { if (hidden(ip)) { ip->flags &= ~HIDDEN; (*ip->ops->restore)(ip); } } else if (!hidden(ip)) { ip->flags |=HIDDEN; (*ip->ops->remove)(ip); } break; case PANEL_SHOW_MENU: if ((int) *avlist++) ip->flags |= SHOW_MENU; else ip->flags &= ~SHOW_MENU; break; case PANEL_ITEM_X : item_x = (int) *avlist++; ip->flags |= ITEM_X_FIXED; item_x_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_ITEM_Y : item_y = (int) *avlist++; ip->flags |= ITEM_Y_FIXED; item_y_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_LABEL_X: label_x = (int) *avlist++; ip->flags |= LABEL_X_FIXED; label_x_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_LABEL_Y: label_y = (int) *avlist++; ip->flags |= LABEL_Y_FIXED; label_y_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_VALUE_X: value_x = (int) *avlist++; ip->flags |= VALUE_X_FIXED; value_x_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_VALUE_Y: value_y = (int) *avlist++; ip->flags |= VALUE_Y_FIXED; value_y_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_LABEL_IMAGE: label_type = IM_PIXRECT; label_data = *avlist++; potential_new_rect = TRUE; break; case PANEL_LABEL_STRING: label_type = IM_STRING; label_data = *avlist++; potential_new_rect = TRUE; break; case PANEL_LABEL_FONT : label_font = (struct pixfont *) LINT_CAST(*avlist++); label_font_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_LABEL_BOLD: label_bold = (int) *avlist++; label_bold_changed = TRUE; potential_new_rect = TRUE; break; case PANEL_LABEL_SHADED: label_shaded = (int) *avlist++; image_set_shaded(label, label_shaded); break; case PANEL_LAYOUT: switch ((Panel_setting) *avlist) { case PANEL_HORIZONTAL: case PANEL_VERTICAL: ip->layout = (Panel_setting) *avlist++; layout_changed = TRUE; potential_new_rect = TRUE; break; default: /* invalid layout */ avlist++; break; } break; case PANEL_NOTIFY_PROC: ip->notify = (int (*)()) LINT_CAST(*avlist++); if (!ip->notify) ip->notify = panel_nullproc; break; case PANEL_ADJUSTABLE: if ((int) *avlist++) ip->flags |= ADJUSTABLE; else ip->flags &= ~ADJUSTABLE; break; case PANEL_PAINT: ip->repaint = (Panel_setting) *avlist++; break; case PANEL_ACCEPT_KEYSTROKE: if (*avlist++) ip->flags |= WANTS_KEY; else ip->flags &= ~WANTS_KEY; break; case PANEL_CLIENT_DATA: ip->client_data = *avlist++; break; case HELP_DATA: ip->help_data = *avlist++; break; case PANEL_ITEM_COLOR: ip->color_index = (int) *avlist++; break; default: avlist = attr_skip(attr, avlist); break; } } /* first handle any item position * changes. */ if (item_x_changed || item_y_changed) { rect_construct(&deltas, 0, 0, 0, 0); /* compute item offset */ if (item_x_changed) deltas.r_left = item_x - ip->rect.r_left; if (item_y_changed) deltas.r_top = item_y - ip->rect.r_top; if (deltas.r_left || deltas.r_top) /* ITEM_X or ITEM_Y has changed, so re-layout item in * order to cause the entire item to change position. */ (void)panel_layout(ip, &deltas); } /* Now handle label size * changes . */ /* update label font & boldness if needed. * Note that this may be set again below if * a new label string or image has been given. */ if (is_string(label) && label_bold_changed) { if (image_bold(label) && !label_bold) { image_set_bold(label, label_bold); ip->label_rect.r_width -= 1; label_size_changed = TRUE; } else if (!image_bold(label) && label_bold) { image_set_bold(label, label_bold); ip->label_rect.r_width += 1; label_size_changed = TRUE; } } if (is_string(label) && label_font_changed) { image_set_font(label, label_font); label_size = pf_textwidth(strlen(image_string(label)), image_font(label), image_string(label)); if (image_bold(label)) label_size.x++; ip->label_rect.r_width = label_size.x; ip->label_rect.r_height = label_size.y; label_size_changed = TRUE; } /* free old label, allocate new */ if (set(label_type)) { char *old_string = is_string(label) ? image_string(label) : NULL; label_size = panel_make_image(label_font, label, label_type, label_data, label_bold, label_shaded); ip->label_rect.r_width = label_size.x; ip->label_rect.r_height = label_size.y; label_size_changed = TRUE; /* now free the old string */ if (old_string) free(old_string); } /* if the label has changed, * menu title may be dirty. */ if (label_size_changed) ip->menu_status.title_dirty = TRUE; /* use default positions for label or * value if not specified. */ if (layout_changed || label_size_changed || label_x_changed || label_y_changed) { /* layout, label position or size has changed, so re-compute * default value position. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -