summaryrefslogtreecommitdiff
path: root/alf/alfradiobutton.cpp
blob: 2fe6cb60f56c50e6c31d22ead880bc63b38f4429 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "alfpriv.h"

typedef struct {
    ALFColor bgcolor;
    WNDPROC  origWndProc;
} ALFRadioPriv;

static ALFRadioPriv *
ALF_Radio_InitializePriv(void)
{
    return ALF_New(ALFRadioPriv, 1);
}

static void
ALF_Radio_FreePriv(ALFRadioPriv *priv)
{
    ALF_Free(priv);
}

static LRESULT
ALF_Radio_HandleCtlColor(HWND window, ALFRadioPriv *priv, HDC hDC)
{
    (void)priv; (void)window;

    SetTextColor(hDC, GetSysColor(COLOR_BTNTEXT));
    SetBkColor(hDC, GetSysColor(COLOR_BTNFACE));
    SetBkMode(hDC, OPAQUE);
    return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}

static LRESULT CALLBACK
ALF_Radio_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
{
    ALFRadioPriv *priv = (ALFRadioPriv *)GetWindowLongPtr(window, GWLP_USERDATA);

    if (!priv) // fuck
        return DefWindowProc(window, msg, wparam, lparam);

    if (msg == ALF_WM_SETBGCOLOR) {
        ALFColor newColor = (ALFColor)lparam;
        if (newColor != priv->bgcolor) {
            priv->bgcolor = newColor;
            if (ALF_Compat_IsAppThemed())
                InvalidateRect(window, NULL, TRUE);
        }
        return TRUE;
    }

    if (msg == 0x2000 + WM_CTLCOLORSTATIC || msg == 0x2000 + WM_CTLCOLORBTN) {
        return ALF_Radio_HandleCtlColor(window, priv, (HDC)wparam);
    }

    if (msg == ALF_WM_BACKGROUNDCHANGE) {
        if (priv->bgcolor == ALF_COLOR_TRANSPARENT && ALF_Compat_IsAppThemed()) {
            InvalidateRect(window, NULL, TRUE);
        }
        return TRUE;
    }

    if (msg == WM_THEMECHANGED) {
        InvalidateRect(window, NULL, TRUE);
    }

    if (msg == WM_DESTROY) {
        WNDPROC orig = priv->origWndProc;
        SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)orig);
        SetWindowLongPtr(window, GWLP_USERDATA, 0);
        ALF_Radio_FreePriv(priv);
        return CallWindowProc(orig, window, msg, wparam, lparam);
    }

    return CallWindowProc(priv->origWndProc, window, msg, wparam, lparam);
}

HWND
ALF_AddRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text)
{
    HWND hwnd  = CreateWindowEx(0,
                                TEXT("BUTTON"),
                                text,
                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
                                0, 0, 100, 100,
                                parent,
                                (HMENU)(ULONG_PTR)id,
                                ALF_HINSTANCE,
                                NULL);

    ALFRadioPriv *priv = ALF_Radio_InitializePriv();
    SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)priv);
    priv->origWndProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ALF_Radio_WindowProc);

    ALF_AddWidget(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_SENDBGCHANGE);

    return hwnd;
}