ReactOS  0.4.12-dev-75-g00dd17e
dialog.c File Reference
#include "sndvol32.h"
Include dependency graph for dialog.c:

Go to the source code of this file.

Functions

VOID ConvertRect (LPRECT lpRect, UINT xBaseUnit, UINT yBaseUnit)
 
LPVOID LoadDialogResource (IN HMODULE hModule, IN LPCWSTR ResourceName, OUT LPDWORD ResourceLength)
 
LPWORD AddDialogControl (IN HWND hwndDialog, IN HWND *OutWnd, IN LPRECT DialogOffset, IN PDLGITEMTEMPLATE DialogItem, IN DWORD DialogIdMultiplier, IN HFONT hFont, UINT xBaseUnit, UINT yBaseUnit)
 
VOID LoadDialogControls (IN PMIXER_WINDOW MixerWindow, LPRECT DialogOffset, WORD ItemCount, PDLGITEMTEMPLATE DialogItem, DWORD DialogIdMultiplier, UINT xBaseUnit, UINT yBaseUnit)
 
VOID LoadDialog (IN HMODULE hModule, IN PMIXER_WINDOW MixerWindow, IN LPCWSTR DialogResId, IN DWORD Index)
 
BOOL CALLBACK EnumConnectionsCallback (PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context)
 
VOID LoadDialogCtrls (PPREFERENCES_CONTEXT PrefContext)
 
VOID UpdateDialogLineSwitchControl (PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line, LONG fValue)
 
VOID UpdateDialogLineSliderControl (PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line, DWORD dwControlID, DWORD dwDialogID, DWORD Position)
 

Function Documentation

◆ AddDialogControl()

LPWORD AddDialogControl ( IN HWND  hwndDialog,
IN HWND OutWnd,
IN LPRECT  DialogOffset,
IN PDLGITEMTEMPLATE  DialogItem,
IN DWORD  DialogIdMultiplier,
IN HFONT  hFont,
UINT  xBaseUnit,
UINT  yBaseUnit 
)

Definition at line 67 of file dialog.c.

Referenced by LoadDialogControls().

