Commit 78651dab authored by Leo's avatar Leo Committed by Francesco Colista

main/motif: upgrade to 2.3.8

parent 254dbc9f
Description: Update build system to satisfy latest automake/autoconf
This is part of the patch submitted by Adam Sampson,
so we can build without having to provide AUTHORS and NEWS files
.
Adam licensed his patch under MIT license (whatever that means ;) )
Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1571
Author: Adam Sampson <ats-motif@offog.org>
Author: Graham Inggs <graham@nerve.org.za>
Last-Update: 2012-12-25
--- a/configure.ac
+++ b/configure.ac
@@ -1,8 +1,13 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT
+AC_PREREQ(2.59)
+AC_INIT([motif], [2.3.4])
AC_CONFIG_SRCDIR([lib/Xm/Form.c])
-AC_PREREQ(2.52)
AC_CONFIG_AUX_DIR(.)
+AC_CANONICAL_TARGET
+
+AM_INIT_AUTOMAKE([foreign no-define])
+dnl AM_MAINTAINER_MODE
+
AC_CHECK_FILE(/usr/X/include/X11/X.h,
AC_PREFIX_DEFAULT(/usr/X),
AC_PREFIX_DEFAULT(/usr))
@@ -10,9 +15,6 @@
AC_PREFIX_DEFAULT(/usr/X11R6),
AC_PREFIX_DEFAULT(/usr))
-dnl AM_MAINTAINER_MODE
-AC_CANONICAL_TARGET
-
dnl The version of the Motif libraries
CURRENT=4
REVISION=4
@@ -21,9 +23,6 @@
AC_SUBST(REVISION)
AC_SUBST(AGE)
-dnl This is really dumb but it seems to be bug
-AM_INIT_AUTOMAKE(motif,2.3.4,no-define)
-
LIBTOOL_VERSION=$CURRENT:$REVISION:$AGE
dnl
Description: Fix buffer overrun in libXm (FontS.c)
Origin: upstream commit dada5ff7f93cb48afaec2469f5dde24178d8d6da
Bug: http://bugs.motifzone.net/show_bug.cgi?id=1568
Author: Arthur Haas <ahaas@impactweather.com>
Author: Graham Inggs <graham@nerve.org.za>
Last-Update: 2013-02-19
--- a/lib/Xm/FontS.c
+++ b/lib/Xm/FontS.c
@@ -1879,7 +1879,7 @@
String params[1];
Cardinal num = 1;
- params[1] = new_font;
+ params[0] = new_font;
dbg(); _XmWarningMsg((Widget) fsw, XmNbadXlfdFont,
XmNbadXlfdFontMsg, params, num);
}
Description: Fix ac_find_xft.m4
ac_find_xft.m4 fails tests required to enable building with Xft anti-aliased fonts.
We also need to add -lfontconfig to LIBS to prevent underlinking of libXm.
.
This patch fixes these. Build-depends on libfontconfig1-dev, libfreetype6-dev and
libxrender-dev can be dropped as they are all dependencies of libxft-dev.
Author: Graham Inggs <graham@nerve.org.za>
Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1591
Last-Update: 2013-03-13
--- a/ac_find_xft.m4
+++ b/ac_find_xft.m4
@@ -54,28 +54,28 @@
case "$freetype_lib" in
no)
- freetype_lib=""
+ FREETYPE_LIBS=""
;;
yes)
case "$ft_config" in
no)
- freetype_lib=""
+ FREETYPE_LIBS="-lfreetype"
;;
*)
- freetype_lib="`$ft_config --libs`"
+ FREETYPE_LIBS="`$ft_config --libs`"
;;
esac
;;
*)
- freetype_lib="-L$freetype_lib -lfreetype"
+ FREETYPE_LIBS="-L$freetype_lib -lfreetype"
;;
esac
saved_LIBS="$LIBS"
-LIBS="$LIBS $freetype_lib"
+LIBS="$LIBS $FREETYPE_LIBS"
saved_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS"
-AC_CHECK_HEADERS(freetype/freetype.h)
+AC_CHECK_HEADERS(freetype/freetype.h,,,[#include <ft2build.h>])
FINDXFT_HAVE_FREETYPE="no"
case "$ac_cv_header_freetype_freetype_h" in
@@ -94,6 +94,7 @@
FINDXFT_HAVE_FREETYPE="yes"
AC_DEFINE(HAVE_FREETYPE, 1, Means we have discovered the FreeType library)
AC_SUBST(FREETYPE_CFLAGS)
+ AC_SUBST(FREETYPE_LIBS)
;;
esac
;;
@@ -134,8 +135,19 @@
FINDXFT_HAVE_XRENDER="no"
case "$have_x" in
yes)
- XRENDER_CFLAGS="-I$x_includes"
- XRENDER_LIBS="-L$x_libraries -lXft -lXrender"
+ if test x$x_includes = x
+ then
+ XRENDER_CFLAGS=""
+ else
+ XRENDER_CFLAGS="-I$x_includes"
+ fi
+
+ if test x$x_libraries = x
+ then
+ XRENDER_LIBS="-lXft -lXrender"
+ else
+ XRENDER_LIBS="-I$x_libraries -lXft -lXrender"
+ fi
saved_LIBS="$LIBS"
LIBS="$LIBS $XRENDER_LIBS"
@@ -203,12 +215,12 @@
case "$fontconfig_lib" in
no)
- fontconfig_lib=""
+ FONTCONFIG_LIBS=""
;;
yes)
case "$fc_config" in
no)
- fontconfig_lib=""
+ FONTCONFIG_LIBS="-lfontconfig"
;;
*)
FONTCONFIG_LIBS="`$fc_config --libs`"
Description: Updated fix for upstream bug #1565
This patch fixes the problem introduced by fix #1565, included in
Motif 2.3.4, which breaks keyboard navigation in menus.
Author: Olexiy Chernyavskyy <ochern@ics.com>
Origin: upstream, http://bugs.motifzone.net/show_bug.cgi?id=1565
Bug: http://bugs.motifzone.net/show_bug.cgi?id=1630
Bug-Debian: http://bugs.debian.org/730026
Last-Update: 2013-11-29
--- a/lib/Xm/ComboBox.c
+++ b/lib/Xm/ComboBox.c
@@ -3164,6 +3164,9 @@
Arg args[4];
ArgList merged_args;
Cardinal n;
+#ifdef FIX_1565
+ XmGrabShellWidget grabsh;
+#endif
n = 0;
XtSetArg(args[n], XmNlayoutDirection, LayoutM(parent)), n++;
@@ -3175,6 +3178,11 @@
merged_args, n + *num_args);
XtFree((char*)merged_args);
+#ifdef FIX_1565
+ grabsh = (XmGrabShellWidget) shell;
+ grabsh->grab_shell.set_input_focus = False;
+#endif
+
return shell;
}
--- a/lib/Xm/DropDown.c
+++ b/lib/Xm/DropDown.c
@@ -2027,6 +2027,9 @@
Arg *new_list, largs[10];
Cardinal num_largs;
Widget sb;
+#ifdef FIX_1565
+ XmGrabShellWidget grabsh;
+#endif
num_largs = 0;
XtSetArg(largs[num_largs], XmNoverrideRedirect, True); num_largs++;
@@ -2040,6 +2043,10 @@
xmGrabShellWidgetClass, w,
new_list,
num_largs + num_args);
+#ifdef FIX_1565
+ grabsh = (XmGrabShellWidget) XmDropDown_popup_shell(cbw);
+ grabsh->grab_shell.set_input_focus = False;
+#endif
XtFree((char *) new_list);
#ifdef FIX_1446
--- a/lib/Xm/GrabShell.c
+++ b/lib/Xm/GrabShell.c
@@ -283,6 +283,10 @@
/* CR 9920: Popdown may be requested before MapNotify. */
grabsh->grab_shell.mapped = False;
+
+#ifdef FIX_1565
+ grabsh->grab_shell.set_input_focus = True;
+#endif
}
/*
@@ -395,8 +399,16 @@
XGetInputFocus(XtDisplay(shell), &grabshell->grab_shell.old_focus,
&grabshell->grab_shell.old_revert_to);
old_handler = XSetErrorHandler(IgnoreXErrors);
- XSetInputFocus(XtDisplay(shell), XtWindow(shell), RevertToParent, time);
- XSync(XtDisplay(shell), False);
+#ifdef FIX_1565
+ if (! grabshell->grab_shell.set_input_focus) {
+ XmForceGrabKeyboard(shell, time);
+ } else {
+#endif
+ XSetInputFocus(XtDisplay(shell), XtWindow(shell), RevertToParent, time);
+ XSync(XtDisplay(shell), False);
+#ifdef FIX_1565
+ }
+#endif
XSetErrorHandler(old_handler);
}
--- a/lib/Xm/GrabShellP.h
+++ b/lib/Xm/GrabShellP.h
@@ -30,6 +30,7 @@
#include <Xm/GrabShell.h>
#include <Xm/XmP.h>
#include <X11/ShellP.h>
+#include "XmI.h"
#ifdef __cplusplus
extern "C" {
@@ -55,6 +56,9 @@
Boolean mapped;
Window old_focus;
int old_revert_to;
+#ifdef FIX_1565
+ Boolean set_input_focus;
+#endif
} XmGrabShellPart;
--- a/lib/Xm/MenuShell.c
+++ b/lib/Xm/MenuShell.c
@@ -1514,9 +1514,7 @@
/** the real grab ***/
_XmMenuGrabKeyboardAndPointer((Widget)rowcol, _time);
-#ifndef FIX_1565
_XmMenuFocus(XtParent(rowcol), XmMENU_BEGIN, _time);
-#endif
/* To support menu replay, keep the pointer in sync mode */
XAllowEvents(XtDisplay(rowcol), SyncPointer, CurrentTime);
--- a/lib/Xm/MenuUtil.c
+++ b/lib/Xm/MenuUtil.c
@@ -1053,11 +1053,7 @@
register int status =
(_XmGrabKeyboard(widget,
-#ifdef FIX_1565
- False,
-#else
True,
-#endif
GrabModeSync,
GrabModeAsync,
time) != GrabSuccess);
--- a/lib/Xm/RCMenu.c
+++ b/lib/Xm/RCMenu.c
@@ -85,6 +85,9 @@
#include "TraversalI.h"
#include "UniqueEvnI.h"
#include "VendorSI.h"
+#ifdef FIX_1565
+#include <Xm/GrabShell.h>
+#endif
#define FIX_1535
@@ -943,6 +946,13 @@
XmMenuState mst = _XmGetMenuState((Widget)w);
Window tmpWindow;
int tmpRevert;
+#ifdef FIX_1565
+ Widget shell;
+
+ shell = w;
+ while (! XtIsSubclass(shell, shellWidgetClass))
+ shell = XtParent(shell);
+#endif
if (_time == CurrentTime)
_time = XtLastTimestampProcessed(XtDisplay(w));
@@ -983,6 +993,11 @@
shell.popped_up))
**/
{
+#ifdef FIX_1565
+ if (XtIsSubclass(shell, xmGrabShellWidgetClass) || XtIsSubclass(shell, xmMenuShellWidgetClass))
+ XmForceGrabKeyboard(w, _time);
+ else
+#endif
SetInputFocus(XtDisplay(w), mst->RC_menuFocus.oldFocus,
mst->RC_menuFocus.oldRevert,
mst->RC_menuFocus.oldTime);
@@ -996,6 +1011,11 @@
*/
else
{
+#ifdef FIX_1565
+ if (XtIsSubclass(shell, xmGrabShellWidgetClass) || XtIsSubclass(shell, xmMenuShellWidgetClass))
+ XmForceGrabKeyboard(w, _time);
+ else
+#endif
SetInputFocus(XtDisplay(w), mst->RC_menuFocus.oldFocus,
mst->RC_menuFocus.oldRevert,
mst->RC_menuFocus.oldTime);
@@ -1014,6 +1034,11 @@
RC_menuFocus.oldFocus);
mst->RC_menuFocus.oldTime = _time - 1;
+#ifdef FIX_1565
+ if (XtIsSubclass(shell, xmGrabShellWidgetClass) || XtIsSubclass(shell, xmMenuShellWidgetClass))
+ XmForceGrabKeyboard(w, _time);
+ else
+#endif
SetInputFocus(XtDisplay(w), XtWindow(w), mst->RC_menuFocus.oldRevert,
mst->RC_menuFocus.oldTime);
@@ -1027,6 +1052,11 @@
XGetInputFocus(XtDisplay(w), &tmpWindow, &tmpRevert);
if (tmpWindow != XtWindow(w))
{
+#ifdef FIX_1565
+ if (XtIsSubclass(shell, xmGrabShellWidgetClass) || XtIsSubclass(shell, xmMenuShellWidgetClass))
+ XmForceGrabKeyboard(w, _time);
+ else
+#endif
SetInputFocus(XtDisplay(w), XtWindow(w), tmpRevert, _time);
mst->RC_menuFocus.oldRevert = tmpRevert;
@@ -1048,6 +1078,11 @@
break;
case XmMENU_MIDDLE:
+#ifdef FIX_1565
+ if (XtIsSubclass(shell, xmGrabShellWidgetClass) || XtIsSubclass(shell, xmMenuShellWidgetClass))
+ XmForceGrabKeyboard(w, _time);
+ else
+#endif
SetInputFocus(XtDisplay(w), XtWindow(w),
mst->RC_menuFocus.oldRevert,
mst->RC_menuFocus.oldTime);
@@ -1062,6 +1097,11 @@
if ((tmpWindow != XtWindow(w)) &&
(_time > mst->RC_menuFocus.oldTime))
{
+#ifdef FIX_1565
+ if (XtIsSubclass(shell, xmGrabShellWidgetClass) || XtIsSubclass(shell, xmMenuShellWidgetClass))
+ XmForceGrabKeyboard(w, _time);
+ else
+#endif
SetInputFocus(XtDisplay(w), XtWindow(w), tmpRevert, _time);
mst->RC_menuFocus.oldRevert = tmpRevert;
--- a/lib/Xm/Xm.c
+++ b/lib/Xm/Xm.c
@@ -40,6 +40,10 @@
#ifdef FIX_345
#include <X11/keysym.h>
#endif
+#ifdef FIX_1565
+#include <Xm/GrabShell.h>
+#include <Xm/MenuShell.h>
+#endif
/**************************************************************************
@@ -530,3 +534,173 @@
return p;
}
#endif
+
+#ifdef FIX_1565
+
+typedef struct _GrabData GrabData;
+struct _GrabData {
+ Widget w;
+ GrabData *next;
+};
+
+static void _XmSendFocusEvent(Widget child, int type);
+static void _XmStartDispatcher(Display *display);
+static Boolean _XmEventDispatcher(XEvent *event);
+static void UnmapHandler(Widget w, XtPointer client_data, XEvent *event, Boolean *cont);
+static Boolean _UngrabKeyboard(Widget w);
+
+static GrabData *grabw_top = NULL;
+static int xm_dispatcher_on = 0;
+static XtEventDispatchProc saved_dispatcher_proc = NULL;
+static XtEventDispatchProc xt_dispatcher_proc = NULL;
+
+/*
+ XmForceGrabKeyboard function is defined to be a substitutor of XSetInputFocus calls
+ for popup and pulldown menus that should grab keyboard focus yet main window at the
+ same time should visually stay in focus for window manager. This resolves focus flip
+ issue when popup or pulldown menu is raised. ~ochern
+ */
+void XmForceGrabKeyboard(Widget w, Time time)
+{
+ GrabData *grabw;
+
+ if (!w)
+ return;
+
+ while (! XtIsSubclass(w, shellWidgetClass))
+ w = XtParent(w);
+
+ if (! (XtIsSubclass(w, xmGrabShellWidgetClass) || XtIsSubclass(w, xmMenuShellWidgetClass)))
+ return;
+
+ _XmStartDispatcher(XtDisplay(w));
+
+ _UngrabKeyboard(w);
+
+ grabw = (GrabData *) XtMalloc(sizeof(GrabData));
+ grabw->w = w;
+ _XmProcessLock();
+ grabw->next = grabw_top;
+ grabw_top = grabw;
+ _XmProcessUnlock();
+
+ XtInsertEventHandler(w, StructureNotifyMask, False, UnmapHandler, NULL, XtListHead);
+
+ _XmSendFocusEvent(w, FocusIn);
+
+ /* Following the XSetInputFocus behaviour we force sending FocusOut (see XGrabKeyboard(3))
+ event to a previous keyboard holder */
+ XtGrabKeyboard(w, True, GrabModeAsync, GrabModeAsync, time);
+}
+
+static void _XmStartDispatcher(Display *display)
+{
+ if (!display)
+ return;
+
+ _XmProcessLock();
+
+ if (xm_dispatcher_on) {
+ _XmProcessUnlock();
+ return;
+ }
+
+ saved_dispatcher_proc = XtSetEventDispatcher(display, KeyPress, _XmEventDispatcher);
+ if (! xt_dispatcher_proc)
+ xt_dispatcher_proc = saved_dispatcher_proc;
+ XtSetEventDispatcher(display, KeyRelease, _XmEventDispatcher);
+ xm_dispatcher_on = 1;
+
+ _XmProcessUnlock();
+}
+
+static Boolean _XmEventDispatcher(XEvent *event)
+{
+ _XmProcessLock();
+ if (grabw_top) {
+ if (event->type == KeyPress || event->type == KeyRelease)
+ event->xany.window = XtWindow(grabw_top->w);
+ }
+ _XmProcessUnlock();
+
+ if (saved_dispatcher_proc) {
+ return (*saved_dispatcher_proc)(event);
+ } else if (xt_dispatcher_proc) {
+ return (*xt_dispatcher_proc)(event);
+ } else {
+ if (grabw_top)
+ XtSetEventDispatcher(XtDisplay(grabw_top->w), event->type, NULL);
+ return XtDispatchEvent(event);
+ }
+}
+
+static void UnmapHandler(Widget w, XtPointer client_data, XEvent *event, Boolean *cont)
+{
+ if (event->type == UnmapNotify)
+ _UngrabKeyboard(w);
+ if (! grabw_top) {
+ XtSetEventDispatcher(XtDisplay(w), KeyPress, saved_dispatcher_proc);
+ XtSetEventDispatcher(XtDisplay(w), KeyRelease, saved_dispatcher_proc);
+ xm_dispatcher_on = 0;
+ }
+
+ /* we do not call XtUngrabKeyboard since X server automatically performs an
+ UngrabKeyboard request if the event window for an active keyboard grab becomes
+ not viewable. ~ochern */
+}
+
+static Boolean _UngrabKeyboard(Widget w)
+{
+ GrabData *grabw, *grabw_prev;
+
+ _XmProcessLock();
+ if (! grabw_top) {
+ _XmProcessUnlock();
+ return False;
+ }
+
+ grabw = grabw_top;
+ grabw_prev = NULL;
+ while(grabw && grabw->w != w) {
+ grabw_prev = grabw;
+ grabw = grabw->next;
+ }
+ if (grabw) {
+ if (grabw_prev)
+ grabw_prev->next = grabw->next;
+ else
+ grabw_top = grabw->next;
+ XtFree((char*) grabw);
+
+ _XmProcessUnlock();
+ return True;
+ }
+
+ _XmProcessUnlock();
+ return False;
+}
+
+static void _XmSendFocusEvent(Widget child, int type)
+{
+ child = XtIsWidget(child) ? child : _XtWindowedAncestor(child);
+ if (XtIsSensitive(child) && !child->core.being_destroyed
+ && XtIsRealized(child) && (XtBuildEventMask(child) & FocusChangeMask))
+ {
+ XFocusChangeEvent event;
+ Display* dpy = XtDisplay (child);
+
+ event.type = type;
+ event.serial = LastKnownRequestProcessed(dpy);
+ event.send_event = True;
+ event.display = dpy;
+ event.window = XtWindow(child);
+ event.mode = NotifyNormal;
+ event.detail = NotifyAncestor;
+ if (XFilterEvent((XEvent*)&event, XtWindow(child)))
+ return;
+ XtDispatchEventToWidget(child, (XEvent*)&event);
+ }
+}
+
+#endif
+
--- a/lib/Xm/XmI.h
+++ b/lib/Xm/XmI.h
@@ -242,7 +242,9 @@
extern XChar2b* _XmUtf8ToUcs2(char *draw_text,
size_t seg_len,
size_t *ret_str_len);
-
+#ifdef FIX_1565
+extern void XmForceGrabKeyboard(Widget w, Time time);
+#endif
/******** End Private Function Declarations ********/
# Contributor: Isaac Dunham <ibid.ag@gmail.com>
# Maintainer: Isaac Dunham <ibid.ag@gmail.com>
pkgname=motif
pkgver=2.3.4
pkgrel=2
pkgver=2.3.8
pkgrel=0
pkgdesc="The Motif library"
url="http://motif.ics.com/"
url="https://motif.ics.com/"
arch="all"
options="!check" # Tests are interactive and require X11.
license="LGPL-2.1-or-later"
depends=""
depends_dev="libx11-dev libxft-dev libxt-dev libxpm-dev libxext-dev xbitmaps"
makedepends="$depends_dev libtool autoconf automake flex flex-libs flex-dev bison"
install=""
makedepends="$depends_dev automake autoconf libtool flex flex-libs flex-dev bison"
subpackages="mwm $pkgname-dev $pkgname-doc"
source="https://downloads.sourceforge.net/$pkgname/Motif%20$pkgver%20Source%20Code/motif-$pkgver-src.tgz
01-fix-autoconf.patch
02-fix-format-security.patch
03-no-demos.patch
06-cast-size_t-to-int.patch
07-fix_lintian_reported_manpage_typos.patch
08-fix_hyphen_in_man_pages.patch
09-fix_typo_in_libxm.patch
10-fix_manpage-has-bad-whatis-entry.patch
11-fix_underlinking.patch
12-fix_buffer_overrun_in_libxm.patch
13-fix_hardcoded_x11rgb_path.patch
14-fix_ac_find_xft.patch
15-link_uil_against_libuil.patch
16-fix-undefined-use-of-sprintf.patch
17-switch-to-system-iswspace.patch
18-updated-fix-1565.patch"
source="
https://downloads.sourceforge.net/project/motif/Motif%20$pkgver%20Source%20Code/motif-$pkgver.tar.gz
02-fix-format-security.patch
03-no-demos.patch
06-cast-size_t-to-int.patch
07-fix_lintian_reported_manpage_typos.patch
08-fix_hyphen_in_man_pages.patch
09-fix_typo_in_libxm.patch
10-fix_manpage-has-bad-whatis-entry.patch
11-fix_underlinking.patch
13-fix_hardcoded_x11rgb_path.patch
15-link_uil_against_libuil.patch
16-fix-undefined-use-of-sprintf.patch
17-switch-to-system-iswspace.patch
"
prepare() {
cd "$builddir"