X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=bfa9966bb0eb742f7f370247ffb181f86dede637;hb=720b0a62c8af0585e9517ed7a98ea336304c02e4;hp=8e4321011d0aaa0242ec3e4df0b5b1f71cbae363;hpb=34ed45c14d923459972fecf7a3b46f44d7e03670;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index 8e432101..bfa9966b 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -70,7 +70,7 @@ void InitProgramInfo(char *argv0, char *userdata_directory, char *program_title, char *window_title, char *icon_title, char *x11_icon_filename, char *x11_iconmask_filename, - char *msdos_pointer_filename, + char *msdos_cursor_filename, char *cookie_prefix, char *filename_prefix, int program_version) { @@ -83,7 +83,7 @@ void InitProgramInfo(char *argv0, program.icon_title = icon_title; program.x11_icon_filename = x11_icon_filename; program.x11_iconmask_filename = x11_iconmask_filename; - program.msdos_pointer_filename = msdos_pointer_filename; + program.msdos_cursor_filename = msdos_cursor_filename; program.cookie_prefix = cookie_prefix; program.filename_prefix = filename_prefix; @@ -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(); @@ -275,7 +275,7 @@ inline static int GetRealDepth(int depth) inline static void sysFillRectangle(Bitmap *bitmap, int x, int y, int width, int height, Pixel color) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLFillRectangle(bitmap, x, y, width, height, color); #else X11FillRectangle(bitmap, x, y, width, height, color); @@ -286,12 +286,12 @@ inline static void sysCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, int dst_x, int dst_y, int mask_mode) { -#ifdef TARGET_SDL - SDLCopyArea(src_bitmap, dst_bitmap, - src_x, src_y, width, height, dst_x, dst_y, mask_mode); +#if defined(TARGET_SDL) + SDLCopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, + dst_x, dst_y, mask_mode); #else - X11CopyArea(src_bitmap, dst_bitmap, - src_x, src_y, width, height, dst_x, dst_y, mask_mode); + X11CopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, + dst_x, dst_y, mask_mode); #endif } @@ -326,7 +326,7 @@ inline void InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, video.fullscreen_available = FULLSCREEN_STATUS; video.fullscreen_enabled = FALSE; -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLInitVideoBuffer(backbuffer, window, fullscreen); #else X11InitVideoBuffer(backbuffer, window); @@ -335,7 +335,7 @@ inline void InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, inline Bitmap *CreateBitmapStruct(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return checked_calloc(sizeof(struct SDLSurfaceInfo)); #else return checked_calloc(sizeof(struct X11DrawableInfo)); @@ -347,7 +347,7 @@ inline Bitmap *CreateBitmap(int width, int height, int depth) Bitmap *new_bitmap = CreateBitmapStruct(); int real_depth = GetRealDepth(depth); -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLCreateBitmapContent(new_bitmap, width, height, real_depth); #else X11CreateBitmapContent(new_bitmap, width, height, real_depth); @@ -364,7 +364,7 @@ inline static void FreeBitmapPointers(Bitmap *bitmap) if (bitmap == NULL) return; -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLFreeBitmapPointers(bitmap); #else X11FreeBitmapPointers(bitmap); @@ -398,7 +398,7 @@ inline void FreeBitmap(Bitmap *bitmap) inline void CloseWindow(DrawWindow *window) { -#ifdef TARGET_X11 +#if defined(TARGET_X11) if (window->drawable) { XUnmapWindow(display, window->drawable); @@ -463,7 +463,7 @@ inline void FillRectangle(Bitmap *bitmap, int x, int y, int width, int height, inline void ClearRectangle(Bitmap *bitmap, int x, int y, int width, int height) { - FillRectangle(bitmap, x, y, width, height, BlackPixel(display, screen)); + FillRectangle(bitmap, x, y, width, height, BLACK_PIXEL); } inline void ClearRectangleOnBackground(Bitmap *bitmap, int x, int y, @@ -483,7 +483,7 @@ static GC last_clip_gc = 0; /* needed for XCopyArea() through clip mask */ inline void SetClipMask(Bitmap *bitmap, GC clip_gc, Pixmap clip_pixmap) { -#ifdef TARGET_X11 +#if defined(TARGET_X11) if (clip_gc) { bitmap->clip_gc = clip_gc; @@ -497,7 +497,7 @@ inline void SetClipMask(Bitmap *bitmap, GC clip_gc, Pixmap clip_pixmap) inline void SetClipOrigin(Bitmap *bitmap, GC clip_gc, int clip_x, int clip_y) { -#ifdef TARGET_X11 +#if defined(TARGET_X11) if (clip_gc) { bitmap->clip_gc = clip_gc; @@ -546,11 +546,10 @@ inline void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap, inline void DrawSimpleWhiteLine(Bitmap *bitmap, int from_x, int from_y, int to_x, int to_y) { -#ifdef TARGET_SDL - SDLDrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, 0xffffff); +#if defined(TARGET_SDL) + SDLDrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, WHITE_PIXEL); #else - XSetForeground(display, bitmap->gc, WhitePixel(display, screen)); - XDrawLine(display, bitmap->drawable, bitmap->gc, from_x, from_y, to_x, to_y); + X11DrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, WHITE_PIXEL); #endif } @@ -608,6 +607,10 @@ inline void DrawLines(Bitmap *bitmap, struct XY *points, int num_points, inline Pixel GetPixel(Bitmap *bitmap, int x, int y) { + if (x < 0 || x >= bitmap->width || + y < 0 || y >= bitmap->height) + return BLACK_PIXEL; + #if defined(TARGET_SDL) return SDLGetPixel(bitmap, x, y); #elif defined(TARGET_ALLEGRO) @@ -656,7 +659,7 @@ inline void SyncDisplay(void) inline void KeyboardAutoRepeatOn(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY / 2, SDL_DEFAULT_REPEAT_INTERVAL / 2); SDL_EnableUNICODE(1); @@ -668,7 +671,7 @@ inline void KeyboardAutoRepeatOn(void) inline void KeyboardAutoRepeatOff(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); SDL_EnableUNICODE(0); #else @@ -679,7 +682,7 @@ inline void KeyboardAutoRepeatOff(void) inline boolean PointerInWindow(DrawWindow *window) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return TRUE; #else Window root, child; @@ -696,7 +699,7 @@ inline boolean PointerInWindow(DrawWindow *window) inline boolean SetVideoMode(boolean fullscreen) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return SDLSetVideoMode(&backbuffer, fullscreen); #else boolean success = TRUE; @@ -717,7 +720,7 @@ inline boolean SetVideoMode(boolean fullscreen) inline boolean ChangeVideoModeIfNeeded(boolean fullscreen) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) if ((fullscreen && !video.fullscreen_enabled && video.fullscreen_available)|| (!fullscreen && video.fullscreen_enabled)) fullscreen = SetVideoMode(fullscreen); @@ -834,7 +837,7 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap) FreeBitmap(tmp_bitmap_2); FreeBitmap(tmp_bitmap_8); -#ifdef TARGET_SDL +#if defined(TARGET_SDL) src_bitmap->surface = tmp_bitmap->surface; tmp_bitmap->surface = NULL; #else @@ -848,6 +851,111 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap) } +/* ------------------------------------------------------------------------- */ +/* mouse pointer functions */ +/* ------------------------------------------------------------------------- */ + +/* XPM */ +static const char *cursor_image_playfield[] = +{ + /* width height num_colors chars_per_pixel */ + " 16 16 3 1", + + /* colors */ + "X c #000000", + ". c #ffffff", + " c None", + + /* 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; + 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 (y=0; y < cursor->width; y++) + { + for (x=0; x < cursor->height; x++) + { + 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[header_lines + y][x]) + { + case 'X': + cursor->data[i] |= bit_mask; + cursor->mask[i] |= bit_mask; + break; + + case '.': + cursor->mask[i] |= bit_mask; + break; + + case ' ': + break; + } + } + } + + sscanf(image[header_lines + y], "%d,%d", &cursor->hot_x, &cursor->hot_y); + + return cursor; +} + +void SetMouseCursor(int mode) +{ + static struct MouseCursorInfo *cursor_playfield = NULL; + + if (cursor_playfield == NULL) + cursor_playfield = get_cursor_from_image(cursor_image_playfield); + +#if defined(TARGET_SDL) + SDLSetMouseCursor(mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL); +#elif defined(TARGET_X11_NATIVE) + X11SetMouseCursor(mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL); +#endif +} + + /* ========================================================================= */ /* audio functions */ /* ========================================================================= */ @@ -908,7 +1016,7 @@ inline void SetAudioMode(boolean enabled) inline void InitEventFilter(EventFilter filter_function) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) /* set event filter to filter out certain events */ SDL_SetEventFilter(filter_function); #endif @@ -916,7 +1024,7 @@ inline void InitEventFilter(EventFilter filter_function) inline boolean PendingEvent(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return (SDL_PollEvent(NULL) ? TRUE : FALSE); #else return (XPending(display) ? TRUE : FALSE); @@ -925,7 +1033,7 @@ inline boolean PendingEvent(void) inline void NextEvent(Event *event) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLNextEvent(event); #else XNextEvent(display, event); @@ -934,7 +1042,7 @@ inline void NextEvent(Event *event) inline Key GetEventKey(KeyEvent *event, boolean with_modifiers) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) #if 0 printf("unicode == '%d', sym == '%d', mod == '0x%04x'\n", (int)event->keysym.unicode, @@ -962,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) @@ -987,7 +1153,7 @@ inline void InitJoysticks() { int i; -#ifdef NO_JOYSTICK +#if defined(NO_JOYSTICK) return; /* joysticks generally deactivated by compile-time directive */ #endif