add windows support to ecore. ecore_evas is ported too (directdraw and direct3d. No opengl yet). It needs to be tested a lot, though. Remove some trailing spaces here and there. Replace WIN32 with _WIN32

SVN revision: 31513
This commit is contained in:
doursse 2007-08-26 11:17:21 +00:00 committed by doursse
parent 1bd182b2f1
commit 50432552c8
30 changed files with 4089 additions and 534 deletions

View File

@ -21,6 +21,7 @@ MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
ecore-job.pc \
ecore-txt.pc \
ecore-x.pc \
ecore-win32.pc \
ecore-sdl.pc \
ecore.pc
@ -40,6 +41,7 @@ EXTRA_DIST = AUTHORS COPYING COPYING-PLAIN ecore.c.in gendoc ecore.supp \
ecore-job.pc.in \
ecore-txt.pc.in \
ecore-x.pc.in \
ecore-win32.pc.in \
ecore-sdl.pc.in \
ecore.spec.in ecore.spec \
debian/changelog \
@ -105,6 +107,11 @@ if BUILD_ECORE_X
px = ecore-x.pc
endif
if BUILD_ECORE_WIN32
pwin32 = ecore-win32.pc
endif
if BUILD_ECORE_SDL
psdl = ecore-sdl.pc
endif
@ -116,4 +123,5 @@ endif
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = \
ecore.pc $(pcon) $(pconfig) $(pdfb) $(pevas) \
$(pfb) $(pfile) $(pdesktop) $(pipc) $(pjob) $(ptxt) $(px) $(psdl)
$(pfb) $(pfile) $(pdesktop) $(pipc) $(pjob) $(ptxt) \
$(px) $(pwin32) $(psdl)

View File

@ -72,6 +72,7 @@ requirements_ecore_ipc=""
requirements_ecore_job=""
requirements_ecore_txt=""
requirements_ecore_x=""
requirements_ecore_win32=""
requirements_ecore_sdl=""
dnl The first call to PKG_CHECK_MODULES is done conditionally,
@ -303,6 +304,31 @@ fi
fi
AC_CHECK_HEADER(ddraw.h,
[ have_ddraw="yes"
AC_DEFINE(HAVE_DIRECTDRAW, 1, [Build Ecore_Win32 with DirectDraw Code])
ddraw_libs="-lddraw -ldxguid" ],
[ have_ddraw="no" ]
)
AC_SUBST(ddraw_libs)
AC_CHECK_HEADERS(d3d9.h d3dx9.h,
[ have_direct3d="yes"
AC_DEFINE(HAVE_DIRECT3D, 1, [Build Ecore_Win32 with Direct3D Code])
direct3d_libs="-ld3d9 -ld3dx9d" ],
[ have_direct3d="no" ]
)
AC_SUBST(direct3d_libs)
have_win32="no"
if test "x${have_ddraw}" = "xyes" -o "x${have_direct3d}" = "xyes"; then
have_win32="yes"
fi
ECORE_CHECK_MODULE([Win32], [no], [$have_win32],
[ecore_win32_libs="$ecore_win32_libs $ddraw_libs $direct3d_libs"])
ECORE_CHECK_MODULE([Job], [yes])
PKG_CHECK_MODULES(DIRECTFB, directfb >= 0.9.16,
@ -837,6 +863,7 @@ ecore-ipc.pc
ecore-job.pc
ecore-txt.pc
ecore-x.pc
ecore-win32.pc
ecore-sdl.pc
ecore.pc
src/Makefile
@ -855,6 +882,7 @@ src/lib/ecore_config/Makefile
src/lib/ecore_file/Makefile
src/lib/ecore_desktop/Makefile
src/lib/ecore_directfb/Makefile
src/lib/ecore_win32/Makefile
README
ecore.spec
debian/changelog
@ -873,13 +901,15 @@ echo " Ecore_X (XCB backend)........: $have_ecore_x_xcb (Xprint: $have_ecore_x_
else
echo " Ecore_X (Xlib backend).......: $have_ecore_x (Xcursor: $use_Xcursor) (Xprint: $use_xprint) (Xinerama: $use_xinerama) (Xrandr: $use_xrandr) (Xscreensaver: $use_xss) (Xrender: $use_xrender) (Xfixes: $use_xfixes) (Xdamage: $use_xdamage) (Xdpms: $use_xdpms)"
fi
echo " Ecore_Win32..................: $have_ecore_win32 (DirectDraw: ${have_ddraw}) (Direct3D: ${have_direct3d})"
echo " Ecore_FB.....................: $have_ecore_fb"
echo " Ecore_DFB....................: $have_ecore_directfb"
echo " Ecore_SDL....................: $have_ecore_sdl"
echo " Ecore_Evas...................: $have_ecore_evas"
echo " Ecore_Evas GL Support........: $have_ecore_evas_gl"
echo " Ecore_Evas XRender Support...: $have_ecore_evas_xrender"
echo " Ecore_Evas X11 16bpp Support.: $have_ecore_evas_16_x11"
echo " Ecore_Evas X11 16bpp Support.: $have_ecore_evas_x11_16"
echo " Ecore_Evas FB Support........: $have_ecore_evas_fb"
echo " Ecore_Evas SDL Support.......: $have_ecore_evas_sdl"
echo " Ecore_Evas DFB Support.......: $have_ecore_evas_dfb"

View File

@ -0,0 +1,11 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: ecore-win32
Description: E core library, Win32 module
Version: @VERSION@
Libs: -L${libdir} -lecore_win32
Libs.private: @ddraw_libs@ @direct3d_libs@
Cflags: -I${includedir}

View File

@ -7,6 +7,7 @@ ecore_fb \
ecore_directfb \
ecore_con \
ecore_x \
ecore_win32 \
ecore_sdl \
ecore_ipc \
ecore_evas \

View File

@ -97,7 +97,7 @@ extern "C" {
};
typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
#ifndef WIN32
#ifndef _WIN32
typedef void Ecore_Exe; /**< A handle for spawned processes */
#endif
typedef void Ecore_Timer; /**< A handle for timers */
@ -120,7 +120,7 @@ extern "C" {
typedef struct _Ecore_Exe_Event_Data_Line Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
typedef struct _Ecore_Exe_Event_Data Ecore_Exe_Event_Data; /**< Data from a child process */
#ifndef WIN32
#ifndef _WIN32
#endif
struct _Ecore_Event_Signal_User /** User signal event */
@ -128,7 +128,7 @@ extern "C" {
int number; /**< The signal number. Either 1 or 2 */
void *ext_data; /**< Extension data - not used */
#ifndef WIN32
#ifndef _WIN32
siginfo_t data; /**< Signal info */
#endif
};
@ -137,7 +137,7 @@ extern "C" {
{
void *ext_data; /**< Extension data - not used */
#ifndef WIN32
#ifndef _WIN32
siginfo_t data; /**< Signal info */
#endif
};
@ -149,7 +149,7 @@ extern "C" {
int terminate : 1; /**< Set if the exit request was a terminate singal */
void *ext_data; /**< Extension data - not used */
#ifndef WIN32
#ifndef _WIN32
siginfo_t data; /**< Signal info */
#endif
};
@ -158,7 +158,7 @@ extern "C" {
{
void *ext_data; /**< Extension data - not used */
#ifndef WIN32
#ifndef _WIN32
siginfo_t data; /**< Signal info */
#endif
};
@ -167,12 +167,12 @@ extern "C" {
{
int num; /**< The realtime signal's number */
#ifndef WIN32
#ifndef _WIN32
siginfo_t data; /**< Signal info */
#endif
};
#ifndef WIN32
#ifndef _WIN32
struct _Ecore_Exe_Event_Add /** Process add event */
{
Ecore_Exe *exe; /**< The handle to the added process */
@ -224,7 +224,7 @@ extern "C" {
EAPI void *ecore_event_current_event_get(void);
#ifndef WIN32
#ifndef _WIN32
EAPI Ecore_Exe *ecore_exe_run(const char *exe_cmd, const void *data);
EAPI Ecore_Exe *ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data);
EAPI int ecore_exe_send(Ecore_Exe *exe, void *data, int size);

View File

@ -1,14 +1,14 @@
#include <locale.h>
#ifndef WIN32
#ifndef _WIN32
# include <langinfo.h>
#endif /* WIN32 */
#endif /* _WIN32 */
#include "ecore_private.h"
#include "Ecore.h"
static const char *_ecore_magic_string_get(Ecore_Magic m);
static int _ecore_init_count = 0;
#ifndef WIN32
#ifndef _WIN32
int _ecore_fps_debug = 0;
#endif
@ -54,7 +54,7 @@ ecore_init(void)
printf("WARNING: not a utf8 locale!\n");
}
*/
#ifndef WIN32
#ifndef _WIN32
if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
if (_ecore_fps_debug) _ecore_fps_debug_init();
_ecore_signal_init();
@ -81,11 +81,11 @@ ecore_shutdown(void)
if (--_ecore_init_count)
return _ecore_init_count;
#ifndef WIN32
#ifndef _WIN32
if (_ecore_fps_debug) _ecore_fps_debug_shutdown();
#endif
_ecore_animator_shutdown();
#ifndef WIN32
#ifndef _WIN32
_ecore_exe_shutdown();
#endif
_ecore_idle_enterer_shutdown();
@ -94,7 +94,7 @@ ecore_shutdown(void)
_ecore_timer_shutdown();
_ecore_event_shutdown();
_ecore_main_shutdown();
#ifndef WIN32
#ifndef _WIN32
_ecore_signal_shutdown();
#endif
@ -164,7 +164,7 @@ _ecore_magic_string_get(Ecore_Magic m)
return "<UNKNOWN>";
}
#ifndef WIN32
#ifndef _WIN32
/* fps debug calls - for debugging how much time your app actually spends */
/* "running" (and the inverse being time spent running)... this does not */
/* account for other apps and multitasking... */

View File

@ -5,7 +5,7 @@
#include "ecore_private.h"
#include "Ecore.h"
#ifndef WIN32
#ifndef _WIN32
/* TODO: Something to let people build a command line and does auto escaping -
*

View File

@ -1,5 +1,5 @@
#ifdef WIN32
#include <winsock.h>
#ifdef _WIN32
#include <windows.h>
#endif
#include <math.h>
@ -342,7 +342,7 @@ _ecore_main_select(double timeout)
if (fdh->fd > max_fd) max_fd = fdh->fd;
}
}
#ifndef WIN32
#ifndef _WIN32
if (_ecore_signal_count_get()) return -1;
#endif
ret = select(max_fd + 1, &rfds, &wfds, &exfds, t);
@ -454,6 +454,9 @@ _ecore_main_fd_handlers_buf_call(void)
static void
_ecore_main_loop_iterate_internal(int once_only)
{
#ifdef _WIN32
MSG msg;
#endif
double next_time;
int have_event = 0;
int have_signal;
@ -469,7 +472,7 @@ _ecore_main_loop_iterate_internal(int once_only)
}
/* any timers re-added as a result of these are allowed to go */
_ecore_timer_enable_new();
#ifndef WIN32
#ifndef _WIN32
/* process signals into events .... */
while (_ecore_signal_count_get()) _ecore_signal_call();
#endif
@ -493,7 +496,7 @@ _ecore_main_loop_iterate_internal(int once_only)
ret = _ecore_main_select(0);
if (ret > 0) have_event = 1;
#ifndef WIN32
#ifndef _WIN32
if (_ecore_signal_count_get() > 0) have_signal = 1;
#endif
@ -520,7 +523,7 @@ _ecore_main_loop_iterate_internal(int once_only)
return;
}
#ifndef WIN32
#ifndef _WIN32
if (_ecore_fps_debug)
{
t2 = ecore_time_get();
@ -549,7 +552,7 @@ _ecore_main_loop_iterate_internal(int once_only)
ret = _ecore_main_select(-1);
if (ret > 0) have_event = 1;
#ifndef WIN32
#ifndef _WIN32
if (_ecore_signal_count_get() > 0) have_signal = 1;
#endif
}
@ -564,7 +567,7 @@ _ecore_main_loop_iterate_internal(int once_only)
if (_ecore_event_exist()) break;
ret = _ecore_main_select(0);
if (ret > 0) have_event = 1;
#ifndef WIN32
#ifndef _WIN32
if (_ecore_signal_count_get() > 0) have_signal = 1;
#endif
if (have_event || have_signal) break;
@ -584,7 +587,7 @@ _ecore_main_loop_iterate_internal(int once_only)
ret = _ecore_main_select(next_time);
if (ret > 0) have_event = 1;
#ifndef WIN32
#ifndef _WIN32
if (_ecore_signal_count_get() > 0) have_signal = 1;
#endif
}
@ -600,7 +603,7 @@ _ecore_main_loop_iterate_internal(int once_only)
if (_ecore_event_exist()) break;
ret = _ecore_main_select(0);
if (ret > 0) have_event = 1;
#ifndef WIN32
#ifndef _WIN32
if (_ecore_signal_count_get() > 0) have_signal = 1;
#endif
if ((have_event) || (have_signal)) break;
@ -614,7 +617,7 @@ _ecore_main_loop_iterate_internal(int once_only)
}
}
}
#ifndef WIN32
#ifndef _WIN32
if (_ecore_fps_debug)
{
t1 = ecore_time_get();
@ -630,7 +633,7 @@ _ecore_main_loop_iterate_internal(int once_only)
if (have_event) _ecore_main_fd_handlers_call();
do
{
#ifndef WIN32
#ifndef _WIN32
/* process signals into events .... */
while (_ecore_signal_count_get()) _ecore_signal_call();
#endif
@ -640,6 +643,13 @@ _ecore_main_loop_iterate_internal(int once_only)
_ecore_main_fd_handlers_cleanup();
}
while (_ecore_main_fd_handlers_buf_call());
#ifdef _WIN32
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#endif
if (once_only) _ecore_idle_enterer_call();
in_main_loop--;
}

