Hi,

I am trying to make the following dockapp code, which appears in the 2000 French edition of Linux Magazine, work. This code was written by someone called Alain Basty who is unfortunately unreachable.

I have created a black .xbm image with a 4-pixel-wide white border on all four sides called "fond.xbm", as instructed in the article, as well as two .xpm image called image1.xpm and image2.xpm respectively. "Hello" appears on the first image in black on a white background, and "World" appears in black on a white background on the second image.

Unfortunately, when I run the dockapp in Window Maker (in X11 on MacosX 10.4), the dockapp appears as a plain grey square with a white border (no "Hello" or "World"), and clicking it does nothing (although I put a 'printf("Button Pressed")' in my
DoPressButton callback).

So here's my question: why doesn't the dockapp display the xpms with "Hello" and "World" on them respectively, and why
doesn't it process button presses?

Many thanks.

pr

-----------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h> // Pour les fonctions de base
#include <X11/xpm.h> // Pour la gestion des pixmaps
#include <X11/Xutil.h> // Pour la communication avec le window manager
#include <X11/extensions/shape.h> // Pour la gestion de la transparence

/* On inclut directement dans le code les donnees decrivant
les bitmaps et pixmaps necessaires a l'application */
#include "fond.xbm" // Le masque de fond pour la transparence
#include "image1.xpm" // Le message Coucou en LCD
#include "image2.xpm" // Le message Salut en LCD

/* Declaration des variables necessaires a la gestion d'un client X */
Display *dpy; // La voie de communication avec le serveur
Window root; // La fenetre fond d'ecran (le "bureau")
int screen; // Le # de l'ecran (0 si un seul ecran)
GC gc; // Le contexte graphique permettant de dessiner
unsigned long p_blanc; // Le # de la couleur blanche
unsigned long p_noir; // Le # de la couleur noire
/* Les fenetres associees a l'application */
Window win; // Notre fenetre principale
Window iconwin; // Notre fenetre icone
unsigned int borderwidth = 1; // La largeur du bord des fenetres

/* Indications a faire passer au window manager */
XWMHints wmhints; // L'icone et l'etat de la fenetre
XSizeHints sizehints; // La taille et la position
XClassHint classHint; // La classe de la fenetre
/* Les pixmaps associes a l'application */
Pixmap pixmask; // Gestion de la transparence
Pixmap XPM[2]; // Nos deux messages (Coucou et Salut)
int nXPM = 0; // Le # du pixmap a afficher
Atom x_wm_delete_window;

/* Gestionnaire de l'evenement Expose (demande de reaffichage) */
void DoExpose() {
        /* Copie du pixmap nXPM dans la fenetre et dans l'icone */
        printf("Exposed\n");
        XCopyArea(dpy, XPM[nXPM], win, gc, 0, 0, 64, 64, 0, 0);
        XCopyArea(dpy, XPM[nXPM], iconwin, gc, 0, 0, 64, 64, 0, 0);
}

/* Gestionnaire de l'evenement ButtonPress (bouton souris enfonce) */
void DoButtonPress() {
        printf("Button pressed\n");
        /* Changement du # du pixmap */
        nXPM = 1 - nXPM;
        /* Demande de reaffichage */
        DoExpose();
}

/* Boucle evenementielle principale */
void DoEvents() {
        XEvent ev; // Structure pour recuperer l'evenement
        do { // Boucle sans fin
                XNextEvent(dpy, &ev); // Attente d'un evenement et recuperation
                switch (ev.type) { // Traitement de l'evenement
                        case Expose:
                                DoExpose(); // Si X demande le reaffichage
                                break;
                        case ButtonPress:
                                DoButtonPress(); // Si l'utilisateur clique sur 
l'icone
                                break; // (ou sur la fenetre)
                        case ClientMessage :
                                if ((Atom)ev.xclient.data.l[0] == 
x_wm_delete_window) {
                                        printf("Deleting window\n");
                                        exit(0);
                                }
                                break;
                        default:
                                break;
                }
        } while (1);
        XCloseDisplay(dpy);
}

/* Initialisations de la dockapp */
int main(int argc, char *argv[]) {

        char *wname = argv[0]; // Le nom de l'application
        /* Initialisations X classiques */
        dpy = XOpenDisplay(NULL); // Ouvre une communication
        x_wm_delete_window = XInternAtom(dpy, "WM_DELETE_WINDOW", 0);
        // avec le serveur X local
        screen = DefaultScreen(dpy); // Recupere l'ecran par defaut
        root = RootWindow(dpy, screen); // Recupere la fenetre de fond
        p_blanc = WhitePixel(dpy, screen); // # de couleur du blanc
        p_noir = BlackPixel(dpy, screen); // # de couleur du noir
        gc = XDefaultGC(dpy, screen); // Recupere le contexte graphique
        /* Definition de la taille des fenetres */
        sizehints.x = 0;
        sizehints.y = 0;
        sizehints.width = 64;
        sizehints.height = 64;
        /* Creation de la fenetre principale et de la fenetre icone */
        win = XCreateSimpleWindow(dpy, root, sizehints.x, sizehints.y,
                sizehints.width, sizehints.height, borderwidth, p_noir, 
p_blanc);
        iconwin = XCreateSimpleWindow(dpy, root, sizehints.x, sizehints.y,
                sizehints.width, sizehints.height, borderwidth, p_noir, 
p_blanc);
        
        sizehints.flags = USSize | USPosition;
        XSetWMNormalHints(dpy, win, &sizehints);
        /* Associe une icone a la fenetre principale et l'indique au
        window manager */
        wmhints.initial_state = WithdrawnState; // Pour ne voir que l'icone
        wmhints.icon_window = iconwin; // L'icone est une fenetre
        wmhints.icon_x = sizehints.x;
        wmhints.icon_y = sizehints.y;
        wmhints.window_group = win;
wmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
        XSetWMHints(dpy, win, &wmhints);
        /* Indique au window manager la classe de la fenetre */
        classHint.res_name = wname;
        classHint.res_class = wname;
        XSetClassHint(dpy, win, &classHint);
        /* Indique au window manager la ligne de commande */
        XSetCommand(dpy, win, argv, argc);
        /* Chargement du pixmap definissant la transparence */
pixmask = XCreateBitmapFromData(dpy, win, fond_bits, fond_width, fond_height);
        /* Definition du masque de transparence pour la fenetre et l'icone */
        XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, pixmask, ShapeSet);
XShapeCombineMask(dpy, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet);
        /* Chargement des deux pixmaps a afficher */
        XpmCreatePixmapFromData(dpy, root, image1_xpm, &XPM[0], NULL, NULL);
        XpmCreatePixmapFromData(dpy, root, image2_xpm, &XPM[1], NULL, NULL);
        /* Selection des evenements pour la fenetre et l'icone */
        XSelectInput(dpy, win, ExposureMask | ButtonPressMask);
        XSelectInput(dpy, iconwin, ExposureMask | ButtonPressMask);
        /* Affichage de la fenetre (Window Maker ne l'affichera pas grace
        a l'option WithdrawnState de wmhints) */
        XMapWindow(dpy,win) ;
        /* Attente et traitement des evenements */
        DoEvents();
        
        return 0;

}

----------------------


--
To unsubscribe, send mail to [email protected].

Reply via email to