528
529
530
531
532
533
534
535
536
537
538
539
540
541
|
gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
struct gui_data *inst = (struct gui_data *)data;
char output[256];
wchar_t ucsoutput[2];
int ucsval, start, end, special, output_charset, use_ucsoutput;
/* Remember the timestamp. */
inst->input_event_time = event->time;
/* By default, nothing is generated. */
end = start = 0;
special = use_ucsoutput = FALSE;
|
>
|
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
|
gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
struct gui_data *inst = (struct gui_data *)data;
char output[256];
wchar_t ucsoutput[2];
int ucsval, start, end, special, output_charset, use_ucsoutput;
int nethack_mode, app_keypad_mode;
/* Remember the timestamp. */
inst->input_event_time = event->time;
/* By default, nothing is generated. */
end = start = 0;
special = use_ucsoutput = FALSE;
|
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
|
request_paste(inst);
return TRUE;
}
special = FALSE;
use_ucsoutput = FALSE;
/* ALT+things gives leading Escape. */
output[0] = '\033';
#if !GTK_CHECK_VERSION(2,0,0)
/*
* In vanilla X, and hence also GDK 1.2, the string received
* as part of a keyboard event is assumed to be in
* ISO-8859-1. (Seems woefully shortsighted in i18n terms,
* but it's true: see the man page for XLookupString(3) for
* confirmation.)
*/
output_charset = CS_ISO8859_1;
strncpy(output+1, event->string, lenof(output)-1);
#else
if (gtk_im_context_filter_keypress(inst->imc, event))
return TRUE;
/*
* GDK 2.0 arranges to have done some translation for us: in
* GDK 2.0, event->string is encoded in the current locale.
*
* So we use the standard C library function mbstowcs() to
* convert from the current locale into Unicode; from there
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
|
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
|
request_paste(inst);
return TRUE;
}
special = FALSE;
use_ucsoutput = FALSE;
nethack_mode = conf_get_int(inst->conf, CONF_nethack_keypad);
app_keypad_mode = (inst->term->app_keypad_keys &&
!conf_get_int(inst->conf, CONF_no_applic_k));
/* ALT+things gives leading Escape. */
output[0] = '\033';
#if !GTK_CHECK_VERSION(2,0,0)
/*
* In vanilla X, and hence also GDK 1.2, the string received
* as part of a keyboard event is assumed to be in
* ISO-8859-1. (Seems woefully shortsighted in i18n terms,
* but it's true: see the man page for XLookupString(3) for
* confirmation.)
*/
output_charset = CS_ISO8859_1;
strncpy(output+1, event->string, lenof(output)-1);
#else
/*
* Most things can now be passed to
* gtk_im_context_filter_keypress without breaking anything
* below this point. An exception is the numeric keypad if
* we're in Nethack or application mode: the IM will eat
* numeric keypad presses if Num Lock is on, but we don't want
* it to.
*/
if (app_keypad_mode &&
(event->keyval == GDK_Num_Lock ||
event->keyval == GDK_KP_Divide ||
event->keyval == GDK_KP_Multiply ||
event->keyval == GDK_KP_Subtract ||
event->keyval == GDK_KP_Add ||
event->keyval == GDK_KP_Enter ||
event->keyval == GDK_KP_0 ||
event->keyval == GDK_KP_Insert ||
event->keyval == GDK_KP_1 ||
event->keyval == GDK_KP_End ||
event->keyval == GDK_KP_2 ||
event->keyval == GDK_KP_Down ||
event->keyval == GDK_KP_3 ||
event->keyval == GDK_KP_Page_Down ||
event->keyval == GDK_KP_4 ||
event->keyval == GDK_KP_Left ||
event->keyval == GDK_KP_5 ||
event->keyval == GDK_KP_Begin ||
event->keyval == GDK_KP_6 ||
event->keyval == GDK_KP_Right ||
event->keyval == GDK_KP_7 ||
event->keyval == GDK_KP_Home ||
event->keyval == GDK_KP_8 ||
event->keyval == GDK_KP_Up ||
event->keyval == GDK_KP_9 ||
event->keyval == GDK_KP_Page_Up ||
event->keyval == GDK_KP_Decimal ||
event->keyval == GDK_KP_Delete)) {
/* app keypad; do nothing */
} else if (nethack_mode &&
(event->keyval == GDK_KP_1 ||
event->keyval == GDK_KP_End ||
event->keyval == GDK_KP_2 ||
event->keyval == GDK_KP_Down ||
event->keyval == GDK_KP_3 ||
event->keyval == GDK_KP_Page_Down ||
event->keyval == GDK_KP_4 ||
event->keyval == GDK_KP_Left ||
event->keyval == GDK_KP_5 ||
event->keyval == GDK_KP_Begin ||
event->keyval == GDK_KP_6 ||
event->keyval == GDK_KP_Right ||
event->keyval == GDK_KP_7 ||
event->keyval == GDK_KP_Home ||
event->keyval == GDK_KP_8 ||
event->keyval == GDK_KP_Up ||
event->keyval == GDK_KP_9 ||
event->keyval == GDK_KP_Page_Up)) {
/* nethack mode; do nothing */
} else {
if (gtk_im_context_filter_keypress(inst->imc, event))
return TRUE;
}
/*
* GDK 2.0 arranges to have done some translation for us: in
* GDK 2.0, event->string is encoded in the current locale.
*
* So we use the standard C library function mbstowcs() to
* convert from the current locale into Unicode; from there
|
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
|
output[1] = '\t';
end = 2;
}
/*
* NetHack keypad mode.
*/
if (conf_get_int(inst->conf, CONF_nethack_keypad)) {
char *keys = NULL;
switch (event->keyval) {
case GDK_KP_1: case GDK_KP_End: keys = "bB\002"; break;
case GDK_KP_2: case GDK_KP_Down: keys = "jJ\012"; break;
case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN\016"; break;
case GDK_KP_4: case GDK_KP_Left: keys = "hH\010"; break;
case GDK_KP_5: case GDK_KP_Begin: keys = "..."; break;
|
|
|
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
|
output[1] = '\t';
end = 2;
}
/*
* NetHack keypad mode.
*/
if (nethack_mode) {
char *keys = NULL;
switch (event->keyval) {
case GDK_KP_1: case GDK_KP_End: keys = "bB\002"; break;
case GDK_KP_2: case GDK_KP_Down: keys = "jJ\012"; break;
case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN\016"; break;
case GDK_KP_4: case GDK_KP_Left: keys = "hH\010"; break;
case GDK_KP_5: case GDK_KP_Begin: keys = "..."; break;
|
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
|
goto done;
}
}
/*
* Application keypad mode.
*/
if (inst->term->app_keypad_keys &&
!conf_get_int(inst->conf, CONF_no_applic_k)) {
int xkey = 0;
switch (event->keyval) {
case GDK_Num_Lock: xkey = 'P'; break;
case GDK_KP_Divide: xkey = 'Q'; break;
case GDK_KP_Multiply: xkey = 'R'; break;
case GDK_KP_Subtract: xkey = 'S'; break;
/*
|
|
<
|
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
|
goto done;
}
}
/*
* Application keypad mode.
*/
if (app_keypad_mode) {
int xkey = 0;
switch (event->keyval) {
case GDK_Num_Lock: xkey = 'P'; break;
case GDK_KP_Divide: xkey = 'Q'; break;
case GDK_KP_Multiply: xkey = 'R'; break;
case GDK_KP_Subtract: xkey = 'S'; break;
/*
|