Hello,
I have made a patch for comdlg32 on Mac OS X that replaces Wine's own color picker dialog with the native one.
Bellow are the sources for colordlg.c, cocoa_colordlg.m and Makefile.in (without comments).
-------------------- colordlg.c --------------------
static BOOL ChooseColor_CocoaCommon(COLORREF *color, BOOL init);
BOOL WINAPI ChooseColorW( CHOOSECOLORW *lpChCol )
{
if (!lpChCol) return FALSE;
return ChooseColor_CocoaCommon(&lpChCol->rgbResult, lpChCol->Flags & CC_RGBINIT);
}
BOOL WINAPI ChooseColorA( LPCHOOSECOLORA lpChCol )
{
if (!lpChCol) return FALSE;
return ChooseColor_CocoaCommon(&lpChCol->rgbResult, lpChCol->Flags & CC_RGBINIT);
}
struct RGBColor {
unsigned short red;
unsigned short green;
unsigned short blue;
};
int cocoa_run_color_dialog_modal(struct RGBColor *color);
static BOOL ChooseColor_CocoaCommon(COLORREF *color, BOOL init) {
struct RGBColor rgb = { 0, 0, 0 };
if (init) {
rgb.red = GetRValue(*color) * 257;
rgb.green = GetGValue(*color) * 257;
rgb.blue = GetBValue(*color) * 257;
}
BOOL ret = cocoa_run_color_dialog_modal(&rgb);
if (ret) *color = RGB(rgb.red / 257, rgb.green / 257, rgb.blue / 257);
return ret;
}-------------------- cocoa_colordlg.m --------------------
#import <AppKit/AppKit.h>
#import <Carbon/Carbon.h>
int cocoa_run_color_dialog_modal(RGBColor *color) {
__block int ret = 0;
void (^block)(void) = ^{
ret = GetColor((Point){ 0, 0 }, (const unsigned char *)"Color", color, color);
};
if ([NSThread isMainThread]) block();
else dispatch_sync(dispatch_get_main_queue(), block);
return ret;
}-------------------- Makefile.in --------------------
MODULE = comdlg32.dll
IMPORTLIB = comdlg32
IMPORTS = uuid shell32 shlwapi comctl32 winspool user32 gdi32 advapi32
DELAYIMPORTS = ole32
EXTRALIBS = -framework AppKit -framework Carbon
C_SRCS = \
cdlg32.c \
colordlg.c \
filedlg.c \
filedlg31.c \
filedlgbrowser.c \
finddlg.c \
fontdlg.c \
itemdlg.c \
printdlg.c
RC_SRCS = comdlg32.rc
SVG_SRCS = \
pd32_collate.svg \
pd32_landscape.svg \
pd32_nocollate.svg \
pd32_portrait.svg
OBJC_SRCS = \
cocoa_colordlg.m
IDL_R_SRCS = comdlg32_classes.idl
@MAKE_DLL_RULES@------------------------------------------------------------
Any comments are welcome.