Eigener Windowmanager mit X11

Präsentation und Organisation von eigenen Projekten
Antworten
Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Eigener Windowmanager mit X11

Beitrag von Jside » Do Dez 04, 2008 6:53 pm

Moin!

OS'e, 3D Games, aber trotzdem kommt kaum noch jemand auf die Idee einen Windowmanager zu programmieren, ein Grund mehr, das ich einen programmiere :mrgreen:

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
cc (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.
uname -a
Linux linux-yqa4.lan 2.6.25.18-0.2-pae #1 SMP 2008-10-21 16:30:26 +0200 i686 i686 i386 GNU/Linux
mit
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...  
}
Ich hoffe, ich hab das bis dato gut gemacht, bis vor ner Woche hatte ich keine Ahnung von X11...

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Eigener Windowmanager mit X11

Beitrag von Dirty Oerti » Do Dez 04, 2008 8:25 pm

Kurze Frage: Wie muss man das ausführen? :)

Von der Konsole aus, nehme ich an, ohne anderen aktivierten Windowmanager?

Einen Windowmanager zu basteln finde ich eine gute Idee :)

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Eigener Windowmanager mit X11

Beitrag von Jside » Do Dez 04, 2008 8:34 pm

In deiner rc.conf den Eintrag:
GDM="YES" oder XDM="YES" oder KDM="YES"
(je nachdem)
auf NO setzten, und in deinem Homeverzeichniss die .xinitrc umbenennen, eine neue erstellen, und den Dateipfad zu meinem WM einfügen, neustarten,(dann biste in der Console) und "startx" eingeben dann dürfte sich der XServer wieder beenden, da es ja wie bereits gesagt nochnichts großartig kann.

Dann wieder in der rc.conf den Wert wieder auf "YES" setzten, und die alte .xinitrc wieder als diese umbenennen, dann neustarten und dann ist wieder alles beim alten ;)

//Edit: alternativ einen for(;;); loop an den Code hängen, dann dürftest du ein Seegrünen Bildschirm haben...(via Strg + alt +Backspace(muss man bei OpenSuse 2x hintereinander machen kommste dann wieder raus)..

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Eigener Windowmanager mit X11

Beitrag von Xin » Fr Dez 05, 2008 8:34 am

Jside hat geschrieben:Ich hoffe, ich hab das bis dato gut gemacht, bis vor ner Woche hatte ich keine Ahnung von X11...
Wenn Dich die X11-Programmierung interessiert, so findest Du in Jürgen Wolfs Buch 'Linux-Programmierung' da ein breiteres Kapitel. (Galileo Computing)

Ich habe das Buch zu Hause und kann Dir bei Bedarf das Inhaltsverzeichnis um die Ohren schlagen. Bei Amazon ist es verschwunden.
(http://www.galileocomputing.de/katalog/ ... 3.Bh4-j.04)

Keine Garantie, dass ich das richtige Buch meine, aber ich bin mir aber recht sicher... notfalls lass mich zuhause nachgucken...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Eigener Windowmanager mit X11

Beitrag von Jside » Fr Dez 05, 2008 7:58 pm

So, X kann jetzt vollständig geupsettet werden :mrgreen:

Jetzt gehts zu den Fenstern: wenn X gestartet ist, und ein X-Programm gestartet wird, so wird dieses zwar als Fenster- mitdem man jedoch nichts machen kann geöffnet. Ich hole einfach ein Fenster, das die Windowboarder enthält, und nehme das Fenster der Application als Subfenster im Boarderfenster :). Jedes Fenster bekommt eine in einem Array zugeordnete struct mit den Daten..oder hat jemand eine andere Lösung ? Aber zuerst muss ich noch einen Eventhandler basteln...Und davor erstmal nen Signalhandler...
Xin hat geschrieben:Wenn Dich die X11-Programmierung interessiert, so findest Du in Jürgen Wolfs Buch 'Linux-Programmierung' da ein breiteres Kapitel. (Galileo Computing)
Nachdem was da steht, gehts da im Kapitel anscheinend nur um GTK+.. :)

Wenn ihr __TEST definiert, dürfte auf dem Bildschirm hinterher ein Text angezeigt werden...
(Hab nicht getestet, obs soweit läuft ..sollte es aber :D )

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;
int sigready;
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];
    if((err->error_code == BadAccess) && (!sigready)) {
         printf(" [EE] Another Windowmanager is allready running\n", text);
    }
    else {
    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 initX() {
    int i;
    XGCValues normalgc;
    XColor dummy;
    XSetWindowAttributes normalattr;
    display = XOpenDisplay(displayName); //Überprüft, ob das Display geöffnet werden kann
    if(!display) {
        printf(" [EE] Failed to open display %s\n", displayName);
        exit(0);
    }
    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
    normalattr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
    XChangeWindowAttributes(display, root, CWEventMask, &normalattr);
    cursor = XCreateFontCursor (display, XC_top_left_arrow); //Erstellt einen XCursor
    XDefineCursor (display, root, cursor); //Und setzt ihn...  
#ifdef __TEST
    char *message = "Hello Windowmanagerworld! Press Strg + Alt + Backspace to exit!";
    XSetFont(display, mainGC, dflfont->fid);
    XDrawString(display, root, mainGC, 10, 10,message, sizeof(message));
    for(;;);
#endif
}

int main(int argc, char *argv[]) {
    printf("\n\nGDE - 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\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");
    }
    initX();
    sigready = 1;

}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Eigener Windowmanager mit X11

Beitrag von Xin » Sa Dez 06, 2008 12:20 am

Jside hat geschrieben:
Xin hat geschrieben:Wenn Dich die X11-Programmierung interessiert, so findest Du in Jürgen Wolfs Buch 'Linux-Programmierung' da ein breiteres Kapitel. (Galileo Computing)
Nachdem was da steht, gehts da im Kapitel anscheinend nur um GTK+.. :)
Es gibt mehrere Kapitel.
Kapitel 14 geht über die XLib von Seite 747 bis 821, dann folgt GTK bis 953.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Eigener Windowmanager mit X11

Beitrag von Dirty Oerti » So Dez 14, 2008 12:39 am

Ich wollte nur mal fragen, wie es bei dir so läuft :)

Arbeitest du noch am Window Manager?
Den Ansatz, mal einen neuen Window Manager zu programmieren find ich nämlich wirklich gut.

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Eigener Windowmanager mit X11

Beitrag von Jside » So Dez 14, 2008 7:04 am

Also sehr viel weiter bin ich nochnicht(nur die Standartroutinen für die Argumente, und "einfaches" Fenster(ohne alles)) aber das kommt noch, ich bin allerdings gerade damit beschäftigt einen 1 Bit CPU zu entwickeln(vielmehr das System, der CPU ist fertig), und progge nurnoch Secundär nebenbei *g* mache aber natürlich noch dran weiter ;)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Eigener Windowmanager mit X11

Beitrag von Xin » So Dez 14, 2008 9:42 am

Jside hat geschrieben:Also sehr viel weiter bin ich nochnicht(nur die Standartroutinen für die Argumente, und "einfaches" Fenster(ohne alles)) aber das kommt noch
Zaunpfahl.
Jside hat geschrieben:, ich bin allerdings gerade damit beschäftigt einen 1 Bit CPU zu entwickeln(vielmehr das System, der CPU ist fertig), und progge nurnoch Secundär nebenbei *g* mache aber natürlich noch dran weiter ;)
Du lötest Dir einen Halbaddierer zusammen oder eine Jside J1?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Eigener Windowmanager mit X11

Beitrag von Jside » Mo Dez 15, 2008 6:57 am

Du lötest Dir einen Halbaddierer zusammen oder eine Jside J1?
Es wäre die Jside J2 ...ist nicht mein erster selbstgelöteter ;) ..sodern mein 2ter :mrgreen:

Antworten