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