View File

@ -1,4 +1,4 @@
#ifndef WIN32
#ifndef _WIN32
# include <dlfcn.h>
# include "ecore_private.h"
# include "Ecore_Data.h"

View File

@ -13,7 +13,7 @@
#include <limits.h>
#include <dirent.h>
#ifndef WIN32
#ifndef _WIN32
# include <sys/mman.h>
#endif
@ -222,7 +222,7 @@ enum _Ecore_Exe_Flags
};
typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
#ifndef WIN32
#ifndef _WIN32
typedef struct _Ecore_Exe Ecore_Exe;
#endif
typedef struct _Ecore_Timer Ecore_Timer;
@ -235,7 +235,7 @@ typedef struct _Ecore_Event_Filter Ecore_Event_Filter;
typedef struct _Ecore_Event Ecore_Event;
typedef struct _Ecore_Animator Ecore_Animator;
#ifndef WIN32
#ifndef _WIN32
struct _Ecore_Exe
{
Ecore_List2 __list_data;
@ -412,7 +412,7 @@ void _ecore_signal_init(void);
int _ecore_signal_count_get(void);
void _ecore_signal_call(void);
#ifndef WIN32
#ifndef _WIN32
void _ecore_exe_init(void);
void _ecore_exe_shutdown(void);
Ecore_Exe *_ecore_exe_find(pid_t pid);

View File

@ -1,4 +1,4 @@
#ifndef WIN32
#ifndef _WIN32
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

View File

@ -1,31 +1,9 @@
#include <sys/time.h>
#ifdef WIN32
#include <sys/timeb.h>
#endif
#include "ecore_private.h"
#include "Ecore.h"
#ifndef HAVE_GETTIMEOFDAY
#ifdef WIN32
static int
gettimeofday(struct timeval *tv, void *unused)
{
struct _timeb t;
if (!tv) return -1;
_ftime (&t);
tv->tv_sec = t.time;
tv->tv_usec = t.millitm * 1000;
return 0;
}
#ifdef _WIN32
# include <windows.h>
#else
# error "Your platform isn't supported yet"
#endif
# include <sys/time.h>
#endif
#include "Ecore.h"
/**
* Retrieves the current system time as a floating point value in seconds.
@ -35,8 +13,16 @@ gettimeofday(struct timeval *tv, void *unused)
EAPI double
ecore_time_get(void)
{
#ifdef _WIN32
return (double)GetTickCount() / 1000.0;
#else
# ifdef HAVE_GETTIMEOFDAY
struct timeval timev;
gettimeofday(&timev, NULL);
return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
# else
# error "Your platform isn't supported yet"
# endif
#endif /* _WIN32 */
}

View File

@ -22,8 +22,8 @@
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#elif WIN32
#include <winsock.h>
#elif _WIN32
#include <winsock2.h>
#endif
static void _ecore_con_cb_dns_lookup(void *data, struct hostent *he);

View File

@ -53,6 +53,7 @@ extern "C" {
#define HAVE_ECORE_EVAS_GL 1
#define HAVE_ECORE_EVAS_X11_16 1
#define HAVE_ECORE_EVAS_DIRECTFB 1
#define HAVE_ECORE_EVAS_WIN32 1
typedef enum _Ecore_Evas_Engine_Type
{
@ -63,6 +64,8 @@ typedef enum _Ecore_Evas_Engine_Type
ECORE_EVAS_ENGINE_XRENDER_X11,
ECORE_EVAS_ENGINE_DIRECTFB,
ECORE_EVAS_ENGINE_SOFTWARE_X11_16,
ECORE_EVAS_ENGINE_SOFTWARE_DDRAW,
ECORE_EVAS_ENGINE_DIRECT3D,
ECORE_EVAS_ENGINE_SDL
} Ecore_Evas_Engine_Type;
@ -76,6 +79,10 @@ typedef unsigned int Ecore_X_Window;
typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
#endif
#ifndef __ECORE_WIN32_H__
typedef void Ecore_Win32_Window;
#endif
#ifndef _ECORE_EVAS_PRIVATE_H
/* basic data types */
typedef struct _Ecore_Evas Ecore_Evas;
@ -127,6 +134,18 @@ EAPI const int *ecore_evas_buffer_pixels_get(Ecore_Evas *ee);
EAPI Evas_Object *ecore_evas_object_image_new(Ecore_Evas *ee_target);
EAPI Ecore_Evas *ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
int x,
int y,
int width,
int height);
EAPI Ecore_Evas *ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
int x,
int y,
int width,
int height);
EAPI Ecore_Evas *ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha);
/* generic manipulation calls */

View File

@ -30,6 +30,16 @@ ECORE_DIRECTFB_LIB =
ECORE_DIRECTFB_LDF =
endif
if BUILD_ECORE_WIN32
ECORE_WIN32_INC = -I$(top_srcdir)/src/lib/ecore_win32
ECORE_WIN32_LIB = $(top_builddir)/src/lib/ecore_win32/libecore_win32.la
ECORE_WIN32_LDF = -L$(top_builddir)/src/lib/ecore_win32/.libs
else
ECORE_WIN32_INC =
ECORE_WIN32_LIB =
ECORE_WIN32_LDF =
endif
if BUILD_ECORE_SDL
ECORE_SDL_INC = -I$(top_srcdir)/src/lib/ecore_sdl
ECORE_SDL_LIB = $(top_builddir)/src/lib/ecore_sdl/libecore_sdl.la
@ -48,6 +58,7 @@ INCLUDES = \
$(ECORE_X_INC) \
$(ECORE_FB_INC) \
$(ECORE_DIRECTFB_INC) \
$(ECORE_WIN32_INC) \
$(ECORE_SDL_INC) \
@EVAS_CFLAGS@ \
@XCB_CFLAGS@
@ -56,6 +67,7 @@ libecore_evas_la_LDFLAGS = -version-info 1:0:0 \
$(ECORE_X_LDF) \
$(ECORE_FB_LDF) \
$(ECORE_DIRECTFB_LDF) \
$(ECORE_WIN32_LDF) \
$(ECORE_SDL_LDF) \
-L$(top_builddir)/src/lib/ecore/.libs
@ -72,21 +84,25 @@ ecore_evas_x.c \
ecore_evas_fb.c \
ecore_evas_buffer.c \
ecore_evas_directfb.c \
ecore_evas_win32.c \
ecore_evas_sdl.c
libecore_evas_la_LIBADD = \
$(ECORE_X_LIB) \
$(ECORE_FB_LIB) \
$(ECORE_DIRECTFB_LIB) \
$(ECORE_WIN32_LIB) \
$(ECORE_SDL_LIB) \
$(top_builddir)/src/lib/ecore/libecore.la \
@EVAS_LIBS@ \
@XCB_LIBS@
@XCB_LIBS@ \
@create_shared_lib@
libecore_evas_la_DEPENDENCIES = \
$(ECORE_X_LIB) \
$(ECORE_FB_LIB) \
$(ECORE_DIRECTFB_LIB) \
$(ECORE_WIN32_LIB) \
$(ECORE_SDL_LIB) \
$(top_builddir)/src/lib/ecore/libecore.la
@ -99,4 +115,5 @@ ecore_evas_x.c \
ecore_evas_fb.c \
ecore_evas_buffer.c \
ecore_evas_directfb.c \
ecore_evas_win32.c \
ecore_evas_sdl.c

View File

@ -1726,7 +1726,7 @@ ecore_evas_ignore_events_get(Ecore_Evas *ee)
return ee->ignore_events ? 1 : 0;
}
#ifndef WIN32
#ifndef _WIN32
/* fps debug calls - for debugging how much time your app actually spends */
/* rendering graphics... :) */

View File

@ -7,7 +7,9 @@
#ifdef BUILD_ECORE_EVAS_BUFFER
static int _ecore_evas_init_count = 0;
#ifndef _WIN32
static int _ecore_evas_fps_debug = 0;
#endif /* _WIN32 */
static Ecore_Evas *ecore_evases = NULL;
@ -24,8 +26,10 @@ _ecore_evas_buffer_init(void)
{
_ecore_evas_init_count++;
if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
#ifndef _WIN32
if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
#endif /* _WIN32 */
return _ecore_evas_init_count;
}
@ -95,7 +99,9 @@ _ecore_evas_buffer_shutdown(void)
{
_ecore_evas_free((Ecore_Evas *)ecore_evases);
}
#ifndef _WIN32
if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
#endif /* _WIN32 */
}
if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
return _ecore_evas_init_count;

View File

@ -10,7 +10,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#ifndef WIN32
#ifndef _WIN32
# include <sys/mman.h>
#endif
@ -61,6 +61,16 @@
#ifdef BUILD_ECORE_EVAS_BUFFER
# include <Evas_Engine_Buffer.h>
#endif
#ifdef BUILD_ECORE_WIN32
# include "Ecore_Win32.h"
# ifdef HAVE_DIRECTDRAW
# include <Evas_Engine_Software_DDraw.h>
# endif
# ifdef HAVE_DIRECT3D
# include <Evas_Engine_Direct3D.h>
# endif
#endif
#define IDLE_FLUSH_TIME 0.5
@ -168,6 +178,13 @@ struct _Ecore_Evas_Engine
Ecore_DirectFB_Window *window;
} directfb;
#endif
#ifdef BUILD_ECORE_WIN32
struct {
Ecore_Win32_Window *parent;
Ecore_Win32_Window *window;
} win32;
#endif
Ecore_Timer *idle_flush_timer;
};

View File

@ -14,7 +14,9 @@
/* static Ecore_List *ecore_evas_input_devices = NULL; */
static int _ecore_evas_init_count = 0;
#ifndef _WIN32
static int _ecore_evas_fps_debug = 0;
#endif /* _WIN32 */
static Ecore_Evas *ecore_evases = NULL;
static Ecore_Event_Handler *ecore_evas_event_handlers[10] = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
@ -216,10 +218,12 @@ _ecore_evas_idle_enter(void *data __UNUSED__)
double t1 = 0.;
double t2 = 0.;
#ifndef _WIN32
if (_ecore_evas_fps_debug)
{
t1 = ecore_time_get();
}
#endif /* _WIN32 */
for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
{
Ecore_Evas *ee;
@ -236,11 +240,13 @@ _ecore_evas_idle_enter(void *data __UNUSED__)
else
evas_norender(ee->evas);
}
#ifndef _WIN32
if (_ecore_evas_fps_debug)
{
t2 = ecore_time_get();
_ecore_evas_fps_debug_rendertime_add(t2 - t1);
}
#endif /* _WIN32 */
return 1;
}
@ -258,10 +264,14 @@ _ecore_evas_sdl_init(int w, int h)
_ecore_evas_init_count++;
if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
#ifndef _WIN32
if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
#endif /* _WIN32 */
ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
ecore_evas_event = ecore_timer_add(0.008, _ecore_evas_sdl_event, NULL);
#ifndef _WIN32
if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
#endif /* _WIN32 */
ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_SDL_EVENT_KEY_DOWN, _ecore_evas_sdl_event_key_down, NULL);
ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_SDL_EVENT_KEY_UP, _ecore_evas_sdl_event_key_up, NULL);
@ -292,7 +302,9 @@ _ecore_evas_sdl_shutdown(void)
ecore_evas_idle_enterer = NULL;
ecore_timer_del(ecore_evas_event);
ecore_evas_event = NULL;
#ifndef _WIN32
if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
#endif /* _WIN32 */
}
if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
return _ecore_evas_init_count;

File diff suppressed because it is too large Load Diff

View File

@ -7,8 +7,8 @@
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#elif WIN32
#include <winsock.h>
#elif _WIN32
#include <winsock2.h>
#endif
#define DLT_ZERO 0

View File

@ -20,7 +20,7 @@ Ecore_Sdl_Keys.h
libecore_sdl_la_LIBADD = \
$(top_builddir)/src/lib/ecore/libecore.la \
@sdl_libs@
@sdl_libs@ @create_shared_lib@
libecore_sdl_la_DEPENDENCIES = \
$(top_builddir)/src/lib/ecore/libecore.la

View File

@ -0,0 +1,292 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifndef __ECORE_WIN32_H__
#define __ECORE_WIN32_H__
#ifdef EAPI
# undef EAPI
#endif
#ifdef _MSC_VER
# ifdef BUILDING_DLL
# define EAPI __declspec(dllexport)
# else
# define EAPI __declspec(dllimport)
# endif
#else
# ifdef __GNUC__
# if __GNUC__ >= 4
# define EAPI __attribute__ ((visibility("default")))
# else
# define EAPI
# endif
# else
# define EAPI
# endif
#endif
typedef void Ecore_Win32_Window;
typedef void Ecore_Win32_DDraw_Object;
typedef void Ecore_Win32_DDraw_Surface;
typedef void Ecore_Win32_Direct3D_Object;
typedef void Ecore_Win32_Direct3D_Device;
typedef void Ecore_Win32_Direct3D_Sprite;
typedef void Ecore_Win32_Direct3D_Texture;
/* Events */
typedef struct _Ecore_Win32_Event_Key_Down Ecore_Win32_Event_Key_Down;
typedef struct _Ecore_Win32_Event_Key_Up Ecore_Win32_Event_Key_Up;
typedef struct _Ecore_Win32_Event_Mouse_Button_Down Ecore_Win32_Event_Mouse_Button_Down;
typedef struct _Ecore_Win32_Event_Mouse_Button_Up Ecore_Win32_Event_Mouse_Button_Up;
typedef struct _Ecore_Win32_Event_Mouse_Move Ecore_Win32_Event_Mouse_Move;
typedef struct _Ecore_Win32_Event_Mouse_In Ecore_Win32_Event_Mouse_In;
typedef struct _Ecore_Win32_Event_Mouse_Out Ecore_Win32_Event_Mouse_Out;
typedef struct _Ecore_Win32_Event_Window_Focus_In Ecore_Win32_Event_Window_Focus_In;
typedef struct _Ecore_Win32_Event_Window_Focus_Out Ecore_Win32_Event_Window_Focus_Out;
typedef struct _Ecore_Win32_Event_Window_Damage Ecore_Win32_Event_Window_Damage;
typedef struct _Ecore_Win32_Event_Window_Destroy Ecore_Win32_Event_Window_Destroy;
typedef struct _Ecore_Win32_Event_Window_Hide Ecore_Win32_Event_Window_Hide;
typedef struct _Ecore_Win32_Event_Window_Show Ecore_Win32_Event_Window_Show;
typedef struct _Ecore_Win32_Event_Window_Delete Ecore_Win32_Event_Window_Delete;
struct _Ecore_Win32_Event_Key_Down
{
Ecore_Win32_Window *window;
char *keyname;
char *keysymbol;
char *keycompose;
double time;
};
struct _Ecore_Win32_Event_Key_Up
{
Ecore_Win32_Window *window;
char *keyname;
char *keysymbol;
char *keycompose;
double time;
};
struct _Ecore_Win32_Event_Mouse_Button_Down
{
Ecore_Win32_Window *window;
int button;
int x;
int y;
double time;
unsigned int double_click : 1;
unsigned int triple_click : 1;
};
struct _Ecore_Win32_Event_Mouse_Button_Up
{
Ecore_Win32_Window *window;
int button;
int x;
int y;
double time;
unsigned int double_click : 1;
unsigned int triple_click : 1;
};
struct _Ecore_Win32_Event_Mouse_Move
{
Ecore_Win32_Window *window;
int x;
int y;
double time;
};
struct _Ecore_Win32_Event_Mouse_In
{
Ecore_Win32_Window *window;
int x;
int y;
double time;
};
struct _Ecore_Win32_Event_Mouse_Out
{
Ecore_Win32_Window *window;
int x;
int y;
double time;
};
struct _Ecore_Win32_Event_Window_Focus_In
{
Ecore_Win32_Window *window;
double time;
};
struct _Ecore_Win32_Event_Window_Focus_Out
{
Ecore_Win32_Window *window;
double time;
};
struct _Ecore_Win32_Event_Window_Damage
{
Ecore_Win32_Window *window;
int x;
int y;
int width;
int height;
double time;
};
struct _Ecore_Win32_Event_Window_Destroy
{
Ecore_Win32_Window *window;
double time;
};
struct _Ecore_Win32_Event_Window_Hide
{
Ecore_Win32_Window *window;
double time;
};
struct _Ecore_Win32_Event_Window_Show
{
Ecore_Win32_Window *window;
double time;
};
struct _Ecore_Win32_Event_Window_Delete
{
Ecore_Win32_Window *window;
double time;
};
EAPI extern int ECORE_WIN32_EVENT_KEY_DOWN;
EAPI extern int ECORE_WIN32_EVENT_KEY_UP;
EAPI extern int ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN;
EAPI extern int ECORE_WIN32_EVENT_MOUSE_BUTTON_UP;
EAPI extern int ECORE_WIN32_EVENT_MOUSE_MOVE;
EAPI extern int ECORE_WIN32_EVENT_MOUSE_IN;
EAPI extern int ECORE_WIN32_EVENT_MOUSE_OUT;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_DAMAGE;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_DESTROY;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_HIDE;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_SHOW;
EAPI extern int ECORE_WIN32_EVENT_WINDOW_DELETE;
/* Core */
EAPI int ecore_win32_init();
EAPI int ecore_win32_shutdown();
EAPI double ecore_win32_current_time_get(void);
EAPI void ecore_win32_message_loop_begin (void);
/* Window */
EAPI Ecore_Win32_Window *ecore_win32_window_new(Ecore_Win32_Window *parent,
int x,
int y,
int width,
int height);
EAPI void ecore_win32_window_del(Ecore_Win32_Window *window);
EAPI void ecore_win32_window_move(Ecore_Win32_Window *window,
int x,
int y);
EAPI void ecore_win32_window_resize(Ecore_Win32_Window *window,
int width,
int height);
EAPI void ecore_win32_window_move_resize(Ecore_Win32_Window *window,
int x,
int y,
int width,
int height);
EAPI void ecore_win32_window_size_get(Ecore_Win32_Window *window,
int *width,
int *height);
EAPI void ecore_win32_window_size_min_set(Ecore_Win32_Window *window,
int min_width,
int min_height);
EAPI void ecore_win32_window_size_max_set(Ecore_Win32_Window *window,
int max_width,
int max_height);
EAPI void ecore_win32_window_size_base_set(Ecore_Win32_Window *window,
int base_width,
int base_height);
EAPI void ecore_win32_window_size_step_set(Ecore_Win32_Window *window,
int step_width,
int step_height);
EAPI void ecore_win32_window_show(Ecore_Win32_Window *window);
EAPI void ecore_win32_window_hide(Ecore_Win32_Window *window);
EAPI void ecore_win32_window_raise(Ecore_Win32_Window *window);
EAPI void ecore_win32_window_lower(Ecore_Win32_Window *window);
EAPI void ecore_win32_window_title_set(Ecore_Win32_Window *window,
const char *title);
EAPI void ecore_win32_window_focus_set(Ecore_Win32_Window *window);
EAPI void ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
int on);
EAPI void ecore_win32_window_borderless_set(Ecore_Win32_Window *window,
int on);
EAPI void ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window,
int on);
/* DirectDraw */
EAPI int ecore_win32_ddraw_init(Ecore_Win32_Window *window);
EAPI void ecore_win32_ddraw_shutdown(Ecore_Win32_Window *window);
EAPI Ecore_Win32_DDraw_Object *ecore_win32_ddraw_object_get(Ecore_Win32_Window *window);
EAPI Ecore_Win32_DDraw_Surface *ecore_win32_ddraw_surface_primary_get(Ecore_Win32_Window *window);
EAPI Ecore_Win32_DDraw_Surface *ecore_win32_ddraw_surface_back_get(Ecore_Win32_Window *window);
EAPI int ecore_win32_ddraw_depth_get(Ecore_Win32_Window *window);
/* Direct3D */
#ifdef __cplusplus
extern "C" {
#endif
EAPI int ecore_win32_direct3d_init(Ecore_Win32_Window *window);
EAPI void ecore_win32_direct3d_shutdown(Ecore_Win32_Window *window);
EAPI Ecore_Win32_Direct3D_Object *ecore_win32_direct3d_object_get(Ecore_Win32_Window *window);
EAPI Ecore_Win32_Direct3D_Device *ecore_win32_direct3d_device_get(Ecore_Win32_Window *window);
EAPI Ecore_Win32_Direct3D_Sprite *ecore_win32_direct3d_sprite_get(Ecore_Win32_Window *window);
EAPI Ecore_Win32_Direct3D_Texture *ecore_win32_direct3d_texture_get(Ecore_Win32_Window *window);
EAPI int ecore_win32_direct3d_depth_get(Ecore_Win32_Window *window);
#ifdef __cplusplus
}
#endif
#endif /* __ECORE_WIN32_H__ */

