Nyt antoi tämäkin haaste periksi. Ohjeet olivat yllättävän vaikeaselkoisia kun ne halutaan pitää lyhyinä. Pistän tähän kokonaisen kääntyvän ohjelman.
Käännnä
gcc simple.c -lX11 -lXpm
riippuvuudet: libxpm-dev libx11-dev
Tuossa koodin alussa siis tehdaan tuollainen kuvake. Esim gimpillä kun piirtää (vaikka tuon 50*50 kokoisen) kuvan ja tallentaa sen xpm-muotoon, se on tekstieditorilla luettavissa ja sisältää tuollaista. Sen voisi suoraan includata, mutta halusin, että tässä on nyt vain yksi tiedosto.
"50 50 2 1", = x,y,värien_määrä (vai väreissä käytettyjen bittien määrä), ?
Sitten kerrotaan mikä merkki esittää mitäkin väriä. None on läpinäkyvä.
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <string.h>
#include <stdio.h>
/* perusrunko: http://www.flug.fi/ohjeita/x-ohjelmointi.html */
/* XPM */
static char * icon_xpm[] = {
"50 50 2 1",
" c None",
". c green",
" ",
" ",
" ",
" .... ......... ",
" ............ .............. ",
" ............... ................. ",
" ............... ................. ",
" ............... .... ........... ",
" .... .... .... ......... ",
" .... .... .... .... ",
" .... .... .... .... ",
" .... .... .... .... ",
" .... .... .... .... ",
" .... .... ................. ",
" .......... .... ................. ",
" ............... ................. ",
" ............... ................. ",
" ............... ...... .... ",
" .... ........ .... ..... ",
" .... .... .... ..... ",
" .... .... .... ..... ",
" .... .... .... .... ",
" .... .... .... .... ",
" .... .... .... .... ",
" .... .... ",
" ",
" ",
" ........ ",
" .......... .......... ",
" ................ ............. ",
" ................ ............. ",
" ................ .... ..... ",
" .... ........ ..... .... ",
" .... .... ..... .... ",
" .... .... ..... .... ",
" .... .... .... .... ",
" ..... .... .... ..... ",
" ..... .... .... ..... ",
" ................. .... ..... ",
" ................. .... .... ",
" ................. .... .... ",
" ................. ..... .... ",
" .... ..... .... ",
" .... ................ ",
" .... ................ ",
" .... ................ ",
" .... ................ ",
" .... ",
" .... ",
" "};
Display *display;
int screen_num;
int main(int argc, char **argv){
Window win;
int width=200, height=200,x=0,y=0;
char *window_name="Viiva!";
XTextProperty windowName;
XEvent report;
char *display_name = NULL;
Screen *screen_ptr;
GC gc;
XGCValues values;
unsigned long valuemask =0;
if ((display=XOpenDisplay(display_name))==NULL)
{
fprintf(stderr,"can't connect to server");
exit(-1);
}
screen_num= DefaultScreen(display);
screen_ptr= DefaultScreenOfDisplay(display);
win=XCreateSimpleWindow(display,RootWindow(display,screen_num)\
,x,y,width,height,0,\
BlackPixel(display,screen_num),\
WhitePixel(display,screen_num));
/* Tällä kerrotaan ikkunamanagerille tärkeitä ominaisuuksia.
* Asetetaan otsikkoon tulostettava teksti oikeaan rakenteeseen.
*/
XStringListToTextProperty(&window_name,1,&windowName);
XSetWMProperties(display,win,&windowName,NULL,argv,argc\
,NULL,NULL,NULL);
/* Valitaan ohjelmalle tapahtumapeite, eli mihin tapahtumiin
* se reagoi.
*/
XSelectInput(display,win,ButtonPressMask|\
ExposureMask|PointerMotionMask);
/*
* Alustetaan grafiikan viitekehys
*/
gc=XCreateGC(display,win,valuemask,&values);
/*
!!!!!!!!!!!!!!!Laitetaan ikoni!!!!!!!!!!!
http://newsgroups.derkeiler.com/Archive/Comp/comp.windows.x/2007-03/msg00015.html
*/
Pixmap image, shape;
XWMHints win_hints;
XpmCreatePixmapFromData(display, win,icon_xpm, &image, &shape, NULL);
//win_hints = XAllocWMHints(); /*jostakin syystä alloc ja free eivät mene läpi?*/
win_hints.initial_state = NormalState;
win_hints.flags = IconPixmapHint|IconMaskHint;
win_hints.icon_pixmap = image;
win_hints.icon_mask = shape;
XSetWMHints(display, win, &win_hints);
//XFree(win_hints);
//////////////////////////////////////////////////////////////
XMapWindow(display,win);
/*main-looppi*/
while(1)
{
XNextEvent(display,&report);
switch (report.type)
{
case Expose:
/* Piirtää viivan. kolmas argumentti on
* tyypiltään Drawable, eli grafiikka-
* viitekehys. */
XDrawLine(display,win,gc,0,0,200,200);
break;
case MotionNotify:
/* seuraa hiiren paikkaa */
XDrawString(display, win, gc,
report.xmotion.x,report.xmotion.y
, window_name, strlen(window_name));
break;
case ButtonPress:
exit(1);
default:
break;
}
}
return 0;
}