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;
   }

Reply via email to