View File

@ -0,0 +1,40 @@
MAINTAINERCLEANFILES = Makefile.in
INCLUDES = \
-I$(top_srcdir)/src/lib/ecore \
-I$(top_builddir)/src/lib/ecore
libecore_win32_la_LDFLAGS = \
-version-info 1:0:0 \
-L$(top_builddir)/src/lib/ecore/.libs
if BUILD_ECORE_WIN32
lib_LTLIBRARIES = libecore_win32.la
include_HEADERS = \
Ecore_Win32.h
libecore_win32_la_SOURCES = \
ecore_win32.c \
ecore_win32_direct3d.cpp \
ecore_win32_ddraw.c \
ecore_win32_event.c \
ecore_win32_window.c \
ecore_win32_private.h
libecore_win32_la_LIBADD = \
@ddraw_libs@ @direct3d_libs@ \
@create_shared_lib@ -lwsock32 \
$(top_builddir)/src/lib/ecore/libecore.la
endif
EXTRA_DIST = \
Ecore_Win32.h \
ecore_win32.c \
ecore_win32_direct3d.cpp \
ecore_win32_ddraw.c \
ecore_win32_event.c \
ecore_win32_window.c \
ecore_win32_private.h

View File

@ -0,0 +1,348 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include <windowsx.h>
#include "Ecore.h"
#include "ecore_win32_private.h"
/*
<raster> hmmm
<raster> yeah window's way of doing eventys is very different
<raster> not select + timeout
<raster> to doa timeout u need to queue up a timed message
<raster> for timers
<raster> etc.
*/
/* typedef LRESULT CALLBACK _ecore_win32_event_callback(HWND, UINT, WPARAM, LPARAM); */
Ecore_List *_ecore_win32_windows_list = NULL;
HINSTANCE _ecore_win32_instance = NULL;
double _ecore_win32_double_click_time = 0.25;
double _ecore_win32_event_last_time = 0.0;
Ecore_Win32_Window *_ecore_win32_event_last_window = NULL;
static int _ecore_win32_init_count = 0;
LRESULT CALLBACK
_ecore_win32_window_procedure(HWND window,
UINT message,
WPARAM window_param,
LPARAM data_param)
{
Ecore_Win32_Callback_Data *data;
POINTS pt;
DWORD coord;
data = (Ecore_Win32_Callback_Data *)malloc(sizeof(Ecore_Win32_Callback_Data));
if (!data) return DefWindowProc(window, message, window_param, data_param);
data->window = window;
data->message = message;
data->window_param = window_param;
data->data_param = data_param;
data->time = GetMessageTime();
coord = GetMessagePos();
pt = MAKEPOINTS(coord);
data->x = pt.x;
data->y = pt.y;
switch (data->message)
{
case WM_KEYDOWN:
printf (" * ecore message : keystroke down\n");
_ecore_win32_event_handle_key_press(data, 1);
return 0;
case WM_CHAR:
_ecore_win32_event_handle_key_press(data, 0);
return 0;
case WM_KEYUP:
printf (" * ecore message : keystroke up\n");
_ecore_win32_event_handle_key_release(data, 1);
return 0;
case WM_LBUTTONDOWN:
printf (" * ecore message : lbuttondown\n");
_ecore_win32_event_handle_button_press(data, 1);
return 0;
case WM_MBUTTONDOWN:
printf (" * ecore message : mbuttondown\n");
_ecore_win32_event_handle_button_press(data, 2);
return 0;
case WM_RBUTTONDOWN:
printf (" * ecore message : rbuttondown\n");
_ecore_win32_event_handle_button_press(data, 3);
return 0;
case WM_LBUTTONUP:
printf (" * ecore message : lbuttonup\n");
_ecore_win32_event_handle_button_release(data, 1);
return 0;
case WM_MBUTTONUP:
printf (" * ecore message : mbuttonup\n");
_ecore_win32_event_handle_button_release(data, 2);
return 0;
case WM_RBUTTONUP:
printf (" * ecore message : rbuttonup\n");
_ecore_win32_event_handle_button_release(data, 3);
return 0;
case WM_MOUSEMOVE:
{
RECT rect;
struct _Ecore_Win32_Window *w = NULL;
ecore_list_first_goto(_ecore_win32_windows_list);
while ((w = ecore_list_next(_ecore_win32_windows_list)))
{
if (w->window == window)
{
ecore_list_remove(_ecore_win32_windows_list);
break;
}
}
if (GetClientRect(window, &rect))
{
POINT pt;
pt.x = GET_X_LPARAM(data_param);
pt.y = GET_Y_LPARAM(data_param);
if (!PtInRect(&rect, pt))
{
if (w->pointer_is_in)
{
w->pointer_is_in = 0;
_ecore_win32_event_handle_leave_notify(data);
}
}
else
{
if (!w->pointer_is_in)
{
w->pointer_is_in = 1;
_ecore_win32_event_handle_enter_notify(data);
}
}
}
_ecore_win32_event_handle_motion_notify(data);
return 0;
}
case WM_DESTROY:
printf (" * ecore message : destroy\n");
_ecore_win32_event_handle_destroy_notify(data);
return 0;
case WM_SHOWWINDOW:
printf (" * ecore message : show\n");
if ((data->data_param == SW_OTHERUNZOOM) ||
(data->data_param == SW_OTHERUNZOOM))
return 0;
if (data->window_param)
_ecore_win32_event_handle_map_notify(data);
else
_ecore_win32_event_handle_unmap_notify(data);
return 0;
case WM_PAINT:
{
RECT rect;
printf (" * ecore message : paint\n");
if (GetUpdateRect(window, &rect, FALSE))
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(window, &ps);
EndPaint(window, &ps);
printf ("%ld %ld %ld %ld\n",
rect.left,
rect.top,
rect.right - rect.left,
rect.bottom - rect.top);
data->update = rect;
_ecore_win32_event_handle_expose(data);
}
return 0;
}
case WM_CLOSE:
printf (" * ecore message : close\n");
_ecore_win32_event_handle_delete(data);
return 0;
case WM_SETFOCUS:
printf (" * ecore message : focus in\n");
_ecore_win32_event_handle_focus_in(data);
return 0;
case WM_KILLFOCUS:
printf (" * ecore message : focus out\n");
_ecore_win32_event_handle_focus_out(data);
return 0;
default:
return DefWindowProc(window, message, window_param, data_param);
}
}
/*
Events:
x * key down
* key sys down
x * key up
* key sys up
x * mouse button down left
x * mouse button down middle
x * mouse button down right
x * mouse button up left
x * mouse button up middle
x * mouse button up right
* mouse move (contains enter)
* mouse leave
* focus in
* focus out
* expose
* create
* destroy
* resize
*/
EAPI int ECORE_WIN32_EVENT_KEY_DOWN = 0;
EAPI int ECORE_WIN32_EVENT_KEY_UP = 0;
EAPI int ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN = 0;
EAPI int ECORE_WIN32_EVENT_MOUSE_BUTTON_UP = 0;
EAPI int ECORE_WIN32_EVENT_MOUSE_MOVE = 0;
EAPI int ECORE_WIN32_EVENT_MOUSE_IN = 0;
EAPI int ECORE_WIN32_EVENT_MOUSE_OUT = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_DAMAGE = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_DESTROY = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_SHOW = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_HIDE = 0;
EAPI int ECORE_WIN32_EVENT_WINDOW_DELETE = 0;
EAPI int
ecore_win32_init()
{
WNDCLASS wc;
if (_ecore_win32_init_count > 0)
{
_ecore_win32_init_count++;
return _ecore_win32_init_count;
}
_ecore_win32_instance = GetModuleHandle(0);
if (!_ecore_win32_instance)
return 0;
memset (&wc, 0, sizeof (WNDCLASS));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = _ecore_win32_window_procedure;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = _ecore_win32_instance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = ECORE_WIN32_WINDOW_CLASS;
if(!RegisterClass(&wc))
{
UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance);
FreeLibrary(_ecore_win32_instance);
return 0;
}
_ecore_win32_windows_list = ecore_list_new();
if (!_ecore_win32_windows_list)
{
UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance);
FreeLibrary(_ecore_win32_instance);
return 0;
}
if (!ECORE_WIN32_EVENT_KEY_DOWN)
{
ECORE_WIN32_EVENT_KEY_DOWN = ecore_event_type_new();
ECORE_WIN32_EVENT_KEY_UP = ecore_event_type_new();
ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
ECORE_WIN32_EVENT_MOUSE_BUTTON_UP = ecore_event_type_new();
ECORE_WIN32_EVENT_MOUSE_MOVE = ecore_event_type_new();
ECORE_WIN32_EVENT_MOUSE_IN = ecore_event_type_new();
ECORE_WIN32_EVENT_MOUSE_OUT = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_DESTROY = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_SHOW = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_HIDE = ecore_event_type_new();
ECORE_WIN32_EVENT_WINDOW_DELETE = ecore_event_type_new();
}
_ecore_win32_init_count++;
return _ecore_win32_init_count;
}
EAPI int
ecore_win32_shutdown()
{
_ecore_win32_init_count++;
if (_ecore_win32_init_count > 0) return _ecore_win32_init_count;
if (!_ecore_win32_instance) return _ecore_win32_init_count;
ecore_list_destroy(_ecore_win32_windows_list);
UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance);
FreeLibrary(_ecore_win32_instance);
_ecore_win32_instance = NULL;
if (_ecore_win32_init_count < 0) _ecore_win32_init_count = 0;
return _ecore_win32_init_count;
}
/**
* Sets the timeout for a double and triple clicks to be flagged.
*
* This sets the time between clicks before the double_click flag is
* set in a button down event. If 3 clicks occur within double this
* time, the triple_click flag is also set.
*
* @param t The time in seconds
*/
EAPI void
ecore_win32_double_click_time_set(double t)
{
if (t < 0.0) t = 0.0;
_ecore_win32_double_click_time = t;
}
/**
* Retrieves the double and triple click flag timeout.
*
* See @ref ecore_win32_double_click_time_set for more information.
*
* @return The timeout for double clicks in seconds.
*/
EAPI double
ecore_win32_double_click_time_get(void)
{
return _ecore_win32_double_click_time;
}
/**
* Return the last event time
*/
EAPI double
ecore_win32_current_time_get(void)
{
return _ecore_win32_event_last_time;
}

