This is uihotkey.c in view mode; [Download] [Up]
/*
* uihotkeys.h - Implementation of UI hotkeys.
*
* Written by
* Ettore Perazzoli (ettore@comm2000.it)
*
* This file is part of VICE, the Versatile Commodore Emulator.
* See README for copyright notice.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA.
*
*/
#include "vice.h"
#include <stdlib.h>
#include "uihotkey.h"
#include "utils.h"
typedef struct {
ui_hotkey_modifier_t modifier;
KeySym keysym;
ui_callback_t callback;
ui_callback_data_t client_data;
} registered_hotkey_t;
static registered_hotkey_t *registered_hotkeys;
static int num_registered_hotkeys;
static int num_allocated_hotkeys;
static int meta_count, control_count, shift_count;
/* ------------------------------------------------------------------------- */
int ui_hotkey_init(void)
{
if (registered_hotkeys != NULL) {
free(registered_hotkeys);
num_registered_hotkeys = num_allocated_hotkeys = 0;
meta_count = control_count = shift_count = 0;
}
return 0;
}
/* ------------------------------------------------------------------------- */
void ui_hotkey_register(ui_hotkey_modifier_t modifier,
KeySym keysym, ui_callback_t callback,
ui_callback_data_t client_data)
{
registered_hotkey_t *p;
if (registered_hotkeys == 0) {
num_allocated_hotkeys = 32;
registered_hotkeys = xmalloc(num_allocated_hotkeys
* sizeof(registered_hotkey_t));
num_registered_hotkeys = 0;
} else if (num_registered_hotkeys == num_allocated_hotkeys) {
num_allocated_hotkeys *= 2;
registered_hotkeys = xrealloc(registered_hotkeys,
(num_allocated_hotkeys
* sizeof(registered_hotkey_t)));
}
p = registered_hotkeys + num_registered_hotkeys;
p->modifier = modifier;
p->keysym = keysym;
p->callback = callback;
p->client_data = client_data;
num_registered_hotkeys++;
}
/* ------------------------------------------------------------------------- */
void ui_hotkey_event_handler(Widget w, XtPointer closure,
XEvent *xevent,
Boolean *continue_to_dispatch)
{
static char buffer[20];
KeySym keysym;
XComposeStatus compose;
int i;
XLookupString(&xevent->xkey, buffer, 20, &keysym, &compose);
/* Bad things could happen if focus goes away and then comes
back... */
if (xevent->type == FocusOut) {
meta_count = control_count = shift_count = 0;
return;
}
switch (keysym) {
case XK_Shift_L:
case XK_Shift_R:
if (xevent->type == KeyPress)
shift_count++;
else if (xevent->type == KeyRelease && shift_count > 0)
shift_count--;
break;
case XK_Control_L:
case XK_Control_R:
if (xevent->type == KeyPress)
control_count++;
else if (xevent->type == KeyRelease && control_count > 0)
control_count--;
break;
case XK_Meta_L:
case XK_Meta_R:
#ifdef ALT_AS_META
case XK_Alt_L:
case XK_Alt_R:
#endif
#ifdef MODE_SWITCH_AS_META
case XK_Mode_switch:
#endif
if (xevent->type == KeyPress)
meta_count++;
else if (xevent->type == KeyRelease && meta_count > 0)
meta_count--;
break;
default:
if (xevent->type == KeyPress && meta_count != 0) {
registered_hotkey_t *p = registered_hotkeys;
/* XXX: Notice that we don't actually check the hotkey modifiers
here. */
for (i = 0; i < num_registered_hotkeys; i++, p++) {
if (p->keysym == keysym) {
p->callback(NULL, p->client_data, NULL);
*continue_to_dispatch = False;
break;
}
}
}
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.