76 {
77  RECT rect;
78  LPWORD Offset;
79  LPWSTR ClassName, WindowName = NULL;
80  HWND hwnd;
81  DWORD wID;
82  INT nSteps, i;
83 
84  /* initialize client rectangle */
85  rect.left = DialogItem->x;
86  rect.top = DialogItem->y;
87  rect.right = DialogItem->x + DialogItem->cx;
88  rect.bottom = DialogItem->y + DialogItem->cy;
89 
90  /* Convert Dialog units to pixes */
91  ConvertRect(&rect, xBaseUnit, yBaseUnit);
92 
93  rect.left += DialogOffset->left;
94  rect.right += DialogOffset->left;
95  rect.top += DialogOffset->top;
96  rect.bottom += DialogOffset->top;
97 
98  /* move offset after dialog item */
99  Offset = (LPWORD)(DialogItem + 1);
100 
101  if (*Offset == 0xFFFF)
102  {
103  /* class is encoded as type */
104  Offset++;
105 
106  /* get control type */
107  switch(*Offset)
108  {
109  case 0x80:
110  ClassName = L"button";
111  WindowName = (LPWSTR)(Offset + 1);
112  break ;
113  case 0x82:
114  ClassName = L"static";
115  WindowName = (LPWSTR)(Offset + 1);
116  break;
117  default:
118  /* FIXME */
119  assert(0);
120  ClassName = NULL;
121  }
122  }
123  else
124  {
125  /* class name is encoded as string */
126  ClassName = (LPWSTR)Offset;
127 
128  /* move offset to the end of class string */
129  Offset += wcslen(ClassName);
130 
131  /* get window name */
132  WindowName = (LPWSTR)(Offset + 1);
133  }
134 
135  /* move offset past class type/string */
136  Offset++;
137 
138  if (DialogItem->id == MAXWORD)
139  {
140  /* id is not important */
141  wID = DialogItem->id;
142  }
143  else
144  {
145  /* calculate id */
146  wID = DialogItem->id * (DialogIdMultiplier + 1);
147 
148  }
149 
150  /* now create the window */
151  hwnd = CreateWindowExW(DialogItem->dwExtendedStyle,
152  ClassName,
153  WindowName,
154  DialogItem->style,
155  rect.left,
156  rect.top,
157  rect.right - rect.left,
158  rect.bottom - rect.top,
159  hwndDialog,
160  UlongToPtr(wID),
161  hAppInstance,
162  NULL);
163 
164  /* sanity check */
165  assert(hwnd);
166 
167  /* store window */
168  *OutWnd = hwnd;
169 
170  /* check if this the track bar */
171  if (!wcsicmp(ClassName, L"msctls_trackbar32"))
172  {
173  if (DialogItem->style & TBS_VERT)
174  {
175  /* Vertical trackbar: Volume */
176 
177  /* set up range */
179 
180  /* set up page size */
182 
183  /* set position */
184  SendMessage(hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)0);
185 
186  /* Calculate and set ticks */
187  nSteps = (VOLUME_STEPS / (VOLUME_TICKS + 1));
188  if (VOLUME_STEPS % (VOLUME_TICKS + 1) != 0)
189  nSteps++;
190  for (i = nSteps; i < VOLUME_STEPS; i += nSteps)
191  SendMessage(hwnd, TBM_SETTIC, 0, (LPARAM)i);
192  }
193  else
194  {
195  /* Horizontal trackbar: Balance */
196 
197  /* set up range */
199 
200  /* set up page size */
202 
203  /* set position */
204  SendMessage(hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)BALANCE_STEPS / 2);
205 
206  /* Calculate and set ticks */
207  nSteps = (BALANCE_STEPS / (BALANCE_TICKS + 1));
208  if (BALANCE_STEPS % (BALANCE_TICKS + 1) != 0)
209  nSteps++;
210  for (i = nSteps; i < BALANCE_STEPS; i += nSteps)
211  SendMessage(hwnd, TBM_SETTIC, 0, (LPARAM)i);
212  }
213  }
214  else if (!wcsicmp(ClassName, L"static") || !wcsicmp(ClassName, L"button"))
215  {
216  /* set font */
217  SendMessageW(hwnd, WM_SETFONT, (WPARAM)hFont, TRUE);
218  }
219 
220  //ShowWindow(hwnd, SW_SHOWNORMAL);
221 
222  if (WindowName != NULL)
223  {
224  /* move offset past window name */
225  Offset += wcslen(WindowName) + 1;
226  }
227 
228  /* check if there is additional data */
229  if (*Offset == 0)
230  {
231  /* no additional data */
232  Offset++;
233  }
234  else
235  {
236  /* FIXME: Determine whether this should be "Offset += 1 + *Offset" to explicitly skip the data count too. */
237  /* skip past additional data */
238  Offset += *Offset;
239  }
240 
241  /* make sure next template is word-aligned */
242  Offset = (LPWORD)(((ULONG_PTR)Offset + 3) & ~3);
243 
244  /* done */
245  return Offset;
246 }
#define VOLUME_TICKS
Definition: sndvol32.h:18
#define TRUE
Definition: types.h:120
#define MAXWORD
#define TBM_SETRANGE
Definition: commctrl.h:2007
LONG top
Definition: windef.h:297
#define assert(x)
Definition: debug.h:53
#define TBM_SETPOS
Definition: commctrl.h:2006
LONG left
Definition: windef.h:296
LONG right
Definition: windef.h:298
int32_t INT
Definition: typedefs.h:56
& rect
Definition: startmenu.cpp:1413
HFONT hFont
Definition: main.c:53
UINT_PTR WPARAM
Definition: windef.h:207
uint32_t ULONG_PTR
Definition: typedefs.h:63
GLenum GLclampf GLint i
Definition: glfuncs.h:14
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
LONG_PTR LPARAM
Definition: windef.h:208
#define MAKELONG(a, b)
Definition: typedefs.h:248
#define TBM_SETPAGESIZE
Definition: commctrl.h:2021
smooth NULL
Definition: ftsmooth.c:416
#define VOLUME_STEPS
Definition: sndvol32.h:17
#define BALANCE_PAGE_SIZE
Definition: sndvol32.h:22
#define BALANCE_TICKS
Definition: sndvol32.h:21
#define UlongToPtr(ul)
Definition: basetsd.h:98
unsigned long DWORD
Definition: ntddk_ex.h:95
#define TBS_VERT
Definition: commctrl.h:1986
static const WCHAR L[]
Definition: oid.c:1087
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define TBM_SETTIC
Definition: commctrl.h:2005
#define wcsicmp
Definition: string.h:1152
#define BALANCE_STEPS
Definition: sndvol32.h:20
uint16_t * LPWORD
Definition: typedefs.h:54
static HWND hwnd[MAXHWNDS]
Definition: dialog.c:47
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_SETFONT
Definition: winuser.h:1632
#define SendMessage
Definition: winuser.h:5709
VOID ConvertRect(LPRECT lpRect, UINT xBaseUnit, UINT yBaseUnit)
Definition: dialog.c:12
LONG bottom
Definition: windef.h:299
#define VOLUME_PAGE_SIZE
Definition: sndvol32.h:19
WCHAR * LPWSTR
Definition: xmlstorage.h:184
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
HINSTANCE hAppInstance
Definition: mmc.c:23
HWND hwndDialog
Definition: powershemes.c:43

◆ ConvertRect()

VOID ConvertRect ( LPRECT  lpRect,
UINT  xBaseUnit,
UINT  yBaseUnit 
)

Definition at line 12 of file dialog.c.

Referenced by AddDialogControl(), and LoadDialog().

13 {
14  lpRect->left = MulDiv(lpRect->left, xBaseUnit, 4);
15  lpRect->right = MulDiv(lpRect->right, xBaseUnit, 4);
16  lpRect->top = MulDiv(lpRect->top, yBaseUnit, 8);
17  lpRect->bottom = MulDiv(lpRect->bottom, yBaseUnit, 8);
18 }
LONG top
Definition: windef.h:297
LONG left
Definition: windef.h:296
LONG right
Definition: windef.h:298
LONG bottom
Definition: windef.h:299
#define MulDiv(x, y, z)
Definition: gdifloat.h:86

◆ EnumConnectionsCallback()

BOOL CALLBACK EnumConnectionsCallback ( PSND_MIXER  Mixer,
DWORD  LineID,
LPMIXERLINE  Line,
PVOID  Context 
)

Definition at line 405 of file dialog.c.

Referenced by LoadDialogCtrls().

410 {
411  WCHAR LineName[MIXER_LONG_NAME_CHARS];
412  DWORD Flags;
413  DWORD wID;
414  UINT ControlCount = 0, Index;
416  HWND hDlgCtrl;
417  PPREFERENCES_CONTEXT PrefContext = (PPREFERENCES_CONTEXT)Context;
418 
419  if (Line->cControls != 0)
420  {
421  /* get line name */
422  if (SndMixerGetLineName(PrefContext->MixerWindow->Mixer, PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, TRUE) == -1)
423  {
424  /* failed to get line name */
425  LineName[0] = L'\0';
426  }
427 
428  /* check if line is found in registry settings */
429  if (ReadLineConfig(PrefContext->DeviceName,
430  LineName,
431  Line->szName,
432  &Flags))
433  {
434  /* is it selected */
435  if (Flags != 0x4)
436  {
437  int dlgId = (PrefContext->MixerWindow->Mode == SMALL_MODE) ? IDD_SMALL_MASTER : IDD_NORMAL_MASTER;
438 
439  /* load dialog resource */
440  LoadDialog(hAppInstance, PrefContext->MixerWindow, MAKEINTRESOURCE(dlgId), PrefContext->Count);
441 
442  /* get id */
443  wID = (PrefContext->Count + 1) * IDC_LINE_NAME;
444 
445  /* set line name */
446  SetDlgItemTextW(PrefContext->MixerWindow->hWnd, wID, Line->szName);
447 
448  /* query controls */
449  if (SndMixerQueryControls(Mixer, &ControlCount, Line, &Control) != FALSE)
450  {
451  /* now go through all controls and update their states */
452  for(Index = 0; Index < Line->cControls; Index++)
453  {
454  if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_SWITCH)
455  {
457 
458  /* get volume control details */
459  if (SndMixerGetVolumeControlDetails(Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details) != -1)
460  {
461  /* update dialog control */
462  wID = (PrefContext->Count + 1) * IDC_LINE_SWITCH;
463 
464  /* get dialog control */
465  hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID);
466 
467  if (hDlgCtrl != NULL)
468  {
469  /* check state */
470  if (SendMessageW(hDlgCtrl, BM_GETCHECK, 0, 0) != Details.fValue)
471  {
472  /* update control state */
473  SendMessageW(hDlgCtrl, BM_SETCHECK, (WPARAM)Details.fValue, 0);
474  }
475  }
476  }
477  }
478  else if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER)
479  {
481 
482  /* get volume control details */
483  if (SndMixerGetVolumeControlDetails(Mixer, Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&Details) != -1)
484  {
485  /* update dialog control */
486  DWORD Position;
487  DWORD Step = 0x10000 / VOLUME_STEPS;
488 
489  /* FIXME: give me granularity */
490  Position = VOLUME_STEPS - (Details.dwValue / Step);
491 
492  /* FIXME support left - right slider */
493  wID = (PrefContext->Count + 1) * IDC_LINE_SLIDER_VERT;
494 
495  /* get dialog control */
496  hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID);
497 
498  if (hDlgCtrl != NULL)
499  {
500  /* check state */
501  LRESULT OldPosition = SendMessageW(hDlgCtrl, TBM_GETPOS, 0, 0);
502  if (OldPosition != Position)
503  {
504  /* update control state */
505  SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, Position + Index);
506  }
507  }
508  }
509  }
510  }
511 
512  /* free controls */
513  HeapFree(GetProcessHeap(), 0, Control);
514  }
515 
516  /* increment dialog count */
517  PrefContext->Count++;
518  }
519  }
520  }
521  return TRUE;
522 }
#define IDC_LINE_SLIDER_VERT
Definition: resources.h:25
#define MAKEINTRESOURCE
Definition: winuser.h:591
BOOL ReadLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, IN LPTSTR szControlName, OUT DWORD *Flags)
Definition: misc.c:197
#define TRUE
Definition: types.h:120
INT SndMixerGetLineName(PSND_MIXER Mixer, DWORD LineID, LPTSTR lpBuffer, UINT uSize, BOOL LongName)
Definition: mixer.c:390
__wchar_t WCHAR
Definition: xmlstorage.h:180
struct _PREFERENCES_CONTEXT * PPREFERENCES_CONTEXT
static COORD Position
Definition: mouse.c:34
INT SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails, LPVOID paDetails)
Definition: mixer.c:498
#define IDD_SMALL_MASTER
Definition: resources.h:33
#define IDD_NORMAL_MASTER
Definition: resources.h:31
#define TBM_SETPOS
Definition: commctrl.h:2006
#define MIXERCONTROL_CT_CLASS_MASK
Definition: mmsystem.h:353
UINT_PTR WPARAM
Definition: windef.h:207
DWORD cControls
Definition: mmsystem.h:1241
BOOL SndMixerQueryControls(PSND_MIXER Mixer, PUINT DisplayControls, LPMIXERLINE LineInfo, LPMIXERCONTROL *Controls)
Definition: mixer.c:112
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define MIXERCONTROL_CT_CLASS_SWITCH
Definition: mmsystem.h:356
#define TBM_GETPOS
Definition: commctrl.h:2001
struct _SND_MIXER * Mixer
Definition: sndvol32.h:35
#define IDC_LINE_NAME
Definition: resources.h:22
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI SetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPCWSTR lpString)
Definition: dialog.c:2748
#define BM_GETCHECK
Definition: winuser.h:1879
#define VOLUME_STEPS
Definition: sndvol32.h:17
VOID LoadDialog(IN HMODULE hModule, IN PMIXER_WINDOW MixerWindow, IN LPCWSTR DialogResId, IN DWORD Index)
Definition: dialog.c:292
#define BM_SETCHECK
Definition: winuser.h:1882
#define GetProcessHeap()
Definition: compat.h:395
unsigned int UINT
Definition: ndis.h:50
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned long DWORD
Definition: ntddk_ex.h:95
CHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1243
WINDOW_MODE Mode
Definition: sndvol32.h:40
static const WCHAR L[]
Definition: oid.c:1087
#define MIXER_LONG_NAME_CHARS
Definition: mmsystem.h:294
static const WCHAR Control[]
Definition: interface.c:27
TCHAR DeviceName[128]
Definition: sndvol32.h:100
#define MIXERCONTROL_CT_CLASS_FADER
Definition: mmsystem.h:359
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI GetDlgItem(HWND hDlg, int nIDDlgItem)
Definition: dialog.c:2113
LONG_PTR LRESULT
Definition: windef.h:209
#define HeapFree(x, y, z)
Definition: compat.h:394
HINSTANCE hAppInstance
Definition: mmc.c:23
PMIXER_WINDOW MixerWindow
Definition: sndvol32.h:91
#define IDC_LINE_SWITCH
Definition: resources.h:23

◆ LoadDialog()

VOID LoadDialog ( IN HMODULE  hModule,
IN PMIXER_WINDOW  MixerWindow,
IN LPCWSTR  DialogResId,
IN DWORD  Index 
)

Definition at line 292 of file dialog.c.

Referenced by EnumConnectionsCallback().

297 {
298  LPDLGTEMPLATE DlgTemplate;
299  PDLGITEMTEMPLATE DlgItem;
300  RECT dialogRect;
301  LPWORD Offset;
302  WORD FontSize;
303  WCHAR FontName[100];
304  WORD Length;
305  int width;
306 
308  UINT xBaseUnit = LOWORD(units);
309  UINT yBaseUnit = HIWORD(units);
310 
311  /* first load the dialog resource */
312  DlgTemplate = (LPDLGTEMPLATE)LoadDialogResource(hModule, DialogResId, NULL);
313  if (!DlgTemplate)
314  {
315  /* failed to load resource */
316  return;
317  }
318 
319  /* Now walk past the dialog header */
320  Offset = (LPWORD)(DlgTemplate + 1);
321 
322  /* FIXME: support menu */
323  assert(*Offset == 0);
324  Offset++;
325 
326  /* FIXME: support classes */
327  assert(*Offset == 0);
328  Offset++;
329 
330  /* FIXME: support titles */
331  assert(*Offset == 0);
332  Offset++;
333 
334  /* get font size */
335  FontSize = *Offset;
336  Offset++;
337 
338  /* calculate font length */
339  Length = wcslen((LPWSTR)Offset) + 1;
340  assert(Length < (sizeof(FontName) / sizeof(WCHAR)));
341 
342  /* copy font */
343  wcscpy(FontName, (LPWSTR)Offset);
344 
345  if (DlgTemplate->style & DS_SETFONT)
346  {
347  HDC hDC;
348 
349  hDC = GetDC(0);
350 
351  if (!MixerWindow->hFont)
352  {
353  int pixels = MulDiv(FontSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
355  }
356 
357  if (MixerWindow->hFont)
358  {
359  SIZE charSize;
360  HFONT hOldFont;
361 
362  hOldFont = SelectObject(hDC, MixerWindow->hFont);
363  charSize.cx = GdiGetCharDimensions(hDC, NULL, &charSize.cy);
364  if (charSize.cx)
365  {
366  xBaseUnit = charSize.cx;
367  yBaseUnit = charSize.cy;
368  }
369  SelectObject(hDC, hOldFont);
370  }
371  }
372 
373 // assert(MixerWindow->hFont);
374 
375  /* move offset after font name */
376  Offset += Length;
377 
378  /* offset is now at first dialog item control */
379  DlgItem = (PDLGITEMTEMPLATE)Offset;
380 
381  dialogRect.left = 0;
382  dialogRect.right = DlgTemplate->cx;
383  dialogRect.top = 0;
384  dialogRect.bottom = DlgTemplate->cy;
385 
386  ConvertRect(&dialogRect, xBaseUnit, yBaseUnit);
387 
388  width = dialogRect.right - dialogRect.left;
389 
390  dialogRect.left += MixerWindow->rect.right;
391  dialogRect.right += MixerWindow->rect.right;
392  dialogRect.top += MixerWindow->rect.top;
393  dialogRect.bottom += MixerWindow->rect.top;
394 
395  MixerWindow->rect.right += width;
396  if ((dialogRect.bottom - dialogRect.top) > (MixerWindow->rect.bottom - MixerWindow->rect.top))
397  MixerWindow->rect.bottom = MixerWindow->rect.top + dialogRect.bottom - dialogRect.top;
398 
399  /* now add the controls */
400  LoadDialogControls(MixerWindow, &dialogRect, DlgTemplate->cdit, DlgItem, Index, xBaseUnit, yBaseUnit);
401 }
#define HDC
Definition: msvc.h:22
GLint GLint GLsizei width
Definition: gl.h:1546
HFONT WINAPI CreateFontW(_In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_opt_ LPCWSTR)
VOID LoadDialogControls(IN PMIXER_WINDOW MixerWindow, LPRECT DialogOffset, WORD ItemCount, PDLGITEMTEMPLATE DialogItem, DWORD DialogIdMultiplier, UINT xBaseUnit, UINT yBaseUnit)
Definition: dialog.c:249
#define DEFAULT_QUALITY
Definition: wingdi.h:434
#define FF_DONTCARE
Definition: wingdi.h:446
HDC WINAPI GetDC(_In_opt_ HWND)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG top
Definition: windef.h:297
LPVOID LoadDialogResource(IN HMODULE hModule, IN LPCWSTR ResourceName, OUT LPDWORD ResourceLength)
Definition: dialog.c:21
DWORD style
Definition: winuser.h:3012
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define assert(x)
Definition: debug.h:53
LONG left
Definition: windef.h:296
#define DEFAULT_CHARSET
Definition: wingdi.h:382
LONG right
Definition: windef.h:298
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define CLIP_DEFAULT_PRECIS
Definition: wingdi.h:424
LONG WINAPI GetDialogBaseUnits(VOID)
Definition: dialog.c:2076
smooth NULL
Definition: ftsmooth.c:416
LONG cx
Definition: windef.h:324
struct DLGTEMPLATE * LPDLGTEMPLATE
unsigned int UINT
Definition: ndis.h:50
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned short WORD
Definition: ntddk_ex.h:93
#define OUT_DEFAULT_PRECIS
Definition: wingdi.h:413
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define DS_SETFONT
Definition: winuser.h:378
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
WORD cdit
Definition: winuser.h:3014
uint16_t * LPWORD
Definition: typedefs.h:54
static HDC hDC
Definition: 3dtext.c:33
GLfloat units
Definition: glext.h:11727
LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *)
Definition: font.c:1922
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: gl.h:1546
short cy
Definition: winuser.h:3018
#define FW_NORMAL
Definition: wingdi.h:371
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define HIWORD(l)
Definition: typedefs.h:246
VOID ConvertRect(LPRECT lpRect, UINT xBaseUnit, UINT yBaseUnit)
Definition: dialog.c:12
LONG bottom
Definition: windef.h:299
#define LOGPIXELSY
Definition: wingdi.h:717
WCHAR * LPWSTR
Definition: xmlstorage.h:184
short cx
Definition: winuser.h:3017
LONG cy
Definition: windef.h:325
#define LOWORD(l)
Definition: pedump.c:82
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define MulDiv(x, y, z)
Definition: gdifloat.h:86
HMODULE hModule
Definition: animate.c:44

◆ LoadDialogControls()

VOID LoadDialogControls ( IN PMIXER_WINDOW  MixerWindow,
LPRECT  DialogOffset,
WORD  ItemCount,
PDLGITEMTEMPLATE  DialogItem,
DWORD  DialogIdMultiplier,
UINT  xBaseUnit,
UINT  yBaseUnit 
)

Definition at line 249 of file dialog.c.

Referenced by LoadDialog().

257 {
258  LPWORD Offset;
259  WORD Index;
260 
261  /* sanity check */
262  assert(ItemCount);
263 
264  if (MixerWindow->Window)
265  MixerWindow->Window = (HWND*)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MixerWindow->Window, (MixerWindow->WindowCount + ItemCount) * sizeof(HWND));
266  else
267  MixerWindow->Window = (HWND*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ItemCount * sizeof(HWND));
268  if (!MixerWindow->Window)
269  {
270  /* no memory */
271  return;
272  }
273 
274  /* enumerate now all controls */
275  for (Index = 0; Index < ItemCount; Index++)
276  {
277  /* add controls */
278  Offset = AddDialogControl(MixerWindow->hWnd, &MixerWindow->Window[MixerWindow->WindowCount], DialogOffset, DialogItem, DialogIdMultiplier, MixerWindow->hFont, xBaseUnit, yBaseUnit);
279 
280  /* sanity check */
281  assert(Offset);
282 
283  /* move dialog item to new offset */
284  DialogItem =(PDLGITEMTEMPLATE)Offset;
285 
286  /* increment window count */
287  MixerWindow->WindowCount++;
288  }
289 }
HANDLE HWND
Definition: compat.h:13
#define assert(x)
Definition: debug.h:53
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned short WORD
Definition: ntddk_ex.h:93
LPWORD AddDialogControl(IN HWND hwndDialog, IN HWND *OutWnd, IN LPRECT DialogOffset, IN PDLGITEMTEMPLATE DialogItem, IN DWORD DialogIdMultiplier, IN HFONT hFont, UINT xBaseUnit, UINT yBaseUnit)
Definition: dialog.c:67
uint16_t * LPWORD
Definition: typedefs.h:54
#define HeapReAlloc
Definition: compat.h:393
#define HEAP_ZERO_MEMORY
Definition: compat.h:123

◆ LoadDialogCtrls()

VOID LoadDialogCtrls ( PPREFERENCES_CONTEXT  PrefContext)

Definition at line 525 of file dialog.c.

Referenced by RebuildMixerWindowControls().

527 {
528  HWND hDlgCtrl;
529  RECT statusRect;
530 
531  /* set dialog count to zero */
532  PrefContext->Count = 0;
533 
534  SetRectEmpty(&PrefContext->MixerWindow->rect);
535 
536  /* enumerate controls */
537  SndMixerEnumConnections(PrefContext->MixerWindow->Mixer, PrefContext->SelectedLine, EnumConnectionsCallback, (PVOID)PrefContext);
538 
539  if (PrefContext->MixerWindow->hStatusBar)
540  {
541  GetWindowRect(PrefContext->MixerWindow->hStatusBar, &statusRect);
542  PrefContext->MixerWindow->rect.bottom += (statusRect.bottom - statusRect.top);
543  }
544 
545  /* now move the window */
547  SetWindowPos(PrefContext->MixerWindow->hWnd, HWND_TOP, PrefContext->MixerWindow->rect.left, PrefContext->MixerWindow->rect.top, PrefContext->MixerWindow->rect.right - PrefContext->MixerWindow->rect.left, PrefContext->MixerWindow->rect.bottom - PrefContext->MixerWindow->rect.top, SWP_NOMOVE | SWP_NOZORDER);
548 
549  /* get last line separator */
550  hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, IDC_LINE_SEP * PrefContext->Count);
551 
552  if (hDlgCtrl != NULL)
553  {
554  /* hide last separator */
555  ShowWindow(hDlgCtrl, SW_HIDE);
556  }
557 }
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
LONG top
Definition: windef.h:297
BOOL SndMixerEnumConnections(PSND_MIXER Mixer, DWORD LineID, PFNSNDMIXENUMCONNECTIONS EnumProc, PVOID Context)
Definition: mixer.c:552
#define WS_DLGFRAME
Definition: pedump.c:626
#define HWND_TOP
Definition: winuser.h:1193
LONG left
Definition: windef.h:296
#define SWP_NOZORDER
Definition: winuser.h:1232
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define WS_CLIPCHILDREN
Definition: pedump.c:619
LONG right
Definition: windef.h:298
BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL)
#define IDC_LINE_SEP
Definition: resources.h:26
BOOL CALLBACK EnumConnectionsCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context)
Definition: dialog.c:405
struct _SND_MIXER * Mixer
Definition: sndvol32.h:35
smooth NULL
Definition: ftsmooth.c:416
#define WS_CAPTION
Definition: pedump.c:624
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
#define WS_MINIMIZEBOX
Definition: pedump.c:631
HWND WINAPI GetDlgItem(HWND hDlg, int nIDDlgItem)
Definition: dialog.c:2113
LONG bottom
Definition: windef.h:299
#define SWP_NOMOVE
Definition: winuser.h:1229
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_SYSMENU
Definition: pedump.c:629
HWND hStatusBar
Definition: sndvol32.h:34
PMIXER_WINDOW MixerWindow
Definition: sndvol32.h:91