View File

@ -0,0 +1,165 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "config.h"
#include "ecore_win32_private.h"
#include "Ecore_Win32.h"
EAPI int
ecore_win32_ddraw_init(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECTDRAW
DDSURFACEDESC2 surface_desc;
DDPIXELFORMAT pixel_format;
RECT rect;
DDSURFACEDESC2 *sd;
struct _Ecore_Win32_Window *w;
if (!window)
return 0;
w = (struct _Ecore_Win32_Window *)window;
if (FAILED(DirectDrawCreateEx(0, (void **)&w->ddraw.object,
&IID_IDirectDraw7, NULL)))
return 0;
if (FAILED(IDirectDraw7_SetCooperativeLevel(w->ddraw.object,
w->window, DDSCL_NORMAL)))
goto no_coop_level;
if (FAILED(IDirectDraw7_CreateClipper(w->ddraw.object, 0,
&w->ddraw.clipper, NULL)))
goto no_clipper;
if (FAILED(IDirectDrawClipper_SetHWnd(w->ddraw.clipper, 0, w->window)))
goto no_clipper_set_window;
memset (&surface_desc, 0, sizeof (surface_desc));
surface_desc.dwSize = sizeof (surface_desc);
surface_desc.dwFlags = DDSD_CAPS;
surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
/* Hack to cleanly remove a warning */
sd = &surface_desc;
if (FAILED(IDirectDraw7_CreateSurface(w->ddraw.object,
(DDSURFACEDESC *)sd,
&w->ddraw.surface_primary,
NULL)))
goto no_primary_surf;
if (FAILED(IDirectDrawSurface7_SetClipper(w->ddraw.surface_primary,
w->ddraw.clipper)))
goto no_primary_surf_set_clipper;
if (!GetClientRect(w->window, &rect))
goto no_get_client;
memset (&surface_desc, 0, sizeof (surface_desc));
surface_desc.dwSize = sizeof (surface_desc);
surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
surface_desc.dwWidth = rect.right - rect.left;
surface_desc.dwHeight = rect.bottom - rect.top;
/* Hack to cleanly remove a warning */
sd = &surface_desc;
if (FAILED(IDirectDraw7_CreateSurface(w->ddraw.object,
(DDSURFACEDESC *)sd,
&w->ddraw.surface_back,
NULL)))
goto no_back_surf;
ZeroMemory(&pixel_format, sizeof(pixel_format));
pixel_format.dwSize = sizeof(pixel_format);
if (FAILED(IDirectDrawSurface7_GetPixelFormat(w->ddraw.surface_primary,
&pixel_format)))
goto no_get_pix_fmt;
w->ddraw.depth = pixel_format.dwRGBBitCount;
return 1;
no_get_pix_fmt:
/* no need to release the back surface. the next call free its memory */
no_back_surf:
no_get_client:
no_primary_surf_set_clipper:
IDirectDrawSurface7_Release(w->ddraw.surface_primary);
no_primary_surf:
no_clipper_set_window:
IDirectDrawClipper_Release(w->ddraw.clipper);
no_clipper:
no_coop_level:
IDirectDraw7_Release(w->ddraw.object);
#endif /* HAVE_DIRECTDRAW */
return 0;
}
EAPI void
ecore_win32_ddraw_shutdown(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECTDRAW
struct _Ecore_Win32_Window *w;
if (!window)
return;
w = (struct _Ecore_Win32_Window *)window;
if (w->ddraw.surface_primary)
IDirectDrawSurface7_Release(w->ddraw.surface_primary);
/* no need to release the back surface. the previous call free its memory */
if (w->ddraw.clipper)
IDirectDrawClipper_Release(w->ddraw.clipper);
if (w->ddraw.object)
IDirectDraw7_Release(w->ddraw.object);
#endif /* HAVE_DIRECTDRAW */
}
EAPI Ecore_Win32_DDraw_Object *
ecore_win32_ddraw_object_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECTDRAW
return ((struct _Ecore_Win32_Window *)window)->ddraw.object;
#else
return NULL;
#endif /* HAVE_DIRECTDRAW */
}
EAPI Ecore_Win32_DDraw_Surface *
ecore_win32_ddraw_surface_primary_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECTDRAW
return ((struct _Ecore_Win32_Window *)window)->ddraw.surface_primary;
#else
return NULL;
#endif /* HAVE_DIRECTDRAW */
}
EAPI Ecore_Win32_DDraw_Surface *
ecore_win32_ddraw_surface_back_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECTDRAW
return ((struct _Ecore_Win32_Window *)window)->ddraw.surface_back;
#else
return NULL;
#endif /* HAVE_DIRECTDRAW */
}
EAPI int
ecore_win32_ddraw_depth_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECTDRAW
return ((struct _Ecore_Win32_Window *)window)->ddraw.depth;
#else
return 0;
#endif /* HAVE_DIRECTDRAW */
}

View File

