import CS motif-2.3.4-29.el9
This commit is contained in:
		
							parent
							
								
									419e024121
								
							
						
					
					
						commit
						289fa424df
					
				
							
								
								
									
										61
									
								
								SOURCES/0001-build-Check-for-Xinerama-availability.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								SOURCES/0001-build-Check-for-Xinerama-availability.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | From 49791ea9aa84c64af114f564d4c46228263d1439 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Tue, 19 Nov 2024 18:40:33 +0100 | ||||||
|  | Subject: [PATCH 1/7] build: Check for Xinerama availability | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  configure.ac       | 22 ++++++++++++++++++++++ | ||||||
|  |  lib/Xm/Makefile.am |  2 +- | ||||||
|  |  2 files changed, 23 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/configure.ac b/configure.ac
 | ||||||
|  | index d57f71e6..f0b2617d 100644
 | ||||||
|  | --- a/configure.ac
 | ||||||
|  | +++ b/configure.ac
 | ||||||
|  | @@ -280,7 +280,29 @@ AC_SUBST(LIB_XP)
 | ||||||
|  |  AC_FIND_XFT | ||||||
|  |  AC_IMAGE_SUPPORT | ||||||
|  |   | ||||||
|  | +AC_ARG_ENABLE(xinerama,[  --enable-xinerama       Enable Xinerama (default=yes)])
 | ||||||
|  | +if test "x$enable_xinerama" = "x"
 | ||||||
|  | +then
 | ||||||
|  | +    enable_xinerama="yes"
 | ||||||
|  | +fi
 | ||||||
|  | +
 | ||||||
|  | +if test "x$enable_xinerama" = "xyes"
 | ||||||
|  | +then
 | ||||||
|  | +  AC_MSG_CHECKING([for libXinerama])
 | ||||||
|  | +  AC_CHECK_HEADERS(X11/extensions/Xinerama.h,
 | ||||||
|  | +    AC_CHECK_LIB(Xinerama, XineramaQueryExtension, ,enable_xinerama="no"),
 | ||||||
|  | +  enable_xinerama="no")
 | ||||||
|  | +fi
 | ||||||
|  | +
 | ||||||
|  | +if test "x$enable_xinerama" = "xyes"
 | ||||||
|  | +then
 | ||||||
|  | +  LIB_XINERAMA=-lXinerama
 | ||||||
|  | +else
 | ||||||
|  | +  LIB_XINERAMA=
 | ||||||
|  | +fi
 | ||||||
|  |   | ||||||
|  | +AM_CONDITIONAL(XINERAMA, test "$enable_xinerama" = "yes")
 | ||||||
|  | +AC_SUBST(LIB_XINERAMA)
 | ||||||
|  |   | ||||||
|  |  # AM_CONDITIONAL(Motif22Compatibility, test x$enable_motif22_compatibility = xyes) | ||||||
|  |   | ||||||
|  | diff --git a/lib/Xm/Makefile.am b/lib/Xm/Makefile.am
 | ||||||
|  | index a95fa2db..07b733f5 100644
 | ||||||
|  | --- a/lib/Xm/Makefile.am
 | ||||||
|  | +++ b/lib/Xm/Makefile.am
 | ||||||
|  | @@ -71,7 +71,7 @@ else
 | ||||||
|  |  PRINTS_SRC = | ||||||
|  |  endif | ||||||
|  |   | ||||||
|  | -libXm_la_LIBADD = ${X_LIBS} ${X_XMU} -lXt -lXext ${LIB_XP} -lX11 ${X_EXTRA_LIBS}
 | ||||||
|  | +libXm_la_LIBADD = ${X_LIBS} ${X_XMU} -lXt -lXext ${LIB_XP} ${LIB_XINERAMA} -lX11 ${X_EXTRA_LIBS}
 | ||||||
|  |   | ||||||
|  |  noinst_HEADERS = BaseClassI.h \ | ||||||
|  |  BitmapsI.h \ | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										419
									
								
								SOURCES/0002-Xm-Display-Add-optional-Xinerama-support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										419
									
								
								SOURCES/0002-Xm-Display-Add-optional-Xinerama-support.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,419 @@ | |||||||
|  | From 011e62e69fb87e78a128487a043cc13b042bb8b5 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Wed, 20 Nov 2024 10:26:28 +0100 | ||||||
|  | Subject: [PATCH 2/7] Xm/Display: Add optional Xinerama support | ||||||
|  | 
 | ||||||
|  | Xinerama support is disabled by default, unless the Xresource | ||||||
|  | "enableXinerama" is set in the X resources database, e.g.: | ||||||
|  | 
 | ||||||
|  |   *enableXinerama: True | ||||||
|  | 
 | ||||||
|  | This also provides an additional private Screen API to get the monitor | ||||||
|  | boundaries given a point on screen. This is meant to be used in the | ||||||
|  | following commits to implement Xinerama awareness in the relevant | ||||||
|  | widgets. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  doc/man/man3/XmDisplay.3 |   2 + | ||||||
|  |  lib/Xm/Display.c         |  95 +++++++++++++++++++++++++++++ | ||||||
|  |  lib/Xm/DisplayP.h        |  18 ++++++ | ||||||
|  |  lib/Xm/Screen.c          | 128 +++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  lib/Xm/ScreenP.h         |   8 +++ | ||||||
|  |  lib/Xm/xmstring.list.in  |   2 + | ||||||
|  |  6 files changed, 253 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/doc/man/man3/XmDisplay.3 b/doc/man/man3/XmDisplay.3
 | ||||||
|  | index a57ea089..ec360c80 100644
 | ||||||
|  | --- a/doc/man/man3/XmDisplay.3
 | ||||||
|  | +++ b/doc/man/man3/XmDisplay.3
 | ||||||
|  | @@ -158,6 +158,8 @@ XmNnoRenditionCallbackXmCCallbackXtCallbackListNULLC
 | ||||||
|  |  _____ | ||||||
|  |  XmNuserDataXmCUserDataXtPointerNULLCSG | ||||||
|  |  _____ | ||||||
|  | +XmNenableXineramaXmCEnableXineramaBooleanFalseC
 | ||||||
|  | +_____
 | ||||||
|  |  .TE | ||||||
|  |  .IP "\fBXmNdefaultButtonEmphasis\fP" 10 | ||||||
|  |  Specifies whether to change the look of the PushButton widget and | ||||||
|  | diff --git a/lib/Xm/Display.c b/lib/Xm/Display.c
 | ||||||
|  | index 55fe4cd3..3ab047f2 100644
 | ||||||
|  | --- a/lib/Xm/Display.c
 | ||||||
