+/* minimum/maximum/default x/y grid size for virtual buttons */
+#define MIN_GRID_XSIZE 3
+#define MIN_GRID_YSIZE 3
+#define MAX_GRID_XSIZE 32
+#define MAX_GRID_YSIZE 32
+#define GRID_REAL_WIDTH MAX(1, MAX(video.screen_width, \
+ video.screen_height))
+#define GRID_REAL_HEIGHT MAX(1, MIN(video.screen_width, \
+ video.screen_height))
+#define DEFAULT_GRID_XSIZE_0 18
+#define DEFAULT_GRID_YSIZE_0 MIN(MAX(MIN_GRID_YSIZE, \
+ DEFAULT_GRID_XSIZE_0 * \
+ GRID_REAL_HEIGHT / \
+ GRID_REAL_WIDTH), \
+ MAX_GRID_YSIZE)
+#define DEFAULT_GRID_XSIZE_1 13
+#define DEFAULT_GRID_YSIZE_1 MIN(MAX(MIN_GRID_YSIZE, \
+ DEFAULT_GRID_XSIZE_1 * \
+ GRID_REAL_WIDTH / \
+ GRID_REAL_HEIGHT), \
+ MAX_GRID_YSIZE)
+
+#define DEFAULT_GRID_XSIZE(n) ((n) == 0 ? DEFAULT_GRID_XSIZE_0 : \
+ DEFAULT_GRID_XSIZE_1)
+#define DEFAULT_GRID_YSIZE(n) ((n) == 0 ? DEFAULT_GRID_YSIZE_0 : \
+ DEFAULT_GRID_YSIZE_1)
+
+#define GRID_ACTIVE_NR() (video.screen_width > \
+ video.screen_height ? 0 : 1)
+
+/* values for grid button characters for virtual buttons */
+#define CHAR_GRID_BUTTON_NONE ' '
+#define CHAR_GRID_BUTTON_LEFT '<'
+#define CHAR_GRID_BUTTON_RIGHT '>'
+#define CHAR_GRID_BUTTON_UP '^'
+#define CHAR_GRID_BUTTON_DOWN 'v'
+#define CHAR_GRID_BUTTON_SNAP '1'
+#define CHAR_GRID_BUTTON_DROP '2'
+
+#define GET_ACTION_FROM_GRID_BUTTON(c) ((c) == CHAR_GRID_BUTTON_LEFT ? \
+ JOY_LEFT : \
+ (c) == CHAR_GRID_BUTTON_RIGHT ? \
+ JOY_RIGHT : \
+ (c) == CHAR_GRID_BUTTON_UP ? \
+ JOY_UP : \
+ (c) == CHAR_GRID_BUTTON_DOWN ? \
+ JOY_DOWN : \
+ (c) == CHAR_GRID_BUTTON_SNAP ? \
+ JOY_BUTTON_1 : \
+ (c) == CHAR_GRID_BUTTON_DROP ? \
+ JOY_BUTTON_2 : \
+ JOY_NO_ACTION)
+