ReactOS  0.4.14-dev-49-gfb4591c
taskdialog.c
Go to the documentation of this file.
1 /*
2  * Task dialog control
3  *
4  * Copyright 2017 Fabian Maurer
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  */
21 
22 #include <stdarg.h>
23 #include <stdlib.h>
24 #include <string.h>
25 
26 #define NONAMELESSUNION
27 
28 #include "windef.h"
29 #include "winbase.h"
30 #include "wingdi.h"
31 #include "winuser.h"
32 #include "commctrl.h"
33 #include "winerror.h"
34 #include "comctl32.h"
35 
36 #include "wine/debug.h"
37 #include "wine/list.h"
38 #include "wine/unicode.h"
39 
40 WINE_DEFAULT_DEBUG_CHANNEL(taskdialog);
41 
42 #define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
43 #define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
44 #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
45 #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
46 
47 static const UINT DIALOG_MIN_WIDTH = 240;
48 static const UINT DIALOG_SPACING = 5;
49 static const UINT DIALOG_BUTTON_WIDTH = 50;
50 static const UINT DIALOG_BUTTON_HEIGHT = 14;
51 
52 static const UINT ID_MAIN_INSTRUCTION = 0xf000;
53 static const UINT ID_CONTENT = 0xf001;
54 
56 {
57  struct list entry;
58  DLGITEMTEMPLATE *template;
59  unsigned int template_size;
60 };
61 
63 {
64  int id;
65  const WCHAR *text;
66  unsigned int width;
67  unsigned int line;
69 };
70 
72 {
74  unsigned int dialog_height;
75  unsigned int dialog_width;
76  struct list controls;
82 };
83 
85 {
89 };
90 
92 {
93  if (width)
94  *width = MulDiv(*width, 4, desc->x_baseunit);
95  if (height)
96  *height = MulDiv(*height, 8, desc->y_baseunit);
97 }
98 
100 {
101  if (width)
102  *width = MulDiv(*width, desc->x_baseunit, 4);
103  if (height)
104  *height = MulDiv(*height, desc->y_baseunit, 8);
105 }
106 
107 static void template_write_data(char **ptr, const void *src, unsigned int size)
108 {
109  memcpy(*ptr, src, size);
110  *ptr += size;
111 }
112 
113 /* used to calculate size for the controls */
115  BOOL user_resource, SIZE *sz)
116 {
117  RECT rect = { 0, 0, desc->dialog_width - DIALOG_SPACING * 2, 0}; /* padding left and right of the control */
118  const WCHAR *textW = NULL;
119  static const WCHAR nulW;
120  unsigned int length;
121  HFONT oldfont;
122  HDC hdc;
123 
124  if (IS_INTRESOURCE(text))
125  {
126  if (!(length = LoadStringW(user_resource ? desc->taskconfig->hInstance : COMCTL32_hModule,
127  (UINT_PTR)text, (WCHAR *)&textW, 0)))
128  {
129  WARN("Failed to load text\n");
130  textW = &nulW;
131  length = 0;
132  }
133  }
134  else
135  {
136  textW = text;
137  length = strlenW(textW);
138  }
139 
140  hdc = GetDC(0);
141  oldfont = SelectObject(hdc, desc->font);
142 
145  pixels_to_dialogunits(desc, &rect.right, &rect.bottom);
146 
147  SelectObject(hdc, oldfont);
148  ReleaseDC(0, hdc);
149 
150  sz->cx = rect.right - rect.left;
151  sz->cy = rect.bottom - rect.top;
152 }
153 
154 static unsigned int taskdialog_add_control(struct taskdialog_template_desc *desc, WORD id, const WCHAR *class,
155  HINSTANCE hInstance, const WCHAR *text, DWORD style, short x, short y, short cx, short cy)
156 {
157  struct taskdialog_control *control = Alloc(sizeof(*control));
158  unsigned int size, class_size, text_size;
159  DLGITEMTEMPLATE *template;
160  static const WCHAR nulW;
161  const WCHAR *textW;
162  char *ptr;
163 
164  class_size = (strlenW(class) + 1) * sizeof(WCHAR);
165 
166  if (IS_INTRESOURCE(text))
167  text_size = LoadStringW(hInstance, (UINT_PTR)text, (WCHAR *)&textW, 0) * sizeof(WCHAR);
168  else
169  {
170  textW = text;
171  text_size = strlenW(textW) * sizeof(WCHAR);
172  }
173 
174  size = sizeof(DLGITEMTEMPLATE);
175  size += class_size;
176  size += text_size + sizeof(WCHAR);
177  size += sizeof(WORD); /* creation data */
178 
179  control->template = template = Alloc(size);
180  control->template_size = size;
181 
182  template->style = WS_VISIBLE | style;
183  template->dwExtendedStyle = 0;
184  template->x = x;
185  template->y = y;
186  template->cx = cx;
187  template->cy = cy;
188  template->id = id;
189  ptr = (char *)(template + 1);
190  template_write_data(&ptr, class, class_size);
191  template_write_data(&ptr, textW, text_size);
192  template_write_data(&ptr, &nulW, sizeof(nulW));
193 
194  list_add_tail(&desc->controls, &control->entry);
195  desc->control_count++;
196  return ALIGNED_LENGTH(size, 3);
197 }
198 
199 static unsigned int taskdialog_add_static_label(struct taskdialog_template_desc *desc, WORD id, const WCHAR *str)
200 {
201  unsigned int size;
202  SIZE sz;
203 
204  if (!str)
205  return 0;
206 
208 
209  desc->dialog_height += DIALOG_SPACING;
210  size = taskdialog_add_control(desc, id, WC_STATICW, desc->taskconfig->hInstance, str, 0, DIALOG_SPACING,
211  desc->dialog_height, sz.cx, sz.cy);
212  desc->dialog_height += sz.cy + DIALOG_SPACING;
213  return size;
214 }
215 
217 {
218  return taskdialog_add_static_label(desc, ID_MAIN_INSTRUCTION, desc->taskconfig->pszMainInstruction);
219 }
220 
222 {
223  return taskdialog_add_static_label(desc, ID_CONTENT, desc->taskconfig->pszContent);
224 }
225 
227  int id, const WCHAR *text, BOOL custom_button)
228 {
229  SIZE sz;
230 
231  taskdialog_get_text_extent(desc, text, custom_button, &sz);
232 
233  button->id = id;
234  button->text = text;
235  button->width = max(DIALOG_BUTTON_WIDTH, sz.cx + DIALOG_SPACING * 2);
236  button->line = 0;
237  button->hinst = custom_button ? desc->taskconfig->hInstance : COMCTL32_hModule;
238 
239  if (id == desc->taskconfig->nDefaultButton)
240  desc->default_button = button;
241 }
242 
244  unsigned int *button_count)
245 {
246  DWORD flags = desc->taskconfig->dwCommonButtons;
247 
248 #define TASKDIALOG_INIT_COMMON_BUTTON(id) \
249  do { \
250  taskdialog_init_button(&buttons[(*button_count)++], desc, ID##id, MAKEINTRESOURCEW(IDS_BUTTON_##id), FALSE); \
251  } while(0)
252 
253  if (flags & TDCBF_OK_BUTTON)
255  if (flags & TDCBF_YES_BUTTON)
257  if (flags & TDCBF_NO_BUTTON)
265 
266 #undef TASKDIALOG_INIT_COMMON_BUTTON
267 }
268 
270 {
271  unsigned int count = 0, buttons_size, i, line_count, size = 0;
272  unsigned int location_x, *line_widths, alignment = ~0u;
273  const TASKDIALOGCONFIG *taskconfig = desc->taskconfig;
275 
276  /* Allocate enough memory for the custom and the default buttons. Maximum 6 default buttons possible. */
277  buttons_size = 6;
278  if (taskconfig->cButtons && taskconfig->pButtons)
279  buttons_size += taskconfig->cButtons;
280 
281  if (!(buttons = Alloc(buttons_size * sizeof(*buttons))))
282  return 0;
283 
284  /* Custom buttons */
285  if (taskconfig->cButtons && taskconfig->pButtons)
286  for (i = 0; i < taskconfig->cButtons; i++)
288  taskconfig->pButtons[i].pszButtonText, TRUE);
289 
290  /* Common buttons */
292 
293  /* There must be at least one button */
294  if (count == 0)
296 
297  if (!desc->default_button)
298  desc->default_button = &buttons[0];
299 
300  /* For easy handling just allocate as many lines as buttons, the worst case. */
301  line_widths = Alloc(count * sizeof(*line_widths));
302 
303  /* Separate buttons into lines */
304  location_x = DIALOG_SPACING;
305  for (i = 0, line_count = 0; i < count; i++)
306  {
307  if (location_x + buttons[i].width + DIALOG_SPACING > desc->dialog_width)
308  {
309  location_x = DIALOG_SPACING;
310  line_count++;
311  }
312 
313  buttons[i].line = line_count;
314 
315  location_x += buttons[i].width + DIALOG_SPACING;
316  line_widths[line_count] += buttons[i].width + DIALOG_SPACING;
317  }
318  line_count++;
319 
320  /* Try to balance lines so they are about the same size */
321  for (i = 1; i < line_count - 1; i++)
322  {
323  int diff_now = abs(line_widths[i] - line_widths[i - 1]);
324  unsigned int j, last_button = 0;
325  int diff_changed;
326 
327  for (j = 0; j < count; j++)
328  if (buttons[j].line == i - 1)
329  last_button = j;
330 
331  /* Difference in length of both lines if we wrapped the last button from the last line into this one */
332  diff_changed = abs(2 * buttons[last_button].width + line_widths[i] - line_widths[i - 1]);
333 
334  if (diff_changed < diff_now)
335  {
336  buttons[last_button].line = i;
337  line_widths[i] += buttons[last_button].width;
338  line_widths[i - 1] -= buttons[last_button].width;
339  }
340  }
341 
342  /* Calculate left alignment so all lines are as far right as possible. */
343  for (i = 0; i < line_count; i++)
344  {
345  int new_alignment = desc->dialog_width - line_widths[i];
346  if (new_alignment < alignment)
347  alignment = new_alignment;
348  }
349 
350  /* Now that we got them all positioned, create all buttons */
351  location_x = alignment;
352  for (i = 0; i < count; i++)
353  {
354  DWORD style = &buttons[i] == desc->default_button ? BS_DEFPUSHBUTTON : BS_PUSHBUTTON;
355 
356  if (i > 0 && buttons[i].line != buttons[i - 1].line) /* New line */
357  {
358  location_x = alignment;
359  desc->dialog_height += DIALOG_BUTTON_HEIGHT + DIALOG_SPACING;
360  }
361 
363  location_x, desc->dialog_height, buttons[i].width, DIALOG_BUTTON_HEIGHT);
364 
365  location_x += buttons[i].width + DIALOG_SPACING;
366  }
367 
368  /* Add height for last row and spacing */
369  desc->dialog_height += DIALOG_BUTTON_HEIGHT + DIALOG_SPACING;
370 
371  Free(line_widths);
372  Free(buttons);
373 
374  return size;
375 }
376 
377 static void taskdialog_clear_controls(struct list *controls)
378 {
379  struct taskdialog_control *control, *control2;
380 
381  LIST_FOR_EACH_ENTRY_SAFE(control, control2, controls, struct taskdialog_control, entry)
382  {
383  list_remove(&control->entry);
384  Free(control->template);
385  Free(control);
386  }
387 }
388 
390 {
391  HMONITOR monitor = MonitorFromWindow(desc->taskconfig->hwndParent ? desc->taskconfig->hwndParent : GetActiveWindow(),
392  MONITOR_DEFAULTTOPRIMARY);
394 
395  info.cbSize = sizeof(info);
396  GetMonitorInfoW(monitor, &info);
397 
398  if (desc->taskconfig->dwFlags & TDF_POSITION_RELATIVE_TO_WINDOW && desc->taskconfig->hwndParent)
399  GetWindowRect(desc->taskconfig->hwndParent, ret);
400  else
401  *ret = info.rcWork;
402 
403  pixels_to_dialogunits(desc, &ret->left, &ret->top);
404  pixels_to_dialogunits(desc, &ret->right, &ret->bottom);
405 
406  pixels_to_dialogunits(desc, &info.rcWork.left, &info.rcWork.top);
407  pixels_to_dialogunits(desc, &info.rcWork.right, &info.rcWork.bottom);
408  return info.rcWork.right - info.rcWork.left;
409 }
410 
412 {
414  if (len && len < length)
415  {
416  WCHAR *p;
417  if ((p = strrchrW(name, '/'))) name = p + 1;
418  if ((p = strrchrW(name, '\\'))) name = p + 1;
419  return name;
420  }
421  else
422  return NULL;
423 }
424 
426 {
427  struct taskdialog_control *control, *control2;
428  unsigned int size, title_size, screen_width;
430  static const WORD fontsize = 0x7fff;
431  static const WCHAR emptyW[] = { 0 };
432  const WCHAR *titleW = NULL;
433  DLGTEMPLATE *template;
434  NONCLIENTMETRICSW ncm;
435  WCHAR pathW[MAX_PATH];
436  RECT ref_rect;
437  char *ptr;
438  HDC hdc;
439 
440  /* Window title */
441  if (!taskconfig->pszWindowTitle)
442  titleW = taskdialog_get_exe_name(taskconfig, pathW, ARRAY_SIZE(pathW));
443  else if (IS_INTRESOURCE(taskconfig->pszWindowTitle))
444  {
445  if (!LoadStringW(taskconfig->hInstance, LOWORD(taskconfig->pszWindowTitle), (WCHAR *)&titleW, 0))
446  titleW = taskdialog_get_exe_name(taskconfig, pathW, ARRAY_SIZE(pathW));
447  }
448  else
449  titleW = taskconfig->pszWindowTitle;
450  if (!titleW)
451  titleW = emptyW;
452  title_size = (strlenW(titleW) + 1) * sizeof(WCHAR);
453 
454  size = sizeof(DLGTEMPLATE) + 2 * sizeof(WORD);
455  size += title_size;
456  size += 2; /* font size */
457 
458  list_init(&desc.controls);
459  desc.taskconfig = taskconfig;
460  desc.control_count = 0;
461 
462  ncm.cbSize = sizeof(ncm);
463  SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
464  desc.font = CreateFontIndirectW(&ncm.lfMessageFont);
465 
466  hdc = GetDC(0);
467  SelectObject(hdc, desc.font);
468  desc.x_baseunit = GdiGetCharDimensions(hdc, NULL, &desc.y_baseunit);
469  ReleaseDC(0, hdc);
470 
471  screen_width = taskdialog_get_reference_rect(&desc, &ref_rect);
472 
473  desc.dialog_height = 0;
474  desc.dialog_width = max(taskconfig->cxWidth, DIALOG_MIN_WIDTH);
475  desc.dialog_width = min(desc.dialog_width, screen_width);
476  desc.default_button = NULL;
477 
481 
482  template = Alloc(size);
483  if (!template)
484  {
485  taskdialog_clear_controls(&desc.controls);
486  DeleteObject(desc.font);
487  return NULL;
488  }
489 
490  template->style = DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_SYSMENU;
491  template->cdit = desc.control_count;
492  template->x = (ref_rect.left + ref_rect.right + desc.dialog_width) / 2;
493  template->y = (ref_rect.top + ref_rect.bottom + desc.dialog_height) / 2;
494  template->cx = desc.dialog_width;
495  template->cy = desc.dialog_height;
496 
497  ptr = (char *)(template + 1);
498  ptr += 2; /* menu */
499  ptr += 2; /* class */
500  template_write_data(&ptr, titleW, title_size);
501  template_write_data(&ptr, &fontsize, sizeof(fontsize));
502 
503  /* write control entries */
504  LIST_FOR_EACH_ENTRY_SAFE(control, control2, &desc.controls, struct taskdialog_control, entry)
505  {
506  ALIGN_POINTER(ptr, 3);
507 
508  template_write_data(&ptr, control->template, control->template_size);
509 
510  /* list item won't be needed later */
511  list_remove(&control->entry);
512  Free(control->template);
513  Free(control);
514  }
515 
516  DeleteObject(desc.font);
517  return template;
518 }
519 
521 {
522  return dialog_info->callback ? dialog_info->callback(dialog_info->hwnd, notification, wparam, lparam,
523  dialog_info->callback_data) : S_OK;
524 }
525 
526 static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD command_id)
527 {
528  if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
529  EndDialog(dialog_info->hwnd, command_id);
530 }
531 
533 {
534  static const WCHAR taskdialog_info_propnameW[] = {'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
535  struct taskdialog_info *dialog_info;
536 
537  TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
538 
539  if (msg != WM_INITDIALOG)
540  dialog_info = GetPropW(hwnd, taskdialog_info_propnameW);
541 
542  switch (msg)
543  {
544  case TDM_CLICK_BUTTON:
546  break;
547  case WM_INITDIALOG:
548  dialog_info = (struct taskdialog_info *)lParam;
549  dialog_info->hwnd = hwnd;
550  SetPropW(hwnd, taskdialog_info_propnameW, dialog_info);
551 
552  taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
553  break;
554  case WM_SHOWWINDOW:
555  taskdialog_notify(dialog_info, TDN_CREATED, 0, 0);
556  break;
557  case WM_COMMAND:
558  if (HIWORD(wParam) == BN_CLICKED)
559  {
561  return TRUE;
562  }
563  break;
564  case WM_DESTROY:
565  taskdialog_notify(dialog_info, TDN_DESTROYED, 0, 0);
566  RemovePropW(hwnd, taskdialog_info_propnameW);
567  break;
568  }
569  return FALSE;
570 }
571 
572 /***********************************************************************
573  * TaskDialogIndirect [COMCTL32.@]
574  */
575 HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *button,
576  int *radio_button, BOOL *verification_flag_checked)
577 {
578  struct taskdialog_info dialog_info;
579  DLGTEMPLATE *template;
580  INT ret;
581 
582  TRACE("%p, %p, %p, %p\n", taskconfig, button, radio_button, verification_flag_checked);
583 
584  if (!taskconfig || taskconfig->cbSize != sizeof(TASKDIALOGCONFIG))
585  return E_INVALIDARG;
586 
587  dialog_info.callback = taskconfig->pfCallback;
588  dialog_info.callback_data = taskconfig->lpCallbackData;
589 
590  template = create_taskdialog_template(taskconfig);
591  ret = (short)DialogBoxIndirectParamW(taskconfig->hInstance, template, taskconfig->hwndParent,
592  taskdialog_proc, (LPARAM)&dialog_info);
593  Free(template);
594 
595  if (button) *button = ret;
596  if (radio_button) *radio_button = taskconfig->nDefaultButton;
597  if (verification_flag_checked) *verification_flag_checked = TRUE;
598 
599  return S_OK;
600 }
601 
602 /***********************************************************************
603  * TaskDialog [COMCTL32.@]
604  */
605 HRESULT WINAPI TaskDialog(HWND owner, HINSTANCE hinst, const WCHAR *title, const WCHAR *main_instruction,
606  const WCHAR *content, TASKDIALOG_COMMON_BUTTON_FLAGS common_buttons, const WCHAR *icon, int *button)
607 {
608  TASKDIALOGCONFIG taskconfig;
609 
610  TRACE("%p, %p, %s, %s, %s, %#x, %s, %p\n", owner, hinst, debugstr_w(title), debugstr_w(main_instruction),
611  debugstr_w(content), common_buttons, debugstr_w(icon), button);
612 
613  memset(&taskconfig, 0, sizeof(taskconfig));
614  taskconfig.cbSize = sizeof(taskconfig);
615  taskconfig.hwndParent = owner;
616  taskconfig.hInstance = hinst;
617  taskconfig.dwCommonButtons = common_buttons;
618  taskconfig.pszWindowTitle = title;
619  taskconfig.u.pszMainIcon = icon;
620  taskconfig.pszMainInstruction = main_instruction;
621  taskconfig.pszContent = content;
622  return TaskDialogIndirect(&taskconfig, button, NULL, NULL);
623 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:609
#define abs(i)
Definition: fconv.c:206
#define DT_EXPANDTABS
Definition: winuser.h:532
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define TASKDIALOG_INIT_COMMON_BUTTON(id)
GLint GLint GLsizei width
Definition: gl.h:1546
#define max(a, b)
Definition: svc.c:63
#define OK(condition, fail_message,...)
#define TRUE
Definition: types.h:120
#define IDOK
Definition: winuser.h:824
unsigned int dialog_height
Definition: taskdialog.c:74
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
const WCHAR * text
Definition: taskdialog.c:65
static void taskdialog_get_text_extent(const struct taskdialog_template_desc *desc, const WCHAR *text, BOOL user_resource, SIZE *sz)
Definition: taskdialog.c:114
PCWSTR pszMainIcon
Definition: commctrl.h:5179
static void taskdialog_clear_controls(struct list *controls)
Definition: taskdialog.c:377
HDC WINAPI GetDC(_In_opt_ HWND)
const WCHAR * text
Definition: package.c:1827
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define DT_WORDBREAK
Definition: winuser.h:544
#define WARN(fmt,...)
Definition: debug.h:111
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
#define BS_DEFPUSHBUTTON
Definition: pedump.c:652
static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD command_id)
Definition: taskdialog.c:526
LONG top
Definition: windef.h:292
static void taskdialog_init_button(struct taskdialog_button_desc *button, struct taskdialog_template_desc *desc, int id, const WCHAR *text, BOOL custom_button)
Definition: taskdialog.c:226
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define WM_SHOWWINDOW
Definition: winuser.h:1610
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: taskdialog.c:532
UINT_PTR WPARAM
Definition: windef.h:207
LONG left
Definition: windef.h:291
int32_t INT_PTR
Definition: typedefs.h:62
LONG right
Definition: windef.h:293
PCWSTR pszButtonText
Definition: commctrl.h:5157
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int32_t INT
Definition: typedefs.h:56
& rect
Definition: startmenu.cpp:1413
WPARAM wParam
Definition: combotst.c:138
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
static const UINT DIALOG_BUTTON_WIDTH
Definition: taskdialog.c:49
HANDLE WINAPI RemovePropW(_In_ HWND, _In_ LPCWSTR)
static WCHAR * taskdialog_get_exe_name(const TASKDIALOGCONFIG *taskconfig, WCHAR *name, DWORD length)
Definition: taskdialog.c:411
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
Definition: exfuncs.h:656
struct _test_info info[]
Definition: SetCursorPos.c:19
HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *button, int *radio_button, BOOL *verification_flag_checked)
Definition: taskdialog.c:575
static unsigned int taskdialog_add_buttons(struct taskdialog_template_desc *desc)
Definition: taskdialog.c:269
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
Definition: list.h:102
#define DS_MODALFRAME
Definition: winuser.h:375
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:93
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HINSTANCE hInstance
Definition: charmap.c:20
static const UINT DIALOG_MIN_WIDTH
Definition: taskdialog.c:47
#define DT_LEFT
Definition: winuser.h:534
#define DT_CALCRECT
Definition: winuser.h:526
LONG_PTR callback_data
Definition: taskdialog.c:88
int TASKDIALOG_COMMON_BUTTON_FLAGS
Definition: commctrl.h:5152
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
PCWSTR pszWindowTitle
Definition: commctrl.h:5175
static void dialogunits_to_pixels(const struct taskdialog_template_desc *desc, LONG *width, LONG *height)
Definition: taskdialog.c:99
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
#define debugstr_w
Definition: kernel32.h:32
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
static PVOID ptr
Definition: dispmode.c:27
content
Definition: atl_ax.c:994
static const UINT DIALOG_SPACING
Definition: taskdialog.c:48
DLGITEMTEMPLATE * template
Definition: taskdialog.c:58
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
#define E_INVALIDARG
Definition: ddrawi.h:101
const WCHAR * str
const struct builtin_class_descr * desc
Definition: regcontrol.c:48
static void pixels_to_dialogunits(const struct taskdialog_template_desc *desc, LONG *width, LONG *height)
Definition: taskdialog.c:91
smooth NULL
Definition: ftsmooth.c:416
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
LONG cx
Definition: windef.h:319
struct list entry
Definition: taskdialog.c:57
LONG_PTR LPARAM
Definition: windef.h:208
Definition: parser.c:48
static DLGTEMPLATE * create_taskdialog_template(const TASKDIALOGCONFIG *taskconfig)
Definition: taskdialog.c:425
#define WM_DESTROY
Definition: winuser.h:1591
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static unsigned int taskdialog_get_reference_rect(const struct taskdialog_template_desc *desc, RECT *ret)
Definition: taskdialog.c:389
#define WS_CAPTION
Definition: pedump.c:624
BOOL WINAPI SystemParametersInfoW(_In_ UINT, _In_ UINT, _Inout_opt_ PVOID, _In_ UINT)
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
Definition: list.h:108
static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam)
Definition: taskdialog.c:520
struct taskdialog_button_desc * default_button
Definition: taskdialog.c:81
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
unsigned int dialog_width
Definition: taskdialog.c:75
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
static void template_write_data(char **ptr, const void *src, unsigned int size)
Definition: taskdialog.c:107
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
BOOL WINAPI GetMonitorInfoW(_In_ HMONITOR, _Inout_ LPMONITORINFO)
static const UINT ID_MAIN_INSTRUCTION
Definition: taskdialog.c:52
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
PVOID Alloc(IN DWORD dwFlags, IN SIZE_T dwBytes)
Definition: main.c:63
static const WCHAR titleW[]
Definition: htmlelem.c:1067
unsigned int width
Definition: taskdialog.c:66
unsigned short WORD
Definition: ntddk_ex.h:93
#define BN_CLICKED
Definition: winuser.h:1907
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define IDS_BUTTON_OK
Definition: comctl32.h:106
GLbitfield flags
Definition: glext.h:7161
#define ALIGN_POINTER(_Ptr, _Align)
Definition: taskdialog.c:45
int ret
HDC hdc
Definition: main.c:9
#define DS_SETFONT
Definition: winuser.h:378
uint32_t entry
Definition: isohybrid.c:63
#define ALIGNED_LENGTH(_Len, _Align)
Definition: taskdialog.c:42
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
Definition: _list.h:228
GLenum src
Definition: glext.h:6340
#define WM_COMMAND
Definition: winuser.h:1722
static const WCHAR textW[]
Definition: itemdlg.c:1559
#define BS_PUSHBUTTON
Definition: pedump.c:651
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
static unsigned int taskdialog_add_main_instruction(struct taskdialog_template_desc *desc)
Definition: taskdialog.c:216
WINE_UNICODE_INLINE WCHAR * strrchrW(const WCHAR *str, WCHAR ch)
Definition: unicode.h:254
static unsigned int taskdialog_add_content(struct taskdialog_template_desc *desc)
Definition: taskdialog.c:221
unsigned int template_size
Definition: taskdialog.c:59
#define S_OK
Definition: intsafe.h:59
LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *)
Definition: font.c:2145
HINSTANCE hInstance
Definition: commctrl.h:5172
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
PFTASKDIALOGCALLBACK pfCallback
Definition: commctrl.h:5199
static const WCHAR emptyW[]
Definition: navigate.c:36
HMODULE COMCTL32_hModule
Definition: commctrl.c:79
PCWSTR pszMainInstruction
Definition: commctrl.h:5181
HWND buttons[5]
Definition: sndrec32.cpp:40
#define ARRAY_SIZE(a)
Definition: main.h:24
#define WC_BUTTONW
Definition: commctrl.h:4595
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
WINE_DEFAULT_DEBUG_CHANNEL(taskdialog)
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
INT_PTR WINAPI DialogBoxIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
HRESULT(CALLBACK * PFTASKDIALOGCALLBACK)(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ LONG_PTR)
Definition: commctrl.h:5161
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons
Definition: commctrl.h:5174
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define WC_STATICW
Definition: commctrl.h:4651
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define msg(x)
Definition: auth_time.c:54
_Out_opt_ int * cx
Definition: commctrl.h:570
Definition: name.c:36
PFTASKDIALOGCALLBACK callback
Definition: taskdialog.c:87
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
#define HIWORD(l)
Definition: typedefs.h:246
GLenum GLuint id
Definition: glext.h:5579
static HINSTANCE hinst
Definition: edit.c:551
LONG bottom
Definition: windef.h:294
static void taskdialog_init_common_buttons(struct taskdialog_template_desc *desc, struct taskdialog_button_desc *buttons, unsigned int *button_count)
Definition: taskdialog.c:243
const TASKDIALOGCONFIG * taskconfig
Definition: taskdialog.c:73
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static const UINT ID_CONTENT
Definition: taskdialog.c:53
GLfloat GLfloat p
Definition: glext.h:8902
unsigned int line
Definition: taskdialog.c:67
Arabic default style
Definition: afstyles.h:93
const TASKDIALOG_BUTTON * pButtons
Definition: commctrl.h:5184
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_SYSMENU
Definition: pedump.c:629
#define memset(x, y, z)
Definition: compat.h:39
static unsigned int taskdialog_add_static_label(struct taskdialog_template_desc *desc, WORD id, const WCHAR *str)
Definition: taskdialog.c:199
LONG cy
Definition: windef.h:320
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
static char title[]
Definition: ps.c:92
HWND WINAPI GetActiveWindow(void)
Definition: winpos.c:138
#define LOWORD(l)
Definition: pedump.c:82
#define MulDiv(x, y, z)
Definition: gdifloat.h:86
LONG_PTR lpCallbackData
Definition: commctrl.h:5200
HRESULT WINAPI TaskDialog(HWND owner, HINSTANCE hinst, const WCHAR *title, const WCHAR *main_instruction, const WCHAR *content, TASKDIALOG_COMMON_BUTTON_FLAGS common_buttons, const WCHAR *icon, int *button)
Definition: taskdialog.c:605
static unsigned int taskdialog_add_control(struct taskdialog_template_desc *desc, WORD id, const WCHAR *class, HINSTANCE hInstance, const WCHAR *text, DWORD style, short x, short y, short cx, short cy)
Definition: taskdialog.c:154
static UINT WPARAM wparam
Definition: combo.c:716
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17
static const UINT DIALOG_BUTTON_HEIGHT
Definition: taskdialog.c:50
GLuint const GLchar * name
Definition: glext.h:6031