Her is a partial implementation of ChangeDisplaySettings and friends. It currently works if "Desktop" is set to the size the display is changed to or if Managed=N.
For Desktop not the size that the display is changed to the code tries SetWindowPos and XResizeWindow witch work in sawfis but dosent in kde. How does i change the size of the desktop shouldent this work? I haven't got any gut ideas how to implement this in Managed=Y. Does any of you? Dispay size changes does ony take place if xvidmode is used. "Sorry for my bad English" MVH Tommy.
Index: dlls/user/user_main.c =================================================================== RCS file: /home/wine/wine/dlls/user/user_main.c,v retrieving revision 1.41 diff -u -b -B -r1.41 user_main.c --- dlls/user/user_main.c 20 May 2002 18:01:44 -0000 1.41 +++ dlls/user/user_main.c 10 Aug 2002 13:34:26 -0000 @@ -113,6 +113,8 @@ GET_USER_FUNC(SetWindowText); GET_USER_FUNC(ShowWindow); GET_USER_FUNC(SysCommandSizeMove); + GET_USER_FUNC(ChangeDisplaySettings); + return TRUE; } Index: dlls/x11drv/desktop.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/desktop.c,v retrieving revision 1.7 diff -u -b -B -r1.7 desktop.c --- dlls/x11drv/desktop.c 13 Jun 2002 19:11:21 -0000 1.7 +++ dlls/x11drv/desktop.c 10 Aug 2002 13:34:27 -0000 @@ -22,12 +22,19 @@ #include <X11/cursorfont.h> #include "ts_xlib.h" +#include "ts_xf86vmode.h" + +#include "xvidmode.h" #include "wine/winuser16.h" #include "win.h" #include "x11drv.h" #include "wine/debug.h" +#include "mwm.h" + +#define PROP_MWM_HINTS_ELEMENTS 5 + WINE_DEFAULT_DEBUG_CHANNEL(x11drv); @@ -174,4 +181,167 @@ XFlush( display ); wine_tsx11_unlock(); return win; +} + +/*********************************************************************** + * X11DRV_create_desktop + * + * Create the X11 desktop window for the desktop mode. + */ +extern int usexvidmode; +static int XVidModeErrorHandler(Display *dpy, XErrorEvent *event, void *arg) +{ + return 1; +} +void X11DRV_ChangeDisplaySettings(LPCSTR devname, LPDEVMODEA devmode, HWND hwnd, DWORD flags, LPARAM lparam){ +#ifdef HAVE_LIBXXF86VM + static int xf86vm_event, xf86vm_error, xf86vm_major, xf86vm_minor; + static int defaultMode=-1; + XF86VidModeModeInfo** modes; + int nmodes; + Bool xvidmodeok = TRUE; + + if (usexvidmode){ + + if (!TSXF86VidModeQueryExtension(thread_display(), &xf86vm_event, &xf86vm_error)) xvidmodeok = FALSE; + X11DRV_expect_error(gdi_display, XVidModeErrorHandler, NULL); + xvidmodeok = TSXF86VidModeQueryVersion(thread_display(), &xf86vm_major, &xf86vm_minor); + if (X11DRV_check_error()) xvidmodeok = FALSE; + if (xvidmodeok){ + + + TSXF86VidModeGetAllModeLines(thread_display(), DefaultScreen(thread_display()), &nmodes, &modes); + + if(defaultMode==-1){ + defaultMode=X11DRV_XF86VM_GetCurrentMode(); + FIXME("Default mode: %i\n",defaultMode); + } + } + }else{ + xvidmodeok = FALSE; + } +#endif + + if(devmode==NULL){ +#ifdef HAVE_LIBXXF86VM + if (xvidmodeok){ + TSXF86VidModeSwitchToMode(thread_display(), DefaultScreen(thread_display()), modes[defaultMode]); + } +#endif + }else{ + int best = -1; + int i; + + + if(flags==CDS_FULLSCREEN){ + Window window; + BOOL grab; + long hwndTemp; + XSetWindowAttributes attr; + RECT rect; + Atom prop; + MwmHints mwmhints; + WND *win; + + grab = 1; + + hwndTemp = GetForegroundWindow(); + FIXME("Root_window=%li,%li\n",root_window,DefaultRootWindow(thread_display())); + FIXME("hwnd=%li\n",hwndTemp); + + if(root_window==DefaultRootWindow(thread_display())){ + win=WIN_GetPtr(hwndTemp); + if(win->dwExStyle & WS_EX_MANAGED){ + FIXME("Is managed Cant handel\n"); + return; + }else{ + FIXME("Is not managed\n"); + } + + rect=((struct x11drv_win_data *)win->pDriverData)->whole_rect; + FIXME("x=%i,y=%i,width=%i,height=%i\n",rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top); + + attr.backing_store=Always; + + window = TSXCreateWindow(thread_display(),root_window, + 0,0,devmode->dmPelsWidth,devmode->dmPelsHeight,0,DefaultDepth(thread_display(), DefaultScreen(thread_display())), + InputOutput,DefaultVisual(thread_display(), DefaultScreen(thread_display())),CWBackingStore,&attr); + + wine_tsx11_lock(); + prop = XInternAtom(thread_display(), "_MOTIF_WM_HINTS", False); + mwmhints.flags = MWM_HINTS_DECORATIONS; + mwmhints.decorations = 0; + XChangeProperty(thread_display(), window, prop, prop, 32, + PropModeReplace, (unsigned char *) &mwmhints, + PROP_MWM_HINTS_ELEMENTS); + wine_tsx11_unlock(); + + TSXMapWindow(thread_display(), window); + + wine_tsx11_lock(); + XMoveWindow (thread_display(), window,0,0); + wine_tsx11_unlock(); + TSXSync(thread_display(),0); + FIXME("Window of (hwnd=%li) = %li\n",hwndTemp,window); + FIXME("Befor grab \n"); + }else{ + SetWindowPos(GetDesktopWindow(),0,0,0,devmode->dmPelsWidth,devmode->dmPelsHeight,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER); + window=X11DRV_get_whole_window(GetDesktopWindow()); + XResizeWindow(thread_display(),window,devmode->dmPelsWidth,devmode->dmPelsHeight); + } + FIXME("RESIZE screen\n"); + if(window){ + TSXGrabPointer(thread_display(), window, True, 0, GrabModeAsync, GrabModeAsync, window, None, CurrentTime); + } + /* if (devmode->dmFields & DM_BITSPERPEL) */ + FIXME(" bpp=%ld\n",devmode->dmBitsPerPel); + /* if (devmode->dmFields & DM_PELSWIDTH) */ + FIXME(" width=%ld\n",devmode->dmPelsWidth); + /* if (devmode->dmFields & DM_PELSHEIGHT) */ + FIXME(" height=%ld\n",devmode->dmPelsHeight); + +#ifdef HAVE_LIBXXF86VM + if (xvidmodeok){ + FIXME("modes: %i\n",nmodes); + for (i=0; i < nmodes; i++) + { + if ((modes[i]->hdisplay >= devmode->dmPelsWidth) && + modes[i]->vdisplay >= devmode->dmPelsHeight) + { + if (best == -1) best = i; + else + { + if (modes[i]->hdisplay < modes[best]->hdisplay || + modes[i]->vdisplay < modes[best]->vdisplay) + best = i; + } + } + } + if (best == -1) + { + FIXME("all modes too small\n"); + /* ok, let's use the largest */ + + for (i=0; i < nmodes; i++) + { + if (best == -1) best = i; + else + { + if (modes[i]->hdisplay > modes[best]->hdisplay || + modes[i]->vdisplay > modes[best]->vdisplay) + best = i; + } + } + } + FIXME("Best: %i\n",best); + FIXME("Width: %i\n",modes[best]->hdisplay); + FIXME("Height: %i\n",modes[best]->vdisplay); + TSXF86VidModeSwitchToMode(thread_display(), DefaultScreen(thread_display()), modes[best]); + } + TSXWarpPointer(gdi_display, None, window, 0, 0, 0, 0, 0, 0); +#endif + + FIXME("After grab\n"); + } + } } Index: dlls/x11drv/x11drv.spec =================================================================== RCS file: /home/wine/wine/dlls/x11drv/x11drv.spec,v retrieving revision 1.38 diff -u -b -B -r1.38 x11drv.spec --- dlls/x11drv/x11drv.spec 21 Jun 2002 19:15:51 -0000 1.38 +++ dlls/x11drv/x11drv.spec 10 Aug 2002 13:34:28 -0000 @@ -98,3 +98,4 @@ @ cdecl RegisterClipboardFormat(str) X11DRV_RegisterClipboardFormat @ cdecl IsSelectionOwner() X11DRV_IsSelectionOwner @ cdecl ResetSelectionOwner(ptr long) X11DRV_ResetSelectionOwner +@ cdecl ChangeDisplaySettings(ptr ptr long long long) X11DRV_ChangeDisplaySettings \ No newline at end of file Index: include/user.h =================================================================== RCS file: /home/wine/wine/include/user.h,v retrieving revision 1.39 diff -u -b -B -r1.39 user.h --- include/user.h 23 May 2002 02:53:10 -0000 1.39 +++ include/user.h 10 Aug 2002 13:34:29 -0000 @@ -107,6 +107,8 @@ BOOL (*pSetWindowText)(HWND,LPCWSTR); BOOL (*pShowWindow)(HWND,INT); void (*pSysCommandSizeMove)(HWND,WPARAM); + /* display functions */ + void (*pChangeDisplaySettings)(LPCSTR devname, LPDEVMODEA devmode, HWND hwnd, DWORD flags, LPARAM lparam); } USER_DRIVER; extern USER_DRIVER USER_Driver; Index: windows/user.c =================================================================== RCS file: /home/wine/wine/windows/user.c,v retrieving revision 1.86 diff -u -b -B -r1.86 user.c --- windows/user.c 31 May 2002 23:06:54 -0000 1.86 +++ windows/user.c 10 Aug 2002 13:34:32 -0000 @@ -274,27 +274,8 @@ */ LONG WINAPI ChangeDisplaySettingsA( LPDEVMODEA devmode, DWORD flags ) { - FIXME_(system)("(%p,0x%08lx), stub\n",devmode,flags); - MESSAGE("\tflags=");_dump_CDS_flags(flags);MESSAGE("\n"); - if (devmode==NULL) - FIXME_(system)(" devmode=NULL (return to default mode)\n"); - else if ( (devmode->dmBitsPerPel != GetSystemMetrics(SM_WINE_BPP)) - || (devmode->dmPelsHeight != GetSystemMetrics(SM_CYSCREEN)) - || (devmode->dmPelsWidth != GetSystemMetrics(SM_CXSCREEN)) ) - { - - if (devmode->dmFields & DM_BITSPERPEL) - FIXME_(system)(" bpp=%ld\n",devmode->dmBitsPerPel); - if (devmode->dmFields & DM_PELSWIDTH) - FIXME_(system)(" width=%ld\n",devmode->dmPelsWidth); - if (devmode->dmFields & DM_PELSHEIGHT) - FIXME_(system)(" height=%ld\n",devmode->dmPelsHeight); - FIXME_(system)(" (Putting X in this mode beforehand might help)\n"); - /* we don't, but the program ... does not need to know */ - return DISP_CHANGE_SUCCESSFUL; - } - return DISP_CHANGE_SUCCESSFUL; + return ChangeDisplaySettingsExA(NULL,devmode,0,flags,0); } /*********************************************************************** @@ -315,9 +296,9 @@ ) { FIXME_(system)("(%s,%p,0x%04x,0x%08lx,0x%08lx), stub\n",devname,devmode,hwnd,flags,lparam); MESSAGE("\tflags=");_dump_CDS_flags(flags);MESSAGE("\n"); - if (devmode==NULL) - FIXME_(system)(" devmode=NULL (return to default mode)\n"); - else if ( (devmode->dmBitsPerPel != GetSystemMetrics(SM_WINE_BPP)) + if (devmode==NULL){ + if(USER_Driver.pChangeDisplaySettings) USER_Driver.pChangeDisplaySettings(devname,devmode,hwnd,flags,lparam); + }else if ( (devmode->dmBitsPerPel != GetSystemMetrics(SM_WINE_BPP)) || (devmode->dmPelsHeight != GetSystemMetrics(SM_CYSCREEN)) || (devmode->dmPelsWidth != GetSystemMetrics(SM_CXSCREEN)) ) @@ -330,6 +311,9 @@ if (devmode->dmFields & DM_PELSHEIGHT) FIXME_(system)(" height=%ld\n",devmode->dmPelsHeight); FIXME_(system)(" (Putting X in this mode beforehand might help)\n"); + + + if(USER_Driver.pChangeDisplaySettings) USER_Driver.pChangeDisplaySettings(devname,devmode,hwnd,flags,lparam); /* we don't, but the program ... does not need to know */ return DISP_CHANGE_SUCCESSFUL; }