aboutsummaryrefslogtreecommitdiff
path: root/modules/mod_wm/mod_wm.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mod_wm/mod_wm.c')
-rw-r--r--modules/mod_wm/mod_wm.c284
1 files changed, 284 insertions, 0 deletions
diff --git a/modules/mod_wm/mod_wm.c b/modules/mod_wm/mod_wm.c
new file mode 100644
index 0000000..f8ff8ea
--- /dev/null
+++ b/modules/mod_wm/mod_wm.c
@@ -0,0 +1,284 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ * Copyright © 2002-2006 Fenix Team (Fenix)
+ * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "bgddl.h"
+#include "bgdrtm.h"
+#include "xstrings.h"
+
+#include "libgrbase.h"
+#include "libvideo.h"
+
+#include <SDL.h>
+
+#if defined( WIN32 ) || ( __linux && ( defined( SDL_VIDEO_DRIVER_X11 ) ) )
+#include <SDL_syswm.h>
+#endif
+
+/* --------------------------------------------------------------------------- */
+/* Window Manager */
+/* --------------------------------------------------------------------------- */
+
+static int bgd_set_title( INSTANCE * my, int * params )
+{
+ gr_set_caption( ( char * )string_get( params[0] ) ) ;
+ return 1 ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int bgd_set_icon( INSTANCE * my, int * params )
+{
+ gr_set_icon( bitmap_get( params[0], params[1] ) );
+ return 1 ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int bgd_minimize( INSTANCE * my, int * params )
+{
+ return SDL_WM_IconifyWindow();
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int bgd_move_window( INSTANCE * my, int * params )
+{
+ int res = 0;
+ if ( full_screen ) return 0;
+
+#if defined( WIN32 ) || ( __linux && ( defined( SDL_VIDEO_DRIVER_X11 ) ) )
+ SDL_SysWMinfo wminfo ;
+
+ SDL_VERSION( &wminfo.version );
+ if ( SDL_GetWMInfo( &wminfo ) != 1 ) return 0 ;
+#endif
+
+#ifdef WIN32
+ /* Set the new window position */
+ res = SetWindowPos(
+ wminfo.window, // handle to window
+ HWND_NOTOPMOST, // Possibly will have no effect... it stays below top-most
+ params[0], // horizontal position
+ params[1], // vertical position
+ 0, // keep the old window width
+ 0, // keep the old window height
+ SWP_SHOWWINDOW | SWP_NOSIZE // Make it visible and retain size
+ ) ;
+#elif __linux
+#ifdef SDL_VIDEO_DRIVER_X11
+ Window root, parent, *children = NULL;
+ unsigned int children_count;
+
+ if ( wminfo.subsystem == SDL_SYSWM_X11 )
+ {
+ if ( XQueryTree( wminfo.info.x11.display, wminfo.info.x11.window, &root, &parent, &children, &children_count ) != BadWindow )
+ {
+ wminfo.info.x11.lock_func();
+ res = XMoveWindow( wminfo.info.x11.display, parent, params[0], params[1] );
+ XMapRaised(wminfo.info.x11.display, parent); /* Show Window */
+ wminfo.info.x11.unlock_func();
+ if ( children ) XFree( children );
+ }
+ }
+#endif
+#endif
+
+ // Missing BeOS & MAC support
+ return res ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int bgd_get_window_pos( INSTANCE * my, int * params )
+{
+ if ( full_screen ) return -1;
+
+#if defined( WIN32 ) || ( __linux && ( defined( SDL_VIDEO_DRIVER_X11 ) ) )
+ SDL_SysWMinfo wminfo ;
+
+ SDL_VERSION( &wminfo.version );
+ if ( SDL_GetWMInfo( &wminfo ) != 1 ) return -1 ;
+#endif
+
+#ifdef WIN32
+ RECT Rect;
+
+ if ( GetWindowRect( wminfo.window, &Rect ) )
+ {
+ if ( params[0] ) *(( int * )( params[0] ) ) = Rect.left;
+ if ( params[1] ) *(( int * )( params[1] ) ) = Rect.top;
+ }
+#elif __linux
+#ifdef SDL_VIDEO_DRIVER_X11
+ Window root, parent, *children = NULL;
+ unsigned int children_count;
+ XWindowAttributes wattr;
+ int res ;
+
+ wminfo.info.x11.lock_func();
+ if ( XQueryTree( wminfo.info.x11.display, wminfo.info.x11.window, &root, &parent, &children, &children_count ) != BadWindow )
+ {
+ if ( children ) XFree( children );
+
+ if ( XQueryTree( wminfo.info.x11.display, parent, &root, &parent, &children, &children_count ) != BadWindow )
+ {
+ if ( children ) XFree( children );
+
+ res = XGetWindowAttributes( wminfo.info.x11.display, parent, &wattr );
+ if ( res != BadDrawable && res != BadWindow )
+ {
+ if ( params[0] ) *(( int * )( params[0] ) ) = wattr.x;
+ if ( params[1] ) *(( int * )( params[1] ) ) = wattr.y;
+ }
+ }
+ }
+ wminfo.info.x11.unlock_func();
+#endif
+#endif
+
+ return 1 ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int bgd_get_window_size( INSTANCE * my, int * params )
+{
+#if defined( WIN32 ) || ( __linux && ( defined( SDL_VIDEO_DRIVER_X11 ) ) )
+ SDL_SysWMinfo wminfo ;
+
+ SDL_VERSION( &wminfo.version );
+ if ( SDL_GetWMInfo( &wminfo ) != 1 ) return -1 ;
+#endif
+
+#ifdef WIN32
+ RECT Rect;
+
+ if ( GetWindowRect( wminfo.window, &Rect ) )
+ {
+ if ( params[0] ) *(( int * )( params[0] ) ) = Rect.right - Rect.left;
+ if ( params[1] ) *(( int * )( params[1] ) ) = Rect.bottom - Rect.top;
+
+ if ( GetClientRect( wminfo.window, &Rect ) )
+ {
+ if ( params[2] ) *(( int * )( params[2] ) ) = Rect.right - Rect.left;
+ if ( params[3] ) *(( int * )( params[3] ) ) = Rect.bottom - Rect.top;
+ }
+ }
+#elif __linux
+#ifdef SDL_VIDEO_DRIVER_X11
+ int res ;
+ XWindowAttributes wattr;
+
+ Window root, parent, *children = NULL;
+ unsigned int children_count;
+
+ wminfo.info.x11.lock_func();
+ if ( XQueryTree( wminfo.info.x11.display, wminfo.info.x11.window, &root, &parent, &children, &children_count ) != BadWindow )
+ {
+ if ( children ) XFree( children );
+
+ res = XGetWindowAttributes( wminfo.info.x11.display, parent, &wattr );
+ if ( res != BadDrawable && res != BadWindow )
+ {
+ if ( params[2] ) *(( int * )( params[2] ) ) = wattr.width;
+ if ( params[3] ) *(( int * )( params[3] ) ) = wattr.height;
+
+ if ( XQueryTree( wminfo.info.x11.display, parent, &root, &parent, &children, &children_count ) != BadWindow )
+ {
+ if ( children ) XFree( children );
+
+ res = XGetWindowAttributes( wminfo.info.x11.display, parent, &wattr );
+ if ( res != BadDrawable && res != BadWindow )
+ {
+ if ( params[0] ) *(( int * )( params[0] ) ) = wattr.width;
+ if ( params[1] ) *(( int * )( params[1] ) ) = wattr.height;
+ }
+ }
+ }
+ }
+ wminfo.info.x11.unlock_func();
+#endif
+#endif
+
+ return 1 ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int bgd_get_desktop_size( INSTANCE * my, int * params )
+{
+#ifdef WIN32
+ RECT Rect;
+
+ if ( GetClientRect( GetDesktopWindow(), &Rect ) )
+ {
+ *(( int * )( params[0] ) ) = Rect.right - Rect.left;
+ *(( int * )( params[1] ) ) = Rect.bottom - Rect.top;
+ }
+#elif __linux
+#ifdef SDL_VIDEO_DRIVER_X11
+ int res ;
+ Window root, parent, *children = NULL;
+ XWindowAttributes wattr;
+ unsigned int children_count;
+
+ SDL_SysWMinfo wminfo ;
+
+ SDL_VERSION( &wminfo.version );
+ if ( SDL_GetWMInfo( &wminfo ) != 1 ) return -1 ;
+
+ wminfo.info.x11.lock_func();
+ if ( XQueryTree(wminfo.info.x11.display, wminfo.info.x11.window, &root, &parent, &children, &children_count ) != BadWindow )
+ {
+ if ( children ) XFree( children );
+
+ res = XGetWindowAttributes( wminfo.info.x11.display, root, &wattr );
+ if ( res != BadDrawable && res != BadWindow )
+ {
+ if ( params[0] ) *(( int * )( params[0] ) ) = wattr.width;
+ if ( params[1] ) *(( int * )( params[1] ) ) = wattr.height;
+ }
+ }
+ wminfo.info.x11.unlock_func();
+#endif
+#endif
+
+ return 1 ;
+}
+
+/* --------------------------------------------------------------------------- */
+/* exports */
+/* --------------------------------------------------------------------------- */
+
+#include "mod_wm_exports.h"
+
+/* --------------------------------------------------------------------------- */