OSDN Git Service

[Qt][OSD] Separate OSD (excepts VM dependented functions) to libCSPosd.so .
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 20 May 2016 18:05:18 +0000 (03:05 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 20 May 2016 18:05:18 +0000 (03:05 +0900)
17 files changed:
source/build-cmake/cmake/config_commonsource.cmake
source/build-cmake/config_build.sh
source/build-cmake/config_build_cross_win32.sh
source/build-cmake/config_build_mingw.sh
source/build-cmake/libCSPosd/CMakeLists.txt [new file with mode: 0644]
source/src/qt/CMakeLists.txt
source/src/qt/common/CMakeLists.txt
source/src/qt/osd.cpp
source/src/qt/osd.h
source/src/qt/osd_console.cpp
source/src/qt/osd_input.cpp
source/src/qt/osd_printer.cpp
source/src/qt/osd_screen.cpp
source/src/qt/osd_sound.cpp
source/src/qt/osd_types.h
source/src/qt/osd_video.cpp
source/src/qt/osd_wrapper.cpp [new file with mode: 0644]

index c99a23d..bf193fe 100644 (file)
@@ -137,7 +137,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../src/qt)
 if(WIN32)
 #  add_subdirectory(../../src/qt/gui qt/gui)
 endif()  
-add_subdirectory(../../src/qt qt/osd)
+#add_subdirectory(../../src/qt qt/osd)
 add_subdirectory(../../src common)
 add_subdirectory(../../src/vm vm/)
 
@@ -153,7 +153,6 @@ if(DEFINED VM_NAME)
 if(WIN32)
           set(LOCAL_LIBS 
                   common_emu
-#                 qt_gui
                    qt_${VM_NAME}
                   vm_${VM_NAME}
                   ${VM_APPEND_LIBS}
@@ -162,7 +161,6 @@ if(WIN32)
                   qt_osd
                   ${DEBUG_LIBS}
                   common_common
-#                 qt_gui
                   )
           else()
           set(LOCAL_LIBS     
@@ -172,7 +170,6 @@ if(WIN32)
                   ${VM_APPEND_LIBS}
                   vm_vm
                   ${FMGEN_LIB}
-                  qt_osd
                   ${DEBUG_LIBS}
                   common_common
                   )
@@ -192,7 +189,7 @@ set(BUNDLE_LIBS
 if(WIN32)
    set(BUNDLE_LIBS ${BUNDLE_LIBS})
 else()
-   set(BUNDLE_LIBS ${BUNDLE_LIBS} -lCSPgui)
+   set(BUNDLE_LIBS ${BUNDLE_LIBS} -lCSPosd -lCSPgui)
 endif()
 
 if(USE_QT_5)
index 82da9b0..67d1d15 100755 (executable)
@@ -39,6 +39,7 @@ esac
 
 # libCSPGui
 mkdir -p libCSPgui/build
+mkdir -p libCSPosd/build
 cd libCSPgui/build
     
 echo ${CMAKE_FLAGS1} ${CMAKE_FLAGS2}
@@ -61,7 +62,6 @@ ${CMAKE} -DCMAKE_C_COMPILER:STRING=${CCMAKE_CC}  \
         .. | tee -a make.log
 
 make clean
-    
 make ${MAKEFLAGS_GENERAL} 2>&1 | tee -a ./make.log
 case $? in
       0 ) sudo make install 2>&1 | tee -a ./make.log ;;
@@ -71,6 +71,38 @@ case $? in
 make clean
 cd ../..
 
+# libCSPosd
+cd libCSPosd/build
+    
+echo ${CMAKE_FLAGS1} ${CMAKE_FLAGS2}
+${CMAKE} -DCMAKE_C_COMPILER:STRING=${CCMAKE_CC}  \
+         -DCMAKE_CXX_COMPILER:STRING=${CCMAKE_CXX} \
+        "-DLIBCSP_INSTALL_DIR:STRING=${LIB_INSTALL}" \
+        ${CMAKE_FLAGS1} \
+        "${CMAKE_FLAGS2}=${MAKEFLAGS_LIB_CXX}" \
+        "${CMAKE_FLAGS3}=${MAKEFLAGS_LIB_CC}" \
+        ${CMAKE_APPENDFLAG} \
+        .. | tee make.log
+        
+${CMAKE} -DCMAKE_C_COMPILER:STRING=${CCMAKE_CC}  \
+        -DCMAKE_CXX_COMPILER:STRING=${CCMAKE_CXX} \
+        "-DLIBCSP_INSTALL_DIR:STRING=${LIB_INSTALL}" \
+        ${CMAKE_FLAGS1} \
+        "${CMAKE_FLAGS2}=${MAKEFLAGS_LIB_CXX}" \
+        "${CMAKE_FLAGS3}=${MAKEFLAGS_LIB_CC}" \
+        ${CMAKE_APPENDFLAG} \
+        .. | tee -a make.log
+
+make clean
+    
+make ${MAKEFLAGS_GENERAL} 2>&1 | tee -a ./make.log
+case $? in
+      0 ) sudo make install 2>&1 | tee -a ./make.log ;;
+      * ) exit $? ;;
+    esac
+    
+make clean
+cd ../..
 
 for SRCDATA in $@ ; do\
 
index 70411fb..7f45ecf 100755 (executable)
@@ -52,6 +52,8 @@ esac
 
 # libCSPGui
 mkdir -p libCSPgui/build-win32
+mkdir -p libCSPosd/build-win32
+
 cd libCSPgui/build-win32
     
 echo ${CMAKE_FLAGS1} ${CMAKE_FLAGS2}
@@ -86,6 +88,40 @@ make ${MAKEFLAGS_GENERAL} 2>&1 | tee -a ./make.log
 #make clean
 cd ../..
 
+#libCSPosd
+cd libCSPosd/build-win32
+echo ${CMAKE_FLAGS1} ${CMAKE_FLAGS2}
+${CMAKE} -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_SCRIPT} \
+       ${CMAKE_FLAGS1} \
+       "${CMAKE_FLAGS2}=${MAKEFLAGS_LIB_CXX}" \
+       "${CMAKE_FLAGS3}=${MAKEFLAGS_LIB_CC}" \
+       "-DUSE_SDL2=ON" \
+       ${CMAKE_APPENDFLAG} \
+       ${CMAKE_LINKFLAG} \
+       .. | tee make.log
+
+${CMAKE} ${CMAKE_FLAGS1} \
+       "${CMAKE_FLAGS2}=${MAKEFLAGS_LIB_CXX}" \
+       "${CMAKE_FLAGS3}=${MAKEFLAGS_LIB_CC}" \
+       "-DUSE_SDL2=ON" \
+       ${CMAKE_APPENDFLAG} \
+       ${CMAKE_LINKFLAG} \
+       .. | tee -a make.log
+       
+make clean
+    
+make ${MAKEFLAGS_GENERAL} 2>&1 | tee -a ./make.log
+#case $? in
+#      0 ) 
+#      cp ./qt/gui/libqt_gui.a ../../bin-win32/ 
+#      cp ./qt/gui/*.lib ../../bin-win32/ 
+#      cp ./qt/gui/*.dll ../../bin-win32/ 
+#      ;;
+#      * ) exit $? ;;
+#esac
+#make clean
+cd ../..
+
 for SRCDATA in $@ ; do\
 
     mkdir -p ${SRCDATA}/build-win32
@@ -123,5 +159,10 @@ done
 cd libCSPgui/build-win32
 make clean
 cd ../..
+
+cd libCSPosd/build-win32
+make clean
+cd ../..
+
 exit 0
 
index 78d5a8f..ac5c66e 100755 (executable)
@@ -44,6 +44,7 @@ case ${BUILD_TYPE} in
 esac
 #libCSPgui
 mkdir -p libCSPgui/build-win32
+mkdir -p libCSPosd/build-win32
 cd libCSPgui/build-win32
 echo ${CMAKE_FLAGS1} ${CMAKE_FLAGS2}
 ${CMAKE} -G "MinGW Makefiles" \
@@ -76,7 +77,40 @@ case $? in
       ;;
       * ) exit $? ;;
 esac
+#mingw32-make clean
+cd ../..
+
+#libCSPosd
+cd libCSPosd/build-win32
+echo ${CMAKE_FLAGS1} ${CMAKE_FLAGS2}
+${CMAKE} -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_SCRIPT} \
+       ${CMAKE_FLAGS1} \
+       "${CMAKE_FLAGS2}=${MAKEFLAGS_LIB_CXX}" \
+       "${CMAKE_FLAGS3}=${MAKEFLAGS_LIB_CC}" \
+       "-DUSE_SDL2=ON" \
+       ${CMAKE_APPENDFLAG} \
+       ${CMAKE_LINKFLAG} \
+       .. | tee make.log
+
+${CMAKE} ${CMAKE_FLAGS1} \
+       "${CMAKE_FLAGS2}=${MAKEFLAGS_LIB_CXX}" \
+       "${CMAKE_FLAGS3}=${MAKEFLAGS_LIB_CC}" \
+       "-DUSE_SDL2=ON" \
+       ${CMAKE_APPENDFLAG} \
+       ${CMAKE_LINKFLAG} \
+       .. | tee -a make.log
+       
 mingw32-make clean
