📄 panel_select.c
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)panel_select.c 20.7 89/08/28 Copyr 1984 Sun Micro";#endif#endif/*****************************************************************************//* panel_select.c *//* Copyright (c) 1984 by Sun Microsystems, Inc. *//*****************************************************************************/#include <suntool/panel_impl.h>#include <suntool/window.h>#include <suntool/selection_svc.h>static panel_item_handle panel_finditem();#define CTRL_D_KEY '\004'#define CTRL_G_KEY '\007'/* * Since the keymapping system no longer supports full translation of event * ids, shiftmasks and flags we must revert to the old stuff that directly * recognizes the 3.x accelerators for CUT and PASTE. */static int keyboard_accel_state_cached;static int keyboard_accel_state;#define UP_CURSOR_KEY (KEY_RIGHT(8))#define DOWN_CURSOR_KEY (KEY_RIGHT(14))#define RIGHT_CURSOR_KEY (KEY_RIGHT(12))#define LEFT_CURSOR_KEY (KEY_RIGHT(10))/*****************************************************************************//* panel_use_event *//* called from both notifier-based panel_notify_event() and *//* old panel_selected(). *//*****************************************************************************//*VARARGS2*/Notify_valuepanel_use_event(panel, event, sb)register panel_handle panel;register Event *event;Scrollbar sb;{ short is_down, id; int action; /* ignore drag-in to subwindow */ if ((event_id(event) == LOC_DRAG) && (panel->mouse_state == PANEL_NONE_DOWN)) return NOTIFY_IGNORED; /* ignore button-up after drag-in */ if ((panel->mouse_state == PANEL_NONE_DOWN) && event_is_up(event)) { switch (event_id(event)) { case MS_LEFT: case MS_MIDDLE: case MS_RIGHT: return NOTIFY_IGNORED; default: break; } } /* make an event adjusted for the current viewing window */ if (event_id(event) != LOC_WINEXIT) (void) panel_event((Panel) panel, event); action = event_action(event); switch (action) { case TOP_KEY: case BOTTOM_KEY: case OPEN_KEY: case CLOSE_KEY: case PROPS_KEY: /* Here we perform the default interface tool actions */ if (panel->tool) { extern Notify_value tool_input(); return tool_input(panel->tool, event, (Notify_arg)0, NOTIFY_SAFE); } break; case PUT_KEY: case GET_KEY: case DELETE_KEY: case FIND_KEY: panel_seln_inform(panel, event); break; case CTRL_D_KEY: /* * Cache and check state of 4.0 accelerators; if not enabled then * allow use of 3.x accelerators */ if (!keyboard_accel_state_cached) { keyboard_accel_state = (!strcmp("Enabled", (char *) defaults_get_string( "/Compatibility/New_keyboard_accelerators", "Enabled", 0))) ? 1 : 0; keyboard_accel_state_cached = 1; } if (keyboard_accel_state) break; /* map to DELETE down/up */ event_set_id(event, DELETE_KEY); event_set_down(event); panel_seln_inform(panel, event); event_set_up(event); panel_seln_inform(panel, event); /* restore */ event_set_id(event, CTRL_D_KEY); event_set_down(event); break; case CTRL_G_KEY: /* * Cache and check state of 4.0 accelerators; if not enabled then * allow use of 3.x accelerators */ if (!keyboard_accel_state_cached) { keyboard_accel_state = (!strcmp("Enabled", (char *) defaults_get_string( "/Compatibility/New_keyboard_accelerators", "Enabled", 0))) ? 1 : 0; keyboard_accel_state_cached = 1; } if (keyboard_accel_state) break; /* map to GET down/up */ event_set_id(event, GET_KEY); event_set_down(event); panel_seln_inform(panel, event); event_set_up(event); panel_seln_inform(panel, event); /* restore */ event_set_id(event, CTRL_G_KEY); event_set_down(event); break; case SCROLL_REQUEST: panel_scroll(panel, sb); break; case SCROLL_EXIT: /* check the state of the mouse */ panel->button_status.left_down = win_get_vuid_value(panel->windowfd, MS_LEFT); panel->button_status.middle_down = win_get_vuid_value(panel->windowfd, MS_MIDDLE); panel->button_status.right_down = win_get_vuid_value(panel->windowfd, MS_RIGHT); break; case KBD_REQUEST: { Seln_holder seln_holder; panel_item_handle new; int take_focus; /* accept the keyboard focus if the user * is not clicking on any item and we have a caret item or the panel * wants key strokes, * or if the user is clicking on a text item or item that wants key * strokes * and * the user is not holding down a function key. */ /* find out who's under the locator */ new = panel_finditem(panel, event); if (new) take_focus = (new->item_type == PANEL_TEXT_ITEM) || wants_key(new); else take_focus = panel->caret || wants_key(panel); if (take_focus) { /* find the rank of the selection */ seln_holder = panel_seln_inquire(panel, SELN_UNSPECIFIED); take_focus = (seln_holder.rank != SELN_SECONDARY); } if (!take_focus) /* Refuse to take the keyboard focus */ (void)win_refuse_kbd_focus(panel->windowfd); /* else take the kbd focus by doing nothing */ } default: break; } /* make sure the caret is off before anything else is done */ /* only turn off if not LOC_MOVE, to avoid caret flashing w/scrollbars */ if (event_id(event) != LOC_MOVE) panel_caret_on(panel, FALSE); /* remember the event info */ is_down = event_is_down(event); id = event_id(event); if (using_wrapper(panel)) window_event_proc((Window)(LINT_CAST(panel)), event, sb); else (void)panel_default_event(panel, event); /* now update the state */ switch (id) { case MS_LEFT: panel->button_status.left_down = event_is_down(event); break; case MS_MIDDLE: panel->button_status.middle_down = win_get_vuid_value(panel->windowfd, MS_MIDDLE); break; case MS_RIGHT: panel->button_status.right_down = win_get_vuid_value(panel->windowfd, MS_RIGHT); break; case LOC_WINENTER: case LOC_WINEXIT: /* erase our knowledge of the button state */ panel->button_status.left_down = FALSE; panel->button_status.middle_down = FALSE; panel->button_status.right_down = FALSE; break; default: /* does not alter button state */ break; } if (panel->button_status.left_down + panel->button_status.middle_down + panel->button_status.right_down > 1) panel->mouse_state = PANEL_CHORD_DOWN; else if (panel->button_status.left_down) panel->mouse_state = PANEL_LEFT_DOWN; else if (panel->button_status.middle_down) panel->mouse_state = PANEL_MIDDLE_DOWN; else if (panel->button_status.right_down) panel->mouse_state = PANEL_RIGHT_DOWN; else panel->mouse_state = PANEL_NONE_DOWN; /* make sure the caret is on before we leave the subwindow */ if (panel->mouse_state == PANEL_NONE_DOWN) panel_caret_on(panel, TRUE); return NOTIFY_DONE;}intpanel_event_is_sunview_semantic(event) register Event *event;{ switch (event_action(event)) { case ACTION_AGAIN: case ACTION_PROPS: case ACTION_UNDO: case ACTION_FRONT: case ACTION_BACK: case ACTION_COPY: case ACTION_OPEN: case ACTION_CLOSE: case ACTION_PASTE: case ACTION_FIND_BACKWARD: case ACTION_FIND_FORWARD: case ACTION_CUT: return 1; default: return 0; }}/* * panel_event_is_panel_semantic(event) -- replaces event_is_key_left() in * panel_default_event() below */intpanel_event_is_panel_semantic(event) register Event *event;{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -