Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 14 Xlib – X Window-Programmierung
  gp 14.1 Architektur von X
    gp 14.1.1 Pufferung
    gp 14.1.2 Ressourcen
  gp 14.2 X Toolkit
  gp 14.3 Der Window-Manager
  gp 14.4 Fenster mit X
    gp 14.4.1 Verbindung herstellen
    gp 14.4.2 Fenster definieren
    gp 14.4.3 Informationen für den Window-Manager
    gp 14.4.4 Fenster anzeigen
    gp 14.4.5 Fenster und X-Verbindung beenden
    gp 14.4.6 Das Grundgerüst als Quellcode
  gp 14.5 Events
    gp 14.5.1 Event-Maske setzen
    gp 14.5.2 Event-Bearbeitungsschleife
    gp 14.5.3 Abarbeitung der Events
    gp 14.5.4 Tastatur-Event
    gp 14.5.5 Mausbutton-Event
    gp 14.5.6 Expose-Event
    gp 14.5.7 EnterWindowMask – LeaveWindowMask
    gp 14.5.8 Listing zu den Events
  gp 14.6 Grafik mit X
    gp 14.6.1 Grafikprimitive – Zeichenfunktionen
  gp 14.7 Text mit X
    gp 14.7.1 Fonts benutzen
    gp 14.7.2 Übersicht zu den Fonts
    gp 14.7.3 Höhe und Breite ermitteln
    gp 14.7.4 Listing mit Textausgabe
  gp 14.8 Farben mit X
  gp 14.9 Beispiel – ein Button mit X
  gp 14.10 Wozu kann ich denn nun die Xlib in der Praxis verwenden?
  gp 14.11 X und X-Toolkits – Einführung
  gp 14.12 Toolkit-Programmierung
    gp 14.12.1 Widgets
  gp 14.13 Ein einfaches Fenster mit einem Button
    gp 14.13.1 Ressourcen
  gp 14.14 Zwei Buttons in Box- und Form-Widget mit Textausgabe (Label-Widget)
  gp 14.15 editres – Widget-Hierarchie
  gp 14.16 Texteingabe mit Dialog-Widget
  gp 14.17 X-Toolkits meets Xlib
  gp 14.18 Zusammenfassung


Rheinwerk Computing

14.16 Texteingabe mit Dialog-Widget  toptop

Nachdem Sie gesehen haben, wie Sie mit dem Label-Widget Text ausgeben können, soll Ihnen hier anhand des Dialog-Widgets gezeigt werden, wie Sie Zeichen von der Tastatur einlesen können. Erledigen können Sie dies mit dem Dialog-Widget, das in der Headerdatei <X11/Xaw/Dialog.h> mit dem Klassennamen dialogWidgetClass definiert wurde. Das Dialog-Widget bietet Ihnen außerdem auch einen Rahmen um zwei Bereiche, einen Labelbereich für einen aussagekräftigen Text und einen Wertebereich, in dem der Text eingegeben wird. Um die Eingabe des Dialog-Widgets zu holen (was ja auch der Sinn des Widgets ist), benötigen Sie die Funktion XawDialogGetValueString() mit der Angabe des Dialog-Widgets als Parameter, von dem der String gelesen werden soll. Einen Wert setzen oder löschen können Sie auch hier mit der Funktion XtVaSetValues(), wie schon im Beispiel zuvor gesehen.

Im folgenden Beispiel wird eine einfache grep-Abfrage verwendet, welche die Groß- und Kleinschreibung ignoriert und die entsprechende Datei und Zeile des Suchergebnisses zurückliefert (grep -i -n ...). Es werden dazu zwei Dialogfelder verwendet, indem einerseits die Dateien angegeben werden (eventuell mit Pfad), in denen gesucht wird, und andererseits der Suchstring selbst angegeben wird. Als Button finden Sie hier einen zum Löschen einer Eingabe des Dialogfeldes und einen zum Starten des grep-Befehls mitsamt des eingegebenen Textes im Dialogfeld und natürlich einen Button zum Beenden der Anwendung.