◆ LoadDialogResource()

LPVOID LoadDialogResource ( IN HMODULE  hModule,
IN LPCWSTR  ResourceName,
OUT LPDWORD  ResourceLength 
)

Definition at line 21 of file dialog.c.

Referenced by LoadDialog().

25 {
26  HRSRC hSrc;
27  HGLOBAL hRes;
28  PVOID Result;
29 
30  /* find resource */
31  hSrc = FindResourceW(hModule, ResourceName, (LPCWSTR)RT_DIALOG);
32 
33  if (!hSrc)
34  {
35  /* failed to find resource */
36  return NULL;
37  }
38 
39  /* now load the resource */
40  hRes = LoadResource(hAppInstance, hSrc);
41  if (!hRes)
42  {
43  /* failed to load resource */
44  return NULL;
45  }
46 
47  /* now lock the resource */
48  Result = LockResource(hRes);
49 
50  if (!Result)
51  {
52  /* failed to lock resource */
53  return NULL;
54  }
55 
56  if (ResourceLength)
57  {
58  /* store output length */
59  *ResourceLength = SizeofResource(hAppInstance, hSrc);
60  }
61 
62  /* done */
63  return Result;
64 }
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
smooth NULL
Definition: ftsmooth.c:416
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
#define RT_DIALOG
Definition: pedump.c:367
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
HINSTANCE hAppInstance
Definition: mmc.c:23
HMODULE hModule
Definition: animate.c:44

◆ UpdateDialogLineSliderControl()

VOID UpdateDialogLineSliderControl ( PPREFERENCES_CONTEXT  PrefContext,
LPMIXERLINE  Line,
DWORD  dwControlID,
DWORD  dwDialogID,
DWORD  Position 
)

Definition at line 606 of file dialog.c.

Referenced by MixerControlChangeCallback().

