summaryrefslogtreecommitdiff
path: root/widgetfactory.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-31 01:49:11 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-31 01:49:11 +0200
commit9251e89359ce46d08c0924b09d48fedbdf2c95fb (patch)
tree4adb0418223a07834f8e55a457c07ceda1bf29b3 /widgetfactory.cpp
parent8d31086aed4aa91232cbaad9cf88d720e6329bcf (diff)
ALFApplication and multiple toplevels support
Diffstat (limited to 'widgetfactory.cpp')
-rw-r--r--widgetfactory.cpp79
1 files changed, 73 insertions, 6 deletions
diff --git a/widgetfactory.cpp b/widgetfactory.cpp
index 060544b..f761d2b 100644
--- a/widgetfactory.cpp
+++ b/widgetfactory.cpp
@@ -40,11 +40,15 @@ enum {
IDM_PANES,
IDM_PANES__MAX = IDM_PANES + PANE__MAX,
IDM_MODALDIALOG_PANES,
- IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX
+ IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX,
+ IDM_MODELESSDIALOG_PANES,
+ IDM_MODELESSDIALOG_PANES__MAX = IDM_MODELESSDIALOG_PANES + PANE__MAX
};
BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL;
+static ALFApplication *g_application = NULL;
+
enum PanelBackgroundMode {
BG_INHERIT,
BG_GRADIENT,
@@ -55,6 +59,7 @@ enum PanelBackgroundMode {
#define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1)
static void wfModalDialogRun(HWND owner, int pane);
+static void wfModelessDialogStart(int pane);
/* common stuff */
typedef struct {
@@ -749,7 +754,8 @@ handleClose(void *closure, HWND window)
{
(void)closure;
- ALF_Toplevel_SetModalResult(window, 0);
+ //ALF_Toplevel_SetModalResult(window, 0);
+ DestroyWindow(window);
}
static LRESULT
@@ -819,6 +825,11 @@ handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid,
wfModalDialogRun(window, paneId);
}
+ if (sourceid >= IDM_MODELESSDIALOG_PANES && sourceid < IDM_MODELESSDIALOG_PANES__MAX) {
+ int paneId = sourceid - IDM_MODELESSDIALOG_PANES;
+ wfModelessDialogStart(paneId);
+ }
+
return 0;
}
@@ -868,13 +879,62 @@ wfModalDialogRun(HWND owner, int pane)
{
HWND dlg = ALF_CreateToplevelWindow(WS_EX_DLGMODALFRAME,
WS_POPUPWINDOW | WS_CAPTION | WS_THICKFRAME,
- owner,
+ owner, g_application,
&g_wfModalDialogVtbl,
(void*)(LONG_PTR)pane);
ALF_Toplevel_ShowModal(dlg);
DestroyWindow(dlg);
}
+static BOOL
+wfModelessDialogInit(void *closure, HWND dialog)
+{
+ HWND panel = ALF_AddPanel(dialog, (WORD)-1, 1, 1);
+ int paneid = (int)(LONG_PTR)closure;
+ g_paneInitTable[paneid](panel);
+
+ ALF_SetText(dialog, g_paneLabels[paneid]);
+
+ ALF_LayoutSetColumnExpandNumerator(dialog, 1, 1);
+ ALF_LayoutSetRowExpandNumerator(dialog, 1, 1);
+ ALF_LayoutSetRowMinSize(dialog, 0, 525);
+ ALF_LayoutSetRowMinSize(dialog, 2, 525);
+ ALF_LayoutSetColumnMinSize(dialog, 0, 525);
+ ALF_LayoutSetColumnMinSize(dialog, 2, 525);
+
+ return TRUE;
+}
+
+static void
+wfModelessDialogClose(void *closure, HWND dialog)
+{
+ (void)closure;
+
+ DestroyWindow(dialog);
+}
+
+static ALFToplevelVTable g_wfModelessDialogVtbl;
+
+static void
+wfModelessDialogPrepareVtbl(void)
+{
+ ZeroMemory(&g_wfModelessDialogVtbl, sizeof(g_wfModelessDialogVtbl));
+ g_wfModelessDialogVtbl.close = wfModelessDialogClose;
+ g_wfModelessDialogVtbl.initialize = wfModelessDialogInit;
+}
+
+static void
+wfModelessDialogStart(int pane)
+{
+ HWND dlg = ALF_CreateToplevelWindow(0,
+ WS_OVERLAPPEDWINDOW,
+ NULL, g_application,
+ &g_wfModelessDialogVtbl,
+ (void*)(LONG_PTR)pane);
+ ShowWindow(dlg, SW_SHOW);
+}
+
+
int CALLBACK
#ifdef UNICODE
wWinMain
@@ -898,6 +958,7 @@ WinMain
}
wfModalDialogPrepareVtbl();
+ wfModelessDialogPrepareVtbl();
ALFToplevelVTable vtbl;
ZeroMemory(&vtbl, sizeof(vtbl));
@@ -907,7 +968,9 @@ WinMain
ALF_Initialize();
- HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, &vtbl, NULL);
+ g_application = ALF_CreateApplication();
+
+ HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, g_application, &vtbl, NULL);
if (!win) {
MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK);
return 1;
@@ -944,6 +1007,7 @@ WinMain
HMENU filemenu = CreateMenu();
HMENU newtabmn = CreateMenu();
HMENU modwndmn = CreateMenu();
+ HMENU mlwndmn = CreateMenu();
HMENU helpmenu = CreateMenu();
HMENU bgmenu = CreateMenu();
@@ -951,6 +1015,7 @@ WinMain
AppendMenu(filemenu, MF_SEPARATOR, 0, 0);
AppendMenu(filemenu, MF_POPUP, (UINT_PTR)newtabmn, TEXT("New Tab"));
AppendMenu(filemenu, MF_POPUP, (UINT_PTR)modwndmn, TEXT("Show Modal"));
+ AppendMenu(filemenu, MF_POPUP, (UINT_PTR)mlwndmn, TEXT("Show Modeless"));
AppendMenu(filemenu, MF_SEPARATOR, 0, 0);
AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4"));
@@ -968,14 +1033,16 @@ WinMain
for (int i = 0; i < PANE__MAX; ++i) {
AppendMenu(newtabmn, MF_STRING, IDM_PANES + (UINT)i, g_paneLabels[i]);
AppendMenu(modwndmn, MF_STRING, IDM_MODALDIALOG_PANES + (UINT)i, g_paneLabels[i]);
+ AppendMenu(mlwndmn, MF_STRING, IDM_MODELESSDIALOG_PANES + (UINT)i, g_paneLabels[i]);
}
SetMenu(win, mainmenu);
ALF_Toplevel_EnsureBigEnough(win);
- ALF_Toplevel_ShowModal(win);
- DestroyWindow(win);
+ ALF_Application_Run(g_application);
+ ALF_DestroyApplication(g_application);
+
ALF_UnInitialize();
return 0;