This is old C++ code originally intended to be a playground for 3D math.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

313 lines
8.0 KiB

using namespace std;
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "xclass.h"
xdisplay::xdisplay(char* name) {
if(name) {
display_name=new char[strlen(name)+1];
strcpy(display_name, name);
}
else {
display_name=NULL;
}
/* Connect to X server */
if ((display=XOpenDisplay(display_name)) == NULL)
throw noconnect_exception();
wincount=0;
screen_anz=ScreenCount(display);
default_screen=DefaultScreen(display);
screens=new xscreen*[screen_anz];
for(int i=0; i<screen_anz; i++) {
screens[i]=new xscreen(this, i);
}
font_info=NULL;
}
xdisplay::xdisplay(const xdisplay& xd) {
if(xd.display_name) {
display_name=new char[strlen(xd.display_name)+1];
strcpy(display_name, xd.display_name);
}
else {
display_name=NULL;
}
display=xd.display;
wincount=xd.wincount;
screen_anz=xd.screen_anz;
default_screen=xd.default_screen;
screens=new xscreen*[screen_anz];
for(int i=0; i<screen_anz; i++) {
screens[i]=(xd.screens)[i];
}
font_info=NULL;
}
xdisplay::~xdisplay() {
if(display_name)
delete [] display_name;
// das ueberlass ich dem Destructor von xscreen!
// for(int i=0; i<wincount; i++)
// delete wins[i];
// delete [] wins;
//for(int i=0; i<screen_anz; i++)
// delete screens[i];
//delete [] screens;
XCloseDisplay(display);
}
xdisplay& xdisplay::operator=(const xdisplay& xd) {
if(xd.display_name) {
display_name=new char[strlen(xd.display_name)+1];
strcpy(display_name, xd.display_name);
}
else {
display_name=NULL;
}
display=xd.display;
wincount=xd.wincount;
screen_anz=xd.screen_anz;
default_screen=xd.default_screen;
screens=new xscreen*[screen_anz];
for(int i=0; i<screen_anz; i++) {
screens[i]=(xd.screens)[i];
}
font_info=NULL;
return *this;
}
xscreen* xdisplay::defaultscreen(void) {
return screens[default_screen];
}
void xdisplay::loadfont(char* fname) {
/* Load font and get font information structure */
if((font_info = XLoadQueryFont(display,fname)) == NULL)
throw nofont_exception();
}
xscreen::xscreen(xdisplay* d, int screen_num) {
this->screen_num=screen_num;
this->x_disp=d;
if(screen_num!=-1) {
XPixmapFormatValues* pixmap_formats;
int count;
screen=XScreenOfDisplay(d->display, screen_num);
width=WidthOfScreen(screen);
height=HeightOfScreen(screen);
default_cm=DefaultColormapOfScreen(screen);
black_pixel=XBlackPixelOfScreen(screen);
white_pixel=XWhitePixelOfScreen(screen);
rootwin=new xwindow(this); // Ich kann nicht this nehmen,
// da das aktuelle Object dem
// Array zugewiesen wird und
// danach weg is.
vis=DefaultVisual(d->display, 0);
pixmap_formats=XListPixmapFormats(d->display, &count);
depth=0;
for(int i=0, result=0; i<count; i++) {
if(pixmap_formats[i].depth > depth) {
// OK, das vi existiert jetzt nur fuer TrueColor, ich muss
// noch fuer alle anderen VisualTypes eins einbauen.
if(XMatchVisualInfo(d->display, d->default_screen,
pixmap_formats[i].depth, TrueColor, &vi)) {
depth=pixmap_formats[i].depth;
bytespp=pixmap_formats[i].bits_per_pixel/8;
scanline_pad=pixmap_formats[i].scanline_pad;
}
}
}
gc=DefaultGC(d->display, d->defaultscreenid());
}
else {
screen=NULL;
rootwin=NULL;
}
}
xscreen::xscreen(const xscreen& scr) {
x_disp=scr.x_disp;
screen_num=scr.screen_num;
screen=scr.screen;
rootwin=scr.rootwin;
width=scr.width;
height=scr.height;
vis=scr.vis;
memcpy(&vi, &scr.vi, sizeof(XVisualInfo));
depth=scr.depth;
bytespp=scr.bytespp;
scanline_pad=scr.scanline_pad;
memcpy(&gc, &scr.gc, sizeof(GC));
default_cm=scr.default_cm;
black_pixel=scr.black_pixel;
white_pixel=scr.white_pixel;
}
xscreen::~xscreen() {
delete rootwin;
XFreeGC(x_disp->display, gc);
XFreeColormap(x_disp->display, default_cm);
}
xscreen& xscreen::operator=(const xscreen& scr) {
x_disp=scr.x_disp;
screen_num=scr.screen_num;
screen=scr.screen;
rootwin=scr.rootwin;
width=scr.width;
height=scr.height;
vis=scr.vis;
memcpy(&vi, &scr.vi, sizeof(XVisualInfo));
depth=scr.depth;
bytespp=scr.bytespp;
scanline_pad=scr.scanline_pad;
memcpy(&gc, &scr.gc, sizeof(GC));
default_cm=scr.default_cm;
black_pixel=scr.black_pixel;
white_pixel=scr.white_pixel;
return *this;
}
xwindow* xdisplay::getXwinById(Window id) {
int i;
for(i=0; i<wincount; i++)
if(wins[i]->window == id)
return wins[i];
return NULL;
}
xwindow::xwindow(xscreen* xs) {
screen=xs;
window=XRootWindowOfScreen(xs->screen);
screen->x_disp->wincount++;
xwindow** temp=new xwindow*[screen->x_disp->wincount];
for(int i=0; i<screen->x_disp->wincount-1; i++)
temp[i]=screen->x_disp->wins[i];
temp[screen->x_disp->wincount-1]=this;
delete[] screen->x_disp->wins;
screen->x_disp->wins=temp;
}
xwindow::xwindow(xwindow* win, int x, int y,
unsigned int bwidth, unsigned int width,
unsigned int height) {
screen=win->screen;
window=XCreateSimpleWindow(screen->x_disp->display, win->window,
x, y, width, height, bwidth,
screen->black_pixel, screen->white_pixel);
screen->x_disp->wincount++;
xwindow** temp=new xwindow*[screen->x_disp->wincount];
for(int i=0; i<screen->x_disp->wincount-1; i++)
temp[i]=screen->x_disp->wins[i];
temp[screen->x_disp->wincount-1]=this;
delete[] screen->x_disp->wins;
screen->x_disp->wins=temp;
XSelectInput(screen->x_disp->display, window,
ExposureMask|KeyPressMask|ButtonPressMask|StructureNotifyMask);
}
xwindow::xwindow(const xwindow& xw) {
screen=xw.screen;
window=xw.window;
back=xw.back;
swapinfo=xw.swapinfo;
}
xwindow& xwindow::operator=(const xwindow& xw) {
screen=xw.screen;
window=xw.window;
back=xw.back;
swapinfo=xw.swapinfo;
return *this;
}
// Dies sollte nochmal in mehrere kleinere Methoden zum einstellen der
// diversen Dinge fuer den WM aufgesplittet werden.
void xwindow::initWM(void) {
XSizeHints* size_hints; // Informationen fuer WM ueber
// minimale Groessen fuer App
XWMHints* wm_hints; // weiter Infos fuer WM z.B. Icon
// Input/Output initialisierung
XClassHint* class_hints; // noch mehr infos fuer WM
if (!(size_hints = XAllocSizeHints())) {
fprintf(stderr, "failure allocating memory\n");
exit(1); //throw exception...
}
if (!(wm_hints = XAllocWMHints())) {
fprintf(stderr, "failure allocating memory\n");
exit(1); //throw exception...
}
if (!(class_hints = XAllocClassHint())) {
fprintf(stderr, "failure allocating memory\n");
exit(1); //throw exception...
}
size_hints->flags = PPosition | PSize | PMinSize;
size_hints->min_width = 300;
size_hints->min_height = 200;
wm_hints->initial_state = NormalState;
wm_hints->input = True;
// wm_hints->icon_pixmap = icon_pixmap;
wm_hints->flags = StateHint | IconPixmapHint | InputHint;
class_hints->res_name = "jokus"; //screen->x_disp->argv[0];
class_hints->res_class = "Basicwin";
// XSetWMProperties(screen->x_disp->display, window, NULL, NULL, /*&iconName*/
// screen->x_disp->argv, screen->x_disp->argc, size_hints,
// wm_hints, class_hints);
XStoreName(screen->x_disp->display, window, "jokus");
}