|  | +++ b/lib/Xm/Display.c
 | ||||||
|  | @@ -35,6 +35,9 @@ static char rcsid[] = "$TOG: Display.c /main/23 1997/06/18 17:36:59 samborn $"
 | ||||||
|  |   | ||||||
|  |  #include <X11/Intrinsic.h> | ||||||
|  |  #include <X11/extensions/shape.h> | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +#include <X11/extensions/Xinerama.h>
 | ||||||
|  | +#endif
 | ||||||
|  |   | ||||||
|  |  #include <X11/Xatom.h> | ||||||
|  |  #include <Xm/AtomMgr.h> | ||||||
|  | @@ -273,6 +276,13 @@ static XtResource resources[] = {
 | ||||||
|  |  	XtOffsetOf(WMShellRec, wm.wm_hints.icon_pixmap),  | ||||||
|  |  	XmRImmediate, NULL | ||||||
|  |      },  | ||||||
|  | +    /* Xinerama support */
 | ||||||
|  | +    {
 | ||||||
|  | +	XmNenableXinerama, XmCEnableXinerama,
 | ||||||
|  | +	XmRBoolean, sizeof(Boolean),
 | ||||||
|  | +	Offset(display.enable_xinerama),
 | ||||||
|  | +	XmRImmediate, (XtPointer) False
 | ||||||
|  | +    },
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  #undef Offset | ||||||
|  | @@ -388,6 +398,45 @@ DisplayClassInitialize( void )
 | ||||||
|  |  		XmMakeCanonicalString("_MOTIF_DRAG_AND_DROP_MESSAGE"); | ||||||
|  |  }     | ||||||
|  |   | ||||||
|  | +static void
 | ||||||
|  | +DisplayInitializeXinerama( XmDisplay	xmDisplay )
 | ||||||