/* toolkit3.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd. h.>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Command. h.>
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Dialog.h>
static Widget w_dialog, w_dialog2;
static void
Quit (Widget w, XtPointer client_data, XtPointer call_data) {
  exit (EXIT_SUCCESS);
}
static void
action (Widget w, XtPointer client_data, XtPointer call_data) {
  String string;
  String string2;
  char help[200];
  char command[255];
  /* Dialogeingaben einlesen */
  string = XawDialogGetValueString  (w_dialog);
  string2 = XawDialogGetValueString (w_dialog2);
  if( strcmp(string, "") ==0 || strcmp(string2, "") ==0)
    return; /* Keine Eingaben im Dialogfeld */
  sprintf (help, "'%s' %s", string2, string);
  sprintf (command, "grep -i -n %s\n", help);
  /* In der Praxis gefährlich => aber hier zweitrangig */
  system (command);
}
/* Text im Dialogfeld leeren */
static void DialogCancel (Widget w, XtPointer client_data,
                          XtPointer call_data) {
  char satz[1];      /* Leerstring */
  strcpy (satz, "");
  /* loesche Text */
  XtVaSetValues (w_dialog, XtNvalue, satz, NULL);
  /* loesche Text */
  XtVaSetValues (w_dialog2, XtNvalue, satz, NULL);
}
int main (int argc, char **argv) {
  XtAppContext app_context;
  Widget w_parent, w_totbox, /* Box um alles herum             */
  w_quit,                    /* Ende-Knopf                     */
  w_boxein,                  /* Box um Dialog und DialogCancel */
  w_dialogCancel,            /* Button bei Texteingabe         */
  w_action,                  /* Form um den grep-Button        */
  w_actiona;                 /* grep-Button                    */
  w_parent = XtVaAppInitialize (&app_context, NULL,
                                NULL, 0, &argc, argv,
                                NULL, NULL);
  /*  Box-Widget um alles herum */
  w_totbox = XtVaCreateManagedWidget (
               "box1",
               boxWidgetClass,   /* Widget-Klasse   */
               w_parent,         /* Eltern-Widget   */
               NULL);
  /* Box um Dialog-Widget und Cancel */
  w_boxein = XtVaCreateManagedWidget (
               "boxein",
               boxWidgetClass,   /* Widget-Klasse   */
               w_totbox,         /* Eltern-Widget   */
               NULL);
  /* Dialog-Widget */
  w_dialog = XtVaCreateManagedWidget (
               "textin_files",
               dialogWidgetClass,   /* Widget-Klasse  */
               w_boxein,            /* Eltern-Widget  */
               XtNvalue, (XtArgVal) "",
               XtNwidth, (XtArgVal) 150,
               XtNlabel, (XtArgVal) "Dateien eingeben: ",
               NULL);
  /*  Dialog-Widget */
  w_dialog2 = XtVaCreateManagedWidget (
                "textin_search",
                dialogWidgetClass,   /* Widget-Klasse   */
                w_boxein,            /* Eltern-Widget   */
                XtNvalue, (XtArgVal) "",
                XtNwidth, (XtArgVal) 150,
                XtNlabel,(XtArgVal) "Suchstring eingeben ",
                NULL);
  /* Cancel-Button */
  w_dialogCancel = XtVaCreateManagedWidget (
                     "Zurücksetzen",
                     commandWidgetClass,   /* Widget-Klasse  */
                     w_boxein,             /* Eltern-Widget  */
                     NULL);
  XtAddCallback (w_dialogCancel, XtNcallback,
                 DialogCancel, w_dialog);
  /* Untere Zeile: Form um den grep-Knopf */
  w_action = XtVaCreateManagedWidget (
               "action_form",
               formWidgetClass,   /* Widget-Klasse   */
               w_totbox,          /* Eltern-Widget   */
               NULL);
  /*  Action-Knopf */
  w_actiona = XtVaCreateManagedWidget (
                "action_grep",
                commandWidgetClass,   /* Widget-Klasse   */
                w_action,             /* Eltern-Widget   */
                XtNbackground, (XtArgVal) "gold",
                XtNlabel, (XtArgVal) " grep -i ",
                NULL);
  XtAddCallback (w_actiona, XtNcallback, action, 0);
  /* Quit */
  w_quit = XtVaCreateManagedWidget (
             "Ende",
             commandWidgetClass,   /* Widget-Klasse   */
             w_action,             /* Eltern-Widget   */
             XtNhorizDistance, (XtArgVal) 100,
             NULL);
  XtAddCallback (w_quit, XtNcallback, Quit, 0);
  /*  Stellt Fenster und Widgets dar    */
  XtRealizeWidget (w_parent);
  /*  Schleife fuer Events              */
  XtAppMainLoop (app_context);
  return EXIT_SUCCESS;
}

Das Programm bei der Ausführung:

$ gcc -o toolkit3 toolkit3.c -L/usr/X11R6/lib -lX11 -lXaw -lXt
$ ./toolkit3

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 14.9    Eine simple Suchfunktion mit Texteingabe


Die Ausgabe bei Betätigung des Buttons grepi und die im Bild (14.9) verwendeten Angaben sehen (bei mir) wie folgt aus:

7:    #include <X11/StringDefs.h>
24:   String string;
25:   String string2;
29:   string = XawDialogGetValueString  (w_dialog);
31:   string2 = XawDialogGetValueString (w_dialog2);
33:   if( strcmp(string, "") ==0 || strcmp(string2, "") ==0)
34:   return; /* Wenn ein String leer ist, nichts machen */
35:   sprintf (help, "'%s' %s", string2, string);
45:   char satz[1];      /* Leerstring */
99:   XtNlabel,(XtArgVal) "Suchstring eingeben ",
 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern