this appeared on the user list, i didn't see any responses.  can anyone here
help?

---------- Forwarded message ----------
From: Philippe de Rochambeau <[email protected]>
Date: 2009/11/26
Subject: Newbie: dockapp code
To: [email protected]



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