2009-08-16 3 views
1

Ich arbeite an einer einfachen Konsole App, um meine Füße wieder mit Flüchen nass zu bekommen. Ich habe ein kleines Problem mit der Portierung meiner App von XP auf AIX. Hier ist ein Beispielcode.AIX/XP Curses erhalten Schlüssel/Zusatztaste in einer plattformübergreifenden Art und Weise

int main(void) 
{ 
    WINDOW *_window = initscr(); 
    int _rows; 
    int _cols; 

    cbreak(); 

    /* Accept all keys */ 
    keypad(_window, true); 

    /* Don't echo things that are typed */ 
    noecho(); 

    /* Get the screen dimensions */ 
    getmaxyx(_window, _rows, _cols); 

    /* Don't display cursor */ 
    curs_set(0); 

    for (;;) 
    { 
     printw("Press a Key "); 
     refresh(); 
     int key = wgetch(_window); 
     printw("%d \n", key); 
    } 

    endwin(); 

    return 0; 
} 

Als ich dies unter XP laufen, erhalte ich die folgende Ausgabe von einem DOWNARROW durch einen CTRL-DOWNARROW gefolgt.

Press a Key 258 
Press a Key 481 
Press a Key 

258 Vorschlagen ist der Code für den Pfeil nach unten, und 481 für ctrl-Pfeil nach unten.

Durchführen desselben Tests unter AIX.

Press a Key 1858 
Press a Key 27 
Press a Key 79 
Press a Key 66 
Press a Key 

Die 1858 ist der Pfeil nach unten, und die 27/29/66 ist die Antwort für den ctrl-Pfeil nach unten. Ich erkenne, dass der 27/29/66 wahrscheinlich eine der Standard-Escape-Sequenzen ist. Ich hatte gehofft, dass Flüche es auf einen einzigen Wert abbilden würden. Auf der XP-Seite ist CTL_DOWN in der Datei curses.h definiert. Die AIX-Seite nicht.

Also hier meine Frage ist

Ist ihnen etwas Beschwörung ich hier verpasst, die auf magische Weise diese drei Zeichen in eine schöne einzigartige ganze Zahl abbildet? Oder muss ich eine Art von Klasse schreiben, um die plattformspezifischen Tastenanschläge in etwas zu verstecken, das meine reale App benutzen kann?

Meine Augen sind Blut aus der Suche nach den AIX-Online-Zeug. Jede Hilfe, um mich in die richtige Richtung zu zeigen, würde geschätzt werden.

Andere Zufallsinformationen

ich XP Pro leite, mit dem neuesten Service msvc 6-Packs, mit Service Pack 6. Die Flüche Bibliothek ist pdcurses

Der andere Compiler ist IBM XL C/C++ ENTERPRISE EDITION V8.0 die Kompilierung verwendet

xlC++ -g app.cpp -lcurses

ich pdcurses33 bin mit auf dem PC und den nativen Flüche auf AIX.

+0

Welche Curses Bibliothek verwenden Sie? –

+0

Guter Fang. Es wurde der Frage hinzugefügt. – EvilTeach

Antwort

0

Re: [PDCurses] Alt + Shift + n (zum Beispiel) auf Windows

LM Fr 12 Jul 2002 08:13:53 -0700

Am 2002.07.07 6: 22:00 Uhr, Jeremy Smith schrieb:

Ich habe in ein kleines Problem geraten. Ich benutze die Flüche Funktion getch() in mein Programm, für Tasten wie 'n' oder Alt + 'n' aber wie erkenne ich diese Kombinationen:

Strg + n Alt + Shift + n Strg + Alt + n Ctrl-Alt-Shift + n

