--- rpl/src/encart.c 2017/08/03 17:17:42 1.60 +++ rpl/src/encart.c 2017/08/21 09:06:02 1.61 @@ -26,8 +26,15 @@ # include # include "X11/xpm.h" # include "Xm/XmAll.h" +# include #endif +static int +_XlibErrorHandler(Display *display, XErrorEvent *event) +{ + uprintf("An error occured detecting the mouse position\n"); + return True; +} void encart(struct_processus *s_etat_processus, integer8 duree) @@ -35,14 +42,29 @@ encart(struct_processus *s_etat_processu # ifdef MOTIF_SUPPORT # include "rpl.xpm" + Bool mouse_found; + Display *display; int argc; int erreur; int hauteur; int hauteur_xpm; + int i; int largeur; int largeur_xpm; + int ns; + int nb_screens; + int offset_x; + int offset_y; + int root_x; + int root_y; + int win_x; + int win_y; + int x_max; + int x_min; + int y_max; + int y_min; Pixel couleur_arriere_plan; Pixel couleur_avant_plan; @@ -64,6 +86,11 @@ encart(struct_processus *s_etat_processu long decor; long fonctions; + unsigned int mask_return; + + Window *root_windows; + Window window_returned; + Widget cadre; Widget form; Widget objet_principal; @@ -71,6 +98,8 @@ encart(struct_processus *s_etat_processu XEvent evenement; + XineramaScreenInfo *ts; + XtAppContext app; if (strstr(XmVERSION_STRING, "LessTif") != NULL) @@ -88,8 +117,6 @@ encart(struct_processus *s_etat_processu if (display != NULL) { - XCloseDisplay(display); - objet_principal = XtVaOpenApplication(&app, "rpl", NULL, 0, &argc, argv, NULL, topLevelShellWidgetClass, NULL); XSynchronize(XtDisplay(objet_principal), False); @@ -141,14 +168,100 @@ encart(struct_processus *s_etat_processu fonctions &= ~(MWM_FUNC_ALL + MWM_FUNC_RESIZE + MWM_FUNC_CLOSE + MWM_FUNC_MINIMIZE + MWM_FUNC_MAXIMIZE); - largeur = WidthOfScreen(XtScreen(form)); - hauteur = HeightOfScreen(XtScreen(form)); - XtVaSetValues(objet_principal, XmNmwmDecorations, decor, XmNmwmFunctions, fonctions, NULL); + if (XineramaIsActive(display) == True) + { + // Récupération de la localisation des différents écrans + // physiques. + + ts = XineramaQueryScreens(display, &ns); + + XSetErrorHandler(_XlibErrorHandler); + nb_screens = XScreenCount(display); + + root_windows = sys_malloc(((unsigned) nb_screens) * sizeof(Window)); + + for(i = 0; i < nb_screens; i++) + { + root_windows[i] = XRootWindow(display, i); + } + + for(i = 0; i < nb_screens; i++) + { + if ((mouse_found = XQueryPointer(display, root_windows[i], + &window_returned, &window_returned, + &root_x, &root_y, &win_x, &win_y, &mask_return)) + == True) + { + break; + } + } + + if (mouse_found == True) + { + mouse_found = False; + + for(i = 0; i < ns; i++) + { + x_min = ts[i].x_org; + x_max = x_min + ts[i].width; + y_min = ts[i].y_org; + y_max = y_min + ts[i].height; + + if ((root_x >= x_min) && (root_x <= x_max) && + (root_y >= y_min) && (root_y <= y_max)) + { + largeur = ts[i].width; + hauteur = ts[i].height; + offset_x = ts[i].x_org; + offset_y = ts[i].y_org; + + mouse_found = True; + break; + } + } + + if (mouse_found == False) + { + // Aucune souris sur un écran physique. + + largeur = ts[0].width; + hauteur = ts[0].height; + offset_x = 0; + offset_y = 0; + } + } + else + { + // Aucune souris, on considère le premier écran physique + // géré par Xinerama. + + largeur = ts[0].width; + hauteur = ts[0].height; + offset_x = 0; + offset_y = 0; + } + + sys_free(root_windows); + XFree(ts); + } + else + { + // Xinerama inactif, on considère qu'il n'y a qu'un seul + // écran physique. + + largeur = WidthOfScreen(XtScreen(form)); + hauteur = HeightOfScreen(XtScreen(form)); + offset_x = 0; + offset_y = 0; + } + + XCloseDisplay(display); + #if 0 XtRealizeWidget(objet_principal); @@ -158,8 +271,8 @@ encart(struct_processus *s_etat_processu NULL); XtVaSetValues(objet_principal, - XmNx, (largeur - largeur_popup) / 2, - XmNy, (hauteur - hauteur_popup) / 2, + XmNx, offset_x + ((largeur - largeur_popup) / 2), + XmNy, offset_y + ((hauteur - hauteur_popup) / 2), NULL); #else sscanf(rpl_xpm[0], "%d %d", &largeur_xpm, &hauteur_xpm); @@ -168,8 +281,8 @@ encart(struct_processus *s_etat_processu hauteur_popup = (Position) (hauteur_xpm + 28); XtVaSetValues(objet_principal, - XmNx, (largeur - largeur_popup) / 2, - XmNy, (hauteur - hauteur_popup) / 2, + XmNx, offset_x + ((largeur - largeur_popup) / 2), + XmNy, offset_y + ((hauteur - hauteur_popup) / 2), NULL); XtRealizeWidget(objet_principal);