@ -0,0 +1,193 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "config.h"
#include "ecore_win32_private.h"
#include "Ecore_Win32.h"
extern "C" {
EAPI int
ecore_win32_direct3d_init(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
D3DPRESENT_PARAMETERS pp;
D3DDISPLAYMODE dm;
D3DSURFACE_DESC sd;
D3DCAPS9 caps;
RECT rect;
struct _Ecore_Win32_Window *w;
DWORD flag;
if (!window)
return 0;
w = (struct _Ecore_Win32_Window *)window;
w->d3d.object = Direct3DCreate9 (D3D_SDK_VERSION);
if (!w->d3d.object)
return 0;
if (FAILED (w->d3d.object->GetAdapterDisplayMode (D3DADAPTER_DEFAULT,
&dm)))
goto no_get_adapter;
if (FAILED (w->d3d.object->GetDeviceCaps (D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
&caps)))
goto no_caps;
if (!GetClientRect(w->window, &rect))
goto no_get_client;
flag = (caps.VertexProcessingCaps != 0)
? D3DCREATE_HARDWARE_VERTEXPROCESSING
: D3DCREATE_SOFTWARE_VERTEXPROCESSING;
ZeroMemory(&pp, sizeof(pp));
pp.BackBufferWidth = rect.right - rect.left;
pp.BackBufferHeight = rect.bottom - rect.top;
pp.BackBufferFormat = dm.Format;
pp.BackBufferCount = 1;
pp.MultiSampleType = D3DMULTISAMPLE_NONE;
pp.MultiSampleQuality = 0;
pp.SwapEffect = D3DSWAPEFFECT_FLIP;
pp.hDeviceWindow = w->window;
pp.Windowed = TRUE;
pp.EnableAutoDepthStencil = FALSE;
pp.FullScreen_RefreshRateInHz = 0;
pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
if (FAILED(w->d3d.object->CreateDevice (D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
w->window,
flag,
&pp,
&w->d3d.device)))
goto no_device;
if (FAILED (D3DXCreateSprite (w->d3d.device, &w->d3d.sprite)))
goto no_sprite;
if (FAILED (w->d3d.device->CreateTexture (rect.right - rect.left,
rect.bottom - rect.top,
1,
D3DUSAGE_DYNAMIC,
dm.Format,
D3DPOOL_DEFAULT,
&w->d3d.texture, NULL)))
goto no_texture;
if (FAILED (w->d3d.texture->GetLevelDesc (0, &sd)))
goto no_level_desc;
switch (sd.Format) {
case D3DFMT_A8R8G8B8:
case D3DFMT_X8R8G8B8:
w->d3d.depth = 32;
break;
case D3DFMT_R5G6B5:
w->d3d.depth = 16;
break;
default:
goto no_supported_depth;
}
return 1;
no_supported_depth:
no_level_desc:
w->d3d.texture->Release();
no_texture:
w->d3d.sprite->Release();
no_sprite:
w->d3d.device->Release();
no_device:
no_get_client:
no_caps:
no_get_adapter:
w->d3d.object->Release();
#endif /* HAVE_DIRECT3D */
return 0;
}
EAPI void
ecore_win32_direct3d_shutdown(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
struct _Ecore_Win32_Window *w;
if (!window)
return;
w = (struct _Ecore_Win32_Window *)window;
if (w->d3d.texture)
w->d3d.texture->Release();
if (w->d3d.sprite)
w->d3d.sprite->Release();
if (w->d3d.device)
w->d3d.device->Release();
if (w->d3d.object)
w->d3d.object->Release();
#endif /* HAVE_DIRECT3D */
}
EAPI Ecore_Win32_Direct3D_Object *
ecore_win32_direct3d_object_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
return ((struct _Ecore_Win32_Window *)window)->d3d.object;
#else
return NULL;
#endif /* HAVE_DIRECT3D */
}
EAPI Ecore_Win32_Direct3D_Device *
ecore_win32_direct3d_device_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
return ((struct _Ecore_Win32_Window *)window)->d3d.device;
#else
return NULL;
#endif /* HAVE_DIRECT3D */
}
EAPI Ecore_Win32_Direct3D_Sprite *
ecore_win32_direct3d_sprite_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
return ((struct _Ecore_Win32_Window *)window)->d3d.sprite;
#else
return NULL;
#endif /* HAVE_DIRECT3D */
}
EAPI Ecore_Win32_Direct3D_Texture *
ecore_win32_direct3d_texture_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
return ((struct _Ecore_Win32_Window *)window)->d3d.texture;
#else
return NULL;
#endif /* HAVE_DIRECT3D */
}
EAPI int
ecore_win32_direct3d_depth_get(Ecore_Win32_Window *window)
{
#ifdef HAVE_DIRECT3D
return ((struct _Ecore_Win32_Window *)window)->d3d.depth;
#else
return 0;
#endif /* HAVE_DIRECT3D */
}
}

View File

@ -0,0 +1,776 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include <windows.h>
#include <windowsx.h>
#include "Ecore.h"
#include "ecore_win32_private.h"
static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL;
static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL;
static double _ecore_win32_mouse_down_last_time = 0;
static double _ecore_win32_mouse_down_last_last_time = 0;
static int _ecore_win32_mouse_down_did_triple = 0;
static int _ecore_win32_mouse_up_count = 0;
static void
_ecore_win32_event_free_key_down(void *data,
void *ev)
{
Ecore_Win32_Event_Key_Down *e;
e = ev;
if (e->keyname) free(e->keyname);
if (e->keysymbol) free(e->keysymbol);
if (e->keycompose) free(e->keycompose);
free(e);
}
static void
_ecore_win32_event_free_key_up(void *data,
void *ev)
{
Ecore_Win32_Event_Key_Up *e;
e = ev;
if (e->keyname) free(e->keyname);
if (e->keysymbol) free(e->keysymbol);
if (e->keycompose) free(e->keycompose);
free(e);
}
static int
_ecore_win32_event_keystroke_get(int key,
char **keyname,
char **keysymbol,
char **keycompose)
{
char *kn;
char *ks;
char *kc;
*keyname = NULL;
*keysymbol = NULL;
*keycompose = NULL;
switch (key)
{
/* Keystroke */
case VK_PRIOR:
kn = "KP_Prior";
ks = "KP_Prior";
kc = "";
break;
case VK_NEXT:
kn = "KP_Next";
ks = "KP_Next";
kc = "";
break;
case VK_END:
kn = "KP_End";
ks = "KP_End";
kc = "";
break;
case VK_HOME:
kn = "KP_Home";
ks = "KP_Home";
kc = "";
break;
case VK_LEFT:
kn = "KP_Left";
ks = "KP_Left";
kc = "";
break;
case VK_UP:
kn = "KP_Up";
ks = "KP_Up";
kc = "";
break;
case VK_RIGHT:
kn = "KP_Right";
ks = "KP_Right";
kc = "";
break;
case VK_DOWN:
kn = "KP_Down";
ks = "KP_Down";
kc = "";
break;
case VK_INSERT:
kn = "KP_Insert";
ks = "KP_Insert";
kc = "";
break;
case VK_DELETE:
kn = "KP_Delete";
ks = "KP_Delete";
kc = "";
break;
case VK_F1:
kn = "F1";
ks = "F1";
kc = "";
break;
case VK_F2:
kn = "F2";
ks = "F2";
kc = "";
break;
case VK_F3:
kn = "F3";
ks = "F3";
kc = "";
break;
case VK_F4:
kn = "F4";
ks = "F4";
kc = "";
break;
case VK_F5:
kn = "F5";
ks = "F5";
kc = "";
break;
case VK_F6:
kn = "F6";
ks = "F6";
kc = "";
break;
case VK_F7:
kn = "F7";
ks = "F7";
kc = "";
break;
case VK_F8:
kn = "F8";
ks = "F8";
kc = "";
break;
case VK_F9:
kn = "F9";
ks = "F9";
kc = "";
break;
case VK_F10:
kn = "F10";
ks = "F10";
kc = "";
break;
case VK_F11:
kn = "F11";
ks = "F11";
kc = "";
break;
case VK_F12:
kn = "F12";
ks = "F12";
kc = "";
break;
case VK_F13:
kn = "F13";
ks = "F13";
kc = "";
break;
case VK_F14:
kn = "F14";
ks = "F14";
kc = "";
break;
case VK_F15:
kn = "F15";
ks = "F15";
kc = "";
break;
case VK_F16:
kn = "F16";
ks = "F16";
kc = "";
break;
case VK_F17:
kn = "F17";
ks = "F17";
kc = "";
break;
case VK_F18:
kn = "F18";
ks = "F18";
kc = "";
break;
case VK_F19:
kn = "F19";
ks = "F19";
kc = "";
break;
case VK_F20:
kn = "F20";
ks = "F20";
kc = "";
break;
case VK_F21:
kn = "F21";
ks = "F21";
kc = "";
break;
case VK_F22:
kn = "F22";
ks = "F22";
kc = "";
break;
case VK_F23:
kn = "F23";
ks = "F23";
kc = "";
break;
case VK_F24:
kn = "F24";
ks = "F24";
kc = "";
break;
default:
/* other non keystroke characters */
return 0;
}
*keyname = strdup(kn);
if (!*keyname) return 0;
*keysymbol = strdup(ks);
if (!*keysymbol)
{
free(*keyname);
*keyname = NULL;
return 0;
}
*keycompose = strdup(kc);
if (!*keycompose)
{
free(*keyname);
free(*keysymbol);
*keyname = NULL;
*keysymbol = NULL;
return 0;
}
return 1;
}
static int
_ecore_win32_event_char_get(int key,
char **keyname,
char **keysymbol,
char **keycompose)
{
char kn[32];
char ks[32];
char *kc;
*keyname = NULL;
*keysymbol = NULL;
*keycompose = NULL;
switch (key)
{
case VK_BACK:
strncpy(kn, "Backspace", 32);
strncpy(ks, "Backspace", 32);
kc = "";
break;
case VK_TAB:
strncpy(kn, "Tab", 32);
strncpy(ks, "Tab", 32);
kc = "";
break;
case 0x0a:
/* Line feed (Shift + Enter) */
strncpy(kn, "LineFeed", 32);
strncpy(ks, "LineFeed", 32);
kc = "";
break;
case VK_RETURN:
strncpy(kn, "Return", 32);
strncpy(ks, "Return", 32);
kc = "";
break;
case VK_ESCAPE:
strncpy(kn, "Escape", 32);
strncpy(ks, "Escape", 32);
kc = "";
break;
default:
/* displayable characters */
printf (" * key : %d\n", key);
kn[0] = (TCHAR)key;
kn[1] = '\0';
ks[0] = (TCHAR)key;
ks[1] = '\0';
kc = "";
break;
}
*keyname = strdup(kn);
if (!*keyname) return 0;
*keysymbol = strdup(ks);
if (!*keysymbol)
{
free(*keyname);
*keyname = NULL;
return 0;
}
*keycompose = strdup(kc);
if (!*keycompose)
{
free(*keyname);
free(*keysymbol);
*keyname = NULL;
*keysymbol = NULL;
return 0;
}
return 1;
}
Ecore_Win32_Window *
_ecore_win32_event_window_get(HWND window)
{
Ecore_Win32_Window *w = NULL;
ecore_list_first_goto(_ecore_win32_windows_list);
while ((w = ecore_list_next(_ecore_win32_windows_list)))
{
if (((struct _Ecore_Win32_Window *)w)->window == window)
return w;
}
return w;
}
void
_ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, int is_keystroke)
{
Ecore_Win32_Event_Key_Down *e;
e = (Ecore_Win32_Event_Key_Down *)malloc(sizeof(Ecore_Win32_Event_Key_Down));
if (!e) return;
if (is_keystroke)
{
if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
&e->keyname,
&e->keysymbol,
&e->keycompose))
{
free(e);
return;
}
goto store_key;
}
else
{
if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
&e->keyname,
&e->keysymbol,
&e->keycompose))
{
free(e);
return;
}
}
store_key:
e->window = _ecore_win32_event_window_get(msg->window);
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
ecore_event_add(ECORE_WIN32_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
}
void
_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg, int is_keystroke)
{
Ecore_Win32_Event_Key_Up *e;
e = (Ecore_Win32_Event_Key_Up *)calloc(1, sizeof(Ecore_Win32_Event_Key_Up));
if (!e) return;
if (is_keystroke)
{
if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
&e->keyname,
&e->keysymbol,
&e->keycompose))
{
free(e);
return;
}
goto store_key;
}
else
{
if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
&e->keyname,
&e->keysymbol,
&e->keycompose))
{
free(e);
return;
}
}
store_key:
e->window = _ecore_win32_event_window_get(msg->window);
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
ecore_event_add(ECORE_WIN32_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
}
void
_ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
int button)
{
Ecore_Win32_Window *window;
window = _ecore_win32_event_window_get(msg->window);
{
Ecore_Win32_Event_Mouse_Move *e;
e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
if (!e) return;
e->window = window;
e->x = GET_X_LPARAM(msg->data_param);
e->y = GET_Y_LPARAM(msg->data_param);
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
_ecore_win32_event_last_window = e->window;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
}
{
Ecore_Win32_Event_Mouse_Button_Down *e;
if (_ecore_win32_mouse_down_did_triple)
{
_ecore_win32_mouse_down_last_window = NULL;
_ecore_win32_mouse_down_last_last_window = NULL;
_ecore_win32_mouse_down_last_time = 0.0;
_ecore_win32_mouse_down_last_last_time = 0.0;
}
e = (Ecore_Win32_Event_Mouse_Button_Down *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Down));
if (!e) return;
e->window = window;
e->button = button;
e->x = GET_X_LPARAM(msg->data_param);
e->y = GET_Y_LPARAM(msg->data_param);
e->time = (double)msg->time / 1000.0;
if (((e->time - _ecore_win32_mouse_down_last_time) <= _ecore_win32_double_click_time) &&
(e->window == _ecore_win32_mouse_down_last_window))
e->double_click = 1;
if (((e->time - _ecore_win32_mouse_down_last_last_time) <= (2.0 * _ecore_win32_double_click_time)) &&
(e->window == _ecore_win32_mouse_down_last_window) &&
(e->window == _ecore_win32_mouse_down_last_last_window))
{
e->triple_click = 1;
_ecore_win32_mouse_down_did_triple = 1;
}
else
_ecore_win32_mouse_down_did_triple = 0;
if (!e->double_click && !e->triple_click)
_ecore_win32_mouse_up_count = 0;
_ecore_win32_event_last_time = e->time;
_ecore_win32_event_last_window = e->window;
if (!_ecore_win32_mouse_down_did_triple)
{
_ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window;
_ecore_win32_mouse_down_last_window = e->window;
_ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time;
_ecore_win32_mouse_down_last_time = e->time;
}
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
}
printf (" * ecore event button press\n");
}
void
_ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
int button)
{
Ecore_Win32_Window *window;
window = _ecore_win32_event_window_get(msg->window);
{
Ecore_Win32_Event_Mouse_Move *e;
e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
if (!e) return;
e->window = window;
e->x = GET_X_LPARAM(msg->data_param);
e->y = GET_Y_LPARAM(msg->data_param);
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
_ecore_win32_event_last_window = e->window;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
}
{
Ecore_Win32_Event_Mouse_Button_Up *e;
e = (Ecore_Win32_Event_Mouse_Button_Up *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Up));
if (!e) return;
e->window = window;
e->button = button;
e->x = GET_X_LPARAM(msg->data_param);
e->y = GET_Y_LPARAM(msg->data_param);
e->time = (double)msg->time / 1000.0;
_ecore_win32_mouse_up_count++;
if ((_ecore_win32_mouse_up_count >= 2) &&
((e->time - _ecore_win32_mouse_down_last_time) <= _ecore_win32_double_click_time) &&
(e->window == _ecore_win32_mouse_down_last_window))
e->double_click = 1;
if ((_ecore_win32_mouse_up_count >= 3) &&
((e->time - _ecore_win32_mouse_down_last_last_time) <= (2.0 * _ecore_win32_double_click_time)) &&
(e->window == _ecore_win32_mouse_down_last_window) &&
(e->window == _ecore_win32_mouse_down_last_last_window))
e->triple_click = 1;
_ecore_win32_event_last_time = e->time;
_ecore_win32_event_last_window = e->window;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
}
Ecore_Win32_Event_Mouse_Button_Up *e;
e = (Ecore_Win32_Event_Mouse_Button_Up *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Up));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->button = button;
e->x = GET_X_LPARAM(msg->data_param);
e->y = GET_Y_LPARAM(msg->data_param);
e->time = (double)msg->time / 1000.0;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
printf (" * ecore event button release\n");
}
void
_ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Mouse_Move *e;
e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->x = GET_X_LPARAM(msg->data_param);
e->y = GET_Y_LPARAM(msg->data_param);
e->time = (double)msg->time / 1000.0;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
}
void
_ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
{
{
Ecore_Win32_Event_Mouse_Move *e;
e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->x = msg->x;
e->y = msg->y;
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
_ecore_win32_event_last_window = e->window;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
}
{
Ecore_Win32_Event_Mouse_In *e;
e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->x = msg->x;
e->y = msg->y;
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL);
}
}
void
_ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
{
{
Ecore_Win32_Event_Mouse_Move *e;
e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->x = msg->x;
e->y = msg->y;
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
_ecore_win32_event_last_window = e->window;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
}
{
Ecore_Win32_Event_Mouse_Out *e;
e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->x = msg->x;
e->y = msg->y;
e->time = (double)msg->time / 1000.0;
_ecore_win32_event_last_time = e->time;
ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL);
}
}
void
_ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Focus_In *e;
e = (Ecore_Win32_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_In));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->time = _ecore_win32_event_last_time;
_ecore_win32_event_last_time = e->time;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
}
void
_ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Focus_Out *e;
e = (Ecore_Win32_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_Out));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->time = _ecore_win32_event_last_time;
_ecore_win32_event_last_time = e->time;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
}
void
_ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Damage *e;
e = (Ecore_Win32_Event_Window_Damage *)calloc(1, sizeof(Ecore_Win32_Event_Window_Damage));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->x = msg->update.left;
e->y = msg->update.top;
e->width = msg->update.right - msg->update.left;
e->height = msg->update.bottom - msg->update.top;
printf (" * ecore : event expose %d %d\n", e->width, e->height);
e->time = _ecore_win32_event_last_time;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
}
void
_ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Destroy *e;
e = calloc(1, sizeof(Ecore_Win32_Event_Window_Destroy));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->time = _ecore_win32_event_last_time;
if (e->window == _ecore_win32_event_last_window) _ecore_win32_event_last_window = NULL;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, e, NULL, NULL);
}
void
_ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Show *e;
e = calloc(1, sizeof(Ecore_Win32_Event_Window_Show));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->time = _ecore_win32_event_last_time;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_SHOW, e, NULL, NULL);
}
void
_ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Hide *e;
e = calloc(1, sizeof(Ecore_Win32_Event_Window_Hide));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->time = _ecore_win32_event_last_time;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_HIDE, e, NULL, NULL);
}
void
_ecore_win32_event_handle_delete(Ecore_Win32_Callback_Data *msg)
{
Ecore_Win32_Event_Window_Delete *e;
e = calloc(1, sizeof(Ecore_Win32_Event_Window_Delete));
if (!e) return;
e->window = _ecore_win32_event_window_get(msg->window);
e->time = _ecore_win32_event_last_time;
ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE, e, NULL, NULL);
}

