aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile9
-rw-r--r--win.c259
2 files changed, 164 insertions, 104 deletions
diff --git a/Makefile b/Makefile
index c5e8670..fc89c68 100644
--- a/Makefile
+++ b/Makefile
@@ -6,8 +6,9 @@ INPUTS += $(PROJECT_ROOT)track_episodes.pl
INPUTS += $(PROJECT_ROOT)local_episodes.pl
INPUTS += $(PROJECT_ROOT)episode_data.pl
-CFLAGS += -v -cc-options,-mwindows,-municode -DUNICODE -D_UNICODE
-LDFLAGS += -lcomctl32 -lgdi32
+CFLAGS += -DUNICODE -D_UNICODE
+CFLAGS += -v -cc-options,-mwindows
+LDFLAGS += -lcomctl32 -lgdi32 -luxtheme
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
@@ -24,7 +25,7 @@ endif
all: episode_browser.exe
-episode_browser.exe: $(INPUTS)
+episode_browser.exe: $(INPUTS) $(PROJECT_ROOT)Makefile
swipl-ld $(CFLAGS) $(LDFLAGS) -goal true -o $@ $(INPUTS)
$(EXTRA_CMDS)
@@ -35,4 +36,4 @@ resource.obj: $(PROJECT_ROOT)resource.h $(PROJECT_ROOT)resource.rc
# $(CC) -c $(CFLAGS) -o $@ $<
clean:
- rm -fr episode_browser.exe $(EXTRA_CLEAN)
+ rm -fr episode_browser.exe resource.obj $(EXTRA_CLEAN)
diff --git a/win.c b/win.c
index 8764092..b45a012 100644
--- a/win.c
+++ b/win.c
@@ -1,6 +1,7 @@
#include <windows.h>
#include <TCHAR.H>
#include <commctrl.h>
+#include <uxtheme.h>
#include <stdio.h>
#include <string.h>
#include <SWI-Prolog.h>
@@ -10,14 +11,18 @@
HFONT g_GUIFont;
-static int Attach(void);
+static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
static INT_PTR CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
+static void CreateListView(HWND);
+static LRESULT HandleListViewNotify(HWND, NMLISTVIEW *);
+
static HFONT GetGUIFont();
+static TCHAR *TSZFromSZ(char *, int);
+
+static int Attach(void);
static void UpdateName(HWND, int);
static void UpdateList(HWND);
static void ShowEpisode(HWND, int);
-static TCHAR *TSZFromSZ(int, char *);
-static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/*
int main(int argc, char *argv[])
@@ -43,7 +48,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, INT nCmdShow)
{
char *rgArgs[2];
- HWND hwnd;
+ HWND hWnd;
MSG msg;
INITCOMMONCONTROLSEX icc;
WNDCLASSEX wc;
@@ -81,7 +86,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
RegisterClassEx(&wc);
- hwnd = CreateWindowEx(
+ hWnd = CreateWindowEx(
0,
CLASSNAME,
TEXT("Episode Browser"),
@@ -94,10 +99,10 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
NULL
);
- if (!hwnd)
+ if (!hWnd)
return 0;
- ShowWindow(hwnd, nCmdShow);
+ ShowWindow(hWnd, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
@@ -108,11 +113,11 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
}
LRESULT CALLBACK
-WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_CLOSE:
- DestroyWindow(hwnd);
+ DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
@@ -120,88 +125,59 @@ WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_FILE_EXIT:
- PostMessage(hwnd, WM_CLOSE, 0, 0);
+ PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case ID_FILE_ABOUT:
DialogBox(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_ABOUT),
- hwnd,
+ hWnd,
AboutDlgProc
);
break;
}
break;
case WM_CREATE:
- {
- HWND hListView;
- LVCOLUMN lvc;
-
- hListView = CreateWindowEx(
- 0,
- WC_LISTVIEW,
- TEXT(""),
- WS_CHILD|WS_VISIBLE|WS_VSCROLL|LVS_REPORT,
- 0, 0, 100, 100,
- hwnd,
- (HMENU)IDC_LISTVIEW,
- GetModuleHandle(NULL),
- NULL
- );
-
- SendMessage(hListView,LVM_SETEXTENDEDLISTVIEWSTYLE,
- 0, LVS_EX_FULLROWSELECT);
-
- SendMessage(hListView, WM_SETFONT,
- (WPARAM)g_GUIFont, MAKELPARAM(FALSE, 0));
-
- lvc.mask = LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
-
- lvc.iSubItem = 0;
- lvc.pszText = TEXT("#");
- lvc.cx = 40;
- ListView_InsertColumn(hListView, 0, &lvc);
-
- lvc.iSubItem = 1;
- lvc.pszText = TEXT("Title");
- lvc.cx = 500;
- ListView_InsertColumn(hListView, 1, &lvc);
-
- UpdateList(hListView);
- }
+ CreateListView(hWnd);
break;
case WM_SIZE:
{
HWND hListView;
RECT rc;
- GetClientRect(hwnd, &rc);
- hListView = GetDlgItem(hwnd, IDC_LISTVIEW);
+ GetClientRect(hWnd, &rc);
+ hListView = GetDlgItem(hWnd, IDC_LISTVIEW);
MoveWindow(hListView, 0, 0,
rc.right, rc.bottom,
TRUE);
}
break;
+ case WM_NOTIFY:
+ switch (((NMHDR *)lParam)->idFrom) {
+ case IDC_LISTVIEW:
+ return HandleListViewNotify(hWnd, (NMLISTVIEW *)lParam);
+ }
+ break;
default:
- return DefWindowProc(hwnd, uMsg, wParam, lParam);
+ return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
INT_PTR CALLBACK
-AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
return TRUE;
case WM_CLOSE:
- EndDialog(hwnd, IDOK);
+ EndDialog(hWnd, IDOK);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
- EndDialog(hwnd, IDOK);
+ EndDialog(hWnd, IDOK);
break;
}
break;
@@ -212,6 +188,125 @@ AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
}
+void
+CreateListView(HWND hWnd)
+{
+ HMODULE hModule;
+ HWND hListView;
+ LVCOLUMN lvc;
+
+ hListView = CreateWindowEx(
+ 0,
+ WC_LISTVIEW,
+ TEXT(""),
+ WS_CHILD|WS_VISIBLE|WS_VSCROLL|LVS_REPORT,
+ 0, 0, 0, 0,
+ hWnd,
+ (HMENU)IDC_LISTVIEW,
+ GetModuleHandle(NULL),
+ NULL
+ );
+
+ SendMessage(hListView,LVM_SETEXTENDEDLISTVIEWSTYLE,
+ 0, LVS_EX_FULLROWSELECT);
+
+ SendMessage(hListView, WM_SETFONT,
+ (WPARAM)g_GUIFont, MAKELPARAM(FALSE, 0));
+
+ hModule = LoadLibrary(TEXT("uxtheme.dll"));
+ if (hModule && GetProcAddress(hModule, "SetWindowTheme")) {
+ SendMessage(hListView, WM_CHANGEUISTATE,
+ MAKEWPARAM(UIS_SET, UISF_HIDEFOCUS), 0);
+ SetWindowTheme(hListView, TEXT("Explorer"), NULL);
+ }
+
+ lvc.mask = LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
+
+ lvc.iSubItem = 0;
+ lvc.pszText = TEXT("#");
+ lvc.cx = 40;
+ ListView_InsertColumn(hListView, 0, &lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = TEXT("Title");
+ lvc.cx = 500;
+ ListView_InsertColumn(hListView, 1, &lvc);
+
+ UpdateList(hWnd);
+}
+
+LRESULT
+HandleListViewNotify(HWND hWnd, NMLISTVIEW *pNmListView)
+{
+ switch (pNmListView->hdr.code) {
+ case NM_CUSTOMDRAW:
+ {
+ NMLVCUSTOMDRAW *pLvCd;
+ pLvCd = (NMLVCUSTOMDRAW *)pNmListView;
+ switch (pLvCd->nmcd.dwDrawStage) {
+ case CDDS_PREPAINT:
+ //return CDRF_NOTIFYITEMDRAW;
+ break;
+ case CDDS_ITEMPREPAINT:
+
+ break;
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
+/***/
+
+HFONT
+GetGUIFont()
+{
+ HMODULE hModule;
+
+ hModule = LoadLibrary(TEXT("User32.dll"));
+ if (hModule && GetProcAddress(hModule, "SystemParametersInfoW")) {
+ NONCLIENTMETRICS m;
+
+ m.cbSize = sizeof(NONCLIENTMETRICS);
+ SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
+ sizeof(NONCLIENTMETRICS), &m, 0);
+ return CreateFontIndirect(&m.lfMessageFont);
+ } else {
+ return GetStockObject(DEFAULT_GUI_FONT);
+ }
+}
+
+/* Convert zero-terminated non-wide (multi-byte) string to
+ * zero-terminated wide/non-wide string depending on UNICODE. */
+TCHAR *
+TSZFromSZ(char *sz, int iCp)
+{
+ TCHAR *tsz;
+
+#ifdef UNICODE
+ int cbMultiByte, cchWideChar;
+
+ cbMultiByte = strlen(sz)+1;
+ cchWideChar = MultiByteToWideChar(iCp, 0, sz, cbMultiByte, NULL, 0);
+ tsz = malloc(cchWideChar*sizeof(WCHAR));
+ if (!tsz)
+ return NULL;
+ if (!MultiByteToWideChar(iCp, 0, sz, cbMultiByte, tsz, cchWideChar))
+ return NULL;
+#else
+ tsz = malloc(strlen(sz)+1);
+ if (!tsz)
+ return NULL;
+ strcpy(tsz, sz);
+#endif
+
+ return tsz;
+}
+
+/***/
+
/* Attach persistent databases. */
int
Attach()
@@ -233,24 +328,9 @@ Attach()
return 1;
}
-HFONT
-GetGUIFont()
-{
-#ifndef WIN9X
- NONCLIENTMETRICS m;
-
- m.cbSize = sizeof(NONCLIENTMETRICS);
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),
- &m, 0);
- return CreateFontIndirect(&m.lfMessageFont);
-#else
- return GetStockObject(DEFAULT_GUI_FONT);
-#endif
-}
-
/* Show episode data. */
void
-ShowEpisode(HWND hwnd, int iEpisode)
+ShowEpisode(HWND hWnd, int iEpisode)
{
int r;
term_t t;
@@ -295,33 +375,9 @@ ShowEpisode(HWND hwnd, int iEpisode)
}
}
-TCHAR *
-TSZFromSZ(int iCp, char *sz)
-{
- TCHAR *tsz;
-
-#ifdef UNICODE
- int cb;
-
- cb = MultiByteToWideChar(iCp, 0, sz, -1, NULL, 0);
- tsz = malloc(cb*sizeof(wchar_t));
- if (!tsz)
- return NULL;
- if (!MultiByteToWideChar(iCp, 0, sz, -1, tsz, cb))
- return NULL;
-#else
- tsz = malloc(strlen(sz)+1);
- if (!tsz)
- return NULL;
- strcpy(tsz, sz);
-#endif
-
- return tsz;
-}
-
/* Update episode name. */
void
-UpdateName(HWND hwnd, int iEpisode)
+UpdateName(HWND hWnd, int iEpisode)
{
char *szName;
term_t t;
@@ -342,16 +398,16 @@ UpdateName(HWND hwnd, int iEpisode)
/* Update episode list. */
void
-UpdateList(HWND hListView)
+UpdateList(HWND hWnd)
{
+ HWND hListView;
LVITEM lviEpisode, lviName;
qid_t q;
term_t t;
- lviEpisode.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
- lviEpisode.state = 0;
- lviEpisode.stateMask = 0;
+ hListView = GetDlgItem(hWnd, IDC_LISTVIEW);
+ lviEpisode.mask = LVIF_TEXT|LVIF_PARAM;
lviName.mask = LVIF_TEXT;
t = PL_new_term_refs(2);
@@ -386,7 +442,7 @@ UpdateList(HWND hListView)
tszName = NULL;
if (r && PL_get_atom_chars(t2+1, &szName)) {
- tszName = TSZFromSZ(CP_UTF8, szName);
+ tszName = TSZFromSZ(szName, CP_UTF8);
if (!tszName)
continue;
}
@@ -400,7 +456,7 @@ UpdateList(HWND hListView)
/* Insert item. */
- lviEpisode.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
+ lviEpisode.mask = LVIF_TEXT|LVIF_STATE|LVIF_PARAM;
lviEpisode.iItem = i;
lviEpisode.iSubItem = 0;
lviEpisode.pszText = tszEpisode;
@@ -413,6 +469,9 @@ UpdateList(HWND hListView)
lviName.pszText = tszName;
ListView_SetItem(hListView, &lviName);
}
+
+ free(tszName);
+ free(tszEpisode);
}
close: