Looking for feedback on a patch for winecfg I sent yesterday.  Should I instead 
be sending it to the patches list?
I made this patch to take out the frustration of re-adding all the Direct3D 
registry entries every time I wiped my .wine dir.  Also to know the tinkering 
I'm doing is actually having an effect, eg. no spelling errors or using 
outdated/misinformation from the various appdb boards.  It also has the nice 
added bonus of automagically linking with the Applications tab...

Stephen


On Sat, 14 Jan 2012 12:37:10 -0500 Stephen Chao <[email protected]> 
wrote:
> ---
>  programs/winecfg/Makefile.in |    3 +-
>  programs/winecfg/direct3d.c  |  256 
> ++++++++++++++++++++++++++++++++++++++++++
>  programs/winecfg/main.c      |   16 +++-
>  programs/winecfg/resource.h  |    8 ++
>  programs/winecfg/winecfg.h   |    1 +
>  programs/winecfg/winecfg.rc  |   12 ++
>  6 files changed, 294 insertions(+), 2 deletions(-)
>  create mode 100644 programs/winecfg/direct3d.c
> 
> diff --git a/programs/winecfg/Makefile.in b/programs/winecfg/Makefile.in
> index 0190854..1db9fec 100644
> --- a/programs/winecfg/Makefile.in
> +++ b/programs/winecfg/Makefile.in
> @@ -13,7 +13,8 @@ C_SRCS = \
>       main.c \
>       theme.c \
>       winecfg.c \
> -     x11drvdlg.c
> +     x11drvdlg.c \
> +     direct3d.c
>  
>  RC_SRCS = winecfg.rc
>  PO_SRCS = winecfg.rc
> diff --git a/programs/winecfg/direct3d.c b/programs/winecfg/direct3d.c
> new file mode 100644
> index 0000000..833999e
> --- /dev/null
> +++ b/programs/winecfg/direct3d.c
> @@ -0,0 +1,256 @@
> +#include "winecfg.h"
> +#include "resource.h"
> +#include <wine/debug.h>
> +
> +WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
> +
> +struct d3doption {
> +  char key[64];
> +  char option1[64];
> +  char option2[64];
> +  char option3[64];
> +  char option4[64];
> +  char option5[64];
> +  char tip[2048];
> +} *d3doptions;
> +
> +static const int numd3dkeys = 9;
> +
> +static void init_d3doptions(void)
> +{
> +  d3doptions = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct 
> d3doption) * numd3dkeys);
> +  
> +  /* "auto" will be added for all options */
> +  /* registry options and defaults found in dlls/wined3d/wined3d_main.c */
> +  /* TODO: VideoPciDeviceID and VideoPciVendorID, see note in 
> on_selection_change() */
> +  
> +  strcpy(d3doptions[0].key, "VertexShaderMode");
> +  strcpy(d3doptions[0].option1, "none");
> +  strcpy(d3doptions[0].tip, "auto = hardware.");
> +  
> +  strcpy(d3doptions[1].key, "PixelShaderMode");
> +  strcpy(d3doptions[1].option1, "enabled");
> +  strcpy(d3doptions[1].option2, "disabled");
> +  strcpy(d3doptions[1].tip, "auto = enabled = hardware.");
> +  
> +  strcpy(d3doptions[2].key, "UseGLSL");
> +  strcpy(d3doptions[2].option1, "disabled");
> +  strcpy(d3doptions[2].tip, "auto = enabled.  Needed for most modern games.  
> May have performance increase when disabled but might not run/render 
> properly.");
> +
> +  strcpy(d3doptions[3].key, "OffscreenRenderingMode");
> +  strcpy(d3doptions[3].option1, "backbuffer");
> +  strcpy(d3doptions[3].option2, "fbo");
> +  strcpy(d3doptions[3].tip, "auto = fbo.");
> +
> +  strcpy(d3doptions[4].key, "RenderTargetLockMode");
> +  strcpy(d3doptions[4].option1, "readdraw");
> +  strcpy(d3doptions[4].option2, "readtex");
> +  strcpy(d3doptions[4].tip, "auto = readtex.  readdraw uses glReadPixels for 
> reading, glDrawPixels for writing.  readtex reads with glReadPixels, writes 
> by drawing a textured quad.");
> +  
> +  strcpy(d3doptions[5].key, "VideoMemorySize");
> +  strcpy(d3doptions[5].option1, "0");
> +  strcpy(d3doptions[5].option2, "512");
> +  strcpy(d3doptions[5].option3, "1024");
> +  strcpy(d3doptions[5].tip, "auto = 0 = autodetect.  Sets the amount of 
> reported video memory (in megabytes).  The default is a simple auto-detection 
> based on the card type guessed from OpenGL capabilities.");
> +  
> +  strcpy(d3doptions[6].key, "Multisampling");
> +  strcpy(d3doptions[6].option1, "disabled");
> +  strcpy(d3doptions[6].tip, "auto = enabled.");
> +
> +  strcpy(d3doptions[7].key, "StrictDrawOrdering");
> +  strcpy(d3doptions[7].option1, "enabled");
> +  strcpy(d3doptions[7].tip, "auto = disabled.  This option ensures any 
> pending drawing operations are submitted to the driver, but at a significant 
> performance cost.");
> +  
> +  strcpy(d3doptions[8].key, "AlwaysOffscreen");
> +  strcpy(d3doptions[8].option1, "enabled");
> +  strcpy(d3doptions[8].tip, "auto = disabled.  Use offscreen rendering for 
> all render targets.  The main effect this has is avoiding the depth buffer 
> copy between offscreen and onscreen targets, which introduces fallbacks in 
> some drivers and exposes bugs in others.  There may be a performance hit 
> depending on the specific driver.");
> +}
> +
> +
> +static void on_setoption(HWND dialog, WPARAM wParam)
> +{
> +  LVITEM item;
> +  int selection;
> +  char buffer[256];
> +  int index = -1;
> +
> +  if(HIWORD(wParam) == CBN_SELENDOK)
> +  {
> +    selection = SendDlgItemMessage(dialog, IDC_D3DCOMBOVAL, CB_GETCURSEL, 0, 
> 0);
> +    SendDlgItemMessage(dialog, IDC_D3DCOMBOVAL, CB_GETLBTEXT, selection, 
> (LPARAM) buffer);
> +  }
> +  else if(HIWORD(wParam) == CBN_EDITCHANGE)
> +  {
> +    SendDlgItemMessage(dialog, IDC_D3DCOMBOVAL, WM_GETTEXT, sizeof(buffer), 
> (LPARAM) buffer);
> +  }
> +
> +  index = (int)SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, CB_GETITEMDATA, 
> 0, 0);
> +  WINE_TRACE("d3d index %d, setoption %s\n", index, buffer);
> +  
> +  set_reg_key(config_key, keypath("Direct3D\\"), d3doptions[index].key, 
> buffer);
> +  SendMessage(GetParent(dialog), PSM_CHANGED, (WPARAM) dialog, 0);
> +  
> +  item.mask = LVIF_TEXT;
> +  item.pszText = buffer;
> +  item.cchTextMax = lstrlen(item.pszText);
> +  item.iItem = index;
> +  item.iSubItem = 1;
> +
> +  SendDlgItemMessage(dialog, IDC_D3DLIST, LVM_SETITEM, 0, (LPARAM) &item);
> +}
> +
> +static void on_selection_change(HWND dialog, HWND listview, LPNMLISTVIEW 
> nmlistview)
> +{
> +  LVITEM item;
> +  struct d3doption *option;
> +  
> +  item.iItem = nmlistview->iItem;
> +  item.iSubItem = 1;
> +  item.mask = LVIF_PARAM | LVIF_TEXT;
> +
> +  
> +  if (item.iItem == -1) return;
> +  
> +  SendMessage(listview, LVM_GETITEM, 0, (LPARAM) &item);
> +
> +  WINE_TRACE("item.iItem=%d\n", nmlistview->iItem);
> +  
> +  option = (struct d3doption*)nmlistview->lParam;
> +  
> +  SetWindowText(GetDlgItem(dialog, IDC_D3DKEY), option->key);
> +  
> +  SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, CB_RESETCONTENT, 0, 0);
> +  
> +  if (option->option5[0]) SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, 
> CB_INSERTSTRING, 0, (LPARAM)option->option5);
> +  if (option->option4[0]) SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, 
> CB_INSERTSTRING, 0, (LPARAM)option->option4);
> +  if (option->option3[0]) SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, 
> CB_INSERTSTRING, 0, (LPARAM)option->option3);
> +  if (option->option2[0]) SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, 
> CB_INSERTSTRING, 0, (LPARAM)option->option2);
> +  if (option->option1[0]) SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, 
> CB_INSERTSTRING, 0, (LPARAM)option->option1);
> +
> +  /* Will have to take out "auto" for VideoPciDeviceID and VideoPciVendorID, 
> 0xffff = autodetect */
> +  SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, CB_INSERTSTRING, 0, 
> (LPARAM)"auto");
> +  
> +  SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, CB_SELECTSTRING, -1, 
> (LPARAM)item.pszText);
> +  
> +  /* attach d3d key index to the 0th combobox value */
> +  SendDlgItemMessage (dialog, IDC_D3DCOMBOVAL, CB_SETITEMDATA, 0, 
> (LPARAM)item.iItem);
> +  
> +  SetWindowText(GetDlgItem(dialog, IDC_D3DTIP), option->tip);
> +}
> +
> +void load_d3d_registry(HWND dialog)
> +{
> +  LVITEM item, item2;
> +  char *fromreg;
> +  char szauto[] = "auto";
> +  int i;
> +  
> +  SendDlgItemMessage(dialog, IDC_D3DLIST, LVM_DELETEALLITEMS, 0, 0);
> +  
> +  for (i=0; i < numd3dkeys; i++)
> +  {
> +    item.mask = LVIF_TEXT | LVIF_PARAM;
> +    item.pszText = d3doptions[i].key;
> +    item.cchTextMax = lstrlen(item.pszText);
> +    item.lParam = (LPARAM) &d3doptions[i];
> +    item.iItem = i;
> +    item.iSubItem = 0;
> +    
> +    SendDlgItemMessage(dialog, IDC_D3DLIST, LVM_INSERTITEM, 0, (LPARAM) 
> &item);
> +    
> +    fromreg = get_reg_key(config_key, keypath("Direct3D\\"), 
> d3doptions[i].key, NULL);
> +    if (fromreg == NULL)
> +    {
> +      /* set registry keys in case they didn't exist -- "auto" specifically 
> */
> +      set_reg_key(config_key, keypath("Direct3D\\"), d3doptions[i].key, 
> szauto);
> +      SendMessage(GetParent(dialog), PSM_CHANGED, (WPARAM) dialog, 0);
> +      item2.pszText = szauto;
> +    }
> +    else
> +    {
> +      item2.pszText = fromreg;
> +    }
> +    
> +    item2.mask = LVIF_TEXT;
> +    item2.cchTextMax = lstrlen(item.pszText);
> +    item2.iItem = i;
> +    item2.iSubItem = 1;
> +    
> +    SendDlgItemMessage(dialog, IDC_D3DLIST, LVM_SETITEM, 0, (LPARAM) &item2);
> +    
> +    HeapFree(GetProcessHeap(), 0, fromreg);
> +  }
> +}
> +
> +static void init_d3dsheet(HWND dialog)
> +{
> +  char key[] = "Key";
> +  char val[] = "Value";
> +  
> +  LVCOLUMN listColumn;
> +  RECT viewRect;
> +  int width;
> +  
> +  init_d3doptions();
> +  
> +  GetClientRect(GetDlgItem(dialog, IDC_D3DLIST), &viewRect);
> +  width = (viewRect.right - viewRect.left);
> +
> +  listColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
> +  listColumn.pszText = key;
> +  listColumn.cchTextMax = lstrlen (listColumn.pszText);
> +  listColumn.cx = 140;
> +
> +  SendDlgItemMessage (dialog, IDC_D3DLIST, LVM_INSERTCOLUMN, 0, (LPARAM) 
> &listColumn);
> +
> +  listColumn.cx = width - 140;
> +  listColumn.pszText = val;
> +  listColumn.cchTextMax = lstrlen (listColumn.pszText);
> +
> +  SendDlgItemMessage (dialog, IDC_D3DLIST, LVM_INSERTCOLUMN, 1, (LPARAM) 
> &listColumn);
> +}
> +
> +
> +INT_PTR CALLBACK
> +Direct3DDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
> +{
> +switch (uMsg)
> +  {
> +    case WM_INITDIALOG:
> +        init_d3dsheet(hDlg);
> +        break;
> +
> +    case WM_SHOWWINDOW:
> +        set_window_title(hDlg);
> +        break;
> +
> +    case WM_NOTIFY:
> +      switch (((LPNMHDR)lParam)->code)
> +      {
> +        case LVN_ITEMCHANGED:
> +            on_selection_change(hDlg, GetDlgItem(hDlg, IDC_D3DLIST), 
> (LPNMLISTVIEW)lParam);
> +            break;
> +     case PSN_SETACTIVE:
> +            load_d3d_registry(hDlg);
> +            break;
> +     case PSN_KILLACTIVE:
> +            SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
> +            break;
> +        case PSN_APPLY:
> +            apply();
> +            SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
> +            break;
> +      }
> +    case WM_COMMAND:
> +      switch (HIWORD(wParam))
> +      {
> +        case CBN_EDITCHANGE:
> +        case CBN_SELENDOK:
> +             on_setoption(hDlg, wParam);
> +             break;
> +      }
> +      
> +      break;
> +  }
> +  return 0;
> +}
> diff --git a/programs/winecfg/main.c b/programs/winecfg/main.c
> index 7376309..ccd59b0 100644
> --- a/programs/winecfg/main.c
> +++ b/programs/winecfg/main.c
> @@ -60,7 +60,7 @@ PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam)
>      return 0;
>  }
>  
> -#define NUM_PROPERTY_PAGES 7
> +#define NUM_PROPERTY_PAGES 8
>  
>  static INT_PTR
>  doPropertySheet (HINSTANCE hInstance, HWND hOwner)
> @@ -84,6 +84,20 @@ doPropertySheet (HINSTANCE hInstance, HWND hOwner)
>      pg++;
>  
>      /*
> +     * Fill out the (Direct3D) PROPSHEETPAGE data structure
> +     * for the property sheet
> +     */
> +    psp[pg].dwSize = sizeof (PROPSHEETPAGEW);
> +    psp[pg].dwFlags = PSP_USETITLE;
> +    psp[pg].hInstance = hInstance;
> +    psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_DIRECT3DCFG);
> +    psp[pg].u2.pszIcon = NULL;
> +    psp[pg].pfnDlgProc = Direct3DDlgProc;
> +    psp[pg].pszTitle = load_string (IDS_TAB_DIRECT3D);
> +    psp[pg].lParam = 0;
> +    pg++;
> +
> +    /*
>       * Fill out the (Libraries) PROPSHEETPAGE data structure 
>       * for the property sheet
>       */
> diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h
> index 6d9c450..826b840 100644
> --- a/programs/winecfg/resource.h
> +++ b/programs/winecfg/resource.h
> @@ -45,6 +45,7 @@
>  #define IDS_SHELL_FOLDER                16
>  #define IDS_LINKS_TO                    17
>  #define IDS_WINECFG_TITLE_APP           18   /* App specific title */
> +#define IDS_TAB_DIRECT3D                19
>  #define IDI_WINECFG                     100
>  #define IDD_MAINDLG                     101
>  #define IDI_LOGO                        102
> @@ -54,6 +55,7 @@
>  #define IDD_GRAPHCFG                    110
>  #define IDD_DLLCFG                      111
>  #define IDD_DRIVECFG                    112
> +#define IDD_DIRECT3DCFG                 113
>  #define IDD_DESKTOP_INTEGRATION         115
>  #define IDB_WINE_LOGO                   200
>  #define IDC_TABABOUT                    1001
> @@ -197,6 +199,12 @@
>  #define IDC_SYSPARAM_COLOR              1416
>  #define IDC_SYSPARAM_FONT               1417
>  
> +/* direct3d tab */
> +#define IDC_D3DLIST                  1501
> +#define IDC_D3DKEY                   1502
> +#define IDC_D3DCOMBOVAL                      1503
> +#define IDC_D3DTIP                   1504
> +
>  #define IDC_SYSPARAMS_BUTTON            8400
>  #define IDC_SYSPARAMS_BUTTON_TEXT       8401
>  #define IDC_SYSPARAMS_DESKTOP           8402
> diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h
> index 1959409..6775707 100644
> --- a/programs/winecfg/winecfg.h
> +++ b/programs/winecfg/winecfg.h
> @@ -88,6 +88,7 @@ INT_PTR CALLBACK LibrariesDlgProc (HWND hDlg, UINT uMsg, 
> WPARAM wParam, LPARAM l
>  INT_PTR CALLBACK AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM 
> lParam);
>  INT_PTR CALLBACK ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM 
> lParam);
>  INT_PTR CALLBACK AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM 
> lParam);
> +INT_PTR CALLBACK Direct3DDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, 
> LPARAM lParam);
>  
>  /* Drive management  */
>  BOOL load_drives(void);
> diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc
> index 4ded308..34baad7 100644
> --- a/programs/winecfg/winecfg.rc
> +++ b/programs/winecfg/winecfg.rc
> @@ -38,6 +38,7 @@ BEGIN
>      IDS_TAB_DESKTOP_INTEGRATION "Desktop Integration"
>      IDS_TAB_AUDIO           "Audio"
>      IDS_TAB_ABOUT           "About"
> +    IDS_TAB_DIRECT3D        "Direct3D"
>      IDS_WINECFG_TITLE       "Wine configuration"
>      IDS_WINECFG_TITLE_APP   "Wine configuration for %s"
>      IDS_THEMEFILE           "Theme files (*.msstyles; *.theme)"
> @@ -153,6 +154,17 @@ BEGIN
>      COMBOBOX        IDC_WINVER,100,194,145,56,CBS_DROPDOWNLIST | WS_VSCROLL 
> | WS_TABSTOP    
>  END
>  
> +IDD_DIRECT3DCFG DIALOG  0, 0, 260, 220
> +STYLE WS_CHILD | WS_DISABLED
> +FONT 8, "MS Shell Dlg"
> +BEGIN
> +    GROUPBOX        "Direct3D Settings", IDC_STATIC, 8, 4, 244, 210
> +    CONTROL         "", IDC_D3DLIST, "SysListView32", WS_TABSTOP | WS_BORDER 
> | LVS_ALIGNLEFT | LVS_SINGLESEL | LVS_REPORT, 15, 51, 148, 116
> +    COMBOBOX        IDC_D3DCOMBOVAL, 167, 64, 79, 16, WS_TABSTOP | 
> CBS_DROPDOWN | CBS_HASSTRINGS
> +    EDITTEXT        IDC_D3DKEY, 167, 52, 79, 12, NOT WS_BORDER | NOT 
> WS_TABSTOP | ES_READONLY
> +    EDITTEXT        IDC_D3DTIP, 15, 174, 232, 36, WS_VSCROLL | NOT 
> WS_TABSTOP | ES_MULTILINE | ES_READONLY
> +END
> +
>  IDD_GRAPHCFG DIALOG  0, 0, 260, 220
>  STYLE WS_CHILD | WS_DISABLED
>  FONT 8, "MS Shell Dlg"


Reply via email to