View File

@ -0,0 +1,104 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifndef __ECORE_WIN32_PRIVATE_H__
#define __ECORE_WIN32_PRIVATE_H__
#include <windows.h>
#include <ddraw.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <Ecore_Data.h>
#include "Ecore_Win32.h"
#define ECORE_WIN32_WINDOW_CLASS "Ecore_Win32_Window_Class"
typedef struct _Ecore_Win32_Callback_Data Ecore_Win32_Callback_Data;
struct _Ecore_Win32_Callback_Data
{
RECT update;
HWND window;
unsigned int message;
WPARAM window_param;
LPARAM data_param;
long time;
int x;
int y;
};
struct _Ecore_Win32_Window
{
HWND window;
#ifdef HAVE_DIRECTDRAW
struct {
LPDIRECTDRAW object;
LPDIRECTDRAWSURFACE surface_primary;
LPDIRECTDRAWSURFACE surface_back;
LPDIRECTDRAWCLIPPER clipper;
int depth;
} ddraw;
#endif /* HAVE_DIRECTDRAW */
#ifdef HAVE_DIRECT3D
struct {
LPDIRECT3D9 object;
LPDIRECT3DDEVICE9 device;
LPD3DXSPRITE sprite;
LPDIRECT3DTEXTURE9 texture;
int depth;
} d3d;
#endif /* HAVE_DIRECT3D */
DWORD style; /* used to go fullscreen to normal */
RECT rect; /* used to go fullscreen to normal */
unsigned int min_width;
unsigned int min_height;
unsigned int max_width;
unsigned int max_height;
unsigned int base_width;
unsigned int base_height;
unsigned int step_width;
unsigned int step_height;
unsigned int pointer_is_in : 1;
unsigned int borderless : 1;
unsigned int iconified : 1;
unsigned int fullscreen : 1;
};
extern Ecore_List *_ecore_win32_windows_list;
extern HINSTANCE _ecore_win32_instance;
extern double _ecore_win32_double_click_time;
extern double _ecore_win32_event_last_time;
extern Ecore_Win32_Window *_ecore_win32_event_last_window;
char *_ecore_win32_hwnd_str_get(HWND window);
void _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, int is_keystroke);
void _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg, int is_keystroke);
void _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, int button);
void _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, int button);
void _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_delete(Ecore_Win32_Callback_Data *msg);
#endif /* __ECORE_WIN32_PRIVATE_H__ */

View File

