build-scripts/androidbuildlibs.sh
author Ryan C. Gordon
Mon, 21 Aug 2017 00:42:06 -0400
changeset 11334 749cb40916f2
parent 11262 8e5441ab6c63
child 11836 a42b155124a3
permissions -rw-r--r--
x11: specify event mask for buttons when grabbing pointer (thanks, Stas!).

This fixes a strange corner case (notes appended below), and should be
safe to do anyhow.

Fixes Bugzilla #3674.

"I did more tests.
It appears the bug only happens if there is
another window on the screen that has "always
on top" property. For me it is xawtv - it is
always opened in a screen corner. Closing
xawtv or removing "always on top" property
from it makes the problem to go away.
Plus, it doesn't appear like the buttons are
not delivered at all. It appears that instead
the button presses are delivered on some mouse
positions, but not delivered when you move the
mouse to other part of the window... So this is
really weird and is likely somewhere deep in the
Xorg.
Maybe somehow it happens that the cursor is
actually above the xawtv window, but, because
my app uses grab, it is not visible there, and
in that case the events are not delivered to
my app?
But with my patch the button events are
always delivered flawlessly, it seems.

Hmm, and that indeed seems to explain my problem:
if the mask is set properly and my app uses
grab, then, even if the mouse is above some
other window, the events would still be delivered
to the grabbing app, which is what actually wanted
because my app uses relative mouse mode, so it
doesn't know the pointer can cross some other window
(my app draws the pointer itself).
So my current theory is that my patch only enforces
the mouse grab, which otherwise can be tricked by
some other window preventing the button events
delivery (but motion events are still delivered
via xinput2, which makes it all look very obscure)."
slouken@11262
     1
#!/bin/sh
slouken@11262
     2
#
slouken@11262
     3
# Build the Android libraries without needing a project
slouken@11262
     4
# (AndroidManifest.xml, jni/{Application,Android}.mk, etc.)
slouken@11262
     5
#
slouken@11262
     6
# Usage: androidbuildlibs.sh [arg for ndk-build ...]"
slouken@11262
     7
#
slouken@11262
     8
# Useful NDK arguments:
slouken@11262
     9
#
slouken@11262
    10
#  NDK_DEBUG=1          - build debug version
slouken@11262
    11
#  NDK_LIBS_OUT=<dest>  - specify alternate destination for installable
slouken@11262
    12
#                         modules.
slouken@11262
    13
#
slouken@11262
    14
# Note that SDLmain is not an installable module (.so) so libSDLmain.a
slouken@11262
    15
# can be found in $obj/local/<abi> along with the unstripped libSDL.so.
slouken@11262
    16
#
slouken@11262
    17
slouken@11262
    18
slouken@11262
    19
# Android.mk is in srcdir
slouken@11262
    20
srcdir=`dirname $0`/..
slouken@11262
    21
srcdir=`cd $srcdir && pwd`
slouken@11262
    22
cd $srcdir
slouken@11262
    23
slouken@11262
    24
slouken@11262
    25
#
slouken@11262
    26
# Create the build directories
slouken@11262
    27
#
slouken@11262
    28
slouken@11262
    29
build=build
slouken@11262
    30
buildandroid=$build/android
slouken@11262
    31
obj=
slouken@11262
    32
lib=
slouken@11262
    33
ndk_args=
slouken@11262
    34
slouken@11262
    35
# Allow an external caller to specify locations.
slouken@11262
    36
for arg in $*
slouken@11262
    37
do
slouken@11262
    38
  if [ "${arg:0:8}" == "NDK_OUT=" ]; then
slouken@11262
    39
	obj=${arg#NDK_OUT=}
slouken@11262
    40
  elif [ "${arg:0:13}" == "NDK_LIBS_OUT=" ]; then
slouken@11262
    41
	lib=${arg#NDK_LIBS_OUT=}
slouken@11262
    42
  else
slouken@11262
    43
    ndk_args="$ndk_args $arg"
slouken@11262
    44
  fi
slouken@11262
    45
done
slouken@11262
    46
slouken@11262
    47
if [ -z $obj ]; then
slouken@11262
    48
  obj=$buildandroid/obj
slouken@11262
    49
fi
slouken@11262
    50
if [ -z $lib ]; then
slouken@11262
    51
  lib=$buildandroid/lib
slouken@11262
    52
fi
slouken@11262
    53
slouken@11262
    54
for dir in $build $buildandroid $obj $lib; do
slouken@11262
    55
    if test -d $dir; then
slouken@11262
    56
        :
slouken@11262
    57
    else
slouken@11262
    58
        mkdir $dir || exit 1
slouken@11262
    59
    fi
slouken@11262
    60
done
slouken@11262
    61
slouken@11262
    62
slouken@11262
    63
# APP_* variables set in the environment here will not be seen by the
slouken@11262
    64
# ndk-build makefile segments that use them, e.g., default-application.mk.
slouken@11262
    65
# For consistency, pass all values on the command line.
slouken@11262
    66
ndk-build \
slouken@11262
    67
  NDK_PROJECT_PATH=null \
slouken@11262
    68
  NDK_OUT=$obj \
slouken@11262
    69
  NDK_LIBS_OUT=$lib \
slouken@11262
    70
  APP_BUILD_SCRIPT=Android.mk \
slouken@11262
    71
  APP_ABI="all" \
slouken@11262
    72
  APP_PLATFORM=android-12 \
slouken@11262
    73
  APP_MODULES="SDL2 SDL2_main" \
slouken@11262
    74
  $ndk_args