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


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to