rnd-20001201-1-src
[rocksndiamonds.git] / src / msdos.c
diff --git a/src/msdos.c b/src/msdos.c
deleted file mode 100644 (file)
index 960609d..0000000
+++ /dev/null
@@ -1,938 +0,0 @@
-/***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
-*----------------------------------------------------------*
-*  ©1995 Artsoft Development                               *
-*        Holger Schemel                                    *
-*        33659 Bielefeld-Senne                             *
-*        Telefon: (0521) 493245                            *
-*        eMail: aeglos@valinor.owl.de                      *
-*               aeglos@uni-paderborn.de                    *
-*               q99492@pbhrzx.uni-paderborn.de             *
-*----------------------------------------------------------*
-*  msdos.c                                                 *
-***********************************************************/
-
-#include "platform.h"
-
-#if defined(PLATFORM_MSDOS)
-
-#include "main.h"
-#include "misc.h"
-#include "tools.h"
-#include "sound.h"
-#include "files.h"
-#include "joystick.h"
-#include "image.h"
-#include "pcx.h"
-
-/* allegro driver declarations */
-DECLARE_GFX_DRIVER_LIST(GFX_DRIVER_VBEAF GFX_DRIVER_VESA2L GFX_DRIVER_VESA1)
-DECLARE_COLOR_DEPTH_LIST(COLOR_DEPTH_8)
-DECLARE_DIGI_DRIVER_LIST(DIGI_DRIVER_SB)
-DECLARE_MIDI_DRIVER_LIST()
-DECLARE_JOYSTICK_DRIVER_LIST(JOYSTICK_DRIVER_STANDARD)
-
-/* allegro global variables */
-extern volatile int key_shifts;
-extern int num_joysticks;
-extern JOYSTICK_INFO joy[];
-extern int i_love_bill;
-
-/* internal variables of msdos.c */
-static boolean keyboard_auto_repeat = TRUE;
-static int key_press_state[MAX_SCANCODES];
-static XEvent event_buffer[MAX_EVENT_BUFFER];
-static int pending_events;
-static boolean joystick_event;
-static boolean mouse_installed = FALSE;
-static int last_mouse_pos;
-static int last_mouse_b;
-static int last_joystick_state;
-static BITMAP* video_bitmap;
-
-static RGB global_colormap[MAX_COLORS];
-static int global_colormap_entries_used = 0;
-
-boolean wait_for_vsync;
-
-/*
-extern int playing_sounds;
-extern struct SoundControl playlist[MAX_SOUNDS_PLAYING];
-extern struct SoundControl emptySoundControl;
-*/
-
-static BITMAP *Read_PCX_to_AllegroBitmap(char *);
-
-static void allegro_init_drivers()
-{
-  int i;
-
-  for (i=0; i<MAX_EVENT_BUFFER; i++)
-    event_buffer[i].type = 0;
-
-  for (i=0; i<MAX_SCANCODES; i++)
-    key_press_state[i] = KeyReleaseMask;
-
-  last_mouse_pos = mouse_pos;
-  last_mouse_b = 0;
-
-  pending_events = 0;
-  clear_keybuf();
-
-  /* enable Windows friendly timer mode (already default under Windows) */
-  i_love_bill = TRUE;
-
-  install_keyboard();
-  install_timer();
-  if (install_mouse() > 0)
-    mouse_installed = TRUE;
-
-  last_joystick_state = 0;
-  joystick_event = FALSE;
-}
-
-static boolean allegro_init_audio()
-{
-  reserve_voices(MAX_SOUNDS_PLAYING, 0);
-
-  if (install_sound(DIGI_AUTODETECT, MIDI_NONE, NULL) == -1)
-    if (install_sound(DIGI_SB, MIDI_NONE, NULL) == -1)
-      return FALSE;
-
-  return TRUE;
-}
-
-static boolean hide_mouse(Display *display, int x, int y,
-                         unsigned int width, unsigned int height)
-{
-  if (mouse_x + display->mouse_ptr->w < x || mouse_x > x + width)
-    return FALSE;
-  if (mouse_y + display->mouse_ptr->h < y || mouse_y > y + height)
-    return FALSE;
-
-  show_mouse(NULL);
-
-  return TRUE;
-}
-
-static void unhide_mouse(Display *display)
-{
-  if (mouse_installed)
-    show_mouse(video_bitmap);
-}
-
-static KeySym ScancodeToKeySym(byte scancode)
-{
-  switch(scancode)
-  {
-    case KEY_ESC:              return XK_Escape;
-    case KEY_1:                        return XK_1;
-    case KEY_2:                        return XK_2;
-    case KEY_3:                        return XK_3;
-    case KEY_4:                        return XK_4;
-    case KEY_5:                        return XK_5;
-    case KEY_6:                        return XK_6;
-    case KEY_7:                        return XK_7;
-    case KEY_8:                        return XK_8;
-    case KEY_9:                        return XK_9;
-    case KEY_0:                        return XK_0;
-    case KEY_MINUS:            return XK_minus;
-    case KEY_EQUALS:           return XK_equal;
-    case KEY_BACKSPACE:                return XK_BackSpace;
-    case KEY_TAB:              return XK_Tab;
-    case KEY_Q:                        return XK_q;
-    case KEY_W:                        return XK_w;
-    case KEY_E:                        return XK_e;
-    case KEY_R:                        return XK_r;
-    case KEY_T:                        return XK_t;
-    case KEY_Y:                        return XK_y;
-    case KEY_U:                        return XK_u;
-    case KEY_I:                        return XK_i;
-    case KEY_O:                        return XK_o;
-    case KEY_P:                        return XK_p;
-    case KEY_OPENBRACE:                return XK_braceleft;
-    case KEY_CLOSEBRACE:       return XK_braceright;
-    case KEY_ENTER:            return XK_Return;
-    case KEY_LCONTROL:         return XK_Control_L;
-    case KEY_A:                        return XK_a;
-    case KEY_S:                        return XK_s;
-    case KEY_D:                        return XK_d;
-    case KEY_F:                        return XK_f;
-    case KEY_G:                        return XK_g;
-    case KEY_H:                        return XK_h;
-    case KEY_J:                        return XK_j;
-    case KEY_K:                        return XK_k;
-    case KEY_L:                        return XK_l;
-    case KEY_COLON:            return XK_colon;
-    case KEY_QUOTE:            return XK_apostrophe;
-    case KEY_TILDE:            return XK_asciitilde;
-    case KEY_LSHIFT:           return XK_Shift_L;
-    case KEY_BACKSLASH:                return XK_backslash;
-    case KEY_Z:                        return XK_z;
-    case KEY_X:                        return XK_x;
-    case KEY_C:                        return XK_c;
-    case KEY_V:                        return XK_v;
-    case KEY_B:                        return XK_b;
-    case KEY_N:                        return XK_n;
-    case KEY_M:                        return XK_m;
-    case KEY_COMMA:            return XK_comma;
-    case KEY_STOP:             return XK_period;
-    case KEY_SLASH:            return XK_slash;
-    case KEY_RSHIFT:           return XK_Shift_R;
-    case KEY_ASTERISK:         return XK_KP_Multiply;
-    case KEY_ALT:              return XK_Alt_L;
-    case KEY_SPACE:            return XK_space;
-    case KEY_CAPSLOCK:         return XK_Caps_Lock;
-    case KEY_F1:               return XK_F1;
-    case KEY_F2:               return XK_F2;
-    case KEY_F3:               return XK_F3;
-    case KEY_F4:               return XK_F4;
-    case KEY_F5:               return XK_F5;
-    case KEY_F6:               return XK_F6;
-    case KEY_F7:               return XK_F7;
-    case KEY_F8:               return XK_F8;
-    case KEY_F9:               return XK_F9;
-    case KEY_F10:              return XK_F10;
-    case KEY_NUMLOCK:          return XK_Num_Lock;
-    case KEY_SCRLOCK:          return XK_Scroll_Lock;
-    case KEY_HOME:             return XK_Home;
-    case KEY_UP:               return XK_Up;
-    case KEY_PGUP:             return XK_Page_Up;
-    case KEY_MINUS_PAD:                return XK_KP_Subtract;
-    case KEY_LEFT:             return XK_Left;
-    case KEY_5_PAD:            return XK_KP_5;
-    case KEY_RIGHT:            return XK_Right;
-    case KEY_PLUS_PAD:         return XK_KP_Add;
-    case KEY_END:              return XK_End;
-    case KEY_DOWN:             return XK_Down;
-    case KEY_PGDN:             return XK_Page_Down;
-    case KEY_INSERT:           return XK_Insert;
-    case KEY_DEL:              return XK_Delete;
-    case KEY_PRTSCR:           return XK_Print;
-    case KEY_F11:              return XK_F11;
-    case KEY_F12:              return XK_F12;
-    case KEY_LWIN:             return XK_Meta_L;
-    case KEY_RWIN:             return XK_Meta_R;
-    case KEY_MENU:             return XK_Menu;
-    case KEY_PAD:              return XK_VoidSymbol;
-    case KEY_RCONTROL:         return XK_Control_R;
-    case KEY_ALTGR:            return XK_Alt_R;
-    case KEY_SLASH2:           return XK_KP_Divide;
-    case KEY_PAUSE:            return XK_Pause;
-
-    case NEW_KEY_BACKSLASH:    return XK_backslash;
-    case NEW_KEY_1_PAD:                return XK_KP_1;
-    case NEW_KEY_2_PAD:                return XK_KP_2;
-    case NEW_KEY_3_PAD:                return XK_KP_3;
-    case NEW_KEY_4_PAD:                return XK_KP_4;
-    case NEW_KEY_5_PAD:                return XK_KP_5;
-    case NEW_KEY_6_PAD:                return XK_KP_6;
-    case NEW_KEY_7_PAD:                return XK_KP_7;
-    case NEW_KEY_8_PAD:                return XK_KP_8;
-    case NEW_KEY_9_PAD:                return XK_KP_9;
-    case NEW_KEY_0_PAD:                return XK_KP_0;
-    case NEW_KEY_STOP_PAD:     return XK_KP_Separator;
-    case NEW_KEY_EQUALS_PAD:   return XK_KP_Equal;
-    case NEW_KEY_SLASH_PAD:    return XK_KP_Divide;
-    case NEW_KEY_ASTERISK_PAD: return XK_KP_Multiply;
-    case NEW_KEY_ENTER_PAD:    return XK_KP_Enter;
-
-    default:                   return XK_VoidSymbol;
-  }
-}
-
-void XMapWindow(Display *display, Window window)
-{
-  int x, y;
-  unsigned int width, height;
-  boolean mouse_off;
-
-  x = display->screens[display->default_screen].x;
-  y = display->screens[display->default_screen].y;
-  width = display->screens[display->default_screen].width;
-  height = display->screens[display->default_screen].height;
-
-  mouse_off = hide_mouse(display, x, y, width, height);
-  blit((BITMAP *)window, video_bitmap, 0, 0, x, y, width, height);
-
-  if (mouse_off)
-    unhide_mouse(display);
-}
-
-static unsigned long AllocColorCell(int r, int g, int b)
-{
-  byte pixel_mapping = 0;
-  int i;
-
-  r >>= 10;
-  g >>= 10;
-  b >>= 10;
-
-  /* try to use existing colors from the global colormap */
-  for (i=0; i<global_colormap_entries_used; i++)
-  {
-    if (r == global_colormap[i].r &&
-       g == global_colormap[i].g &&
-       b == global_colormap[i].b)              /* color found */
-    {
-      pixel_mapping = i;
-      break;
-    }
-  }
-
-  if (i == global_colormap_entries_used)       /* color not found */
-  {
-    if (global_colormap_entries_used < MAX_COLORS)
-      global_colormap_entries_used++;
-
-    global_colormap[i].r = r;
-    global_colormap[i].g = g;
-    global_colormap[i].b = b;
-
-    pixel_mapping = i;
-  }
-
-  return pixel_mapping;
-}
-
-Display *XOpenDisplay(char *display_name)
-{
-  Screen *screen;
-  Display *display;
-  BITMAP *mouse_bitmap = NULL;
-  char *filename;
-
-  filename = getPath3(options.ro_base_directory, GRAPHICS_DIRECTORY,
-                     MOUSE_FILENAME);
-
-  mouse_bitmap = Read_PCX_to_AllegroBitmap(filename);
-  free(filename);
-
-  if (mouse_bitmap == NULL)
-    return NULL;
-
-  screen = malloc(sizeof(Screen));
-  display = malloc(sizeof(Display));
-
-  screen[0].cmap = 0;
-  screen[0].root = 0;
-#if 0
-  screen[0].white_pixel = 0xFF;
-  screen[0].black_pixel = 0x00;
-#else
-  screen[0].white_pixel = AllocColorCell(0xFFFF, 0xFFFF, 0xFFFF);
-  screen[0].black_pixel = AllocColorCell(0x0000, 0x0000, 0x0000);
-#endif
-  screen[0].video_bitmap = NULL;
-
-  display->default_screen = 0;
-  display->screens = screen;
-  display->mouse_ptr = mouse_bitmap;
-
-  allegro_init();
-  allegro_init_drivers();
-  set_color_depth(8);
-
-  /* force Windows 95 to switch to fullscreen mode */
-  set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);
-  rest(200);
-  set_gfx_mode(GFX_AUTODETECT, XRES, YRES, 0, 0);
-
-  return display;
-}
-
-Window XCreateSimpleWindow(Display *display, Window parent, int x, int y,
-                          unsigned int width, unsigned int height,
-                          unsigned int border_width, unsigned long border,
-                          unsigned long background)
-{
-  video_bitmap = create_video_bitmap(XRES, YRES);
-  clear_to_color(video_bitmap, background);
-
-  display->screens[display->default_screen].video_bitmap = video_bitmap;
-  display->screens[display->default_screen].x = x;
-  display->screens[display->default_screen].y = y;
-  display->screens[display->default_screen].width = XRES;
-  display->screens[display->default_screen].height = YRES;
-
-  set_mouse_sprite(display->mouse_ptr);
-
-#if 0
-  set_mouse_sprite_focus(1, 1);
-#endif
-
-  set_mouse_speed(1, 1);
-  set_mouse_range(display->screens[display->default_screen].x + 1,
-                 display->screens[display->default_screen].y + 1,
-                 display->screens[display->default_screen].x + WIN_XSIZE + 1,
-                 display->screens[display->default_screen].y + WIN_YSIZE + 1);
-
-  show_video_bitmap(video_bitmap);
-
-  return (Window)video_bitmap;
-}
-
-Status XStringListToTextProperty(char **list, int count,
-                                XTextProperty *text_prop_return)
-{
-  char *string;
-
-  if (count >= 1)
-  {
-    string = malloc(strlen(list[0] + 1));
-    strcpy(string, list[0]);
-    text_prop_return->value = (unsigned char *)string;
-    return 1;
-  }
-  else
-    text_prop_return = NULL;
-
-  return 0;
-}
-
-void XFree(void *data)
-{
-  if (data)
-    free(data);
-}
-
-GC XCreateGC(Display *display, Drawable d, unsigned long value_mask,
-            XGCValues *values)
-{
-  XGCValues *gcv;
-  gcv = malloc(sizeof(XGCValues));
-  gcv->foreground = values->foreground;
-  gcv->background = values->background;
-  gcv->graphics_exposures = values->graphics_exposures;
-  gcv->clip_mask = values->clip_mask;
-  gcv->clip_x_origin = values->clip_x_origin;
-  gcv->clip_y_origin = values->clip_y_origin;
-  gcv->value_mask = value_mask;
-  return (GC)gcv;
-}
-
-void XSetClipMask(Display *display, GC gc, Pixmap pixmap)
-{
-  XGCValues *gcv = (XGCValues *)gc;
-
-  gcv->clip_mask = pixmap;
-  gcv->value_mask |= GCClipMask;
-}
-
-void XSetClipOrigin(Display *display, GC gc, int x, int y)
-{
-  XGCValues *gcv = (XGCValues *)gc;
-
-  gcv->clip_x_origin = x;
-  gcv->clip_x_origin = y;
-}
-
-void XFillRectangle(Display *display, Drawable d, GC gc, int x, int y,
-                   unsigned int width, unsigned int height)
-{
-  boolean mouse_off = FALSE;
-
-  if ((BITMAP *)d == video_bitmap)
-  {
-    x += display->screens[display->default_screen].x;
-    y += display->screens[display->default_screen].y;
-    freeze_mouse_flag = TRUE;
-    mouse_off = hide_mouse(display, x, y, width, height);
-  }
-
-  rectfill((BITMAP *)d, x, y, x + width - 1, y + height - 1,
-          ((XGCValues *)gc)->foreground);
-
-  if (mouse_off)
-    unhide_mouse(display);
-
-  freeze_mouse_flag = FALSE;
-}
-
-Pixmap XCreatePixmap(Display *display, Drawable d, unsigned int width,
-                    unsigned int height, unsigned int depth)
-{
-  BITMAP *bitmap = NULL;
-
-  if (gfx_capabilities & GFX_HW_VRAM_BLIT &&
-      width == FXSIZE && height == FYSIZE)
-    bitmap = create_video_bitmap(width, height);
-
-  if (bitmap == NULL)
-    bitmap = create_bitmap(width, height);
-
-  return (Pixmap)bitmap;
-}
-
-void XSync(Display *display, Bool discard_events)
-{
-  wait_for_vsync = TRUE;
-}
-
-inline void XCopyArea(Display *display, Drawable src, Drawable dest, GC gc,
-                     int src_x, int src_y,
-                     unsigned int width, unsigned int height,
-                     int dest_x, int dest_y)
-{
-  boolean mouse_off = FALSE;
-
-  if ((BITMAP *)src == video_bitmap)
-  {
-    src_x += display->screens[display->default_screen].x;
-    src_y += display->screens[display->default_screen].y;
-  }
-
-  if ((BITMAP *)dest == video_bitmap)
-  {
-    dest_x += display->screens[display->default_screen].x;
-    dest_y += display->screens[display->default_screen].y;
-    freeze_mouse_flag = TRUE;
-    mouse_off = hide_mouse(display, dest_x, dest_y, width, height);
-  }
-
-  if (wait_for_vsync)
-  {
-    wait_for_vsync = FALSE;
-    vsync();
-  }
-
-  if (((XGCValues *)gc)->value_mask & GCClipMask)
-    masked_blit((BITMAP *)src, (BITMAP *)dest, src_x, src_y, dest_x, dest_y,
-               width, height);
-  else
-    blit((BITMAP *)src, (BITMAP *)dest, src_x, src_y, dest_x, dest_y,
-        width, height);
-
-  if (mouse_off)
-    unhide_mouse(display);
-
-  freeze_mouse_flag = FALSE;
-}
-
-static BITMAP *Image_to_AllegroBitmap(Image *image)
-{
-  BITMAP *bitmap;
-  byte *src_ptr = image->data;
-  byte pixel_mapping[MAX_COLORS];
-  unsigned int depth = 8;
-
-#if 0
-  int i, j, x, y;
-#else
-  int i, x, y;
-#endif
-
-  /* allocate new allegro bitmap structure */
-  if ((bitmap = create_bitmap_ex(depth, image->width, image->height)) == NULL)
-  {
-    errno_pcx = PCX_NoMemory;
-    return NULL;
-  }
-
-  clear(bitmap);
-
-  /* try to use existing colors from the global colormap */
-  for (i=0; i<MAX_COLORS; i++)
-  {
-
-#if 0
-    int r, g, b;
-#endif
-
-    if (!image->rgb.color_used[i])
-      continue;
-
-
-#if 0
-    r = image->rgb.red[i] >> 10;
-    g = image->rgb.green[i] >> 10;
-    b = image->rgb.blue[i] >> 10;
-
-    for (j=0; j<global_colormap_entries_used; j++)
-    {
-      if (r == global_colormap[j].r &&
-         g == global_colormap[j].g &&
-         b == global_colormap[j].b)            /* color found */
-      {
-       pixel_mapping[i] = j;
-       break;
-      }
-    }
-
-    if (j == global_colormap_entries_used)     /* color not found */
-    {
-      if (global_colormap_entries_used < MAX_COLORS)
-       global_colormap_entries_used++;
-
-      global_colormap[j].r = r;
-      global_colormap[j].g = g;
-      global_colormap[j].b = b;
-
-      pixel_mapping[i] = j;
-    }
-#else
-    pixel_mapping[i] = AllocColorCell(image->rgb.red[i],
-                                     image->rgb.green[i],
-                                     image->rgb.blue[i]);
-#endif
-
-  }
-
-  /* copy bitmap data */
-  for (y=0; y<image->height; y++)
-    for (x=0; x<image->width; x++)
-      putpixel(bitmap, x, y, pixel_mapping[*src_ptr++]);
-
-  return bitmap;
-}
-
-static BITMAP *Read_PCX_to_AllegroBitmap(char *filename)
-{
-  BITMAP *bitmap;
-  Image *image;
-
-  /* read the graphic file in PCX format to internal image structure */
-  if ((image = Read_PCX_to_Image(filename)) == NULL)
-    return NULL;
-
-  /* convert internal image structure to allegro bitmap structure */
-  if ((bitmap = Image_to_AllegroBitmap(image)) == NULL)
-    return NULL;
-
-  set_palette(global_colormap);
-
-  return bitmap;
-}
-
-int Read_PCX_to_Pixmap(Display *display, Window window, GC gc, char *filename,
-                      Pixmap *pixmap, Pixmap *pixmap_mask)
-{
-  BITMAP *bitmap;
-
-  if ((bitmap = Read_PCX_to_AllegroBitmap(filename)) == NULL)
-    return errno_pcx;
-
-  *pixmap = (Pixmap)bitmap;
-  *pixmap_mask = (Pixmap)bitmap;
-
-  return PCX_Success;
-}
-
-int XReadBitmapFile(Display *display, Drawable d, char *filename,
-                   unsigned int *width_return, unsigned int *height_return,
-                   Pixmap *bitmap_return,
-                   int *x_hot_return, int *y_hot_return)
-{
-  BITMAP *bitmap;
-
-  if ((bitmap = Read_PCX_to_AllegroBitmap(filename)) == NULL)
-    return BitmapOpenFailed;
-
-  *width_return = bitmap->w;
-  *height_return = bitmap->h;
-  *x_hot_return = -1;
-  *y_hot_return = -1;
-  *bitmap_return = (Pixmap)bitmap;
-
-  return BitmapSuccess;
-}
-
-void XFreePixmap(Display *display, Pixmap pixmap)
-{
-  if (pixmap != DUMMY_MASK &&
-      (is_memory_bitmap((BITMAP *)pixmap) ||
-       is_screen_bitmap((BITMAP *)pixmap)))
-    destroy_bitmap((BITMAP *)pixmap);
-}
-
-void XFreeGC(Display *display, GC gc)
-{
-  XGCValues *gcv;
-
-  gcv = (XGCValues *)gc;
-  if (gcv)
-    free(gcv);
-}
-
-void XCloseDisplay(Display *display)
-{
-  BITMAP *bitmap = video_bitmap;
-
-  if (is_screen_bitmap(bitmap))
-    destroy_bitmap(bitmap);
-
-  if (display->screens)
-    free(display->screens);
-
-  if (display)
-    free(display);
-
-  /* return to text mode (or DOS box on Windows screen) */
-  set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
-}
-
-void XNextEvent(Display *display, XEvent *event_return)
-{
-  while (!pending_events)
-    XPending(display);
-
-  memcpy(event_return, &event_buffer[pending_events], sizeof(XEvent));
-  pending_events--;
-}
-
-static void NewKeyEvent(int key_press_state, KeySym keysym)
-{
-  XKeyEvent *xkey;
-
-  if (pending_events >= MAX_EVENT_BUFFER)
-    return;
-
-  pending_events++;
-  xkey = (XKeyEvent *)&event_buffer[pending_events];
-  xkey->type = key_press_state;
-  xkey->state = (unsigned int)keysym;
-}
-
-#define HANDLE_RAW_KB_ALL_KEYS                 0
-#define HANDLE_RAW_KB_MODIFIER_KEYS_ONLY       1
-
-static int modifier_scancode[] =
-{
-  KEY_LSHIFT,
-  KEY_RSHIFT,
-  KEY_LCONTROL,
-  KEY_RCONTROL,
-  KEY_ALT,
-  KEY_ALTGR,
-  KEY_LWIN,
-  KEY_RWIN,
-  KEY_CAPSLOCK,
-  KEY_NUMLOCK,
-  KEY_SCRLOCK,
-  -1
-};
-
-static void HandleKeyboardRaw(int mode)
-{
-  int i;
-
-  for (i=0; i<MAX_SCANCODES; i++)
-  {
-    int scancode, new_state, event_type;
-    char key_pressed;
-
-    if (mode == HANDLE_RAW_KB_MODIFIER_KEYS_ONLY)
-    {
-      if ((scancode = modifier_scancode[i]) == -1)
-       return;
-    }
-    else
-      scancode = i;
-
-    key_pressed = key[scancode];
-    new_state = (key_pressed ? KeyPressMask : KeyReleaseMask);
-    event_type = (key_pressed ? KeyPress : KeyRelease);
-
-    if (key_press_state[i] == new_state)       /* state not changed */
-      continue;
-
-    key_press_state[i] = new_state;
-
-    NewKeyEvent(event_type, ScancodeToKeySym(scancode));
-  }
-}
-
-static void HandleKeyboardEvent()
-{
-  if (keypressed())
-  {
-    int key_info = readkey();
-    int scancode = (key_info >> 8);
-    int ascii = (key_info & 0xff);
-    KeySym keysym = ScancodeToKeySym(scancode);
-
-    if (scancode == KEY_PAD)
-    {
-      /* keys on the numeric keypad return just scancode 'KEY_PAD'
-        for some reason, so we must handle them separately */
-
-      if (ascii >= '0' && ascii <= '9')
-       keysym = XK_KP_0 + (KeySym)(ascii - '0');
-      else if (ascii == '.')
-       keysym = XK_KP_Separator;
-    }
-    else if (ascii >= ' ' && ascii <= 'Z')
-      keysym = XK_space + (KeySym)(ascii - ' ');
-    else if (ascii == '^')
-      keysym = XK_asciicircum;
-    else if (ascii == '_')
-      keysym = XK_underscore;
-    else if (ascii == 'Ä')
-      keysym = XK_Adiaeresis;
-    else if (ascii == 'Ö')
-      keysym = XK_Odiaeresis;
-    else if (ascii == 'Ü')
-      keysym = XK_Udiaeresis;
-    else if (ascii == 'ä')
-      keysym = XK_adiaeresis;
-    else if (ascii == 'ö')
-      keysym = XK_odiaeresis;
-    else if (ascii == 'ü')
-      keysym = XK_udiaeresis;
-    else if (ascii == 'ß')
-      keysym = XK_ssharp;
-
-    NewKeyEvent(KeyPress, keysym);
-  }
-  else if (key_shifts & (KB_SHIFT_FLAG | KB_CTRL_FLAG | KB_ALT_FLAG))
-  {
-    /* the allegro function keypressed() does not give us single pressed
-       modifier keys, so we must detect them with the internal global
-       allegro variable 'key_shifts' and then handle them separately */
-
-    HandleKeyboardRaw(HANDLE_RAW_KB_MODIFIER_KEYS_ONLY);
-  }
-}
-
-int XPending(Display *display)
-{
-  XButtonEvent *xbutton;
-  XMotionEvent *xmotion;
-  int i;
-
-  /* When using 'HandleKeyboardRaw()', keyboard input is also stored in
-     the allegro keyboard input buffer and would be available a second
-     time by calling 'HandleKeyboardEvent()'. To avoid double keyboard
-     events, the allegro function 'clear_keybuf()' must be called each
-     time when switching from calling 'HandleKeyboardRaw()' to calling
-     'HandleKeyboardEvent()' to get keyboard input, which is actually
-     done by 'XAutoRepeatOn()' which sets keyboard_auto_repeat to TRUE. */
-
-  /* keyboard event */
-  if (keyboard_auto_repeat)
-    HandleKeyboardEvent();
-  else
-    HandleKeyboardRaw(HANDLE_RAW_KB_ALL_KEYS);
-
-  /* mouse motion event */
-  if (mouse_pos != last_mouse_pos)
-  {
-    last_mouse_pos = mouse_pos;
-    pending_events++;
-    xmotion = (XMotionEvent *)&event_buffer[pending_events];
-    xmotion->type = MotionNotify;
-    xmotion->x = mouse_x - display->screens[display->default_screen].x;
-    xmotion->y = mouse_y - display->screens[display->default_screen].y;
-  }
-
-  /* mouse button event */
-  if (mouse_b != last_mouse_b)
-  {
-    for (i=0; i<3; i++)                /* check all three mouse buttons */
-    {
-      int bitmask = (1 << i);
-
-      if ((last_mouse_b & bitmask) != (mouse_b & bitmask))
-      {
-       int mapping[3] = { 1, 3, 2 };
-
-       pending_events++;
-        xbutton = (XButtonEvent *)&event_buffer[pending_events];
-        xbutton->type = (mouse_b & bitmask ? ButtonPress : ButtonRelease);
-        xbutton->button = mapping[i];
-       xbutton->x = mouse_x - display->screens[display->default_screen].x;
-       xbutton->y = mouse_y - display->screens[display->default_screen].y;
-      }
-    }
-    last_mouse_b = mouse_b;
-  }
-
-  return pending_events;
-}
-
-KeySym XLookupKeysym(XKeyEvent *key_event, int index)
-{
-  return key_event->state;
-}
-
-int XLookupString(XKeyEvent *key_event, char *buffer, int buffer_size,
-                 KeySym *key, XComposeStatus *compose)
-{
-  *key = key_event->state;
-  return 0;
-}
-
-void XSetForeground(Display *display, GC gc, unsigned long pixel)
-{
-  XGCValues *gcv = (XGCValues *)gc;
-
-  gcv->foreground = pixel;
-}
-
-void XDrawLine(Display *display, Drawable d, GC gc,
-              int x1, int y1, int x2, int y2)
-{
-  XGCValues *gcv = (XGCValues *)gc;
-  boolean mouse_off = FALSE;
-
-  if ((BITMAP *)d == video_bitmap)
-  {
-    x1 += display->screens[display->default_screen].x;
-    y1 += display->screens[display->default_screen].y;
-    x2 += display->screens[display->default_screen].x;
-    y2 += display->screens[display->default_screen].y;
-    freeze_mouse_flag = TRUE;
-    mouse_off = hide_mouse(display, MIN(x1, x2), MIN(y1, y2),
-                          MAX(x1, x2) - MIN(x1, x2),
-                          MAX(y1, y2) - MIN(y1, y2));
-  }
-
-  line((BITMAP *)d, x1, y1, x2, y2, gcv->foreground);
-
-  if (mouse_off)
-    unhide_mouse(display);
-
-  freeze_mouse_flag = FALSE;
-}
-
-void XDestroyImage(XImage *ximage)
-{
-}
-
-Bool XQueryPointer(Display *display, Window window,
-                  Window *root, Window *child, int *root_x, int *root_y,
-                  int *win_x, int *win_y, unsigned int *mask)
-{
-  *win_x = mouse_x - display->screens[display->default_screen].x;
-  *win_y = mouse_y - display->screens[display->default_screen].y;
-
-  return True;
-}
-
-void XAutoRepeatOn(Display *display)
-{
-  keyboard_auto_repeat = TRUE;
-  clear_keybuf();
-}
-
-void XAutoRepeatOff(Display *display)
-{
-  keyboard_auto_repeat = FALSE;
-}
-
-boolean MSDOSOpenAudio(void)
-{
-  return allegro_init_audio();
-}
-
-boolean MSDOSCloseAudio(void)
-{
-  /* nothing to be done here */
-}
-
-void NetworkServer(int port, int serveronly)
-{
-  Error(ERR_WARN, "networking not supported in DOS version");
-}
-
-#endif /* PLATFORM_MSDOS */