Keypad should produce correct symbols on Brazilian (and any other)

keyboard when NumLock is on.  Also added some explanatory comments to
the source code.
Some pointers were not being turned off when widgets were deleted, this
caused flwm to crash.


git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@553 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Bill Spitzak 1999-04-23 06:55:53 +00:00
parent 2f22abf4e2
commit 349f047032
3 changed files with 50 additions and 32 deletions

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl.cxx,v 1.24.2.4 1999/04/17 01:02:28 bill Exp $"
// "$Id: Fl.cxx,v 1.24.2.5 1999/04/23 06:55:52 bill Exp $"
//
// Main event handling code for the Fast Light Tool Kit (FLTK).
//
@ -407,6 +407,8 @@ void fl_throw_focus(Fl_Widget *o) {
#endif
if (o->contains(Fl::belowmouse())) Fl::belowmouse_ = 0;
if (o->contains(Fl::focus())) Fl::focus_ = 0;
if (o == fl_xfocus) fl_xfocus = 0;
if (o == fl_xmousewin) fl_xmousewin = 0;
fl_fix_focus();
}
@ -696,5 +698,5 @@ int fl_old_shortcut(const char* s) {
}
//
// End of "$Id: Fl.cxx,v 1.24.2.4 1999/04/17 01:02:28 bill Exp $".
// End of "$Id: Fl.cxx,v 1.24.2.5 1999/04/23 06:55:52 bill Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_win32.cxx,v 1.33.2.7 1999/04/18 19:17:03 mike Exp $"
// "$Id: Fl_win32.cxx,v 1.33.2.8 1999/04/23 06:55:53 bill Exp $"
//
// WIN32-specific code for the Fast Light Tool Kit (FLTK).
//
@ -287,7 +287,7 @@ static int mouse_event(Fl_Window *window, int what, int button,
static const struct {unsigned short vk, fltk, extended;} vktab[] = {
{VK_BACK, FL_BackSpace},
{VK_TAB, FL_Tab},
{VK_CLEAR, FL_KP+'5'},
{VK_CLEAR, FL_KP+'5', 0xff0b/*XK_Clear*/},
{VK_RETURN, FL_Enter, FL_KP_Enter},
{VK_SHIFT, FL_Shift_L, FL_Shift_R},
{VK_CONTROL, FL_Control_L, FL_Control_R},
@ -922,5 +922,5 @@ void Fl_Window::make_current() {
}
//
// End of "$Id: Fl_win32.cxx,v 1.33.2.7 1999/04/18 19:17:03 mike Exp $".
// End of "$Id: Fl_win32.cxx,v 1.33.2.8 1999/04/23 06:55:53 bill Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_x.cxx,v 1.24.2.3 1999/04/17 01:02:29 bill Exp $"
// "$Id: Fl_x.cxx,v 1.24.2.4 1999/04/23 06:55:53 bill Exp $"
//
// X specific code for the Fast Light Tool Kit (FLTK).
//
@ -443,45 +443,60 @@ int fl_handle(const XEvent& xevent)
break;
case KeyPress: {
#if BACKSPACE_HACK
static int got_backspace;
#endif /* BACKSPACE_HACK */
int keycode = xevent.xkey.keycode;
fl_key_vector[keycode/8] |= (1 << (keycode%8));
static char buffer[21];
KeySym keysym;
int i = xevent.xkey.keycode; fl_key_vector[i/8] |= (1 << (i%8));
int len = XLookupString((XKeyEvent*)&(xevent.xkey),buffer,20,&keysym,0);
if (!len && keysym < 0x400) {
// turn all latin-2,3,4 characters into 8-bit codes:
buffer[0] = char(keysym);
len = 1;
if (keysym && keysym < 0x400) { // a character in latin-1,2,3,4 sets
// force it to type a character (not sure if this ever is needed):
if (!len) {buffer[0] = char(keysym); len = 1;}
// ignore all effects of shift on the keysyms, which makes it a lot
// easier to program shortcuts and is Windoze-compatable:
keysym = XKeycodeToKeysym(fl_display, keycode, 0);
}
// ignore all effects of shift on the keysyms (makes it a lot
// easier to program shortcuts!)
if (keysym < 0x400) keysym = XKeycodeToKeysym(fl_display, i, 0);
#ifdef __sgi
// get some missing PC keyboard keys:
if (!keysym) switch(i) {
// You can plug a microsoft keyboard into an sgi but the extra shift
// keys are not translated. Make them translate like XFree86 does:
if (!keysym) switch(keycode) {
case 147: keysym = FL_Meta_L; break;
case 148: keysym = FL_Meta_R; break;
case 149: keysym = FL_Menu; break;
}
#endif
#if BACKSPACE_HACK
// Attempt to fix keyboards that send "delete" for the key in the
// upper-right corner of the main keyboard. But it appears that
// very few of these remain?
static int got_backspace;
if (!got_backspace) {
// Backspace kludge: until user hits the backspace key, assumme
// it is missing and use the Delete key for that purpose:
if (keysym == FL_Delete) keysym = FL_BackSpace;
else if (keysym == FL_BackSpace) got_backspace = 1;
}
#endif /* BACKSPACE_HACK */
if (keysym >= 0xff95 && keysym < 0xffa0) {
// Make NumLock irrelevant (always on):
// This lookup table turns the XK_KP_* functions back into the
// ascii characters. This won't work on non-PC layout keyboards,
// but are there any of those left??
buffer[0] = "7486293150."[keysym-0xff95];
keysym = FL_KP+buffer[0];
len = 1;
#endif
// We have to get rid of the XK_KP_function keys, because they are
// not produced on Windoze and thus case statements tend not to check
// for them. There are 15 of these in the range 0xff91 ... 0xff9f
if (keysym >= 0xff91 && keysym <= 0xff9f) {
// Try to make them turn into FL_KP+'c' so that NumLock is
// irrelevant, by looking at the shifted code. This matches the
// behavior of the translator in Fl_win32.C, and IMHO is the
// user-friendly result:
unsigned long keysym1 = XKeycodeToKeysym(fl_display, keycode, 1);
if (keysym1 <= 0x7f || keysym1 > 0xff9f && keysym1 <= FL_KP_Last) {
keysym = keysym1 | FL_KP;
buffer[0] = char(keysym1) & 0x7F;
len = 1;
} else {
// If that failed to work, just translate them to the matching
// normal function keys:
static const unsigned short table[15] = {
FL_F+1, FL_F+2, FL_F+3, FL_F+4,
FL_Home, FL_Left, FL_Up, FL_Right,
FL_Down, FL_Page_Up, FL_Page_Down, FL_End,
0xff0b/*XK_Clear*/, FL_Insert, FL_Delete};
keysym = table[keysym-0xff91];
}
}
buffer[len] = 0;
Fl::e_keysym = int(keysym);
@ -493,7 +508,8 @@ int fl_handle(const XEvent& xevent)
break;}
case KeyRelease: {
int i = xevent.xkey.keycode; fl_key_vector[i/8] &= ~(1 << (i%8));
int keycode = xevent.xkey.keycode;
fl_key_vector[keycode/8] &= ~(1 << (keycode%8));
set_event_xy();}
break;
@ -849,5 +865,5 @@ void Fl_Window::make_current() {
#endif
//
// End of "$Id: Fl_x.cxx,v 1.24.2.3 1999/04/17 01:02:29 bill Exp $".
// End of "$Id: Fl_x.cxx,v 1.24.2.4 1999/04/23 06:55:53 bill Exp $".
//