[v3 04/12] comctl32: Extend TaskDialog, add simple callback and tests

Nikolay Sivov bunglehead at gmail.com
Fri Mar 10 15:58:53 CST 2017


On 10.03.2017 21:21, Fabian Maurer wrote:
> v3: Rewrite to implement Nikolay Sivov's suggestions
> 
> Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
> ---
>  dlls/comctl32/taskdialog.c       | 29 +++++++++++++++++++++++--
>  dlls/comctl32/tests/taskdialog.c | 46 +++++++++++++++++++++++++++++++++-------
>  2 files changed, 65 insertions(+), 10 deletions(-)
> 
> diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
> index 2166ce1898..c5f410716e 100644
> --- a/dlls/comctl32/taskdialog.c
> +++ b/dlls/comctl32/taskdialog.c
> @@ -147,17 +147,41 @@ static void controls_add(struct list *controls, WORD id, const WCHAR *class, con
>      list_add_tail(controls, &data->entry);
>  }
>  
> +/* FIXME: Make thread safe */
> +static const TASKDIALOGCONFIG *task_config = 0;
> +static HRESULT callback(HWND hwnd, UINT uNotification, WPARAM wParam, LPARAM lParam)
> +{
> +    if(task_config->pfCallback)
> +        return task_config->pfCallback(hwnd, uNotification, wParam, lParam, task_config->lpCallbackData);
> +    return S_OK;
> +}
> +

There's no reason to introduce global variable for that, just to remove
it two patches after.

>  static INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
>  {
> +    HRESULT ret_callback;
> +
>      switch (uMsg)
>      {
> +        case WM_INITDIALOG:
> +            callback(hwndDlg, TDN_DIALOG_CONSTRUCTED, 0, 0);
> +            callback(hwndDlg, TDN_CREATED, 0, 0);
> +            return TRUE;
>          case WM_COMMAND:
> -            if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK)
> +            if(HIWORD(wParam) == BN_CLICKED)
>              {
> -                EndDialog(hwndDlg, 0);
> +                WORD command_id = LOWORD(wParam);
> +
> +                ret_callback = callback(hwndDlg, TDN_BUTTON_CLICKED, command_id, 0);
> +                if(ret_callback == S_OK) /* FIXME */
> +                {
> +                    EndDialog(hwndDlg, command_id);
> +                }
>                  return TRUE;
>              }
>              break;
> +        case WM_DESTROY:
> +            callback(hwndDlg, TDN_DESTROYED, 0, 0);
> +            break;
>      }
>      return FALSE;

For minimal working replacement of MessageBox callback support is not
needed, right?






More information about the wine-devel mailing list