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].