X
xtian_82
Jungspund
Hi, habe mir mal ein kleines Programm überlegt, mit dem man die Grafikausgabe erheblich vereinfachen kann. Wollte mal hören, was ihr davon haltet...
Also, man bindet die Datei einfach mit
in seinem Programm ein und kann dann mit
das Fenster starten. Zum drauf zeichnen nimmt man einfach
bzw.
.
Naja, die Event-Behandlung habe ich mal bewusst aussen vor gelassen. Beendet wird das Fenster mit
, wobei das Fenster erst dann wirklich geschlossen wird, wenn es einmal angeklickt wurde. Fertig.
Ist gedacht um schnell mal was zu zeichnen ohne irgendwelche Events oder so abzufragen. Interaktionen gehen also nur über die Standardeingabe.
Hier die eigentliche "Header"-Datei Grafik.h:
Achso, das ganze braucht natürlich die Xlib und wegen dem Sleep die unistd.h.
Edit: Also "-L/usr/X11R6/lib -lX11" nicht vergessen!
Also, man bindet die Datei einfach mit
Code:
#include "Grafik.h"
Code:
create_window(int width, int height)
Code:
draw_point(int x, int y)
Code:
draw_line(int x1, int y1, int x2, int y2)
Naja, die Event-Behandlung habe ich mal bewusst aussen vor gelassen. Beendet wird das Fenster mit
Code:
close_window()
Ist gedacht um schnell mal was zu zeichnen ohne irgendwelche Events oder so abzufragen. Interaktionen gehen also nur über die Standardeingabe.
Hier die eigentliche "Header"-Datei Grafik.h:
Code:
/* Grafik.h */
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <unistd.h>
/* Funktionsprototypen */
static int create_window (int w, int h);
static void close_window (void);
static void draw_point(int x, int y);
static void draw_line(int x1, int y1, int x2, int y2);
/* Globale Variablen */
static unsigned int width, height;
static Display *display;
static int screen;
static int depth;
static Window win;
static GC mygc;
/* erzeugt ein Fenster zum Reinzeichnen */
static int create_window (int w, int h) {
width=w;
height=h;
char *window_name = "Grafik-Fenster";
char *icon_name = "Grafik";
static XSizeHints size_hints;
Window rootwin;
/* X-Sitzung öffnen */
display = XOpenDisplay (NULL);
/* Fehlerüberprüfung */
if (display == NULL) {
printf ("Keine Verbindung zum X-Server!\n");
exit(EXIT_FAILURE);
}
screen = XDefaultScreen (display);
depth = XDefaultDepth (display, screen);
rootwin = RootWindow (display, screen);
win = XCreateSimpleWindow ( display, rootwin, 100, 100, width, height, 5, BlackPixel (display, screen), WhitePixel (display, screen));
size_hints.flags = PSize | PMinSize | PMaxSize;
size_hints.min_width = width;
size_hints.max_width = width;
size_hints.min_height = height;
size_hints.max_height = height;
XSetStandardProperties ( display, win, window_name, icon_name, None, 0, 0, &size_hints );
XSelectInput ( display, win, ButtonPressMask );
XMapWindow (display, win);
unsigned long black, white;
XMapRaised(display,win);
black = BlackPixel (display, screen);
white = WhitePixel (display, screen);
mygc = XCreateGC (display, win, 0, 0);
XSetForeground (display, mygc, black);
XSetBackground (display, mygc, white);
XClearWindow(display, win);
return 1;
}
/* schließt Fenster, aber erst nachdem reingeklickt wurde */
static void close_window (void) {
XFlush(display);
while (XPending (display) == 0)
sleep(1); // um den Prozessor ein wenig zu entlasten!
XFreeGC (display, mygc);
XCloseDisplay (display);
}
static void draw_point(int x, int y) {
if ( x>=0 && x < width && y >= 0 && y < height ) {
XFlush (display);
XDrawPoint (display, win, mygc, x, y);
}
}
static void draw_line(int x1, int y1, int x2, int y2) {
XFlush (display);
XDrawLine (display, win, mygc, x1, y1, x2, y2);
}
Achso, das ganze braucht natürlich die Xlib und wegen dem Sleep die unistd.h.
Edit: Also "-L/usr/X11R6/lib -lX11" nicht vergessen!
Zuletzt bearbeitet: