Cuda się dzieją z rxvt... z xterm też.

Marcin 'Qrczak' Kowalczyk mk167280 w zodiac.mimuw.edu.pl
Śro, 22 Lis 2000, 18:58:55 CET


Wed, 22 Nov 2000 16:03:00 +0100, Michal Kochanowicz <mkochano w ee.pw.edu.pl> pisze:

> 1. Uruchamiam rxvt przez wybór z menu WindowMakera.
> 2. Uruchamiam rxvt z xterma.
> 
> W (1) BackSpace działa, w (2) generuje '^?'. Środowiska obu nie
> zawierają istotnych różnic.

Różnią się pewnie parametry terminala w jądrze:
stty

Ale nie wiem dlaczego.

U mnie w każdej sytuacji erase jest ^?, o czym wie jądro (tzn.
parametr, do którego interfejs jest przez stty), terminfo i emulatory
terminala - więc wszystko się zgadza.

Nie zgadzały się za to inne klawisze. Na przykład F1-F4 miały inne
kody w gnome-terminalu (^[OP ^[OQ ^[OR ^[OS) i we wszystkich innych
emulatorach terminala jakie mam pod ręką (^[11~ ^[12~ ^[13~ ^[14~, jak
na konsoli). Co ciekawe, w terminfo jest łata pochodzącega z XFree,
która terminalowi xterm-color przypisuje takie ciągi jak generuje
gnome-terminal - ale nawet xterm z XFree używa innych!

Uznałem ^[11..14~ za słuszniejsze i poprawiłem sobie gnome-libs
przez zamianę łaty fix_bs_del_keys na następującą. Przy okazji
z Shift+F1..F10 robią się F11-F20.

------------------------------------------------------------------------
diff -urN gnome-libs-1.2.8.orig/zvt/zvtterm.c gnome-libs-1.2.8/zvt/zvtterm.c
--- gnome-libs-1.2.8.orig/zvt/zvtterm.c	Tue Oct 24 01:12:43 2000
+++ gnome-libs-1.2.8/zvt/zvtterm.c	Sun Nov 19 16:25:45 2000
@@ -2337,8 +2337,8 @@
  */
 
 /* remapping table for function keys 5-20 */
-static unsigned char f5_f20_remap[] =
-   {15,17,18,19,20,21,23,24,25,26,28,29,31,32,33,34};
+static unsigned char f1_f20_remap[] =
+   {11,12,13,14,15,17,18,19,20,21,23,24,25,26,28,29,31,32,33,34};
 
 static gint
 zvt_term_key_press (GtkWidget *widget, GdkEventKey *event)
@@ -2366,17 +2366,11 @@
   handled = TRUE;
   switch (event->keyval) {
   case GDK_BackSpace:
-    if (event->state & GDK_MOD1_MASK)
-      *p++ = '\033';
-
-    if (term->swap_del_key)
-      *p++ = '\177';
-    else
-      *p++ = 8;
+    *p++ = '\177';
     break;
   case GDK_KP_Right:
   case GDK_Right:
-    cursor ="C";
+    cursor = "C";
     goto do_cursor;
   case GDK_KP_Left:
   case GDK_Left:
@@ -2397,21 +2391,14 @@
     break;
   case GDK_KP_Insert:
   case GDK_Insert:
-    if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK){
+    if (event->state & GDK_SHIFT_MASK){
         request_paste (widget, 0, event->time);
     } else {
       p+=sprintf (p, "\033[2~");
     }
     break;
-  case GDK_Delete:
-    if (event->state & GDK_MOD1_MASK)
-      *p++ = '\033';
-    if (term->swap_del_key)
-      *p++ = 8;
-    else
-      *p++ = '\177';
-    break;
   case GDK_KP_Delete:
+  case GDK_Delete:
     p+=sprintf (p, "\033[3~");
     break;
   case GDK_KP_Home:
@@ -2438,26 +2425,28 @@
     break;
 
   case GDK_KP_F1:
-  case GDK_F1:
-    p+=sprintf (p, "\033OP");
+    p+=sprintf (p, "\033[11~");
     break;
   case GDK_KP_F2:
-  case GDK_F2:
-    p+=sprintf (p, "\033OQ");
+    p+=sprintf (p, "\033[12~");
     break;
   case GDK_KP_F3:
-  case GDK_F3:
-    p+=sprintf (p, "\033OR");
+    p+=sprintf (p, "\033[13~");
     break;
   case GDK_KP_F4:
-  case GDK_F4:
-    p+=sprintf (p, "\033OS");
+    p+=sprintf (p, "\033[14~");
     break;
+  case GDK_F1:  case GDK_F2:  case GDK_F3:  case GDK_F4:
   case GDK_F5:  case GDK_F6:  case GDK_F7:  case GDK_F8:
-  case GDK_F9:  case GDK_F10:  case GDK_F11:  case GDK_F12:
-  case GDK_F13:  case GDK_F14:  case GDK_F15:  case GDK_F16:
-  case GDK_F17:  case GDK_F18:  case GDK_F19:  case GDK_F20:
-    p+=sprintf (p, "\033[%d~", f5_f20_remap[event->keyval-GDK_F5]);
+  case GDK_F9:  case GDK_F10:
+    if (event->state & GDK_SHIFT_MASK) {
+      p+=sprintf (p, "\033[%d~", f1_f20_remap[event->keyval-GDK_F1+10]);
+      break;
+    }
+  case GDK_F11:  case GDK_F12:  case GDK_F13:  case GDK_F14:
+  case GDK_F15:  case GDK_F16:  case GDK_F17:  case GDK_F18:
+  case GDK_F19:  case GDK_F20:
+    p+=sprintf (p, "\033[%d~", f1_f20_remap[event->keyval-GDK_F1]);
     break;
 
   case GDK_KP_0:  case GDK_KP_1:  case GDK_KP_2:  case GDK_KP_3:
@@ -3302,8 +3291,6 @@
 {
   g_return_if_fail (term != NULL);
   g_return_if_fail (ZVT_IS_TERM (term));
-  
-  term->swap_del_key = state != 0;
 }
 
 /*
diff -urN gnome-libs-1.2.8.orig/zvt/zvtterm.h gnome-libs-1.2.8/zvt/zvtterm.h
--- gnome-libs-1.2.8.orig/zvt/zvtterm.h	Sat Mar 18 08:57:13 2000
+++ gnome-libs-1.2.8/zvt/zvtterm.h	Sun Nov 19 16:11:44 2000
@@ -124,7 +124,6 @@
   unsigned int scroll_on_output:1;
   unsigned int transparent:1;	      /*transparent background*/
   unsigned int shaded:1;	      /*transparent background with shade*/
-  unsigned int swap_del_key:1;        /* swap the del and backspace keys */
 };
 
 struct _ZvtTermClass
------------------------------------------------------------------------

Do tego trzeba poprawić ncurses:

------------------------------------------------------------------------
diff -urN ncurses-5.1.orig/misc/terminfo.src ncurses-5.1/misc/terminfo.src
--- ncurses-5.1.orig/misc/terminfo.src	Sun Nov 19 16:38:55 2000
+++ ncurses-5.1/misc/terminfo.src	Sun Nov 19 16:52:31 2000
@@ -2530,7 +2530,7 @@
 	ka3=\EOu,
 	kb2=\EOy,
 	kbeg=\EOE,
-	kbs=^H,
+	kbs=\177,
 	kc1=\EOq,
 	kc3=\EOs,
 	kcub1=\EOD,
@@ -2540,7 +2540,7 @@
 	kdch1=\E[3~,
 	kend=\E[4~,
 	kent=\EOM,
-	kf1=\EOP,
+	kf1=\E[11~,
 	kf10=\E[21~,
 	kf11=\E[23~,
 	kf12=\E[24~,
@@ -2551,10 +2551,10 @@
 	kf17=\E[31~,
 	kf18=\E[32~,
 	kf19=\E[33~,
-	kf2=\EOQ,
+	kf2=\E[12~,
 	kf20=\E[34~,
-	kf3=\EOR,
-	kf4=\EOS,
+	kf3=\E[13~,
+	kf4=\E[14~,
 	kf5=\E[15~,
 	kf6=\E[17~,
 	kf7=\E[18~,
@@ -2657,7 +2657,7 @@
 	op=\E[m,
 	setab=\E[4%p1%dm,
 	setaf=\E[3%p1%dm,
-	use=xterm-r6,
+	use=xterm-xfree86,
 #
 xterm-boldso|xterm with bold for standout (X Window System),
 	rmso=\E[m,
------------------------------------------------------------------------

Dzięki temu większość klawiszy działa sensownie pod większością
emulatorów terminala. Tylko rxvt generuje inne ciągi dla Home
i End, a kvt, aterm i Eterm dla strzałek. Poza tym kvt nie rozumie
Shift-F1..F10 (ale mam stare kvt z KDE-1.0, być może potem to
poprawili). Może ktoś ma ochotę zrobić z tym porządek.

Można uznać, że kvt, aterm i Eterm mają rację w sprawie strzałek
i terminal xterm-color powinien wyrażać je tak jak konsola: ^[[A ^[[B
^[[C ^[[D, a nie ^[OA ^[OB ^[OC ^[OD. W takiej sytuacji xterm,
gnome-libs i terminfo są do poprawki.

-- 
 __("<  Marcin Kowalczyk * qrczak w knm.org.pl http://qrczak.ids.net.pl/
 \__/
  ^^                      SYGNATURA ZASTĘPCZA
QRCZAK



Więcej informacji o liście dyskusyjnej pld-devel-pl