+mingw32-make ${MAKEFLAGS_GENERAL} 2>&1 | tee -a ./make.log
+#case $? in
+#      0 ) 
+#      cp ./qt/gui/libqt_gui.a ../../bin-win32/ 
+#      cp ./qt/gui/*.lib ../../bin-win32/ 
+#      cp ./qt/gui/*.dll ../../bin-win32/ 
+#      ;;
+#      * ) exit $? ;;
+#esac
+#make clean
 cd ../..
 
 for SRCDATA in $@ ; do\
@@ -118,7 +152,10 @@ for SRCDATA in $@ ; do\
 done
 
 cd libCSPgui/build-win32
+mingw32-make clean
+cd ../..
 
+cd libCSPosd/build-win32
 mingw32-make clean
 cd ../..
 
diff --git a/source/build-cmake/libCSPosd/CMakeLists.txt b/source/build-cmake/libCSPosd/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1ca300b
--- /dev/null
@@ -0,0 +1,127 @@
+# Build Common Sourcecode Project, Agar.
+# (C) 2014 K.Ohta <whatisthis.sowhat@gmail.com>
+# This is part of , but license is apache 2.2,
+# this part was written only me.
+
+cmake_minimum_required (VERSION 2.8)
+cmake_policy(SET CMP0011 NEW)
+
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../cmake")
+
+project (libCSPgui)
+
+include(CheckFunctionExists)
+# Use cmake if enabled.
+  find_program(USE_CCACHE ccache)
+  if(USE_CCACHE)
+   SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+   SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
+  endif()
+  FIND_PACKAGE(Qt5Widgets REQUIRED)
+  FIND_PACKAGE(Qt5Core REQUIRED)
+  FIND_PACKAGE(Qt5Gui REQUIRED)
+  FIND_PACKAGE(Qt5OpenGL REQUIRED)
+  include_directories(${Qt5Widgets_INCLUDE_DIRS})
+  include_directories(${Qt5Core_INCLUDE_DIRS})
+  include_directories(${Qt5Gui_INCLUDE_DIRS})
+  include_directories(${Qt5OpenGL_INCLUDE_DIRS})
+  add_definitions(-D_USE_OPENGL -DUSE_OPENGL)
+if(USE_SOCKET)
+  FIND_PACKAGE(Qt5Network REQUIRED)
+  include_directories(${Qt5Network_INCLUDE_DIRS})
+endif()
+SET(USE_QT_5 ON)
+set(USE_QT5_4_APIS OFF CACHE BOOL "Build with Qt5.4 (or later) APIs if you can.")
+set(USE_GCC_OLD_ABI ON CACHE BOOL "Build with older GCC ABIs if you can.")
+set(USE_SDL2 ON CACHE BOOL "Build with libSDL2. DIsable is building with libSDL1.")
+
+add_definitions(-D_USE_QT5)
+
+if(USE_QT5_4_APIS)
+  add_definitions(-D_USE_QT_5_4)
+endif()
+
+if(USE_GCC_OLD_ABI)
+  add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
+else()
+  add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
+endif()
+
+SET(CMAKE_AUTOMOC OFF)
+SET(CMAKE_AUTORCC ON)
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+add_definitions(-D_USE_QT)
+add_definitions(-DUSE_QT)
+add_definitions(-DQT_MAJOR_VERSION=${Qt5Widgets_VERSION_MAJOR})
+add_definitions(-DQT_MINOR_VERSION=${Qt5Widgets_VERSION_MINOR})
+
+if(USE_OPENMP)
+  find_package(OpenMP)
+  include_directories(${OPENMP_INCLUDE_PATH})
+endif()
+
+find_package(Threads)
+include_directories(${THREADS_INCLUDE_PATH})
+
+include(FindPkgConfig)
+
+if(USE_SDL2)
+   if(CMAKE_CROSSCOMPILING)
+      include_directories(${SDL2_INCLUDE_DIRS})
+   else()
+      pkg_search_module(SDL2 REQUIRED sdl2)
+      include_directories(${SDL2_INCLUDE_DIRS})
+   endif()
+   set(SDL_LIBS ${SDL2_LIBRARIES})
+   add_definitions(-DUSE_SDL2)
+else()
+   if(CMAKE_CROSSCOMPILING)
+      include_directories(${SDL_INCLUDE_DIRS})
+      set(SDL_LIBS ${SDL_LIBRARIES})
+   else()
+      include(FindSDL)
+      #pkg_search_module(SDL REQUIRED sdl)
+      #include_directories(${SDL_INCLUDE_DIRS})
+      include_directories(${SDL_INCLUDE_DIR})
+      set(SDL_LIBS ${SDL_LIBRARY})
+   endif()
+endif()
+
+# GCC Only?
+if(CMAKE_COMPILER_IS_GNUCC) 
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flax-vector-conversions")
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCXX) 
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -flax-vector-conversions")
+endif()
+
+
+check_function_exists("nanosleep" HAVE_NANOSLEEP)
+if(NOT HAVE_NANOSLEEP)
+  check_library_exists("rt" "nanosleep" "" LIB_RT_HAS_NANOSLEEP)
+endif(NOT HAVE_NANOSLEEP)
+
+if(LIB_RT_HAS_NANOSLEEP)
+  add_target_library(${EXEC_TARGET} rt)
+endif(LIB_RT_HAS_NANOSLEEP)
+
+if(HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP)
+  add_definitions(-DHAVE_NANOSLEEP)
+endif(HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP)
+
+
+set(SRC_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../src)
+
+if(USE_QT_5)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
+endif()
+
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../src/qt/common)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../src/qt/gui)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../src/qt)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../src)
+add_subdirectory(../../src/qt qt/osd)
+
index 0630db8..663961f 100644 (file)
@@ -12,7 +12,7 @@ endif()
 #endif()
 
  
