You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
572 lines
14 KiB
572 lines
14 KiB
/*
|
|
* A simple application using Windows Resources.
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include <commctrl.h>
|
|
#include <winbase.h>
|
|
#include <tchar.h>
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
#include <aygshell.h>
|
|
#endif
|
|
|
|
#include <mmsystem.h>
|
|
#include <shlobj.h>
|
|
|
|
#include "osmroute.h"
|
|
#include "wince_port.h"
|
|
#include "draw.h"
|
|
#include "gui.h"
|
|
#include "system.h"
|
|
#include "routing.h"
|
|
|
|
|
|
/* scale: km/per pixel */
|
|
HINSTANCE hi;
|
|
HWND hMainWnd;
|
|
|
|
BOOL InitApplication(HINSTANCE hinstance);
|
|
BOOL InitInstance(HINSTANCE hinstance, int nCmdShow);
|
|
LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);
|
|
void DoMenuActions(HWND w, INT id);
|
|
const WCHAR *WindowCaption = L"Resource Test";
|
|
|
|
|
|
/*
|
|
* functions which are might usefull
|
|
*/
|
|
void wince_taskbar(HWND hWnd, int show) {
|
|
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
RECT rc;
|
|
static int lastshow = -1;
|
|
static int initbottom = -1;
|
|
static int inittop = -1;
|
|
|
|
if (!hWnd) return;
|
|
|
|
/* prevent from hiding or displaying the bar twice */
|
|
// d_printf ("%s:%d wince_taskbar function is wrong --> so just return. The window size is somehow always wrong..", __FILE__, __LINE__);
|
|
// return;
|
|
|
|
if (lastshow == show) return;
|
|
lastshow = show;
|
|
GetWindowRect( hWnd, &rc );
|
|
|
|
if (initbottom == -1) {
|
|
initbottom = rc.bottom;
|
|
inittop = rc.top;
|
|
}
|
|
|
|
d_printf ("wince_taskbar show/hide: %d dest size: %d, %d, %d, %d", show, rc.left, rc.top, rc.right, rc.bottom);
|
|
|
|
|
|
HWND hWndTB=FindWindow(TEXT("HHTaskbar"),NULL);
|
|
|
|
if (show) {
|
|
SHFullScreen( hWnd, SHFS_SHOWTASKBAR | (SHFS_SHOWSIPBUTTON + SHFS_SHOWSTARTICON) );
|
|
ShowWindow( hWndTB, SW_SHOW );
|
|
MoveWindow( hWnd,
|
|
rc.left,
|
|
inittop,
|
|
rc.right,
|
|
rc.bottom,
|
|
TRUE
|
|
);
|
|
}
|
|
else {
|
|
SHFullScreen( hWnd, SHFS_HIDETASKBAR | (SHFS_HIDESIPBUTTON + SHFS_HIDESTARTICON) );
|
|
ShowWindow( hWndTB, SW_HIDE );
|
|
MoveWindow( hWnd,
|
|
rc.left,
|
|
inittop - MENU_HEIGHT,
|
|
rc.right,
|
|
initbottom + MENU_HEIGHT,
|
|
TRUE
|
|
);
|
|
}
|
|
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* converting between wchar and char
|
|
*/
|
|
int wchar2char (char *c, int clen, WCHAR *wc) {
|
|
int len = lstrlenW(wc);
|
|
|
|
WideCharToMultiByte(CP_UTF8, 0, wc, -1, c, clen, NULL, NULL);
|
|
return len;
|
|
};
|
|
|
|
|
|
int wchar2oem (char *c, int clen, WCHAR *wc) {
|
|
int len = lstrlenW(wc);
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, wc, -1, c, clen, NULL, NULL);
|
|
return len;
|
|
};
|
|
|
|
|
|
int char2wchar (WCHAR *wc, int wclen, char *c) {
|
|
return MultiByteToWideChar(CP_UTF8, 0, c, -1, wc, wclen)-1;
|
|
};
|
|
|
|
|
|
void SetDlgItemText_wa (HWND hwnd, int id, char *str) {
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
WCHAR str_w[1024];
|
|
char2wchar (str_w, 1024, str);
|
|
SetDlgItemText(hwnd, id, str_w);
|
|
#else
|
|
SetDlgItemText(hwnd, id, str);
|
|
#endif
|
|
};
|
|
|
|
|
|
void GetDlgItemText_wa (HWND hwnd, int id, char *str, int cnt) {
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
WCHAR str_w[1024];
|
|
GetDlgItemText(hwnd, id, str_w, 1024);
|
|
wchar2char (str, cnt, str_w);
|
|
#else
|
|
GetDlgItemText(hwnd, id, str, cnt);
|
|
#endif
|
|
};
|
|
|
|
|
|
void SendMessage_SetText_wa (HWND hwnd, UINT msg, WPARAM wParam, LPARAM str) {
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
WCHAR str_w[1024];
|
|
char2wchar (str_w, 1024, (char*) str);
|
|
SendMessage (hwnd, msg, wParam, (LPARAM) str_w);
|
|
#else
|
|
SendMessage (hwnd, msg, wParam, str);
|
|
#endif
|
|
};
|
|
|
|
|
|
void SendMessage_GetText_wa (HWND hwnd, UINT msg, WPARAM wParam, LPARAM str, int cnt) {
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
WCHAR str_w[1024];
|
|
SendMessage (hwnd, msg, wParam, (LPARAM) str_w);
|
|
wchar2char ((char*)str, cnt, (WCHAR *) str_w);
|
|
#else
|
|
SendMessage (hwnd, msg, wParam, str);
|
|
#endif
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************************************************
|
|
*
|
|
* load all configs and init the main window
|
|
*
|
|
*/
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
int WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) {
|
|
#else
|
|
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
|
#endif
|
|
MSG msg;
|
|
BOOL fGotMessage;
|
|
|
|
app_init (nCmdShow, lpCmdLine);
|
|
|
|
if (!InitApplication(hinstance))
|
|
return FALSE;
|
|
|
|
if (!InitInstance(hinstance, nCmdShow))
|
|
return FALSE;
|
|
|
|
while ((fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0 && fGotMessage != -1) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
app_shutdown ();
|
|
|
|
return msg.wParam;
|
|
}
|
|
|
|
BOOL InitApplication(HINSTANCE hinstance)
|
|
{
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
WNDCLASS WndCls;
|
|
HWND hWnd;
|
|
SHInitExtraControls();
|
|
int e;
|
|
|
|
hWnd = FindWindow(L"osmRoute", NULL);
|
|
e = GetLastError();
|
|
if (hWnd && e != ERROR_CLASS_DOES_NOT_EXIST) {
|
|
/* another process is still running.. */
|
|
if (SetForegroundWindow((HWND)((ULONG) hWnd | 0x01)) != 0) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//
|
|
// create the ressource and stup the window
|
|
//
|
|
WndCls.style = CS_HREDRAW | CS_VREDRAW;
|
|
WndCls.lpfnWndProc = WndProcedure;
|
|
WndCls.cbClsExtra = 0;
|
|
WndCls.cbWndExtra = 0;
|
|
WndCls.hIcon = NULL;
|
|
WndCls.hCursor = NULL;
|
|
WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
|
WndCls.lpszMenuName = NULL;
|
|
WndCls.lpszClassName = L"osmRoute";
|
|
WndCls.hInstance = hinstance;
|
|
|
|
return RegisterClass(&WndCls);
|
|
|
|
#else
|
|
WNDCLASSEX wcx;
|
|
|
|
// Fill in the window class structure with parameters
|
|
// that describe the main window.
|
|
wcx.cbSize = sizeof(wcx); // size of structure
|
|
wcx.style = CS_HREDRAW |
|
|
CS_VREDRAW; // redraw if size changes
|
|
wcx.lpfnWndProc = WndProcedure; // points to window procedure
|
|
wcx.cbClsExtra = 0; // no extra class memory
|
|
wcx.cbWndExtra = 0; // no extra window memory
|
|
wcx.hInstance = hinstance; // handle to instance
|
|
wcx.hIcon = LoadIcon(NULL,
|
|
IDI_APPLICATION); // predefined app. icon
|
|
wcx.hCursor = LoadCursor(NULL,
|
|
IDC_ARROW); // predefined arrow
|
|
wcx.hbrBackground = GetStockObject(
|
|
WHITE_BRUSH); // white background brush
|
|
// wcx.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); // name of menu resource
|
|
wcx.lpszClassName = "osmRoute"; // name of window class
|
|
wcx.lpszMenuName = NULL;
|
|
wcx.hIconSm = LoadImage(hinstance, // small class icon
|
|
MAKEINTRESOURCE(5),
|
|
IMAGE_ICON,
|
|
GetSystemMetrics(SM_CXSMICON),
|
|
GetSystemMetrics(SM_CYSMICON),
|
|
LR_DEFAULTCOLOR);
|
|
|
|
// Register the window class.
|
|
return RegisterClassEx(&wcx);
|
|
#endif
|
|
}
|
|
|
|
BOOL InitInstance(HINSTANCE hinstance, int nCmdShow)
|
|
{
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
hi = hinstance;
|
|
hMainWnd = CreateWindow(L"osmRoute", L"wceOSMroute", WS_VISIBLE | WS_MAXIMIZE ,
|
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
NULL, NULL, hinstance, NULL);
|
|
|
|
if (!hMainWnd)
|
|
return FALSE;
|
|
|
|
// wince_taskbar (hMainWnd, FALSE );
|
|
ShowWindow(hMainWnd, SW_SHOWMAXIMIZED);
|
|
#else
|
|
// Save the application-instance handle.
|
|
hi = hinstance;
|
|
hMainWnd = CreateWindow(
|
|
"osmRoute", // name of window class
|
|
"wceOSMroute", // title-bar string
|
|
WS_OVERLAPPEDWINDOW, // top-level window
|
|
CW_USEDEFAULT, // default horizontal position
|
|
CW_USEDEFAULT, // default vertical position
|
|
240, // default width
|
|
320, // default height
|
|
(HWND) NULL, // no owner window
|
|
(HMENU) NULL, // use class menu
|
|
hinstance, // handle to application instance
|
|
(LPVOID) NULL); // no window-creation data
|
|
|
|
if (!hMainWnd)
|
|
return FALSE;
|
|
|
|
// Show the window and send a WM_PAINT message to the window
|
|
// procedure.
|
|
ShowWindow(hMainWnd, nCmdShow);
|
|
#endif
|
|
UpdateWindow(hMainWnd);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
LRESULT CALLBACK WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
|
|
static int timer_cyclicloop = -1;
|
|
static int timer_active = 0;
|
|
int x ,y;
|
|
GUIEvent gevent;
|
|
RECT rc;
|
|
|
|
switch (Msg) {
|
|
case WM_CREATE:
|
|
{
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
wince_taskbar (hWnd, FALSE);
|
|
|
|
/* SHMENUBARINFO mbi;
|
|
ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
|
|
|
|
mbi.cbSize = sizeof(SHMENUBARINFO);
|
|
mbi.hwndParent = hWnd;
|
|
mbi.nToolBarId = IDR_MAINMENU;
|
|
mbi.hInstRes = hi;
|
|
mbi.dwFlags = SHCMBF_HMENU;
|
|
if(!SHCreateMenuBar(&mbi)) {
|
|
wince_taskbar (hWnd, TRUE);
|
|
DestroyWindow(hWnd);
|
|
PostQuitMessage(1);
|
|
return(-1);
|
|
}
|
|
else {
|
|
HWND g_hwndMb = mbi.hwndMB;
|
|
HMENU g_hMenu;
|
|
TBBUTTONINFO tbbi = {0};
|
|
|
|
tbbi.cbSize = sizeof(tbbi);
|
|
tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;
|
|
SendMessage(g_hwndMb, TB_GETBUTTONINFO,0, (LPARAM)&tbbi);
|
|
g_hMenu = (HMENU)tbbi.lParam;
|
|
} */
|
|
#else
|
|
#endif
|
|
timer_cyclicloop = SetTimer(hWnd, WINTIMER_CYCLICLOOP, 0, NULL);
|
|
gfx_resize (100,100);
|
|
}
|
|
break;
|
|
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
|
|
case WM_ACTIVATE:
|
|
// if (LOWORD(wParam)!=WA_INACTIVE) {
|
|
// wince_taskbar (hWnd, FALSE);
|
|
// } else {
|
|
// wince_taskbar (hWnd, TRUE);
|
|
// }
|
|
break;
|
|
#endif
|
|
case WM_DESTROY:
|
|
wince_taskbar (hWnd, TRUE);
|
|
route_stop ();
|
|
gps_stop ();
|
|
KillTimer (hWnd, timer_cyclicloop);
|
|
PostQuitMessage(WM_QUIT);
|
|
break;
|
|
case WM_TIMER:
|
|
if (timer_active) break;
|
|
else timer_active = 1;
|
|
draw_mouseloop ();
|
|
if (gps_isrunning ()) {
|
|
struct gps_data *gpsdata;
|
|
if ((gpsdata = gps_loop ()))
|
|
drawgps_set_pos (gpsdata);
|
|
main_wnd_update ();
|
|
}
|
|
timer_active = 0;
|
|
break;
|
|
case WM_PAINT:
|
|
GetWindowRect( hWnd, &rc );
|
|
gfx_resize (rc.right-rc.left, rc.bottom-rc.top);
|
|
|
|
draw_wm_paint = 1;
|
|
draw ();
|
|
draw_wm_paint = 0;
|
|
break;
|
|
case WM_LBUTTONUP:
|
|
x = (lParam & 0xFFFF);
|
|
y = (lParam >> 16);
|
|
gevent.mousepos.x = x;
|
|
gevent.mousepos.y = y;
|
|
gevent.mousebtn = 1;
|
|
gevent.event = EGUI_MOUSERELEASED;
|
|
if (gui_event (gevent) == 0) draw_mousebtnup (x, y, 1);
|
|
break;
|
|
case WM_LBUTTONDOWN:
|
|
x = (lParam & 0xFFFF);
|
|
y = (lParam >> 16);
|
|
gevent.mousepos.x = x;
|
|
gevent.mousepos.y = y;
|
|
gevent.mousebtn = 1;
|
|
gevent.event = EGUI_MOUSEPRESSED;
|
|
if (gui_event (gevent) == 0) draw_mousebtndown (x, y, 1);
|
|
break;
|
|
case WM_MOUSEMOVE:
|
|
x = (lParam & 0xFFFF);
|
|
y = (lParam >> 16);
|
|
gevent.mousepos.x = x;
|
|
gevent.mousepos.y = y;
|
|
gevent.mousebtn = 0;
|
|
gevent.event = EGUI_MOUSEMOVE;
|
|
gui_event (gevent);
|
|
draw_mousemove (x, y, -1);
|
|
break;
|
|
case WM_CHAR:
|
|
if (wParam < ' ') gevent.keyval = 0xff00 | wParam;
|
|
else gevent.keyval = wParam;
|
|
gevent.event = EGUI_KEYRELEASED;
|
|
d_printf ("char wParam:%x keyval:%x", wParam, gevent.keyval);
|
|
if (gui_event (gevent) != 0) draw();
|
|
break;
|
|
// case WM_KEYUP:
|
|
// if (wParam == 0x03) gevent.keyval = 0xff1b;
|
|
// else if (wParam == 0x08) gevent.keyval = 0xff08;
|
|
// else if (wParam == 0x0d) gevent.keyval = 0xff0d;
|
|
// else {
|
|
// break;
|
|
// }
|
|
// gevent.event = EGUI_KEYRELEASED;
|
|
// if (gui_event (gevent) != 0) draw();
|
|
// break;
|
|
case WM_COMMAND:
|
|
/* Handle the menu items */
|
|
DoMenuActions(hWnd, LOWORD(wParam));
|
|
break;
|
|
default:
|
|
return DefWindowProc(hWnd, Msg, wParam, lParam);;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void DoMenuActions(HWND hWnd, INT id) {
|
|
switch (id) {
|
|
case IDM_MENU_EXIT:
|
|
gps_stop ();
|
|
route_stop ();
|
|
wince_taskbar (hWnd, TRUE);
|
|
PostQuitMessage(0);
|
|
break;
|
|
case IDM_MENU_MAP_PATH:
|
|
{
|
|
char *fn;
|
|
// wince_taskbar (hWnd, TRUE);
|
|
fn = select_dir_dialog ("MapData", cfg.datapath);
|
|
// wince_taskbar (hWnd, FALSE);
|
|
if (fn) {
|
|
d_printf ("config: changed data path from '%s' to '%s'.", cfg.datapath, fn);
|
|
map_clear();
|
|
strncpy (cfg.datapath, fn, LEN_FILENAME);
|
|
map_clear();
|
|
draw_redrawmap ();
|
|
}
|
|
}
|
|
break;
|
|
case IDM_MENU_LOG_PATH:
|
|
{
|
|
char *fn;
|
|
// wince_taskbar (hWnd, TRUE);
|
|
fn = select_dir_dialog ("LOG Path", cfg.logpath);
|
|
// wince_taskbar (hWnd, FALSE);
|
|
if (fn) {
|
|
d_printf ("config: changed log path from '%s' to '%s'.", cfg.logpath, fn);
|
|
strncpy (cfg.logpath, fn, LEN_FILENAME);
|
|
}
|
|
}
|
|
break;
|
|
case IDM_MENU_MAP_REFRESHSEARCH:
|
|
{
|
|
#ifndef _WINDOWSCE_
|
|
char lfn[LEN_FILENAME];
|
|
char rfn[LEN_FILENAME] = "search.mapidx";
|
|
|
|
map_search_get_filename (lfn, LEN_FILENAME);
|
|
map_webload (rfn, lfn, NULL);
|
|
map_search_sort ();
|
|
#endif
|
|
app_status ("", -1);
|
|
}
|
|
break;
|
|
case IDM_MENU_MAP_WEBLOAD:
|
|
{
|
|
char fn[LEN_FILENAME];
|
|
char rfn[LEN_FILENAME];
|
|
|
|
map_ls_get_filename_only (fn, LEN_FILENAME, map_geo2igeo (view_lon), map_geo2igeo (view_lat));
|
|
map_ls_get_filename (rfn, LEN_FILENAME, map_geo2igeo (view_lon), map_geo2igeo (view_lat));
|
|
#ifndef _WINDOWSCE_
|
|
map_webload (fn, rfn, NULL);
|
|
#endif
|
|
draw_redrawmap ();
|
|
}
|
|
break;
|
|
case IDM_MENU_GPS_SETTING:
|
|
// wince_taskbar (hWnd, TRUE);
|
|
gps_wince_settings ();
|
|
// wince_taskbar (hWnd, FALSE);
|
|
break;
|
|
case IDM_MENU_GPS_START:
|
|
gps_start ();
|
|
break;
|
|
case IDM_MENU_GPS_STOP:
|
|
gps_stop ();
|
|
break;
|
|
case IDM_MENU_GPS_LOGLOAD:
|
|
{
|
|
char *fn;
|
|
// wince_taskbar (hWnd, TRUE);
|
|
fn = dialog_getfilename ("GPS-Logfile", "NMEA-File\0*.nmea\0All\0*.*\0", 0);
|
|
// wince_taskbar (hWnd, FALSE);
|
|
if (fn)
|
|
gps_load_log (fn);
|
|
}
|
|
break;
|
|
case IDM_MENU_GPX_EXPORT:
|
|
{
|
|
char *fn;
|
|
// wince_taskbar (hWnd, TRUE);
|
|
fn = dialog_getfilename ("GPX-Export", "GPX-File\0*.gpx\0All\0*.*\0", 1);
|
|
// wince_taskbar (hWnd, FALSE);
|
|
if (fn)
|
|
gpsroute_exportgpx (gpsroute, fn);
|
|
}
|
|
break;
|
|
case IDM_MENU_ROUTESAVE:
|
|
{
|
|
char *fn;
|
|
// wince_taskbar (hWnd, TRUE);
|
|
fn = dialog_getfilename ("Route Save", "Text File\0*.txt\0All\0*.*\0", 1);
|
|
// wince_taskbar (hWnd, FALSE);
|
|
// if (fn)
|
|
// gpsroute_saveroute (gpsroute, fn);
|
|
}
|
|
break;
|
|
case IDM_MENU_SEL_DIR: {
|
|
d_printf ("nothing here yet..");
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
|
|
|
|
void main_wnd_loop (long long int cur, long long int max) {
|
|
main_wnd_update ();
|
|
};
|
|
|
|
|
|
/******************************************************************************
|
|
* update stausbar - not finished in windows.. we have no status bar here yet.
|
|
*/
|
|
void main_wnd_update () {
|
|
MSG message;
|
|
if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
|
|
TranslateMessage(&message);
|
|
DispatchMessage(&message);
|
|
}
|
|
};
|
|
|