[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23372] trunk/blender/source/blender/ windowmanager/intern/wm_window.c: Ghost/Compiz bug:

Martin Poirier theeth at yahoo.com
Sun Sep 20 19:24:56 CEST 2009


Revision: 23372
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23372
Author:   theeth
Date:     2009-09-20 19:24:56 +0200 (Sun, 20 Sep 2009)

Log Message:
-----------
Ghost/Compiz bug:

Sometimes, events for window size or move are sent even when the window hasn't changed. This triggers unneeded refreshes.

As a precaution, we now ignore all such events (eventually, it should be done in Ghost X11, but I don't know that code well enough).

Modified Paths:
--------------
    trunk/blender/source/blender/windowmanager/intern/wm_window.c

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c	2009-09-20 17:23:57 UTC (rev 23371)
+++ trunk/blender/source/blender/windowmanager/intern/wm_window.c	2009-09-20 17:24:56 UTC (rev 23372)
@@ -627,6 +627,7 @@
 				if(state!=GHOST_kWindowStateMinimized) {
 					GHOST_RectangleHandle client_rect;
 					int l, t, r, b, scr_w, scr_h;
+					int sizex, sizey, posx, posy;
 					
 					client_rect= GHOST_GetClientBounds(win->ghostwin);
 					GHOST_GetRectangle(client_rect, &l, &t, &r, &b);
@@ -634,37 +635,56 @@
 					GHOST_DisposeRectangle(client_rect);
 					
 					wm_get_screensize(&scr_w, &scr_h);
-					win->sizex= r-l;
-					win->sizey= b-t;
-					win->posx= l;
-					win->posy= scr_h - t - win->sizey;
+					sizex= r-l;
+					sizey= b-t;
+					posx= l;
+					posy= scr_h - t - win->sizey;
 
-					/* debug prints */
-					if(0) {
-						state = GHOST_GetWindowState(win->ghostwin);
-
-						if(state==GHOST_kWindowStateNormal) {
-							if(G.f & G_DEBUG) printf("window state: normal\n");
+					/*
+					 * Ghost sometimes send size or move events when the window hasn't changed.
+					 * One case of this is using compiz on linux. To alleviate the problem
+					 * we ignore all such event here.
+					 * 
+					 * It might be good to eventually do that at Ghost level, but that is for 
+					 * another time.
+					 */
+					if (win->sizex != sizex ||
+							win->sizey != sizey ||
+							win->posx != posx ||
+							win->posy != posy)
+					{
+						win->sizex= sizex;
+						win->sizey= sizey;
+						win->posx= posx;
+						win->posy= posy;
+	
+						/* debug prints */
+						if(0) {
+							state = GHOST_GetWindowState(win->ghostwin);
+	
+							if(state==GHOST_kWindowStateNormal) {
+								if(G.f & G_DEBUG) printf("window state: normal\n");
+							}
+							else if(state==GHOST_kWindowStateMinimized) {
+								if(G.f & G_DEBUG) printf("window state: minimized\n");
+							}
+							else if(state==GHOST_kWindowStateMaximized) {
+								if(G.f & G_DEBUG) printf("window state: maximized\n");
+							}
+							else if(state==GHOST_kWindowStateFullScreen) {
+								if(G.f & G_DEBUG) printf("window state: fullscreen\n");
+							}
+							
+							if(type!=GHOST_kEventWindowSize) {
+								if(G.f & G_DEBUG) printf("win move event pos %d %d size %d %d\n", win->posx, win->posy, win->sizex, win->sizey);
+							}
+							
 						}
-						else if(state==GHOST_kWindowStateMinimized) {
-							if(G.f & G_DEBUG) printf("window state: minimized\n");
-						}
-						else if(state==GHOST_kWindowStateMaximized) {
-							if(G.f & G_DEBUG) printf("window state: maximized\n");
-						}
-						else if(state==GHOST_kWindowStateFullScreen) {
-							if(G.f & G_DEBUG) printf("window state: fullscreen\n");
-						}
-						
-						if(type!=GHOST_kEventWindowSize) {
-							if(G.f & G_DEBUG) printf("win move event pos %d %d size %d %d\n", win->posx, win->posy, win->sizex, win->sizey);
-						}
-						
+					
+						wm_window_make_drawable(C, win);
+						wm_draw_window_clear(win);
+						WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
 					}
-				
-					wm_window_make_drawable(C, win);
-					wm_draw_window_clear(win);
-					WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
 				}
 				break;
 			}





More information about the Bf-blender-cvs mailing list