-add_library(qt_osd
+SET(s_qt_osd_srcs
          osd.cpp
          osd_screen.cpp
          osd_console.cpp
@@ -24,3 +24,24 @@ add_library(qt_osd
          ${s_qt_osd_headers_MOC}
 )
 
+if(WIN32)
+  include (GenerateExportHeader)
+
+  add_library(qt_osd
+    ${s_qt_osd_srcs}
+    ${s_qt_osd_headers_MOC}
+  )
+
+else()
+  add_library(CSPosd SHARED
+    ${s_qt_osd_srcs}
+    ${s_qt_osd_headers_MOC}
+  )
+  
+  set_target_properties(CSPosd PROPERTIES 
+     SOVERSION 1.0.0
+     VERSION 1.0.0
+  )
+  INSTALL(TARGETS CSPosd DESTINATION ${LIBCSP_INSTALL_DIR})
+endif()
+
index 97d3578..a349a3f 100644 (file)
@@ -20,6 +20,7 @@ set(QT_COMMON_BASE
          util_fd2.cpp
          util_bubble2.cpp
          util_main.cpp
+         ../osd_wrapper.cpp
 )
 
 if(USE_QT_5)
@@ -49,6 +50,7 @@ endif()
 if(WIN32)
  target_link_libraries(${EXEC_TARGET} 
  ${LOCAL_LIBS}
+ ${CMAKE_SOURCE_DIR}/../../build-cmake/libCSPgui/build-win32/qt/gui/libqt_osd.a
  ${CMAKE_SOURCE_DIR}/../../build-cmake/libCSPgui/build-win32/qt/gui/libqt_gui.a
  ${BUNDLE_LIBS} 
  ${CMAKE_SOURCE_DIR}/../../build-cmake/libCSPgui/build-win32/qt/gui/libqt_gui.a
index 8040d5f..a9046b7 100644 (file)
@@ -7,17 +7,18 @@
        [ Qt dependent ]
 */
 
-#include "emu.h"
+//#include "emu.h"
 #include <string>
 #include <QDateTime>
 #include <QDate>
 #include <QTime>
 #include <QString>
 #include <QObject>
-#include "emu_thread.h"
-#include "draw_thread.h"
+#include <QThread>
+
 #include "qt_gldraw.h"
 #include "agar_logger.h"
+#include "osd.h"
 
 OSD::OSD() : QThread(0)
 {
@@ -45,18 +46,6 @@ void OSD::set_parent_thread(EmuThreadClass *parent)
        parent_thread = parent;
 }
 
-void OSD::set_draw_thread(DrawThreadClass *handler)
-{
-       this->moveToThread(handler);
-       connect(this, SIGNAL(sig_update_screen(bitmap_t *)), handler, SLOT(do_update_screen(bitmap_t *)));
-       connect(this, SIGNAL(sig_save_screen(const char *)), glv, SLOT(do_save_frame_screen(const char *)));
-       connect(this, SIGNAL(sig_close_window()), parent_thread, SLOT(doExit()));
-       connect(this, SIGNAL(sig_resize_vm_screen(QImage *, int, int)), glv, SLOT(do_set_texture_size(QImage *, int, int)));
-       connect(this, SIGNAL(sig_console_input_string(QString)), parent_thread, SLOT(do_call_debugger_command(QString)));
-       connect(parent_thread, SIGNAL(sig_debugger_input(QString)), this, SLOT(do_set_input_string(QString)));
-       connect(parent_thread, SIGNAL(sig_quit_debugger()), this, SLOT(do_close_debugger_thread()));
-}
-
 void OSD::initialize(int rate, int samples)
 {
        // get module path
@@ -81,12 +70,8 @@ void OSD::initialize(int rate, int samples)
        initialize_printer();
        initialize_screen();
        initialize_sound(rate, samples);
-#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
-       initialize_video();
-#endif
-#ifdef USE_SOCKET
-       initialize_socket();
-#endif
+       if(get_use_movie_player() || get_use_video_capture()) initialize_video();
+       if(get_use_socket()) initialize_socket();
 }
 
 void OSD::release()
@@ -95,12 +80,8 @@ void OSD::release()
        release_printer();
        release_screen();
        release_sound();
-#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
-       release_video();
-#endif
-#ifdef USE_SOCKET
-       release_socket();
-#endif
+       if(get_use_movie_player() || get_use_video_capture()) release_video();
+       if(get_use_socket()) release_socket();
        //CoUninitialize();
 }
 
@@ -111,22 +92,22 @@ void OSD::power_off()
 
 void OSD::suspend()
 {
-#ifdef USE_MOVIE_PLAYER
-       if(now_movie_play && !now_movie_pause) {
-               pause_movie();
-               now_movie_pause = false;
+       if(get_use_movie_player()) {
+               if(now_movie_play && !now_movie_pause) {
+                       pause_movie();
+                       now_movie_pause = false;
+               }
        }
-#endif
        mute_sound();
 }
 
 void OSD::restore()
 {
-#ifdef USE_MOVIE_PLAYER
-       if(now_movie_play && !now_movie_pause) {
-               play_movie();
+       if(get_use_movie_player()) {
+               if(now_movie_play && !now_movie_pause) {
+                       play_movie();
+               }
        }
-#endif
 }
 
 _TCHAR* OSD::bios_path(const _TCHAR* file_name)
@@ -163,44 +144,10 @@ void OSD::create_date_file_name(_TCHAR *name, int length, const _TCHAR *extensio
 {
        QDateTime nowTime = QDateTime::currentDateTime();
        QString tmps = QString::fromUtf8("emu");
-       tmps = tmps + QString::fromUtf8(CONFIG_NAME);
+       tmps = tmps + get_vm_config_name();
        tmps = tmps + QString::fromUtf8("_");
        tmps = tmps + nowTime.toString(QString::fromUtf8("yyyy-MM-dd_hh-mm-ss.zzz."));
        tmps = tmps + QString::fromUtf8(extension);
        snprintf(name, length, _T("%s"), tmps.toLocal8Bit().constData());
 }
 
-void OSD::lock_vm(void)
-{
-       locked_vm = true;
-       if(parent_thread != NULL) { 
-               if(!parent_thread->now_debugging()) VMSemaphore->acquire(1);
-       } else {
-               VMSemaphore->acquire(1);
-       }
-}
-
-void OSD::unlock_vm(void)
-{
-       if(parent_thread != NULL) { 
-               if(!parent_thread->now_debugging()) VMSemaphore->release(1);
-       } else {
-               VMSemaphore->release(1);
-       }
-       locked_vm = false;
-}
-
-bool OSD::is_vm_locked(void)
-{
-       return locked_vm;
-}
-
-void OSD::force_unlock_vm(void)
-{
-       if(parent_thread == NULL) {
-               while(VMSemaphore->available() < 1) VMSemaphore->release(1);
-               return;
-       }
-       if(parent_thread->now_debugging()) return;
-       while(VMSemaphore->available() < 1) VMSemaphore->release(1);
-}
index bbec39d..38d19c6 100644 (file)
 #if !defined(Q_OS_WIN32)
 #include "qt_input.h"
 #endif
-//#ifdef USE_SOCKET
 #define SOCKET_MAX 4
 #define SOCKET_BUFFER_MAX 0x100000
-//#endif
 #include "osd_types.h"
 
 
@@ -67,8 +65,6 @@ class OSD : public QThread
 {
        Q_OBJECT
 protected:
-//     VM* vm;
-//     EMU* emu;
        EmuThreadClass *parent_thread;
        QSemaphore *VMSemaphore;
        QSemaphore *DebugSemaphore;
@@ -96,10 +92,10 @@ protected:
        uint8_t keycode_conv[256];
        uint8_t key_status[256];        // windows key code mapping
        uint8_t key_dik_prev[256];
-//#ifdef USE_SHIFT_NUMPAD_KEY
        uint8_t key_converted[256];
        bool key_shift_pressed, key_shift_released;
-//#endif
+
+
        uint32_t modkey_status;
        bool lost_focus;
        uint32_t joy_status[4]; // joystick #1, #2 (b0 = up, b1 = down, b2 = left, b3 = right, b4- = buttons
@@ -122,9 +118,8 @@ protected:
        void release_screen();
        void initialize_screen_buffer(bitmap_t *buffer, int width, int height, int mode);
        void release_screen_buffer(bitmap_t *buffer);
-//#ifdef USE_SCREEN_ROTATE
        void rotate_screen_buffer(bitmap_t *source, bitmap_t *dest);
-//#endif
+       
        void stretch_screen_buffer(bitmap_t *source, bitmap_t *dest);
        int add_video_frames();
        
@@ -189,7 +184,6 @@ protected:
 #endif
        SDL_AudioSpec snd_spec_req, snd_spec_presented;
        
-//#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
        // video device
        void initialize_video();
        void release_video();
@@ -214,25 +208,22 @@ protected:
        bitmap_t dshow_screen_buffer;
        int direct_show_width, direct_show_height;
        bool direct_show_mute[2];
-//#endif
-//#ifdef USE_MOVIE_PLAYER
+
        double movie_frame_rate;
        int movie_sound_rate;
-//#endif
-//#ifdef USE_VIDEO_CAPTURE
+
        void enum_capture_devs();
        bool connect_capture_dev(int index, bool pin);
        int cur_capture_dev_index;
        int num_capture_devs;
        _TCHAR capture_dev_name[MAX_CAPTURE_DEVS][256];
-//#endif
+
        _TCHAR prn_file_name[_MAX_PATH];
        FILEIO *prn_fio;
        int prn_data, prn_wait_frames;
        bool prn_strobe;
 
        // socket
-//#ifdef USE_SOCKET
        void initialize_socket();
        void release_socket();
        
@@ -242,8 +233,33 @@ protected:
        int socket_delay[SOCKET_MAX];
        char recv_buffer[SOCKET_MAX][SOCKET_BUFFER_MAX];
        int recv_r_ptr[SOCKET_MAX], recv_w_ptr[SOCKET_MAX];
-//#endif
-       
+
+       // wrapper
+       void vm_draw_screen(void);
+       double vm_frame_rate(void);
+       Sint16* create_sound(int *extra_frames);
+       bool get_use_socket(void);
+       bool get_support_variable_timing(void);
+       bool get_notify_key_down(void);
+       bool get_notify_key_down_lr_shift(void);
+       bool get_notify_key_down_lr_control(void);
+       bool get_notify_key_down_lr_menu(void);
+       bool get_use_shift_numpad_key(void);
+       bool get_use_auto_key(void);
+       bool get_dont_keeep_key_pressed(void);
+       bool get_one_board_micro_computer(void);
+       bool get_use_screen_rotate(void);
+       bool get_use_movie_player(void);
+       bool get_use_video_capture(void);
+       void vm_key_down(int code, bool flag);
+       void vm_key_up(int code);
+       void vm_reset(void);
+       void update_buttons(void);
+       QString get_vm_config_name(void);
+       int get_screen_width(void);
+       int get_screen_height(void);
+       int get_vm_buttons_code(int num);
+
 public:
        OSD();
        ~OSD();
@@ -254,9 +270,7 @@ public:
        class Ui_MainWindow *main_window_handle;
        GLDrawClass *glv;
        int host_cpus;
-//#ifdef USE_AUTO_KEY
        bool now_auto_key;
-//#endif       
        
        void initialize(int rate, int samples);
        void release();
@@ -292,9 +306,8 @@ public:
        {
                lost_focus = true;
        }
-//#ifdef ONE_BOARD_MICRO_COMPUTER
        void press_button(int num);
-//#endif
+
 # if !defined(Q_OS_WIN) && !defined(Q_OS_CYGWIN)
        uint16_t GetAsyncKeyState(uint32_t vk);  // Win32 GetAsyncKeyState() wrappeer.
 # endif
@@ -393,22 +406,17 @@ public:
        }
        scrntype_t* get_vm_screen_buffer(int y);
        int draw_screen();
-//#ifdef ONE_BOARD_MICRO_COMPUTER
        void reload_bitmap()
        {
                first_invalidate = true;
        }
-//#endif
        void capture_screen();
        bool start_record_video(int fps);
        void stop_record_video();
        void restart_record_video();
        void add_extra_frames(int extra_frames);
        bool now_record_video;
-//#ifdef USE_CRT_FILTER
        bool screen_skip_line;
-//#endif
-
        // common sound
        void update_sound(int* extra_frames);
        void mute_sound();
@@ -418,12 +426,9 @@ public:
        void restart_record_sound();
        bool now_record_sound;
        
-//#if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
        // common video device
        void get_video_buffer();
        void mute_video_dev(bool l, bool r);
-//#endif
-//#ifdef USE_MOVIE_PLAYER
        bool open_movie_file(const _TCHAR* file_path);
        void close_movie_file();
        void play_movie();
@@ -440,8 +445,6 @@ public:
        void set_cur_movie_frame(int frame, bool relative);
        uint32_t get_cur_movie_frame();
        bool now_movie_play, now_movie_pause;
-//#endif
-//#ifdef USE_VIDEO_CAPTURE
        int get_cur_capture_dev_index()
        {
                return cur_capture_dev_index;
@@ -460,10 +463,8 @@ public:
        void show_capture_dev_pin();
        void show_capture_dev_source();
        void set_capture_dev_channel(int ch);
-//#endif
        
        // common printer
-//#ifdef USE_PRINTER
        void create_bitmap(bitmap_t *bitmap, int width, int height);
        void release_bitmap(bitmap_t *bitmap);
        void create_font(font_t *font, const _TCHAR *family, int width, int height, int rotate, bool bold, bool italic);
@@ -480,11 +481,9 @@ public:
        void draw_point_to_bitmap(bitmap_t *bitmap, int x, int y, uint8_t r, uint8_t g, uint8_t b);
 
        void stretch_bitmap(bitmap_t *dest, int dest_x, int dest_y, int dest_width, int dest_height, bitmap_t *source, int source_x, int source_y, int source_width, int source_height);
-//#endif
        void write_bitmap_to_file(bitmap_t *bitmap, const _TCHAR *file_path);
 
        // common socket
-//#ifdef USE_SOCKET
        int get_socket(int ch)
        {
                return soc[ch];
@@ -501,20 +500,21 @@ public:
        void send_socket_data_udp(int ch, uint32_t ipaddr, int port);
        void send_socket_data(int ch);
        void recv_socket_data(int ch);
-//#endif
 
        // win32 dependent
        void update_screen();
        void set_parent_thread(EmuThreadClass *parent);
        EmuThreadClass *get_parent_handler();
-       void set_draw_thread(DrawThreadClass *handler);
+
        _TCHAR *console_input_string(void);
        void clear_console_input_string(void);
+       // Wrapper
        void lock_vm(void);
        void unlock_vm(void);
        void force_unlock_vm(void);
        bool is_vm_locked(void);
-
+       void set_draw_thread(DrawThreadClass *handler);
+       
 public slots:
        void do_write_inputdata(QString s);
        void do_set_input_string(QString s);
index aae67b4..509dd50 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "emu.h"
 #include "fifo.h"
-#include "emu_thread.h"
+//#include "emu_thread.h"
 #include "emu.h"
 #include <QString>
 
@@ -140,8 +140,5 @@ void OSD::close_debugger_console()
 
 void OSD::do_close_debugger_thread()
 {
-#if defined(USE_DEBUGGER)
-               emit sig_debugger_finished();
-               //}
-#endif 
+       emit sig_debugger_finished();
 }
index 6de886c..426819c 100644 (file)
 #include <QApplication>
 #include <SDL.h>
 
-#include "../emu.h"
+//#include "../emu.h"
 #include "../fifo.h"
-#include "fileio.h"
+#include "../fileio.h"
+//#include "osd.h"
 
 #include "qt_input.h"
 #include "qt_gldraw.h"
 #include "qt_main.h"
 
-#include "mainwidget.h"
+#include "osd.h"
+//#include "mainwidget.h"
 #include "agar_logger.h"
 #include "dropdown_keyset.h"
 
-#ifdef NOTIFY_KEY_DOWN_LR_SHIFT
-#define VK_SHIFT_TEMP  VK_LSHIFT
-#else
-#define VK_SHIFT_TEMP  VK_SHIFT
-#endif
 #define KEY_KEEP_FRAMES        3
 
-#ifdef USE_SHIFT_NUMPAD_KEY
 static const int numpad_table[256] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -50,7 +46,6 @@ static const int numpad_table[256] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
-#endif
 
 
 void OSD::initialize_input()
@@ -61,8 +56,8 @@ void OSD::initialize_input()
        memset(mouse_status, 0, sizeof(mouse_status));
        // mouse emulation is disenabled
        mouse_enabled = false;
-       mouse_ptrx = mouse_oldx = SCREEN_WIDTH / 2;
-       mouse_ptry = mouse_oldy = SCREEN_HEIGHT / 2;
+       mouse_ptrx = mouse_oldx = get_screen_width() / 2;
+       mouse_ptry = mouse_oldy = get_screen_height() / 2;
        // initialize keycode convert table
        FILEIO* fio = new FILEIO();
        if(fio->Fopen(bios_path(_T("keycode.cfg")), FILEIO_READ_BINARY)) {
@@ -74,15 +69,11 @@ void OSD::initialize_input()
                }
        }
        delete fio;
-#ifdef USE_AUTO_KEY
        now_auto_key = false;
-#endif 
        
-#ifdef USE_SHIFT_NUMPAD_KEY
        // initialize shift+numpad conversion
        memset(key_converted, 0, sizeof(key_converted));
        key_shift_pressed = key_shift_released = false;
-#endif
        lost_focus = false;
 }
 
@@ -108,65 +99,53 @@ void OSD::update_input()
        int i_c = 0;;
        bool press_flag = false;
        bool release_flag = false;
-#ifdef USE_SHIFT_NUMPAD_KEY
-       //update numpad key status
-       if(key_shift_pressed && !key_shift_released) {
-               if(key_status[VK_SHIFT] == 0) {
-                       // shift key is newly pressed
-                       key_status[VK_SHIFT] = 0x80;
-# ifdef NOTIFY_KEY_DOWN
-                       vm->key_down(VK_SHIFT, false);
-# endif
-               }
-       } else if(!key_shift_pressed && key_shift_released) {
-               if(key_status[VK_SHIFT] != 0) {
-                       // shift key is newly released
-                       key_status[VK_SHIFT] = 0;
-# ifdef NOTIFY_KEY_DOWN
-                       vm->key_up(VK_SHIFT);
-# endif
-                       // check l/r shift
-                       if(!(GetAsyncKeyState(VK_LSHIFT) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
-                       if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
-               }
-               if(key_status[VK_LSHIFT] != 0) {
+       if(get_use_shift_numpad_key()) {
+               //update numpad key status
+               if(key_shift_pressed && !key_shift_released) {
+                       if(key_status[VK_SHIFT] == 0) {
+                               // shift key is newly pressed
+                               key_status[VK_SHIFT] = 0x80;
+                               if(this->get_notify_key_down()) vm_key_down(VK_SHIFT, false);
+                       }
+               } else if(!key_shift_pressed && key_shift_released) {
+                       if(key_status[VK_SHIFT] != 0) {
                        // shift key is newly released
-                       key_status[VK_LSHIFT] = 0;
-# ifdef NOTIFY_KEY_DOWN
-                       vm->key_up(VK_LSHIFT);
-# endif
+                               key_status[VK_SHIFT] = 0;
+                               if(this->get_notify_key_down()) vm_key_up(VK_SHIFT);
+                               // check l/r shift
+                               if(!(GetAsyncKeyState(VK_LSHIFT) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+                               if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+                       }
+                       if(key_status[VK_LSHIFT] != 0) {
+                               // shift key is newly released
+                               key_status[VK_LSHIFT] = 0;
+                       if(this->get_notify_key_down()) vm_key_up(VK_LSHIFT);
                        // check l/r shift
                        if(!(GetAsyncKeyState(VK_LSHIFT) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+                       }
+                       if(key_status[VK_RSHIFT] != 0) {
+                               // shift key is newly released
+                               key_status[VK_RSHIFT] = 0;
+                               if(this->get_notify_key_down()) vm_key_up(VK_RSHIFT);
+                               // check l/r shift
+                               if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+                       }
                }
-               if(key_status[VK_RSHIFT] != 0) {
-                       // shift key is newly released
-                       key_status[VK_RSHIFT] = 0;
-# ifdef NOTIFY_KEY_DOWN
-                       vm->key_up(VK_RSHIFT);
-# endif
-                       // check l/r shift
-                       if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
-               }
+               key_shift_pressed = key_shift_released = false;
        }
-       key_shift_pressed = key_shift_released = false;
-#endif
            
        // release keys
-#ifdef USE_AUTO_KEY
        if(lost_focus && !now_auto_key) {
-#else
-       if(lost_focus) {
-#endif
                // we lost key focus so release all pressed keys
                for(int i = 0; i < 256; i++) {
                        if(key_status[i] & 0x80) {
                                key_status[i] &= 0x7f;
                                release_flag = true;
-#ifdef NOTIFY_KEY_DOWN
-                               if(!key_status[i]) {
-                                       vm->key_up(i);
+                               if(this->get_notify_key_down()) {
+                                       if(!key_status[i]) {
+                                               vm_key_up(i);
+                                       }
                                }
-#endif
                        }
                }
        } else {
@@ -174,37 +153,17 @@ void OSD::update_input()
                        if(key_status[i] & 0x7f) {
                                key_status[i] = (key_status[i] & 0x80) | ((key_status[i] & 0x7f) - 1);
                                press_flag = true;
-#ifdef NOTIFY_KEY_DOWN
-                               if(!key_status[i]) {
-                                       vm->key_up(i);
+                               if(this->get_notify_key_down()) {
+                                       if(!key_status[i]) {
+                                               vm_key_up(i);
+                                       }
                                }
-#endif
                        }
                }
        }
        lost_focus = false;
 
-#if defined(MAX_BUTTONS)
-       if(!press_flag && !release_flag) {
-               int ii;
-               ii = 0;
-               for(ii = 0; vm_buttons[ii].code != 0x00; ii++) { 
-                       if((mouse_ptrx >= vm_buttons[ii].x) && (mouse_ptrx < (vm_buttons[ii].x + vm_buttons[ii].width))) {
-                               if((mouse_ptry >= vm_buttons[ii].y) && (mouse_ptry < (vm_buttons[ii].y + vm_buttons[ii].height))) {
-                                       if((key_status[vm_buttons[ii].code] & 0x7f) == 0) this->press_button(ii);
-                               }
-                       }
-               }
-               if((mouse_ptrx >= vm_buttons[ii].x) && (mouse_ptrx < (vm_buttons[ii].x + vm_buttons[ii].width))) {
-                       if((mouse_ptry >= vm_buttons[ii].y) && (mouse_ptry < (vm_buttons[ii].y + vm_buttons[ii].height))) {
-                               this->press_button(ii);
-                       }
-               }
-               mouse_ptrx = mouse_ptry = 0;
-       }
-       //return;
-#endif                 
-               
+       update_buttons();
        // update mouse status
        if(mouse_enabled) {
                bool hid = false;
@@ -251,18 +210,18 @@ void OSD::key_down(int code, bool repeat)
                        return;
                }
        }
-#ifdef USE_SHIFT_NUMPAD_KEY
-       if(code == VK_LSHIFT) {
-               key_shift_pressed = true;
-                       return;
-       } else if(numpad_table[code] != 0) {
-               if(key_shift_pressed || key_shift_released) {
-                       key_converted[code] = 1;
+       if(get_use_shift_numpad_key()) {
+               if(code == VK_LSHIFT) {
                        key_shift_pressed = true;
-                       code = numpad_table[code];
+                       return;
+               } else if(numpad_table[code] != 0) {
+                       if(key_shift_pressed || key_shift_released) {
+                               key_converted[code] = 1;
+                               key_shift_pressed = true;
+                               code = numpad_table[code];
+                       }
                }
        }
-#endif
        key_down_native(code, repeat);
 }
 
@@ -293,16 +252,16 @@ void OSD::key_up(int code)
                        return;
                }
        }
-#ifdef USE_SHIFT_NUMPAD_KEY
-       if(code == VK_LSHIFT) {
-               key_shift_pressed = false;
-               key_shift_released = true;
-               return;
-       } else if(key_converted[code] != 0) {
-               key_converted[code] = 0;
-               code = numpad_table[code];
+       if(get_use_shift_numpad_key()) {
+               if(code == VK_LSHIFT) {
+                       key_shift_pressed = false;
+                       key_shift_released = true;
+                       return;
+               } else if(key_converted[code] != 0) {
+                       key_converted[code] = 0;
+                       code = numpad_table[code];
+               }
        }
-#endif
        key_up_native(code);
 }
 
@@ -321,62 +280,55 @@ void OSD::key_down_native(int code, bool repeat)
                code = VK_KANJI;
                keep_frames = true;
        }
-       //if(!(code == VK_LSHIFT || code == VK_RSHIFT || code == VK_LCONTROL || code == VK_RCONTROL || code == VK_LMENU || code == VK_RMENU)) {
-               code = keycode_conv[code];
-               //}
+       code = keycode_conv[code];
        
-#ifdef DONT_KEEEP_KEY_PRESSED
-       if(!(code == VK_LSHIFT || code == VK_RSHIFT || code == VK_LCONTROL || code == VK_RCONTROL || code == VK_LMENU || code == VK_RMENU)) {
-               key_status[code] = KEY_KEEP_FRAMES;
-       } else
-#endif
-       key_status[code] = keep_frames ? KEY_KEEP_FRAMES : 0x80;
-       
-#ifdef NOTIFY_KEY_DOWN
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
+       if(get_dont_keeep_key_pressed()) {
+               if(!(code == VK_LSHIFT || code == VK_RSHIFT || code == VK_LCONTROL || code == VK_RCONTROL || code == VK_LMENU || code == VK_RMENU)) {
+                       key_status[code] = KEY_KEEP_FRAMES;
+               } else {
+                       key_status[code] = keep_frames ? KEY_KEEP_FRAMES : 0x80;
+               }
+       } else {
+               key_status[code] = keep_frames ? KEY_KEEP_FRAMES : 0x80;
+       }
+
        uint8_t prev_shift = key_status[VK_SHIFT];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
        uint8_t prev_control = key_status[VK_CONTROL];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
        uint8_t prev_menu = key_status[VK_MENU];
-#endif
-#endif
        key_status[VK_SHIFT] = key_status[VK_LSHIFT] | key_status[VK_RSHIFT];
        key_status[VK_CONTROL] = key_status[VK_LCONTROL] | key_status[VK_RCONTROL];
        key_status[VK_MENU] = key_status[VK_LMENU] | key_status[VK_RMENU];
        
-#ifdef NOTIFY_KEY_DOWN
-       if(keep_frames) {
-               repeat = false;
-       }
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
-       if(code == VK_LSHIFT || code == VK_RSHIFT) {
-               if(prev_shift == 0 && key_status[VK_SHIFT] != 0) {
-                       vm->key_down(VK_SHIFT, repeat);
+       if(get_notify_key_down()) {
+               if(keep_frames) {
+                       repeat = false;
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
-       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
-               if(prev_control == 0 && key_status[VK_CONTROL] != 0) {
-                       vm->key_down(VK_CONTROL, repeat);
+               if(!get_notify_key_down_lr_shift()) {
+                       if(code == VK_LSHIFT || code == VK_RSHIFT) {
+                               if(prev_shift == 0 && key_status[VK_SHIFT] != 0) {
+                                       vm_key_down(VK_SHIFT, repeat);
+                               }
+                               return;
+                       }
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
-       if(code == VK_LMENU|| code == VK_RMENU) {
-               if(prev_menu == 0 && key_status[VK_MENU] != 0) {
-                       vm->key_down(VK_MENU, repeat);
+               if(!get_notify_key_down_lr_control()) {
+                       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
+                               if(prev_control == 0 && key_status[VK_CONTROL] != 0) {
+                                       vm_key_down(VK_CONTROL, repeat);
+                               }
+                               return;
+                       }
                }
-               return;
+               if(!get_notify_key_down_lr_menu()) {
+                       if(code == VK_LMENU|| code == VK_RMENU) {
+                               if(prev_menu == 0 && key_status[VK_MENU] != 0) {
+                                       vm_key_down(VK_MENU, repeat);
+                               }
+                               return;
+                       }
+               }
+               vm_key_down(code, repeat);
        }
-#endif
-       vm->key_down(code, repeat);
-#endif
 }
 
 void OSD::key_up_native(int code)
@@ -391,48 +343,41 @@ void OSD::key_up_native(int code)
                return;
        }
        
-#ifdef NOTIFY_KEY_DOWN
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
        uint8_t prev_shift = key_status[VK_SHIFT];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
        uint8_t prev_control = key_status[VK_CONTROL];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
        uint8_t prev_menu = key_status[VK_MENU];
-#endif
-#endif
        key_status[VK_SHIFT] = key_status[VK_LSHIFT] | key_status[VK_RSHIFT];
        key_status[VK_CONTROL] = key_status[VK_LCONTROL] | key_status[VK_RCONTROL];
        key_status[VK_MENU] = key_status[VK_LMENU] | key_status[VK_RMENU];
        
-#ifdef NOTIFY_KEY_DOWN
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
-       if(code == VK_LSHIFT || code == VK_RSHIFT) {
-               if(prev_shift != 0 && key_status[VK_SHIFT] == 0) {
-                       vm->key_up(VK_SHIFT);
+
+       if(get_notify_key_down()) {
+               if(!get_notify_key_down_lr_shift()) {
+                       if(code == VK_LSHIFT || code == VK_RSHIFT) {
+                               if(prev_shift != 0 && key_status[VK_SHIFT] == 0) {
+                                       vm_key_up(VK_SHIFT);
+                               }
+                               return;
+                       }
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
-       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
-               if(prev_control != 0 && key_status[VK_CONTROL] == 0) {
-                       vm->key_up(VK_CONTROL);
+               if(!get_notify_key_down_lr_control()) {
+                       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
+                               if(prev_control != 0 && key_status[VK_CONTROL] == 0) {
+                                       vm_key_up(VK_CONTROL);
+                               }
+                               return;
+                       }
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
-       if(code == VK_LMENU || code == VK_RMENU) {
-               if(prev_menu != 0 && key_status[VK_MENU] == 0) {
-                       vm->key_up(VK_MENU);
+               if(!get_notify_key_down_lr_menu()) {
+                       if(code == VK_LMENU || code == VK_RMENU) {
+                               if(prev_menu != 0 && key_status[VK_MENU] == 0) {
+                                       vm_key_up(VK_MENU);
+                               }
+                               return;
+                       }
                }
-               return;
+               vm_key_up(code);
        }
-#endif
-       vm->key_up(code);
-#endif
 }
 
 void OSD::key_down_sub(int code, bool repeat)
@@ -453,58 +398,55 @@ void OSD::key_down_sub(int code, bool repeat)
                code = keycode_conv[code];
        }
        
-#ifdef DONT_KEEEP_KEY_PRESSED
-       if(!(code == VK_LSHIFT || code == VK_RSHIFT || code == VK_LCONTROL || code == VK_RCONTROL || code == VK_LMENU || code == VK_RMENU)) {
-               key_status[code] = KEY_KEEP_FRAMES;
-       } else
-#endif
-       key_status[code] = keep_frames ? KEY_KEEP_FRAMES : 0x80;
-       
-#ifdef NOTIFY_KEY_DOWN
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
+
+       if(get_dont_keeep_key_pressed()) {
+               if(!(code == VK_LSHIFT || code == VK_RSHIFT || code == VK_LCONTROL || code == VK_RCONTROL || code == VK_LMENU || code == VK_RMENU)) {
+                       key_status[code] = KEY_KEEP_FRAMES;
+               } else {
+                       key_status[code] = keep_frames ? KEY_KEEP_FRAMES : 0x80;
+               }
+       } else {
+               key_status[code] = keep_frames ? KEY_KEEP_FRAMES : 0x80;
+       }
+
        uint8_t prev_shift = key_status[VK_SHIFT];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
        uint8_t prev_control = key_status[VK_CONTROL];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
        uint8_t prev_menu = key_status[VK_MENU];
-#endif
-#endif
+       
        key_status[VK_SHIFT] = key_status[VK_LSHIFT] | key_status[VK_RSHIFT];
        key_status[VK_CONTROL] = key_status[VK_LCONTROL] | key_status[VK_RCONTROL];
        key_status[VK_MENU] = key_status[VK_LMENU] | key_status[VK_RMENU];
        
-#ifdef NOTIFY_KEY_DOWN
-       if(keep_frames) {
-               repeat = false;
-       }
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
-       if(code == VK_LSHIFT || code == VK_RSHIFT) {
-               if(prev_shift == 0 && key_status[VK_SHIFT] != 0) {
-                       vm->key_down(VK_SHIFT, repeat);
+       if(get_notify_key_down()) {
+               if(keep_frames) {
+                       repeat = false;
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
-       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
-               if(prev_control == 0 && key_status[VK_CONTROL] != 0) {
-                       vm->key_down(VK_CONTROL, repeat);
+               if(!get_notify_key_down_lr_shift()) {
+                       if(code == VK_LSHIFT || code == VK_RSHIFT) {
+                               if(prev_shift == 0 && key_status[VK_SHIFT] != 0) {
+                                       vm_key_down(VK_SHIFT, repeat);
+                               }
+                               return;
+                       }
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
-       if(code == VK_LMENU|| code == VK_RMENU) {
-               if(prev_menu == 0 && key_status[VK_MENU] != 0) {
-                       vm->key_down(VK_MENU, repeat);
+               if(!get_notify_key_down_lr_control()) {
+                       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
+                               if(prev_control == 0 && key_status[VK_CONTROL] != 0) {
+                                       vm_key_down(VK_CONTROL, repeat);
+                               }
+                               return;
+                       }
                }
-               return;
+               if(!get_notify_key_down_lr_menu()) {
+                       if(code == VK_LMENU|| code == VK_RMENU) {
+                               if(prev_menu == 0 && key_status[VK_MENU] != 0) {
+                                       vm_key_down(VK_MENU, repeat);
+                               }
+                               return;
+                       }
+               }
+               vm_key_down(code, repeat);
        }
-#endif
-       vm->key_down(code, repeat);
-#endif
 }
 
 void OSD::key_up_sub(int code)
@@ -519,64 +461,57 @@ void OSD::key_up_sub(int code)
                return;
        }
        
-#ifdef NOTIFY_KEY_DOWN
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
        uint8_t prev_shift = key_status[VK_SHIFT];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
        uint8_t prev_control = key_status[VK_CONTROL];
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
        uint8_t prev_menu = key_status[VK_MENU];
-#endif
-#endif
        key_status[VK_SHIFT] = key_status[VK_LSHIFT] | key_status[VK_RSHIFT];
        key_status[VK_CONTROL] = key_status[VK_LCONTROL] | key_status[VK_RCONTROL];
        key_status[VK_MENU] = key_status[VK_LMENU] | key_status[VK_RMENU];
-       
-#ifdef NOTIFY_KEY_DOWN
-#ifndef NOTIFY_KEY_DOWN_LR_SHIFT
-       if(code == VK_LSHIFT || code == VK_RSHIFT) {
-               if(prev_shift != 0 && key_status[VK_SHIFT] == 0) {
-                       vm->key_up(VK_SHIFT);
+       if(get_notify_key_down()) {
+               if(!get_notify_key_down_lr_shift()) {
+                       if(code == VK_LSHIFT || code == VK_RSHIFT) {
+                               if(prev_shift != 0 && key_status[VK_SHIFT] == 0) {
+                                       vm_key_up(VK_SHIFT);
+                               }
+                               return;
+                       }
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_CONTROL
-       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
-               if(prev_control != 0 && key_status[VK_CONTROL] == 0) {
-                       vm->key_up(VK_CONTROL);
+               if(!get_notify_key_down_lr_control()) {
+                       if(code == VK_LCONTROL|| code == VK_RCONTROL) {
+                               if(prev_control != 0 && key_status[VK_CONTROL] == 0) {
+                                       vm_key_up(VK_CONTROL);
+                               }
+                               return;
+                       }
                }
-               return;
-       }
-#endif
-#ifndef NOTIFY_KEY_DOWN_LR_MENU
-       if(code == VK_LMENU || code == VK_RMENU) {
-               if(prev_menu != 0 && key_status[VK_MENU] == 0) {
-                       vm->key_up(VK_MENU);
+               if(!get_notify_key_down_lr_menu()) {
+                       if(code == VK_LMENU || code == VK_RMENU) {
+                               if(prev_menu != 0 && key_status[VK_MENU] == 0) {
+                                       vm_key_up(VK_MENU);
+                               }
+                               return;
+                       }
                }
-               return;
+               vm_key_up(code);
        }
-#endif
-       vm->key_up(code);
-#endif
 }
 
-#ifdef ONE_BOARD_MICRO_COMPUTER
+
 void OSD::press_button(int num)
 {
-       int code = vm_buttons[num].code;
-       
-       if(code) {
-               key_down_sub(code, false);
-               key_status[code] = KEY_KEEP_FRAMES;
-       } else {
-               // code=0: reset virtual machine
-               vm->reset();
+       if(get_one_board_micro_computer()) {
+               int code = get_vm_buttons_code(num);
+               
+               if(code) {
+                       key_down_sub(code, false);
+                       key_status[code] = KEY_KEEP_FRAMES;
+               } else {
+                       // code=0: reset virtual machine
+                       vm_reset();
+               }
        }
 }
-#endif
+
 
 void OSD::enable_mouse()
 {
@@ -584,8 +519,8 @@ void OSD::enable_mouse()
        if(!mouse_enabled) {
                QCursor cursor;
                QPoint pos;
-               mouse_oldx = mouse_ptrx = SCREEN_WIDTH / 2;
-               mouse_oldy = mouse_ptry = SCREEN_HEIGHT / 2;
+               mouse_oldx = mouse_ptrx = get_screen_width() / 2;
+               mouse_oldy = mouse_ptry = get_screen_height() / 2;
                cursor = glv->cursor();
                pos.setX(glv->width() / 2);
                pos.setY(glv->height() / 2);
index 8743a2b..2ce0a45 100644 (file)
@@ -7,7 +7,7 @@
        [ Qt printer ]
 */
 
-#include "../emu.h"
+#include "osd.h"
 
 void OSD::initialize_printer()
 {
@@ -38,10 +38,6 @@ void OSD::printer_strobe(bool value)
                }
                prn_fio->Fputc(prn_data);
                // wait 10sec
-#ifdef SUPPORT_VARIABLE_TIMING
-               prn_wait_frames = (int)(vm->get_frame_rate() * 10.0 + 0.5);
-#else
-               prn_wait_frames = (int)(FRAMES_PER_SEC * 10.0 + 0.5);
-#endif
+               prn_wait_frames = (int)(vm_frame_rate() * 10.0 + 0.5);
        }
 }
index d3c2558..868db2d 100644 (file)
 #define REC_VIDEO_FULL         2
 #define REC_VIDEO_ERROR                3
 
-void OSD::initialize_screen()
-{
-       host_window_width = base_window_width = WINDOW_WIDTH;
-       host_window_height = base_window_height = WINDOW_HEIGHT;
-       host_window_mode = true;
-       
-       vm_screen_width = SCREEN_WIDTH;
-       vm_screen_height = SCREEN_HEIGHT;
-       vm_window_width = WINDOW_WIDTH;
-       vm_window_height = WINDOW_HEIGHT;
-       vm_window_width_aspect = WINDOW_WIDTH_ASPECT;
-       vm_window_height_aspect = WINDOW_HEIGHT_ASPECT;
-       
-       QColor col(0, 0, 0, 255);
-       //memset(&vm_screen_buffer, 0, sizeof(bitmap_t));
-       vm_screen_buffer.width = SCREEN_WIDTH;
-       vm_screen_buffer.height = SCREEN_HEIGHT;
-       vm_screen_buffer.pImage = QImage(SCREEN_WIDTH, SCREEN_HEIGHT, QImage::Format_ARGB32);
-       vm_screen_buffer.pImage.fill(col);
-       now_record_video = false;
-       //pAVIStream = NULL;
-       //pAVICompressed = NULL;
-       //pAVIFile = NULL;
-       
-       first_draw_screen = false;
-       first_invalidate = true;
-       self_invalidate = false;
-}
-
-void OSD::release_screen()
-{
-       stop_record_video();
-       
-       //release_d3d9();
-       //if(vm_screen_buffer.pImage != NULL) delete vm_screen_buffer.pImage;
-       release_screen_buffer(&vm_screen_buffer);
-}
-
-int OSD::get_window_mode_width(int mode)
-{
-#ifdef USE_SCREEN_ROTATE
-       if(config.rotate_type == 1 || config.rotate_type == 3) {
-               return (config.window_stretch_type == 0 ? vm_window_height : vm_window_height_aspect) * (mode + WINDOW_MODE_BASE);
-       }
-#endif
-       return (config.window_stretch_type == 0 ? vm_window_width : vm_window_width_aspect) * (mode + WINDOW_MODE_BASE);
-}
 
-int OSD::get_window_mode_height(int mode)
-{
-#ifdef USE_SCREEN_ROTATE
-       if(config.rotate_type == 1 || config.rotate_type == 3) {
-               return (config.window_stretch_type == 0 ? vm_window_width : vm_window_width_aspect) * (mode + WINDOW_MODE_BASE);
-       }
-#endif
-       return (config.window_stretch_type == 0 ? vm_window_height : vm_window_height_aspect) * (mode + WINDOW_MODE_BASE);
-}
 
 void OSD::set_host_window_size(int window_width, int window_height, bool window_mode)
 {
@@ -160,7 +104,7 @@ int OSD::draw_screen()
                }
                initialize_screen_buffer(&vm_screen_buffer, vm_screen_width, vm_screen_height, 0);
        }
-       vm->draw_screen();
+       this->vm_draw_screen();
        unlock_vm();
        // screen size was changed in vm->draw_screen()
        if(vm_screen_buffer.width != vm_screen_width || vm_screen_buffer.height != vm_screen_height) {
@@ -363,22 +307,23 @@ int OSD::add_video_frames()
        static double frames = 0;
        static int prev_video_fps = -1;
        int counter = 0;
-#if 0  
-#ifdef SUPPORT_VARIABLE_TIMING
        static double prev_vm_fps = -1;
-       double vm_fps = vm->frame_rate();
-       
-       if(prev_video_fps != rec_video_fps || prev_vm_fps != vm_fps) {
-               prev_video_fps = rec_video_fps;
-               prev_vm_fps = vm_fps;
-               frames = vm_fps / rec_video_fps;
-       }
-#else
-       if(prev_video_fps != rec_video_fps) {
-               prev_video_fps = rec_video_fps;
-               frames = FRAMES_PER_SEC / rec_video_fps;
+#if 0  
+       if(get_support_variable_timing()) {
+               double vm_fps = vm_frame_rate();
+               
+               prev_vm_fps = -1;
+               if(prev_video_fps != rec_video_fps || prev_vm_fps != vm_fps) {
+                       prev_video_fps = rec_video_fps;
+                       prev_vm_fps = vm_fps;
+                       frames = vm_fps / rec_video_fps;
+               }
+       } else {
+               if(prev_video_fps != rec_video_fps) {
+                       prev_video_fps = rec_video_fps;
+                       frames = FRAMES_PER_SEC / rec_video_fps;
+               }
        }
-#endif
        while(rec_video_run_frames > 0) {
                rec_video_run_frames -= frames;
                rec_video_frames += frames;
index 62962dc..3038801 100644 (file)
@@ -180,11 +180,7 @@ void OSD::release_sound()
 void OSD::update_sound(int* extra_frames)
 {
        *extra_frames = 0;
-#ifdef USE_DEBUGGER
-//     if(now_debugging) {
-//             return;
-//     }
-#endif
+       
        now_mute = false;
        if(sound_ok) {
                uint32_t play_c, offset, size1, size2;
@@ -207,7 +203,7 @@ void OSD::update_sound(int* extra_frames)
                }
                //SDL_UnlockAudio();
                // sound buffer must be updated
-               Sint16* sound_buffer = (Sint16 *)vm->create_sound(extra_frames);
+               Sint16* sound_buffer = (Sint16 *)this->create_sound(extra_frames);
                if(now_record_sound) {
                        // record sound
                        if(sound_samples > rec_sound_buffer_ptr) {
@@ -219,20 +215,20 @@ void OSD::update_sound(int* extra_frames)
                                        // sync video recording
                                        static double frames = 0;
                                        static int prev_samples = -1;
-#ifdef SUPPORT_VARIABLE_TIMING
-                                       static double prev_fps = -1;
-                                       double fps = vm->get_frame_rate();
-                                       if(prev_samples != samples || prev_fps != fps) {
-                                               prev_samples = samples;
-                                               prev_fps = fps;
-                                               frames = fps * (double)samples / (double)sound_rate;
-                                       }
-#else
-                                       if(prev_samples != samples) {
-                                               prev_samples = samples;
-                                               frames = FRAMES_PER_SEC * (double)samples / (double)sound_rate;
+                                       if(this->get_support_variable_timing()) {
+                                               static double prev_fps = -1;
+                                               double fps = this->vm_frame_rate();
+                                               if(prev_samples != samples || prev_fps != fps) {
+                                                       prev_samples = samples;
+                                                       prev_fps = fps;
+                                                       frames = fps * (double)samples / (double)sound_rate;
+                                               }
+                                       } else {
+                                               if(prev_samples != samples) {
+                                                       prev_samples = samples;
+                                                       frames = vm_frame_rate() * (double)samples / (double)sound_rate;
+                                               }
                                        }
-#endif
                                        rec_video_frames -= frames;
                                        if(rec_video_frames > 2) {
                                                rec_video_run_frames -= (rec_video_frames - 2);
@@ -349,7 +345,7 @@ void OSD::start_record_sound()
                //LockVM();
                QDateTime nowTime = QDateTime::currentDateTime();
                QString tmps = QString::fromUtf8("Sound_Save_emu");
-               tmps = tmps + QString::fromUtf8(CONFIG_NAME);
+               tmps = tmps + get_vm_config_name();
                tmps = tmps + QString::fromUtf8("_");
                tmps = tmps + nowTime.toString(QString::fromUtf8("yyyy-MM-dd_hh-mm-ss.zzz"));
                tmps = tmps + QString::fromUtf8(".wav");
index bc0fe7b..8935357 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <ctime>
 
-#include "../vm/vm.h"
+//#include "../vm/vm.h"
 //#include "../emu.h"
 #include "../config.h"
 #include "../fileio.h"
index f30d00d..9e768b3 100644 (file)
@@ -31,14 +31,11 @@ void OSD::initialize_video()
        memset(&dshow_screen_buffer, 0, sizeof(screen_buffer_t));
        
        direct_show_mute[0] = direct_show_mute[1] = true;
-#ifdef USE_MOVIE_PLAYER
+
        now_movie_play = now_movie_pause = false;
-#endif
-#ifdef USE_VIDEO_CAPTURE
-       enum_capture_devs();
+       if(get_use_video_capture()) enum_capture_devs();
        cur_capture_dev_index = -1;
 #endif
-#endif
 }
 
 #define SAFE_RELEASE(x) { \
diff --git a/source/src/qt/osd_wrapper.cpp b/source/src/qt/osd_wrapper.cpp
new file mode 100644 (file)
index 0000000..e70b673
--- /dev/null
@@ -0,0 +1,335 @@
+/*
+       Skelton for retropc emulator
+
+       Author : K.Ohta <whatisthis.sowhat _at_ gmail.com>
+       Date   : 2015.11.30-
+
+       [ VM/OSD Wrapper ]
+*/
+
+#include <QImage>
+#include <QPainter>
+#include <QColor>
+#include <QPen>
+#include <QPoint>
+#include <QTextCodec>
+
+#include "osd.h"
+#include "../vm/vm.h"
+#include "emu.h"
+
+#include "emu_thread.h"
+#include "draw_thread.h"
+
+#include "qt_gldraw.h"
+#include "agar_logger.h"
+
+void OSD::vm_draw_screen(void)
+{
+       vm->draw_screen();
+}
+
+double OSD::vm_frame_rate(void)
+{
+#ifdef SUPPORT_VARIABLE_TIMING
+       return vm->get_frame_rate();
+#else
+       return FRAMES_PER_SEC;
+#endif   
+}
+
+Sint16* OSD::create_sound(int *extra_frames)
+{
+       return (Sint16 *)vm->create_sound(extra_frames);
+}
+
+
+bool OSD::get_use_socket(void)
+{
+#ifdef USE_SOCKET
+       return true;
+#else
+       return false;
+#endif
+}
+bool OSD::get_support_variable_timing(void)
+{
+#ifdef SUPPORT_VARIABLE_TIMING
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_notify_key_down(void)
+{
+#ifdef NOTIFY_KEY_DOWN
+       return true;
+#else
+       return false;
+#endif 
+}
+
+bool OSD::get_notify_key_down_lr_shift(void)
+{
+#ifdef NOTIFY_KEY_DOWN_LR_SHIFT
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_notify_key_down_lr_control(void)
+{
+#ifdef NOTIFY_KEY_DOWN_LR_CONTROL
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_notify_key_down_lr_menu(void)
+{
+#ifdef NOTIFY_KEY_DOWN_LR_MEHU
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_use_shift_numpad_key(void)
+{
+#ifdef USE_SHIFT_NUMPAD_KEY
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_use_auto_key(void)
+{
+#ifdef USE_AUTO_KEY
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_dont_keeep_key_pressed(void)
+{
+#ifdef DONT_KEEEP_KEY_PRESSED
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_one_board_micro_computer(void)
+{
+#ifdef ONE_BOARD_MICRO_COMPUTER
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_use_screen_rotate(void)
+{
+#ifdef USE_SCREEN_ROTATE
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_use_movie_player(void)
+{
+#ifdef USE_MOVIE_PLAYER
+       return true;
+#else
+       return false;
+#endif
+}
+
+bool OSD::get_use_video_capture(void)
+{
+#ifdef USE_VIDEO_CAPTURE
+       return true;
+#else
+       return false;
+#endif
+}
+
+void OSD::vm_key_down(int code, bool flag)
+{
+       vm->key_down(code, flag);
+}
+
+void OSD::vm_key_up(int code)
+{
+       vm->key_up(code);
+}
+
+void OSD::vm_reset(void)
+{
+       vm->reset();
+}
+
+int OSD::get_vm_buttons_code(int num)
+{
+#ifdef ONE_BOARD_MICRO_COMPUTER
+       if(num < 0) return 0;
+       return vm_buttons[num].code;
+#else
+       return 0;
+#endif
+}      
+
+void OSD::update_buttons(void)
+{
+#if defined(MAX_BUTTONS)
+       if(!press_flag && !release_flag) {
+               int ii;
+               ii = 0;
+               for(ii = 0; vm_buttons[ii].code != 0x00; ii++) { 
+                       if((mouse_ptrx >= vm_buttons[ii].x) && (mouse_ptrx < (vm_buttons[ii].x + vm_buttons[ii].width))) {
+                               if((mouse_ptry >= vm_buttons[ii].y) && (mouse_ptry < (vm_buttons[ii].y + vm_buttons[ii].height))) {
+                                       if((key_status[vm_buttons[ii].code] & 0x7f) == 0) this->press_button(ii);
+                               }
+                       }
+               }
+               if((mouse_ptrx >= vm_buttons[ii].x) && (mouse_ptrx < (vm_buttons[ii].x + vm_buttons[ii].width))) {
+                       if((mouse_ptry >= vm_buttons[ii].y) && (mouse_ptry < (vm_buttons[ii].y + vm_buttons[ii].height))) {
+                               this->press_button(ii);
+                       }
+               }
+               mouse_ptrx = mouse_ptry = 0;
+       }
+       //return;
+#endif                 
+}      
+
+QString OSD::get_vm_config_name(void)
+{
+#if defined(CONFIG_NAME)
+       return QString::fromUtf8(CONFIG_NAME);
+#else
+       return QString::fromUtf8(" ");
+#endif
+}
+
+int OSD::get_screen_width(void)
+{
+       return SCREEN_WIDTH;
+}
+
+int OSD::get_screen_height(void)
+{
+       return SCREEN_HEIGHT;
+}
+
+void OSD::lock_vm(void)
+{
+       locked_vm = true;
+       if(parent_thread != NULL) { 
+               if(!parent_thread->now_debugging()) VMSemaphore->acquire(1);
+       } else {
+               VMSemaphore->acquire(1);
+       }
+}
+
+void OSD::unlock_vm(void)
+{
+       if(parent_thread != NULL) { 
+               if(!parent_thread->now_debugging()) VMSemaphore->release(1);
+       } else {
+               VMSemaphore->release(1);
+       }
+       locked_vm = false;
+}
+
+
+bool OSD::is_vm_locked(void)
+{
+       return locked_vm;
+}
+
+void OSD::force_unlock_vm(void)
+{
+       if(parent_thread == NULL) {
+               while(VMSemaphore->available() < 1) VMSemaphore->release(1);
+               return;
+       }
+       if(parent_thread->now_debugging()) return;
+       while(VMSemaphore->available() < 1) VMSemaphore->release(1);
+}
+
+void OSD::set_draw_thread(DrawThreadClass *handler)
+{
+       this->moveToThread(handler);
+       connect(this, SIGNAL(sig_update_screen(bitmap_t *)), handler, SLOT(do_update_screen(bitmap_t *)));
+       connect(this, SIGNAL(sig_save_screen(const char *)), glv, SLOT(do_save_frame_screen(const char *)));
+       connect(this, SIGNAL(sig_resize_vm_screen(QImage *, int, int)), glv, SLOT(do_set_texture_size(QImage *, int, int)));
+       connect(parent_thread, SIGNAL(sig_debugger_input(QString)), this, SLOT(do_set_input_string(QString)));
+       connect(parent_thread, SIGNAL(sig_quit_debugger()), this, SLOT(do_close_debugger_thread()));
+       connect(this, SIGNAL(sig_close_window()), parent_thread, SLOT(doExit()));
+       connect(this, SIGNAL(sig_console_input_string(QString)), parent_thread, SLOT(do_call_debugger_command(QString)));
+}
+
+void OSD::initialize_screen()
+{
+       host_window_width = base_window_width = WINDOW_WIDTH;
+       host_window_height = base_window_height = WINDOW_HEIGHT;
+       host_window_mode = true;
+       
+       vm_screen_width = SCREEN_WIDTH;
+       vm_screen_height = SCREEN_HEIGHT;
+       vm_window_width = WINDOW_WIDTH;
+       vm_window_height = WINDOW_HEIGHT;
+       vm_window_width_aspect = WINDOW_WIDTH_ASPECT;
+       vm_window_height_aspect = WINDOW_HEIGHT_ASPECT;
+       
+       QColor col(0, 0, 0, 255);
+       //memset(&vm_screen_buffer, 0, sizeof(bitmap_t));
+       vm_screen_buffer.width = SCREEN_WIDTH;
+       vm_screen_buffer.height = SCREEN_HEIGHT;
+       vm_screen_buffer.pImage = QImage(SCREEN_WIDTH, SCREEN_HEIGHT, QImage::Format_ARGB32);
+       vm_screen_buffer.pImage.fill(col);
+       now_record_video = false;
+       //pAVIStream = NULL;
+       //pAVICompressed = NULL;
+       //pAVIFile = NULL;
+       
+       first_draw_screen = false;
+       first_invalidate = true;
+       self_invalidate = false;
+}
+
+void OSD::release_screen()
+{
+       stop_record_video();
+       
+       //release_d3d9();
+       //if(vm_screen_buffer.pImage != NULL) delete vm_screen_buffer.pImage;
+       release_screen_buffer(&vm_screen_buffer);
+}
+
+int OSD::get_window_mode_width(int mode)
+{
+       if(get_use_screen_rotate()) {
+               if(config.rotate_type == 1 || config.rotate_type == 3) {
+                       return (config.window_stretch_type == 0 ? vm_window_height : vm_window_height_aspect) * (mode + WINDOW_MODE_BASE);
+               }
+       }
+       return (config.window_stretch_type == 0 ? vm_window_width : vm_window_width_aspect) * (mode + WINDOW_MODE_BASE);
+}
+
+int OSD::get_window_mode_height(int mode)
+{
+       if(get_use_screen_rotate()) {
+               if(config.rotate_type == 1 || config.rotate_type == 3) {
+                       return (config.window_stretch_type == 0 ? vm_window_width : vm_window_width_aspect) * (mode + WINDOW_MODE_BASE);
+               }
+       }
+       return (config.window_stretch_type == 0 ? vm_window_height : vm_window_height_aspect) * (mode + WINDOW_MODE_BASE);
+}