@ -0,0 +1,480 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include <Ecore.h>
#include "ecore_win32_private.h"
typedef enum _Ecore_Win32_Window_Z_Order Ecore_Win32_Window_Z_Order;
enum _Ecore_Win32_Window_Z_Order
{
ECORE_WIN32_WINDOW_Z_ORDER_BOTTOM,
ECORE_WIN32_WINDOW_Z_ORDER_NOTOPMOST,
ECORE_WIN32_WINDOW_Z_ORDER_TOP,
ECORE_WIN32_WINDOW_Z_ORDER_TOPMOST
};
EAPI Ecore_Win32_Window *
ecore_win32_window_new(Ecore_Win32_Window *parent,
int x,
int y,
int width,
int height)
{
RECT rect;
struct _Ecore_Win32_Window *w;
int minimal_width;
int minimal_height;
w = (struct _Ecore_Win32_Window *)calloc(1, sizeof(struct _Ecore_Win32_Window));
if (!w)
return NULL;
printf (" * ecore : new debut : %d %d %d\n",
width, height, GetSystemMetrics(SM_CXMIN));
rect.left = 0;
rect.top = 0;
rect.right = width;
rect.bottom = height;
if (!AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, FALSE))
{
free(w);
return NULL;
}
printf (" * ecore : new debut : %ld %d\n",
rect.right - rect.left, GetSystemMetrics(SM_CXMIN));
minimal_width = GetSystemMetrics(SM_CXMIN);
minimal_height = GetSystemMetrics(SM_CYMIN);
if (((rect.right - rect.left) < minimal_width) ||
((rect.bottom - rect.top) < minimal_height))
{
printf ("[Ecore] [Win32] ERROR !!\n");
printf (" Wrong size %ld\n", rect.right - rect.left);
free(w);
return NULL;
}
w->window = CreateWindow(ECORE_WIN32_WINDOW_CLASS, "",
WS_OVERLAPPEDWINDOW | WS_SIZEBOX,
x, y,
rect.right - rect.left,
rect.bottom - rect.top,
parent ? ((struct _Ecore_Win32_Window *)parent)->window : NULL,
NULL, _ecore_win32_instance, NULL);
if (!w->window)
{
free(w);
return NULL;
}
if (ecore_list_append(_ecore_win32_windows_list, w) == FALSE)
{
ecore_win32_ddraw_shutdown(w);
DestroyWindow(w->window);
free(w);
return NULL;
}
w->min_width = width;
w->min_height = height;
w->max_width = width;
w->max_height = height;
w->base_width = 0;
w->base_height = 0;
w->step_width = 1;
w->step_height = 1;
w->pointer_is_in = 0;
w->borderless = 0;
w->iconified = 0;
w->fullscreen = 0;
return w;
}
EAPI void
ecore_win32_window_del(Ecore_Win32_Window *window)
{
Ecore_Win32_Window *w;
if (!window) return;
ecore_list_first_goto(_ecore_win32_windows_list);
while ((w = ecore_list_next(_ecore_win32_windows_list)))
{
if (w == window)
{
ecore_list_remove(_ecore_win32_windows_list);
break;
}
}
ecore_list_remove(_ecore_win32_windows_list);
ecore_win32_ddraw_shutdown(window);
DestroyWindow(((struct _Ecore_Win32_Window *)window)->window);
free(window);
}
/*
EAPI void
ecore_win32_window_configure(Ecore_Win32_Window *window,
Ecore_Win32_Window_Z_Order order,
int x,
int y,
int width,
int height)
{
HWND w;
switch (order)
{
case ECORE_WIN32_WINDOW_Z_ORDER_BOTTOM:
w = HWND_BOTTOM;
break;
case ECORE_WIN32_WINDOW_Z_ORDER_NOTOPMOST:
w = HWND_NOTOPMOST;
break;
case ECORE_WIN32_WINDOW_Z_ORDER_TOP:
w = HWND_TOP;
break;
case ECORE_WIN32_WINDOW_Z_ORDER_TOPMOST:
w = HWND_TOPMOST;
break;
default:
return;
}
SetWindowPos((struct _Ecore_Win32_Window *)window->window, w, x, y, width, height, ???);
}
*/
EAPI void
ecore_win32_window_move(Ecore_Win32_Window *window,
int x,
int y)
{
RECT rect;
HWND w;
if (!window) return;
w = ((struct _Ecore_Win32_Window *)window)->window;
if (!GetWindowRect(w, &rect))
return;
MoveWindow(w, x, y,
rect.right - rect.left,
rect.bottom - rect.top,
TRUE);
}
EAPI void
ecore_win32_window_resize(Ecore_Win32_Window *window,
int width,
int height)
{
RECT rect;
struct _Ecore_Win32_Window *w;
DWORD style;
int x;
int y;
if (!window) return;
w = (struct _Ecore_Win32_Window *)window;
if (!GetWindowRect(w->window, &rect)) return;
x = rect.left;
y = rect.top;
rect.left = 0;
rect.top = 0;
if (width < w->min_width) width = w->min_width;
if (width > w->max_width) width = w->max_width;
if (height < w->min_height) height = w->min_height;
if (height > w->max_height) height = w->max_height;
rect.right = width;
rect.bottom = height;
style = GetWindowLong(w->window, GWL_STYLE);
if (!AdjustWindowRect(&rect, style, FALSE))
return;
MoveWindow(w->window, x, y,
rect.right - rect.left,
rect.bottom - rect.top,
TRUE);
}
EAPI void
ecore_win32_window_move_resize(Ecore_Win32_Window *window,
int x,
int y,
int width,
int height)
{
RECT rect;
struct _Ecore_Win32_Window *w;
DWORD style;
if (!window) return;
w = ((struct _Ecore_Win32_Window *)window);
rect.left = 0;
rect.top = 0;
if (width < w->min_width) width = w->min_width;
if (width > w->max_width) width = w->max_width;
if (height < w->min_height) height = w->min_height;
if (height > w->max_height) height = w->max_height;
rect.right = width;
rect.bottom = height;
style = GetWindowLong(w->window, GWL_STYLE);
if (!AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, FALSE))
return;
MoveWindow(w->window, x, y,
rect.right - rect.left,
rect.bottom - rect.top,
TRUE);
}
EAPI void
ecore_win32_window_size_get(Ecore_Win32_Window *window,
int *width,
int *height)
{
RECT rect;
if (!window) return;
if (!GetClientRect(((struct _Ecore_Win32_Window *)window)->window,
&rect))
{
if (width) *width = 0;
if (height) *height = 0;
}
if (width) *width = rect.right - rect.left;
if (height) *height = rect.bottom - rect.top;
}
EAPI void
ecore_win32_window_size_min_set(Ecore_Win32_Window *window,
int min_width,
int min_height)
{
struct _Ecore_Win32_Window *w;
if (!window) return;
w = (struct _Ecore_Win32_Window *)window;
w->min_width = min_width;
w->min_height = min_height;
}
EAPI void
ecore_win32_window_size_max_set(Ecore_Win32_Window *window,
int max_width,
int max_height)
{
struct _Ecore_Win32_Window *w;
if (!window) return;
w = (struct _Ecore_Win32_Window *)window;
w->max_width = max_width;
w->max_height = max_height;
}
EAPI void
ecore_win32_window_size_base_set(Ecore_Win32_Window *window,
int base_width,
int base_height)
{
struct _Ecore_Win32_Window *w;
if (!window) return;
w = (struct _Ecore_Win32_Window *)window;
w->base_width = base_width;
w->base_height = base_height;
}
EAPI void
ecore_win32_window_size_step_set(Ecore_Win32_Window *window,
int step_width,
int step_height)
{
struct _Ecore_Win32_Window *w;
if (!window) return;
w = (struct _Ecore_Win32_Window *)window;
w->step_width = step_width;
w->step_height = step_height;
}
/* TODO: ecore_win32_window_shaped_set */
EAPI void
ecore_win32_window_show(Ecore_Win32_Window *window)
{
if (!window) return;
ShowWindow(((struct _Ecore_Win32_Window *)window)->window, SW_SHOWNORMAL);
UpdateWindow(((struct _Ecore_Win32_Window *)window)->window);
}
/* FIXME: seems to block the taskbar */
EAPI void
ecore_win32_window_hide(Ecore_Win32_Window *window)
{
if (!window) return;
ShowWindow(((struct _Ecore_Win32_Window *)window)->window, SW_HIDE);
}
EAPI void
ecore_win32_window_raise(Ecore_Win32_Window *window)
{
if (!window) return;
SetWindowPos(((struct _Ecore_Win32_Window *)window)->window,
HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
}
EAPI void
ecore_win32_window_lower(Ecore_Win32_Window *window)
{
if (!window) return;
SetWindowPos(((struct _Ecore_Win32_Window *)window)->window,
HWND_BOTTOM, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
}
EAPI void
ecore_win32_window_title_set(Ecore_Win32_Window *window,
const char *title)
{
if (!window) return;
if (!title || !title[0]) return;
SetWindowText(((struct _Ecore_Win32_Window *)window)->window, title);
}
EAPI void
ecore_win32_window_focus_set(Ecore_Win32_Window *window)
{
if (!window) return;
SetFocus(((struct _Ecore_Win32_Window *)window)->window);
}
EAPI void
ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
int on)
{
struct _Ecore_Win32_Window *ew;
if (!window) return;
ew = (struct _Ecore_Win32_Window *)window;
if (((ew->iconified) && (on)) ||
((!ew->iconified) && (!on)))
return;
if (on)
{
ShowWindow(ew->window,
SW_MINIMIZE);
}
else
{
ShowWindow(ew->window,
SW_RESTORE);
}
ew->iconified = on;
}
EAPI void
ecore_win32_window_borderless_set(Ecore_Win32_Window *window,
int on)
{
RECT rect;
DWORD style;
struct _Ecore_Win32_Window *ew;
HWND w;
if (!window) return;
ew = (struct _Ecore_Win32_Window *)window;
if (((ew->borderless) && (on)) ||
((!ew->borderless) && (!on)))
return;
w = ew->window;
style = GetWindowLong(w, GWL_STYLE);
if (on)
{
if (!GetClientRect(w, &rect)) return;
SetWindowLong(w, GWL_STYLE, style & ~WS_CAPTION);
}
else
{
if (!GetWindowRect(w, &rect)) return;
style |= WS_CAPTION;
AdjustWindowRect (&rect, style, FALSE);
SetWindowLong(w, GWL_STYLE, style);
}
SetWindowPos(w, HWND_TOPMOST,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOMOVE | SWP_FRAMECHANGED);
ew->borderless = on;
}
EAPI void
ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window,
int on)
{
struct _Ecore_Win32_Window *ew;
HWND w;
int width;
int height;
if (!window) return;
ew = (struct _Ecore_Win32_Window *)window;
if (((ew->fullscreen) && (on)) ||
((!ew->fullscreen) && (!on)))
return;
w = ew->window;
if (on)
{
if (!GetWindowRect(w, &ew->rect)) return;
width = GetSystemMetrics (SM_CXSCREEN);
height = GetSystemMetrics (SM_CYSCREEN);
ew->style = GetWindowLong(w, GWL_STYLE);
SetWindowLong(w, GWL_STYLE, (ew->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
SetWindowPos(w, HWND_TOP, 0, 0, width, height,
SWP_NOCOPYBITS | SWP_SHOWWINDOW);
}
else
{
SetWindowLong(w, GWL_STYLE, ew->style);
SetWindowPos(w, HWND_NOTOPMOST,
ew->rect.left,
ew->rect.top,
ew->rect.right - ew->rect.left,
ew->rect.bottom - ew->rect.right,
SWP_NOCOPYBITS | SWP_SHOWWINDOW);
}
ew->fullscreen = on;
}