|  | +{
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    Display     *display = XtDisplay(xmDisplay);
 | ||||||
|  | +    int		dummy1, dummy2;
 | ||||||
|  | +    Status      have_xinerama;
 | ||||||
|  | +
 | ||||||
|  | +    xmDisplay->display.monitors = NULL;
 | ||||||
|  | +    xmDisplay->display.n_monitors = 0;
 | ||||||
|  | +
 | ||||||
|  | +    /* Xinerama support is disabled by default, unless XmNenableXinerama is set */
 | ||||||
|  | +    if (!xmDisplay->display.enable_xinerama) {
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +      printf("XINERAMA support not enabled\n");
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +      return;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    if (!XineramaQueryExtension(display, &dummy1, &dummy2)) {
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +      printf("XINERAMA extension not available\n");
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +      xmDisplay->display.enable_xinerama = False;
 | ||||||
|  | +      return;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    if (!XineramaIsActive(display)) {
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +      printf("XINERAMA extension not activated\n");
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +      xmDisplay->display.enable_xinerama = False;
 | ||||||
|  | +      return;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    _XmDisplayUpdateXinerama(xmDisplay);
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  /*ARGSUSED*/ | ||||||
|  |  static void  | ||||||
|  |  SetDragReceiverInfo( | ||||||
|  | @@ -553,6 +602,8 @@ DisplayInitialize(
 | ||||||
|  |  	  XmDRAG_PREFER_PREREGISTER; | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | +    DisplayInitializeXinerama(xmDisplay);
 | ||||||
|  | +
 | ||||||
|  |      _XmVirtKeysInitialize (new_widget); | ||||||
|  |   | ||||||
|  |      _XmProcessLock(); | ||||||
|  | @@ -672,6 +723,9 @@ DisplayDestroy(
 | ||||||
|  |   | ||||||
|  |      _XmVirtKeysDestroy (w); | ||||||
|  |   | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    XFree(dd->display.monitors);
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  |      XDeleteContext( XtDisplay( w), None, context) ; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -1225,3 +1279,44 @@ _XmSetThicknessDefault0(
 | ||||||
|  |  	value->addr = (XPointer)&thickness; | ||||||
|  |   | ||||||
|  |  } | ||||||
|  | +
 | ||||||
|  | +
 | ||||||
|  | +Boolean
 | ||||||
|  | +_XmDisplayUseXinerama(
 | ||||||
|  | +	XmDisplay xmDisplay )
 | ||||||
|  | +{
 | ||||||
|  | +    return xmDisplay && xmDisplay->display.enable_xinerama;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +
 | ||||||
|  | +void
 | ||||||
|  | +_XmDisplayUpdateXinerama(
 | ||||||
|  | +	XmDisplay xmDisplay )
 | ||||||
|  | +{
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +    int i;
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +
 | ||||||
|  | +    if (!_XmDisplayUseXinerama(xmDisplay))
 | ||||||
|  | +      return;
 | ||||||
|  | +
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +    printf("Updating XINERAMA configuration\n");
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +
 | ||||||
|  | +    if (xmDisplay->display.monitors)
 | ||||||
|  | +      XFree(xmDisplay->display.monitors);
 | ||||||
|  | +
 | ||||||
|  | +    xmDisplay->display.monitors =
 | ||||||
|  | +      XineramaQueryScreens (XtDisplay(xmDisplay), &xmDisplay->display.n_monitors);
 | ||||||
|  | +
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +    for (i = 0; i < xmDisplay->display.n_monitors; ++i) {
 | ||||||
|  | +      printf("XINERAMA Monitor %i: (%i,%i) [%ix%i]\n", i,
 | ||||||
|  | +              xmDisplay->display.monitors[i].x_org, xmDisplay->display.monitors[i].y_org,
 | ||||||
|  | +              xmDisplay->display.monitors[i].width, xmDisplay->display.monitors[i].height);
 | ||||||
|  | +    }
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  | +}
 | ||||||
|  | diff --git a/lib/Xm/DisplayP.h b/lib/Xm/DisplayP.h
 | ||||||
|  | index 655c29b6..a2420f96 100644
 | ||||||
|  | --- a/lib/Xm/DisplayP.h
 | ||||||
|  | +++ b/lib/Xm/DisplayP.h
 | ||||||
|  | @@ -23,6 +23,14 @@
 | ||||||
|  |  #ifndef _XmDisplayP_h | ||||||
|  |  #define _XmDisplayP_h | ||||||
|  |   | ||||||
|  | +#ifdef HAVE_CONFIG_H
 | ||||||
|  | +#include <config.h>
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +#include <X11/extensions/Xinerama.h>
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |  #include <Xm/DesktopP.h> | ||||||
|  |  #include <Xm/VendorSEP.h> | ||||||
|  |  #include <Xm/DropSMgr.h> | ||||||
|  | @@ -115,6 +123,11 @@ typedef struct {
 | ||||||
|  |      Boolean			enable_unselectable_drag; | ||||||
|  |      Boolean                     enable_thin_thickness; | ||||||
|  |      Boolean			enable_multi_key_bindings; | ||||||
|  | +    Boolean			enable_xinerama;
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    XineramaScreenInfo          *monitors;
 | ||||||
|  | +    int                         n_monitors;
 | ||||||
|  | +#endif
 | ||||||
|  |  } XmDisplayPart, *XmDisplayPartPtr; | ||||||
|  |   | ||||||
|  |  typedef struct _XmDisplayInfo { | ||||||
|  | @@ -143,6 +156,11 @@ externalref XmDisplayClassRec 	xmDisplayClassRec;
 | ||||||
|  |   | ||||||
|  |  externalref String _Xm_MOTIF_DRAG_AND_DROP_MESSAGE ; | ||||||
|  |   | ||||||
|  | +extern Boolean _XmDisplayUseXinerama(
 | ||||||
|  | +	XmDisplay xmDisplay ) ;
 | ||||||
|  | +
 | ||||||
|  | +extern void _XmDisplayUpdateXinerama(
 | ||||||
|  | +	XmDisplay xmDisplay ) ;
 | ||||||
|  |   | ||||||
|  |  #ifdef __cplusplus | ||||||
|  |  }  /* Close scope of 'extern "C"' declaration which encloses file. */ | ||||||
|  | diff --git a/lib/Xm/Screen.c b/lib/Xm/Screen.c
 | ||||||
|  | index 10ba8d2b..44abcfb3 100644
 | ||||||
|  | --- a/lib/Xm/Screen.c
 | ||||||
|  | +++ b/lib/Xm/Screen.c
 | ||||||
|  | @@ -396,7 +396,67 @@ GetUnitFromFont(
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |  } | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +/* ARGSUSED */
 | ||||||
|  | +static void
 | ||||||
|  | +StructureNotifyHandler(
 | ||||||
|  | +        Widget wid,
 | ||||||
|  | +        XtPointer data,
 | ||||||
|  | +        XEvent *event,
 | ||||||
|  | +        Boolean *cont )
 | ||||||
|  | +{
 | ||||||
|  | +    Display           *display = XtDisplay(wid);
 | ||||||
|  | +
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +    printf("Root event received\n");
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  |   | ||||||
|  | +    if (event->type == ConfigureNotify)
 | ||||||
|  | +        _XmDisplayUpdateXinerama((XmDisplay) XmGetXmDisplay(display)) ;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/* ARGSUSED */
 | ||||||
|  | +static void
 | ||||||
|  | +InstallStructureNotifyHandler(
 | ||||||
|  | +        XmScreen     xmScreen)
 | ||||||
|  | +{
 | ||||||
|  | +    Display           *display = XtDisplay(xmScreen);
 | ||||||
|  | +    Window            rootwindow;
 | ||||||
|  | +    XWindowAttributes rootattributes;
 | ||||||
|  | +
 | ||||||
|  | +    if (!_XmDisplayUseXinerama((XmDisplay) XmGetXmDisplay(display)))
 | ||||||
|  | +        return;
 | ||||||
|  | +
 | ||||||
|  | +    rootwindow = RootWindowOfScreen(XtScreen(xmScreen));
 | ||||||
|  | +    XGetWindowAttributes(display, rootwindow, &rootattributes);
 | ||||||
|  | +    XSelectInput(display,
 | ||||||
|  | +		 rootwindow,
 | ||||||
|  | +		 StructureNotifyMask | rootattributes.your_event_mask);
 | ||||||
|  | +    XtRegisterDrawable(display, rootwindow, (Widget)xmScreen);
 | ||||||
|  | +    XtAddEventHandler((Widget)xmScreen,
 | ||||||
|  | +                         (EventMask) StructureNotifyMask, True,
 | ||||||
|  | +			 StructureNotifyHandler, (XtPointer) NULL);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/* ARGSUSED */
 | ||||||
|  | +static void
 | ||||||
|  | +UninstallStructureNotifyHandler(
 | ||||||
|  | +        XmScreen     xmScreen)
 | ||||||
|  | +{
 | ||||||
|  | +    Display           *display = XtDisplay(xmScreen);
 | ||||||
|  | +    Window            rootwindow;
 | ||||||
|  | +    XWindowAttributes rootattributes;
 | ||||||
|  | +
 | ||||||
|  | +    if (!_XmDisplayUseXinerama((XmDisplay) XmGetXmDisplay(display)))
 | ||||||
|  | +        return;
 | ||||||
|  | +
 | ||||||
|  | +    rootwindow = RootWindowOfScreen(XtScreen(xmScreen));
 | ||||||
|  | +    XtUnregisterDrawable(display, rootwindow);
 | ||||||
|  | +    XtRemoveEventHandler((Widget)xmScreen,
 | ||||||
|  | +                         (EventMask) StructureNotifyMask, True,
 | ||||||
|  | +			 StructureNotifyHandler, (XtPointer) NULL);
 | ||||||
|  | +}
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  |   | ||||||
|  |  /************************************************************************ | ||||||
|  |   * | ||||||
|  | @@ -413,6 +473,8 @@ Initialize(
 | ||||||
|  |  { | ||||||
|  |      XmScreen     xmScreen = (XmScreen)new_widget; | ||||||
|  |      Display      *display = XtDisplay(new_widget); | ||||||
|  | +    Window       rootwindow;
 | ||||||
|  | +    XWindowAttributes rootattributes;
 | ||||||
|  |   | ||||||
|  |      xmScreen->screen.screenInfo = NULL; | ||||||
|  |   | ||||||
|  | @@ -474,6 +536,9 @@ Initialize(
 | ||||||
|  |      } | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    InstallStructureNotifyHandler(xmScreen);
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /************************************************************************ | ||||||
|  | @@ -672,6 +737,10 @@ Destroy(
 | ||||||
|  |   | ||||||
|  |      /* need to remove pixmap and GC related to this screen */ | ||||||
|  |      _XmCleanPixmapCache (XtScreen(widget), NULL); | ||||||
|  | +
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    UninstallStructureNotifyHandler(xmScreen);
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void  | ||||||
|  | @@ -1447,3 +1516,62 @@ XmGetXmScreen(
 | ||||||
|  |  	_XmAppUnlock(app); | ||||||
|  |  	return widget; | ||||||
|  |  } | ||||||
|  | +
 | ||||||
|  | +void
 | ||||||
|  | +_XmScreenGetBoundariesAtpoint(
 | ||||||
|  | +        Screen *screen,
 | ||||||
|  | +	Position pt_x,
 | ||||||
|  | +	Position pt_y,
 | ||||||
|  | +	Position *ret_x,
 | ||||||
|  | +	Position *ret_y,
 | ||||||
|  | +	Position *ret_max_x,
 | ||||||
|  | +	Position *ret_max_y )
 | ||||||
|  | +{
 | ||||||
|  | +    XmDisplay	xmDisplay;
 | ||||||
|  | +    Position screen_x, screen_y;
 | ||||||
|  | +    Position screen_max_x, screen_max_y;
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    Position tmp_x, tmp_y;
 | ||||||
|  | +    Position tmp_max_x, tmp_max_y;
 | ||||||
|  | +    int i;
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  | +
 | ||||||
|  | +    xmDisplay = (XmDisplay) XmGetXmDisplay(DisplayOfScreen(screen));
 | ||||||
|  | +    screen_x = 0;
 | ||||||
|  | +    screen_y = 0;
 | ||||||
|  | +    screen_max_x = WidthOfScreen(screen);
 | ||||||
|  | +    screen_max_y = HeightOfScreen(screen);
 | ||||||
|  | +
 | ||||||
|  | +    if (!_XmDisplayUseXinerama(xmDisplay))
 | ||||||
|  | +      goto out;
 | ||||||
|  | +
 | ||||||
|  | +#ifdef HAVE_LIBXINERAMA
 | ||||||
|  | +    for (i = 0; i < xmDisplay->display.n_monitors; ++i) {
 | ||||||
|  | +      tmp_x = xmDisplay->display.monitors[i].x_org;
 | ||||||
|  | +      tmp_y = xmDisplay->display.monitors[i].y_org;
 | ||||||
|  | +      tmp_max_x = tmp_x + xmDisplay->display.monitors[i].width;
 | ||||||
|  | +      tmp_max_y = tmp_y + xmDisplay->display.monitors[i].height;
 | ||||||
|  | +
 | ||||||
|  | +      if (pt_x >= tmp_x && pt_x < tmp_max_x && pt_y >= tmp_y && pt_y < tmp_max_y) {
 | ||||||
|  | +	screen_x = tmp_x;
 | ||||||
|  | +	screen_y = tmp_y;
 | ||||||
|  | +	screen_max_x = tmp_max_x;
 | ||||||
|  | +	screen_max_y = tmp_max_y;
 | ||||||
|  | +        break; /* We have a match */
 | ||||||
|  | +      }
 | ||||||
|  | +    }
 | ||||||
|  | +#endif /* HAVE_LIBXINERAMA */
 | ||||||
|  | +out:
 | ||||||
|  | +#ifdef DEBUG_XINERAMA
 | ||||||
|  | +    printf("Point (%i,%i) constrained within (%i,%i) and (%i,%i)\n",
 | ||||||
|  | +           pt_x, pt_y, screen_x, screen_y, screen_max_x, screen_max_y);
 | ||||||
|  | +#endif /* DEBUG_XINERAMA */
 | ||||||
|  | +    if (ret_x)
 | ||||||
|  | +      *ret_x = screen_x;
 | ||||||
|  | +    if (ret_y)
 | ||||||
|  | +      *ret_y = screen_y;
 | ||||||
|  | +    if (ret_max_x)
 | ||||||
|  | +      *ret_max_x = screen_max_x;
 | ||||||
|  | +    if (ret_max_y)
 | ||||||
|  | +      *ret_max_y = screen_max_y;
 | ||||||
|  | +}
 | ||||||
|  | diff --git a/lib/Xm/ScreenP.h b/lib/Xm/ScreenP.h
 | ||||||
|  | index c870c19e..b4b95a6f 100644
 | ||||||
|  | --- a/lib/Xm/ScreenP.h
 | ||||||
|  | +++ b/lib/Xm/ScreenP.h
 | ||||||
|  | @@ -134,6 +134,14 @@ typedef struct _XmScreenRec {
 | ||||||
|  |      XmScreenPart		screen; | ||||||
|  |  } XmScreenRec; | ||||||
|  |   | ||||||
|  | +extern void _XmScreenGetBoundariesAtpoint(
 | ||||||
|  | +        Screen *screen,
 | ||||||
|  | +	Position pt_x,
 | ||||||
|  | +	Position pt_y,
 | ||||||
|  | +	Position *ret_x,
 | ||||||
|  | +	Position *ret_y,
 | ||||||
|  | +	Position *ret_max_x,
 | ||||||
|  | +	Position *ret_max_y ) ;
 | ||||||
|  |   | ||||||
|  |  #ifdef __cplusplus | ||||||
|  |  }  /* Close scope of 'extern "C"' declaration which encloses file. */ | ||||||
|  | diff --git a/lib/Xm/xmstring.list.in b/lib/Xm/xmstring.list.in
 | ||||||
|  | index 8c0c4f9a..5887e7ad 100644
 | ||||||
|  | --- a/lib/Xm/xmstring.list.in
 | ||||||
|  | +++ b/lib/Xm/xmstring.list.in
 | ||||||
|  | @@ -1692,6 +1692,8 @@ CFontEncoding
 | ||||||
|  |  NxftFont | ||||||
|  |  CXftFont | ||||||
|  |  SUTF8_STRING | ||||||
|  | +NenableXinerama
 | ||||||
|  | +CEnableXinerama
 | ||||||
|  |   | ||||||
|  |  #file XmStrDefsI.h | ||||||
|  |  #table _XmStringsI | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										119
									
								
								SOURCES/0003-Xm-MenuShell-Use-Xinerama-to-place-menus.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								SOURCES/0003-Xm-MenuShell-Use-Xinerama-to-place-menus.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | |||||||
|  | From 10168aa7f16afb32e71d9e0a22fa8f90fb301bf4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Thu, 21 Nov 2024 11:52:22 +0100 | ||||||
|  | Subject: [PATCH 3/7] Xm/MenuShell: Use Xinerama to place menus | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  lib/Xm/MenuShell.c | 34 +++++++++++++++++----------------- | ||||||
|  |  1 file changed, 17 insertions(+), 17 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/lib/Xm/MenuShell.c b/lib/Xm/MenuShell.c
 | ||||||
|  | index 483cc95a..1dea4a54 100644
 | ||||||
|  | --- a/lib/Xm/MenuShell.c
 | ||||||
|  | +++ b/lib/Xm/MenuShell.c
 | ||||||
|  | @@ -41,6 +41,7 @@ static char rcsid[] = "$TOG: MenuShell.c /main/24 1999/07/08 16:49:59 vipin $"
 | ||||||
|  |  #include <Xm/LabelP.h> | ||||||
|  |  #include <Xm/LayoutT.h> | ||||||
|  |  #include <Xm/MenuT.h> | ||||||
|  | +#include <Xm/ScreenP.h>
 | ||||||
|  |  #include <Xm/SpecRenderT.h> | ||||||
|  |  #include <Xm/TraitP.h> | ||||||
|  |  #include <Xm/TransltnsP.h> | ||||||
|  | @@ -913,7 +914,7 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |          register Position *y ) | ||||||
|  |  { | ||||||
|  |     Position rightEdgeOfMenu, bottomEdgeOfMenu; | ||||||
|  | -   Dimension dispWidth, dispHeight;
 | ||||||
|  | +   Position dispX, dispY, dispMaxX, dispMaxY;
 | ||||||
|  |     Widget pulldown_button = RC_CascadeBtn(rowcol); | ||||||
|  |     Dimension RowColBorderWidth = rowcol->core.border_width << 1; | ||||||
|  |     Dimension CascadeBorderWidth = 0; | ||||||
|  | @@ -925,8 +926,7 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |   | ||||||
|  |     rightEdgeOfMenu = *x + RowColBorderWidth + rowcol->core.width; | ||||||
|  |     bottomEdgeOfMenu = *y + RowColBorderWidth + rowcol->core.height; | ||||||
|  | -   dispWidth = WidthOfScreen (XtScreen(rowcol));
 | ||||||
|  | -   dispHeight = HeightOfScreen (XtScreen(rowcol));
 | ||||||
|  | +   _XmScreenGetBoundariesAtpoint(XtScreen(rowcol), *x, *y, &dispX, &dispY, &dispMaxX, &dispMaxY);
 | ||||||
|  |   | ||||||
|  |     /* | ||||||
|  |      * For OPTION menus, if the submenu is [partially] offscreen, offset it | ||||||
|  | @@ -937,9 +937,9 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |         (RC_Type(XtParent(pulldown_button)) == XmMENU_OPTION)) | ||||||
|  |     { | ||||||
|  |        Position old_x = *x; | ||||||
|  | -      if (bottomEdgeOfMenu >= (Position)dispHeight)
 | ||||||
|  | +      if (bottomEdgeOfMenu >= dispMaxY)
 | ||||||
|  |        { | ||||||
|  | -          *y = dispHeight - rowcol->core.height - RowColBorderWidth - 1;
 | ||||||
|  | +          *y = dispMaxY - rowcol->core.height - RowColBorderWidth - 1;
 | ||||||
|  |            if (LayoutIsRtoLM(rowcol)) | ||||||
|  |               *x = old_x - rowcol->core.width - (rowcol->core.border_width <<1); | ||||||
|  |            else | ||||||
|  | @@ -948,9 +948,9 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |            bottomEdgeOfMenu = *y + RowColBorderWidth + rowcol->core.height; | ||||||
|  |        } | ||||||
|  |   | ||||||
|  | -      if (*y < 0)
 | ||||||
|  | +      if (*y < dispY)
 | ||||||
|  |        { | ||||||
|  | -          *y = 0;
 | ||||||
|  | +          *y = dispY;
 | ||||||
|  |   | ||||||
|  |  	  /* Consider CascadeBtn as well as RowCol width to allow multi | ||||||
|  |  	   * column RowColumn | ||||||
|  | @@ -963,13 +963,13 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |            bottomEdgeOfMenu = *y + RowColBorderWidth + rowcol->core.height; | ||||||
|  |        } | ||||||
|  |   | ||||||
|  | -      if (rightEdgeOfMenu >= (Position)dispWidth)
 | ||||||
|  | +      if (rightEdgeOfMenu >= dispMaxX)
 | ||||||
|  |        { | ||||||
|  |  	  *x = old_x - rowcol->core.width + RowColBorderWidth; | ||||||
|  |  	  rightEdgeOfMenu = *x + RowColBorderWidth + rowcol->core.width; | ||||||
|  |        } | ||||||
|  |   | ||||||
|  | -      if (*x < 0)
 | ||||||
|  | +      if (*x < dispX)
 | ||||||
|  |        { | ||||||
|  |            if (LayoutIsRtoLM(rowcol)) | ||||||
|  |               *x = old_x + pulldown_button->core.width + CascadeBorderWidth; | ||||||
|  | @@ -982,10 +982,10 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |     /* | ||||||
|  |      * If the submenu is offscreen force it completely on. | ||||||
|  |      */ | ||||||
|  | -   if (rightEdgeOfMenu >= (Position)dispWidth)
 | ||||||
|  | -       *x -= (rightEdgeOfMenu - dispWidth + 1);
 | ||||||
|  | +   if (rightEdgeOfMenu >= dispMaxX)
 | ||||||
|  | +       *x -= (rightEdgeOfMenu - dispMaxX + 1);
 | ||||||
|  |   | ||||||
|  | -   if (bottomEdgeOfMenu >= (Position)dispHeight)
 | ||||||
|  | +   if (bottomEdgeOfMenu >= dispMaxY)
 | ||||||
|  |     { | ||||||
|  |        if (pulldown_button && XtParent(pulldown_button) && | ||||||
|  |  	  (RC_Type(XtParent(pulldown_button)) == XmMENU_BAR)) | ||||||
|  | @@ -1005,15 +1005,15 @@ ForceMenuPaneOnScreen(
 | ||||||
|  |  	     *y = y_temp; | ||||||
|  |        } | ||||||
|  |        else | ||||||
|  | -	  *y -= (bottomEdgeOfMenu - dispHeight + 1);
 | ||||||
|  | +	  *y -= (bottomEdgeOfMenu - dispMaxY + 1);
 | ||||||
|  |     } | ||||||
|  |   | ||||||
|  |     /* Make sure that the top left corner os on screen! */ | ||||||
|  | -   if (*x < 0)
 | ||||||
|  | -       *x = 0;
 | ||||||
|  | +   if (*x < dispX)
 | ||||||
|  | +       *x = dispX;
 | ||||||
|  |   | ||||||
|  | -   if (*y < 0)
 | ||||||
|  | -       *y = 0;
 | ||||||
|  | +   if (*y < dispY)
 | ||||||
|  | +       *y = dispY;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										65
									
								
								SOURCES/0004-Xm-DropDown-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								SOURCES/0004-Xm-DropDown-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | |||||||
|  | From e21e7ffaa62df64be305326d24eca09c80129403 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Thu, 21 Nov 2024 14:11:11 +0100 | ||||||
|  | Subject: [PATCH 4/7] Xm/DropDown: Use Xinerama for placement | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  lib/Xm/DropDown.c | 18 +++++++++--------- | ||||||
|  |  1 file changed, 9 insertions(+), 9 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/lib/Xm/DropDown.c b/lib/Xm/DropDown.c
 | ||||||
|  | index a25d1092..665e0e26 100644
 | ||||||
|  | --- a/lib/Xm/DropDown.c
 | ||||||
|  | +++ b/lib/Xm/DropDown.c
 | ||||||
|  | @@ -13,7 +13,7 @@
 | ||||||
|  |  #include "XmI.h" | ||||||
|  |  #include <Xm/VaSimpleP.h> | ||||||
|  |  #include <Xm/DrawP.h> | ||||||
|  | -
 | ||||||
|  | +#include <Xm/ScreenP.h>
 | ||||||
|  |  #include <Xm/DropDownP.h> | ||||||
|  |   | ||||||
|  |  #include <X11/Shell.h> | ||||||
|  | @@ -2169,8 +2169,9 @@ PopupList(Widget w)
 | ||||||
|  |      XmDropDownWidget cbw = (XmDropDownWidget) w; | ||||||
|  |      Widget shell = XmDropDown_popup_shell(cbw); | ||||||
|  |      Position x, y, temp; | ||||||
|  | +    Position dispX, dispY, dispMaxX, dispMaxY;
 | ||||||
|  |      Dimension width; | ||||||
|  | -    int ret, scr_width, scr_height;
 | ||||||
|  | +    int ret;
 | ||||||
|  |      Arg args[10]; | ||||||
|  |      Cardinal num_args; | ||||||
|  |   | ||||||
|  | @@ -2209,21 +2210,20 @@ PopupList(Widget w)
 | ||||||
|  |       * | ||||||
|  |       * Lets start by getting the width and height of the screen. | ||||||
|  |       */ | ||||||
|  | -    scr_width = WidthOfScreen(XtScreen(shell));
 | ||||||
|  | -    scr_height = HeightOfScreen(XtScreen(shell));
 | ||||||
|  | +    _XmScreenGetBoundariesAtpoint(XtScreen(shell), x, y, &dispX, &dispY, &dispMaxX, &dispMaxY);
 | ||||||
|  |   | ||||||
|  | -    if( (int)(y + XtHeight(shell)) > scr_height )
 | ||||||
|  | +    if( (int)(y + XtHeight(shell)) > dispMaxY )
 | ||||||
|  |      { | ||||||
|  |  	Position tmp; | ||||||
|  |  	XtTranslateCoords(w, 0, 0, &tmp, &y); | ||||||
|  |  	y -= ((int)XtHeight(shell)); | ||||||
|  |      } | ||||||
|  | -    if( y < 0 ) y = 0;
 | ||||||
|  | -    if( (int)(x + width) > scr_width )
 | ||||||
|  | +    if( y < dispY ) y = dispY;
 | ||||||
|  | +    if( (int)(x + width) > dispMaxX )
 | ||||||
|  |      { | ||||||
|  | -	x = scr_width - ((int)width);
 | ||||||
|  | +	x = dispMaxX - ((int)width);
 | ||||||
|  |      } | ||||||
|  | -    if( x < 0 ) x = 0;
 | ||||||
|  | +    if( x < dispX ) x = dispX;
 | ||||||
|  |   | ||||||
|  |      XtSetArg(args[num_args], XmNx, x); num_args++; | ||||||
|  |      XtSetArg(args[num_args], XmNy, y); num_args++; | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										70
									
								
								SOURCES/0005-Xm-RCMenu-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								SOURCES/0005-Xm-RCMenu-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | From d97abbe6cf64a8bb0e331725c36caf5e0ac37b0f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Thu, 21 Nov 2024 14:17:21 +0100 | ||||||
|  | Subject: [PATCH 5/7] Xm/RCMenu: Use Xinerama for placement | ||||||
|  | 
 | ||||||
|  | Please note that when building with Xinerama enabled, the placement | ||||||
|  | logic changes, as the original location of the CascadeButton is not | ||||||
|  | taken into account when relocating the RCMenu widget. | ||||||
|  | 
 | ||||||
|  | Reason for that is because I reckon the current code is not correct, as | ||||||
|  | it moves the RCMenu way off the screen, yet it doesn't show without | ||||||
|  | Xinerama because there is another check later to make sure the widget | ||||||
|  | remains on the overall screen, hence hiding the problem. | ||||||
|  | 
 | ||||||
|  | With Xinerama, that breaks in-between monitors and the RCMenu ends up | ||||||
|  | completely misplaced, which is why I think the code was wrong, yet the | ||||||
|  | logic is preserved when building without XINERAMA support to preserve | ||||||
|  | the current behavior if needed. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  lib/Xm/RCMenu.c | 18 ++++++++++++++---- | ||||||
|  |  1 file changed, 14 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/lib/Xm/RCMenu.c b/lib/Xm/RCMenu.c
 | ||||||
|  | index 2c698d4f..abd7a70e 100644
 | ||||||
|  | --- a/lib/Xm/RCMenu.c
 | ||||||
|  | +++ b/lib/Xm/RCMenu.c
 | ||||||
|  | @@ -537,6 +537,7 @@ LocatePulldown(
 | ||||||
|  |          XEvent *event ) | ||||||
|  |  {    | ||||||
|  |      Position x, y, x1, y1; | ||||||
|  | +    Position dispX, dispMaxX;
 | ||||||
|  |   | ||||||
|  |      if (root == NULL)  | ||||||
|  |        return; | ||||||
|  | @@ -617,17 +618,26 @@ LocatePulldown(
 | ||||||
|  |       * window co-ords. | ||||||
|  |       */ | ||||||
|  |      XtTranslateCoords( (Widget) p, x, y, &x1, &y1); | ||||||
|  | +    _XmScreenGetBoundariesAtpoint(XtScreen(m), x1, y1, &dispX, NULL, &dispMaxX, NULL);
 | ||||||
|  |   | ||||||
|  |      /* Oh no!  we're going off screen.  Let's try and do  | ||||||
|  |         something reasonable.  We're only doing the cascade | ||||||
|  |         off a menu case for now.  (CR 6421) */ | ||||||
|  | -    if ((x1 + XtWidth(m)) > WidthOfScreen(XtScreen(m))) {
 | ||||||
|  | +    if ((x1 + XtWidth(m)) > dispMaxX) {
 | ||||||
|  |        if (!IsOption(root) && (XmIsCascadeButton(p) || XmIsCascadeButtonGadget(p))) { | ||||||
|  | -	x1 -= XtWidth(m) + x - XtX(p);
 | ||||||
|  | +	x1 -= XtWidth(m) + x;
 | ||||||
|  | +#ifndef HAVE_LIBXINERAMA
 | ||||||
|  | +	/* XXX: I don't think it's correct, but that's what the original code was doing… */
 | ||||||
|  | +	x1 -= XtX(p);
 | ||||||
|  | +#endif /* not HAVE_LIBXINERAMA */
 | ||||||
|  |        } | ||||||
|  | -    } else if (x1 < 0) { /* R to L case */
 | ||||||
|  | +    } else if (x1 < dispX) { /* R to L case */
 | ||||||
|  |        if (!IsOption(root) && (XmIsCascadeButton(p) || XmIsCascadeButtonGadget(p))) { | ||||||
|  | -	x1 += XtWidth(m) + x - XtX(p);
 | ||||||
|  | +	x1 += XtWidth(m) + x;
 | ||||||
|  | +#ifndef HAVE_LIBXINERAMA
 | ||||||
|  | +	/* XXX: I don't think it's correct, but that's what the original code was doing… */
 | ||||||
|  | +	x1 -= XtX(p);
 | ||||||
|  | +#endif /* not HAVE_LIBXINERAMA */
 | ||||||
|  |        } | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										53
									
								
								SOURCES/0006-Xm-Tooltip-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								SOURCES/0006-Xm-Tooltip-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | From af453aebd8e53a32369c792cf8d0e641b2b3a834 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Thu, 21 Nov 2024 14:24:30 +0100 | ||||||
|  | Subject: [PATCH 6/7] Xm/Tooltip: Use Xinerama for placement | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  lib/Xm/ToolTip.c | 13 +++++++++---- | ||||||
|  |  1 file changed, 9 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/lib/Xm/ToolTip.c b/lib/Xm/ToolTip.c
 | ||||||
|  | index dc65071d..fdd32221 100644
 | ||||||
|  | --- a/lib/Xm/ToolTip.c
 | ||||||
|  | +++ b/lib/Xm/ToolTip.c
 | ||||||
|  | @@ -29,6 +29,7 @@
 | ||||||
|  |  #include <Xm/VendorSEP.h> | ||||||
|  |  #include <Xm/GadgetP.h> | ||||||
|  |  #include <Xm/SlideC.h> | ||||||
|  | +#include <Xm/ScreenP.h>
 | ||||||
|  |  #include <Xm/TraitP.h> | ||||||
|  |  #include <Xm/ToolTipCT.h> | ||||||
|  |  #include <Xm/ToolTipT.h> | ||||||
|  | @@ -153,6 +154,8 @@ ToolTipPost (XtPointer client_data,
 | ||||||
|  |     XtWidgetGeometry geo; | ||||||
|  |     Position destX, | ||||||
|  |       destY; | ||||||
|  | +   Position dispMaxX,
 | ||||||
|  | +     dispMaxY;
 | ||||||
|  |   | ||||||
|  |     XmToolTipConfigTrait ttp; /* ToolTip pointer */ | ||||||
|  |   | ||||||
|  | @@ -197,12 +200,14 @@ ToolTipPost (XtPointer client_data,
 | ||||||
|  |        Don't let the tip be off the right/bottom of the screen | ||||||
|  |      */ | ||||||
|  |     destX = rx + (XmIsGadget (w) ? XtX (w) : 0) - x + XtWidth (w) / 2; | ||||||
|  | -   if (destX + geo.width > WidthOfScreen (XtScreen (w)))
 | ||||||
|  | +   destY = ry + (XmIsGadget (w) ? XtY (w) : 0) - y + XtHeight (w);
 | ||||||
|  | +   _XmScreenGetBoundariesAtpoint(XtScreen(w), destX, destY, NULL, NULL, &dispMaxX, &dispMaxY);
 | ||||||
|  | +
 | ||||||
|  | +   if (destX + geo.width > dispMaxX)
 | ||||||
|  |     { | ||||||
|  | -      destX = WidthOfScreen (XtScreen (w)) - geo.width;
 | ||||||
|  | +      destX = dispMaxX - geo.width;
 | ||||||
|  |     } | ||||||
|  | -   destY = ry + (XmIsGadget (w) ? XtY (w) : 0) - y + XtHeight (w);
 | ||||||
|  | -   if (destY + geo.height > HeightOfScreen (XtScreen (w)))
 | ||||||
|  | +   if (destY + geo.height > dispMaxY)
 | ||||||
|  |     { | ||||||
|  |        destY = ry + (XmIsGadget (w) ? XtY (w) : 0) - y - geo.height; | ||||||
|  |     } | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
							
								
								
									
										51
									
								
								SOURCES/0007-Xm-ComboBox-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								SOURCES/0007-Xm-ComboBox-Use-Xinerama-for-placement.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | From 8a026c2d1e94ab2a33a1bec55d703b229ce9daf7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | Date: Thu, 21 Nov 2024 14:30:23 +0100 | ||||||
|  | Subject: [PATCH 7/7] Xm/ComboBox: Use Xinerama for placement | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> | ||||||
|  | ---
 | ||||||
|  |  lib/Xm/ComboBox.c | 11 +++++++---- | ||||||
|  |  1 file changed, 7 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/lib/Xm/ComboBox.c b/lib/Xm/ComboBox.c
 | ||||||
|  | index 1472e458..0f49de50 100644
 | ||||||
|  | --- a/lib/Xm/ComboBox.c
 | ||||||
|  | +++ b/lib/Xm/ComboBox.c
 | ||||||
|  | @@ -43,6 +43,7 @@
 | ||||||
|  |  #include <Xm/DisplayP.h> | ||||||
|  |  #include <Xm/DrawP.h> | ||||||
|  |  #include <Xm/GrabShellP.h> | ||||||
|  | +#include <Xm/ScreenP.h>
 | ||||||
|  |  #include <Xm/List.h> | ||||||
|  |  #include <Xm/TextF.h> | ||||||
|  |  #include <Xm/TraitP.h> | ||||||
|  | @@ -1791,6 +1792,7 @@ CBDropDownList(Widget    widget,
 | ||||||
|  |  	  Cardinal n; | ||||||
|  |  	  int tmp; | ||||||
|  |  	  Position root_x, root_y, shell_x, shell_y; | ||||||
|  | +	  Position dispX, dispY, dispMaxX, dispMaxY;
 | ||||||
|  |  	  Dimension shell_width; | ||||||
|  |   | ||||||
|  |  	  XtTranslateCoords((Widget)cb, XtX(cb), XtY(cb), &root_x, &root_y); | ||||||
|  | @@ -1801,12 +1803,13 @@ CBDropDownList(Widget    widget,
 | ||||||
|  |  	    XtY(cb);  | ||||||
|  |  	 | ||||||
|  |  	  /* Try to position the shell on the screen. */ | ||||||
|  | -	  tmp = WidthOfScreen(XtScreen(cb)) - XtWidth(CB_ListShell(cb));
 | ||||||
|  | +	  _XmScreenGetBoundariesAtpoint(XtScreen(cb), shell_x, shell_y, &dispX, &dispY, &dispMaxX, &dispMaxY);
 | ||||||
|  | +	  tmp = dispMaxX - XtWidth(CB_ListShell(cb));
 | ||||||
|  |  	  tmp = MIN(tmp, shell_x); | ||||||
|  | -	  shell_x = MAX(0, tmp);
 | ||||||
|  | -	  tmp = HeightOfScreen(XtScreen(cb)) - XtHeight(CB_ListShell(cb));
 | ||||||
|  | +	  shell_x = MAX(dispX, tmp);
 | ||||||
|  | +	  tmp = dispMaxY - XtHeight(CB_ListShell(cb));
 | ||||||
|  |  	  tmp = MIN(tmp, shell_y); | ||||||
|  | -	  shell_y = MAX(0, tmp);
 | ||||||
|  | +	  shell_y = MAX(dispY, tmp);
 | ||||||
|  |   | ||||||
|  |  	  /* CR 8446: The shell width may have changed unexpectedly. */ | ||||||
|  |  	  shell_width = XtWidth(cb) - 2 * CB_HighlightThickness(cb); | ||||||
|  | -- 
 | ||||||
|  | 2.47.1 | ||||||
|  | 
 | ||||||
| @ -1,7 +1,7 @@ | |||||||
| Summary: Run-time libraries and programs | Summary: Run-time libraries and programs | ||||||
| Name: motif | Name: motif | ||||||
| Version: 2.3.4 | Version: 2.3.4 | ||||||
| Release: 28%{?dist} | Release: 29%{?dist} | ||||||
| License: LGPLv2+ | License: LGPLv2+ | ||||||
| Source: http://downloads.sf.net/motif/motif-%{version}-src.tgz | Source: http://downloads.sf.net/motif/motif-%{version}-src.tgz | ||||||
| Source1: xmbind | Source1: xmbind | ||||||
| @ -22,6 +22,7 @@ BuildRequires: libjpeg-devel libpng-devel | |||||||
| BuildRequires: libXft-devel libXmu-devel libXp-devel libXt-devel libXext-devel | BuildRequires: libXft-devel libXmu-devel libXp-devel libXt-devel libXext-devel | ||||||
| BuildRequires: xorg-x11-xbitmaps | BuildRequires: xorg-x11-xbitmaps | ||||||
| BuildRequires: perl-interpreter | BuildRequires: perl-interpreter | ||||||
|  | BuildRequires: pkgconfig(xinerama) | ||||||
| 
 | 
 | ||||||
| Patch22: motif-2.3.4-no_demos.patch | Patch22: motif-2.3.4-no_demos.patch | ||||||
| Patch23: openMotif-2.2.3-uil_lib.patch | Patch23: openMotif-2.2.3-uil_lib.patch | ||||||
| @ -46,6 +47,16 @@ Patch56: 0001-Fix-CVE-2023-43788-Out-of-bounds-read-in-XpmCreateXp.patch | |||||||
| # CVE-2023-43789 | # CVE-2023-43789 | ||||||
| Patch57: 0001-Fix-CVE-2023-43789-Out-of-bounds-read-on-XPM-with-co.patch | Patch57: 0001-Fix-CVE-2023-43789-Out-of-bounds-read-on-XPM-with-co.patch | ||||||
| 
 | 
 | ||||||
|  | # https://issues.redhat.com/browse/RHEL-69956 | ||||||
|  | Patch58: 0001-build-Check-for-Xinerama-availability.patch | ||||||
|  | Patch59: 0002-Xm-Display-Add-optional-Xinerama-support.patch | ||||||
|  | Patch60: 0003-Xm-MenuShell-Use-Xinerama-to-place-menus.patch | ||||||
|  | Patch61: 0004-Xm-DropDown-Use-Xinerama-for-placement.patch | ||||||
|  | Patch62: 0005-Xm-RCMenu-Use-Xinerama-for-placement.patch | ||||||
|  | Patch63: 0006-Xm-Tooltip-Use-Xinerama-for-placement.patch | ||||||
|  | Patch64: 0007-Xm-ComboBox-Use-Xinerama-for-placement.patch | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| Conflicts: lesstif <= 0.92.32-6 | Conflicts: lesstif <= 0.92.32-6 | ||||||
| 
 | 
 | ||||||
| %description | %description | ||||||
| @ -93,6 +104,13 @@ This package contains the static Motif libraries. | |||||||
| %patch55 -p1 -b .long_bit | %patch55 -p1 -b .long_bit | ||||||
| %patch56 -p1 -b .cve-2023-43788 | %patch56 -p1 -b .cve-2023-43788 | ||||||
| %patch57 -p1 -b .cve-2023-43789 | %patch57 -p1 -b .cve-2023-43789 | ||||||
|  | %patch58 -p1 -b .xinerama | ||||||
|  | %patch59 -p1 -b .xinerama | ||||||
|  | %patch60 -p1 -b .xinerama | ||||||
|  | %patch61 -p1 -b .xinerama | ||||||
|  | %patch62 -p1 -b .xinerama | ||||||
|  | %patch63 -p1 -b .xinerama | ||||||
|  | %patch64 -p1 -b .xinerama | ||||||
| 
 | 
 | ||||||
| %build | %build | ||||||
| ./autogen.sh | ./autogen.sh | ||||||
| @ -142,6 +160,9 @@ rm -f %{buildroot}%{_libdir}/*.la | |||||||
| %{_libdir}/lib*.a | %{_libdir}/lib*.a | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Mon Nov 25 2024 Olivier Fourdan <ofourdan@redhat.com> - 2.3.4-29 | ||||||
|  | - Add Xinerama support (RHEL-69956) | ||||||
|  | 
 | ||||||
| * Mon Nov 27 2023 José Expósito <jexposit@redhat.com> - 2.3.4-28 | * Mon Nov 27 2023 José Expósito <jexposit@redhat.com> - 2.3.4-28 | ||||||
| - Fix CVE-2023-43788: out of bounds read in XpmCreateXpmImageFromBuffer() | - Fix CVE-2023-43788: out of bounds read in XpmCreateXpmImageFromBuffer() | ||||||
| - Fix CVE-2023-43789: out of bounds read on XPM with corrupted colormap | - Fix CVE-2023-43789: out of bounds read on XPM with corrupted colormap | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user