OS'e, 3D Games, aber trotzdem kommt kaum noch jemand auf die Idee einen Windowmanager zu programmieren, ein Grund mehr, das ich einen programmiere
Zurzeit kann er nur einen Bildschirm reservieren, ein Rootfenster setzten, Farben und Font laden, einen Cursor setzten und mit Fehlern umgehen, er soll aber hinterher folgendes können:
- *.xpm Bilder laden und anzeigen
- komplett via *.gderc configurierbar sein
- Stylisch etwas CDE/Motif/4dwm angelehnt sein
- Auch auf Free/NetBSD laufen
- Komplett nur mit den X Libs
Der Code ist nochnicht wirklich funktionell, besonders, da er nicht festellen kann, ob ein anderer WM läuft und, da er nichts zutun hat sich sofort wieder beendet, aber es ist schonmal ein Anfang...
Ich übernehme keine Verantwortung gegenüber schäden, die von dem Programm verursacht werden.(auf eigene Gefahr)
cc --version
uname -acc (SUSE Linux) 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036]
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mitLinux linux-yqa4.lan 2.6.25.18-0.2-pae #1 SMP 2008-10-21 16:30:26 +0200 i686 i686 i386 GNU/Linux
cc -lXt -lX11 zu kompilieren(bei mir keine Messages)
main.c
Code: Alles auswählen
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xproto.h>
#include <X11/Xatom.h> //Ein paar Includes sind in diesem Stadium noch zuviel, macht aber nix^^
#include <X11/SM/SMlib.h>
#include <X11/Xmu/Error.h>
#include <X11/extensions/sync.h>
#include <X11/Xlocale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define XC_top_left_arrow 132 //Ein Font basierender Cursor
#define DEFAULTFONT "lucidasans-12" //Die default Font
#define BACKCOLOR "seagreen"
#define FORECOLOR "black"
char *HOME;
char *displayName;
int screen;
Display *display; //Display
Window root; //das Root Window ~Also der Windowmanager
Cursor cursor;
XFontStruct *dflFont;
XColor BackgroundColor;
XColor ForegroundColor;
GC mainGC;
//TODO: Signalhandler hinzufügen.
int ErrorHandl(Display *dpy, XErrorEvent *err) {
char text[500];
XGetErrorText(display, err->error_code, text, sizeof(text)); //ließt den Fehlertext aus den gegebenen Errorcodes.
printf(" [EE] X Error: %s \n", text);
exit(0);
}
int main(int argc, char *argv[]) {
int i;
XGCValues normalgc;
XColor dummy;
XSetWindowAttributes normalattr;
printf("GDE - Global Display Manager\n");
printf("(c) 2007 - 2008 Jan Adelsbach <jan.software[at]web.de>\n"); //That's me ;P
printf("Output legend: EE - Error, DB - Debug, WW - Warning\n");
//TODO: Parameter auslesen, sobald ein paar mehr sachen intigriert sind.
HOME = getenv("HOME"); //Homeverzeichniss auslesen(für die Configurations- dateien, und Errorlogs)(noch nicht Intigriert)
if(HOME == NULL) {
HOME = "./";
printf(" [WW] Unable to get variable: $HOME. Setting to './' \n");
}
display = XOpenDisplay(displayName); //Überprüft, ob das Display geöffnet werden kann
if(!display) {
printf(" [EE] Failed to open display %s\n", displayName);
return -1;
}
XSetErrorHandler(ErrorHandl); //Setzt die ErrorHandl(siehe oben) funktion als Errorhandler.
screen = DefaultScreen(display);
root = RootWindow(display, screen);
XAllocNamedColor(display, DefaultColormap(display, screen), BACKCOLOR, &BackgroundColor, &dummy); //Findet die nächstgelengendste Farbe, die von der Graka unterstrützt wird
XAllocNamedColor(display, DefaultColormap(display, screen), FORECOLOR, &ForegroundColor, &dummy);
dflFont = XLoadQueryFont (display, DEFAULTFONT); //Lädt die Defaultfont
if(!dflFont) {
printf(" [WW] Failed to load %s font! switch to fixed.\n", DEFAULTFONT);
dflFont = XLoadQueryFont (display, "fixed");
}
normalgc.function = GXcopy;
normalgc.background = BackgroundColor.pixel;
normalgc.foreground = ForegroundColor.pixel;
normalgc.line_width = 1;
normalgc.font = dflFont->fid;
mainGC = XCreateGC(display, root, GCFunction | GCBackground | GCForeground | GCLineWidth | GCFont, &normalgc); //Erstellt die Main GC
//TODO Window Attribute setzten
cursor = XCreateFontCursor (display, XC_top_left_arrow); //Erstellt einen XCursor
XDefineCursor (display, root, cursor); //Und setzt ihn...
}