rnd-20030703-1-src
[rocksndiamonds.git] / src / libgame / system.c
index 45fb77c1e86471cc7861b27ec3af6ab88b045770..bfa9966bb0eb742f7f370247ffb181f86dede637 100644 (file)
@@ -107,7 +107,7 @@ void InitExitFunction(void (*exit_function)(int))
 #endif
 }
 
-void InitPlatformDependantStuff(void)
+void InitPlatformDependentStuff(void)
 {
 #if defined(PLATFORM_MSDOS)
   _fmode = O_BINARY;
@@ -120,7 +120,7 @@ void InitPlatformDependantStuff(void)
 #endif
 }
 
-void ClosePlatformDependantStuff(void)
+void ClosePlatformDependentStuff(void)
 {
 #if defined(PLATFORM_MSDOS)
   dumpErrorFile();
@@ -855,84 +855,79 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap)
 /* mouse pointer functions                                                   */
 /* ------------------------------------------------------------------------- */
 
-/* cursor bitmap in XPM format */
+/* XPM */
 static const char *cursor_image_playfield[] =
 {
   /* width height num_colors chars_per_pixel */
-  "    32    32        3            1",
+  "    16    16        3            1",
 
   /* colors */
   "X c #000000",
   ". c #ffffff",
   "  c None",
 
-  " X                              ",
-  "X.X                             ",
-  " X                              ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
-  "                                ",
+  /* pixels */
+  " X              ",
+  "X.X             ",
+  " X              ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+  "                ",
+
+  /* hot spot */
   "1,1"
 };
 
+#if defined(TARGET_SDL)
+static const int cursor_bit_order = BIT_ORDER_MSB;
+#elif defined(TARGET_X11_NATIVE)
+static const int cursor_bit_order = BIT_ORDER_LSB;
+#endif
+
 static struct MouseCursorInfo *get_cursor_from_image(const char **image)
 {
   struct MouseCursorInfo *cursor;
-  int row, col, i;
+  boolean bit_order_msb = (cursor_bit_order == BIT_ORDER_MSB);
+  int header_lines = 4;
+  int x, y, i;
 
   cursor = checked_calloc(sizeof(struct MouseCursorInfo));
 
+  sscanf(image[0], " %d %d ", &cursor->width, &cursor->height);
+
   i = -1;
-  for (row=0; row<32; ++row)
+  for (y=0; y < cursor->width; y++)
   {
-    for (col=0; col<32; ++col)
+    for (x=0; x < cursor->height; x++)
     {
-      if (col % 8)
-      {
-        cursor->data[i] <<= 1;
-        cursor->mask[i] <<= 1;
-      }
-      else
+      int bit_nr = x % 8;
+      int bit_mask = 0x01 << (bit_order_msb ? 7 - bit_nr : bit_nr );
+
+      if (bit_nr == 0)
       {
         i++;
         cursor->data[i] = cursor->mask[i] = 0;
       }
 
-      switch (image[4+row][col])
+      switch (image[header_lines + y][x])
       {
         case 'X':
-         cursor->data[i] |= 0x01;
-         cursor->mask[i] |= 0x01;
+         cursor->data[i] |= bit_mask;
+         cursor->mask[i] |= bit_mask;
          break;
 
         case '.':
-         cursor->mask[i] |= 0x01;
+         cursor->mask[i] |= bit_mask;
          break;
 
         case ' ':
@@ -941,17 +936,14 @@ static struct MouseCursorInfo *get_cursor_from_image(const char **image)
     }
   }
 
-  sscanf(image[4+row], "%d,%d", &cursor->hot_x, &cursor->hot_y);
-
-  cursor->width = 32;
-  cursor->height = 32;
+  sscanf(image[header_lines + y], "%d,%d", &cursor->hot_x, &cursor->hot_y);
 
   return cursor;
 }
 
 void SetMouseCursor(int mode)
 {
-  struct MouseCursorInfo *cursor_playfield = NULL;
+  static struct MouseCursorInfo *cursor_playfield = NULL;
 
   if (cursor_playfield == NULL)
     cursor_playfield = get_cursor_from_image(cursor_image_playfield);
@@ -1078,6 +1070,64 @@ inline Key GetEventKey(KeyEvent *event, boolean with_modifiers)
 #endif
 }
 
+inline KeyMod HandleKeyModState(Key key, int key_status)
+{
+#if !defined(TARGET_SDL)
+  static KeyMod current_modifiers = KMOD_None;
+
+  if (key != KSYM_UNDEFINED)   /* new key => check for modifier key change */
+  {
+    KeyMod new_modifier = KMOD_None;
+
+    switch(key)
+    {
+      case KSYM_Shift_L:
+       new_modifier = KMOD_Shift_L;
+       break;
+      case KSYM_Shift_R:
+       new_modifier = KMOD_Shift_R;
+       break;
+      case KSYM_Control_L:
+       new_modifier = KMOD_Control_L;
+       break;
+      case KSYM_Control_R:
+       new_modifier = KMOD_Control_R;
+       break;
+      case KSYM_Meta_L:
+       new_modifier = KMOD_Meta_L;
+       break;
+      case KSYM_Meta_R:
+       new_modifier = KMOD_Meta_R;
+       break;
+      case KSYM_Alt_L:
+       new_modifier = KMOD_Alt_L;
+       break;
+      case KSYM_Alt_R:
+       new_modifier = KMOD_Alt_R;
+       break;
+      default:
+       break;
+    }
+
+    if (key_status == KEY_PRESSED)
+      current_modifiers |= new_modifier;
+    else
+      current_modifiers &= ~new_modifier;
+  }
+
+  return current_modifiers;
+#endif
+}
+
+inline KeyMod GetKeyModState()
+{
+#if defined(TARGET_SDL)
+  return (KeyMod)SDL_GetModState();
+#else
+  return HandleKeyModState(KSYM_UNDEFINED, 0);
+#endif
+}
+
 inline boolean CheckCloseWindowEvent(ClientMessageEvent *event)
 {
   if (event->type != EVENT_CLIENTMESSAGE)