ich dort vorstellen muss eine Art Fahne sein Umschalt zurückzukehren + Alt + 2 als tatsächlichen Schlüsselcode (das aus Shift, Alt verschieden ist, oder 2), aber ich nicht wissen wie. :-(

überprüfte ich die Header für Datei für curses.h und sie scheinen alle Standard-Scan-Codes aufzulisten, die Sie von der Rückseite eine Tastatur bekommen, darunter auch einige ALT Kombinationen und einige der Steuerungskombinationen in pdckbd.c der Routine.

Dann überprüfte ich die Implementierung von Windows. ein Zeichen für das erhalten win32_kbhit Read nennt. die Verschiebung, alt, Kontrolle und andere Statustasten aus dieser Funktion in den dwControlKeyState zurückgegeben werden. die PDC_get_bios_key Berichte, welche Taste gedrückt wird mit die beiden kptab Tabellen (kptab und ext_kptab), also wenn die Kombination nicht in der Tabelle ist, sehen Sie es wahrscheinlich nicht. Sie können möglicherweise einige Definitionen zu den Tabellen hinzufügen, wenn etwas fehlt. Es gibt auch einen Code in der gleichen Routine, die die Zustände (BUTTON_SHIFT, BUTTON_CONTROL, BUTTON_ALT) setzt, aber dies scheint für die Mauseingabe zu sein. So können Sie diese Schlüssel in der MOUSE_STATUS-Struktur überprüfen. Dies betrifft nur die Windows-Implementierung . Jede Plattform hat eine einzigartige Möglichkeit herauszufinden, welche Tasten gedrückt werden.

In 16-Bit-DOS, änderte ich den Zustand der Verschiebung, Feststelltaste und Num-Sperre durch Ändern der Einstellungen an der Hex 417-Adresse. Dies funktioniert nur für echte Modus-Programme. Viele der neuen Windows-Compiler erlauben es Ihnen nicht einmal, direkt mit Funktionen auf BIOS oder Speicher zuzugreifen. Die 16-Bit-Position bei Hex 417 und Hex 418 zeigt an, dass die rechte Verschiebung gedrückt wurde, indem das höchste Bit an der Adresse 417 gesetzt wurde, die linke Verschiebung, indem das zweithöchste Bit im Byte gesetzt wurde, die Strg-Taste durch Einstellung Die nächsthöhere Zahl ist und danach die nächsthöhere Alt-Taste. Die Adresse 418 enthält den Status, ob die rechte oder linke Alt-Taste und die Steuertaste gedrückt wurden.

Es scheint, als ob Sie möglicherweise einige Änderungen an Ihrer bestimmten Version von Fluchten vornehmen müssen, um genau das zu bekommen, was Sie wollen. Curses ist eine sehr portable Benutzerschnittstelle, daher unterstützt es oft den niedrigsten gemeinsamen Nenner von Features auf einigen Plattformen.

Übrigens, ich erinnere mich zu lesen, dass es Arbeit für einen neuen Fluchstandard gab, der internationale Zeichenunterstützung einschließt. Hat jemand etwas weiter zu diesem Aufwand gehört?

Mit freundlichen Grüßen.

Laura Michaels http://www.distasis.com

Es sieht aus wie ich meine eigene Tastatur Dekodierung müssen tun.

1

Sie könnten versuchen, die Open-Source-Bibliotheken "ncurses" anstelle der von AIX bereitgestellten Bibliothek zu verwenden, die stark auf IBM spezifische Hardware- und Softwarebibliotheken ausgerichtet war.

Ich kann mich nicht genau erinnern, ob es eine xlC-kompatible Version gibt, also musst du die Bibliothek aus der Quelle bauen oder zu 'gcc' wechseln. Thier ist auch eine Version von ncurses für Windows, so dass Sie möglicherweise Ihre Änderungen auf die ursprüngliche Version Ihres Codes zurückportieren können.

Ich habe einen Vauge-Speicher von Ncursse, der logische Namen wie UP_ARROW usw. unterstützt, anstatt Nummern für die Steuertasten. Das Problem, das von der Plattform, Terminalemulation, NLS-Einstellungen usw. abhängt, könnte ein einfacher Pfeil nach oben als 'UP_ARROW', 'Esc_UP', 'Cntrl_K' sein.

Ich erinnere mich an die Zuordnung mehrerer Tastenanschläge zu einer logischen 'Absicht' wie 'MEANT_UP' das letzte Mal musste ich eine Curses-Anwendung auf eine andere Plattform portieren (und das war ein relativ einfacher AIX zu Solaris-Port).

+0

Es ist zumindest eine Idee. Danke – EvilTeach

Verwandte Themen