612 {
613  DWORD Index;
614  DWORD wID;
615  HWND hDlgCtrl;
616  WCHAR LineName[MIXER_LONG_NAME_CHARS];
617 
618  /* find the index of this line */
619  for(Index = 0; Index < PrefContext->Count; Index++)
620  {
621  /* get id */
622  wID = (Index + 1) * IDC_LINE_NAME;
623 
624  if (GetDlgItemText(PrefContext->MixerWindow->hWnd, wID, LineName, MIXER_LONG_NAME_CHARS) == 0)
625  {
626  /* failed to retrieve id */
627  continue;
628  }
629 
630  /* check if the line name matches */
631  if (!wcsicmp(LineName, Line->szName))
632  {
633  /* found matching line name */
634  wID = (Index + 1) * dwDialogID;
635 
636  /* get dialog control */
637  hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID);
638 
639  if (hDlgCtrl != NULL)
640  {
641  /* check state */
642  LRESULT OldPosition = SendMessageW(hDlgCtrl, TBM_GETPOS, 0, 0);
643  if (OldPosition != Position)
644  {
645  /* update control state */
646  SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, Position + Index);
647  }
648  }
649  break;
650  }
651  }
652 }
#define TRUE
Definition: types.h:120
__wchar_t WCHAR
Definition: xmlstorage.h:180
static COORD Position
Definition: mouse.c:34
#define TBM_SETPOS
Definition: commctrl.h:2006
UINT_PTR WPARAM
Definition: windef.h:207
#define TBM_GETPOS
Definition: commctrl.h:2001
#define IDC_LINE_NAME
Definition: resources.h:22
smooth NULL
Definition: ftsmooth.c:416
#define GetDlgItemText
Definition: winuser.h:5651
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned long DWORD
Definition: ntddk_ex.h:95
CHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1243
#define MIXER_LONG_NAME_CHARS
Definition: mmsystem.h:294
#define wcsicmp
Definition: string.h:1152
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI GetDlgItem(HWND hDlg, int nIDDlgItem)
Definition: dialog.c:2113
LONG_PTR LRESULT
Definition: windef.h:209
PMIXER_WINDOW MixerWindow
Definition: sndvol32.h:91

◆ UpdateDialogLineSwitchControl()

VOID UpdateDialogLineSwitchControl ( PPREFERENCES_CONTEXT  PrefContext,
LPMIXERLINE  Line,
LONG  fValue 
)

Definition at line 560 of file dialog.c.

Referenced by MixerControlChangeCallback().

564 {
565  DWORD Index;
566  DWORD wID;
567  HWND hDlgCtrl;
568  WCHAR LineName[MIXER_LONG_NAME_CHARS];
569 
570  /* find the index of this line */
571  for(Index = 0; Index < PrefContext->Count; Index++)
572  {
573  /* get id */
574  wID = (Index + 1) * IDC_LINE_NAME;
575 
576  if (GetDlgItemText(PrefContext->MixerWindow->hWnd, wID, LineName, MIXER_LONG_NAME_CHARS) == 0)
577  {
578  /* failed to retrieve id */
579  continue;
580  }
581 
582  /* check if the line name matches */
583  if (!wcsicmp(LineName, Line->szName))
584  {
585  /* found matching line name */
586  wID = (Index + 1) * IDC_LINE_SWITCH;
587 
588  /* get dialog control */
589  hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd, wID);
590 
591  if (hDlgCtrl != NULL)
592  {
593  /* check state */
594  if (SendMessageW(hDlgCtrl, BM_GETCHECK, 0, 0) != fValue)
595  {
596  /* update control state */
597  SendMessageW(hDlgCtrl, BM_SETCHECK, (WPARAM)fValue, 0);
598  }
599  }
600  break;
601  }
602  }
603 }
__wchar_t WCHAR
Definition: xmlstorage.h:180
UINT_PTR WPARAM
Definition: windef.h:207
#define IDC_LINE_NAME
Definition: resources.h:22
smooth NULL
Definition: ftsmooth.c:416
#define BM_GETCHECK
Definition: winuser.h:1879
#define BM_SETCHECK
Definition: winuser.h:1882
#define GetDlgItemText
Definition: winuser.h:5651
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned long DWORD
Definition: ntddk_ex.h:95
CHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1243
#define MIXER_LONG_NAME_CHARS
Definition: mmsystem.h:294
#define wcsicmp
Definition: string.h:1152
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI GetDlgItem(HWND hDlg, int nIDDlgItem)
Definition: dialog.c:2113
PMIXER_WINDOW MixerWindow
Definition: sndvol32.h:91
#define IDC_LINE_SWITCH
Definition: resources.h:23