]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkgeometry-win32.c
Updated Norwegian bokmål translation.
[~andy/gtk] / gdk / win32 / gdkgeometry-win32.c
index ea36ac9a149f7a5e6cc42b969805167b361e8675..61dbf762876a52a32580e9d43492d40cc5a91692 100644 (file)
@@ -38,7 +38,7 @@
  * so that big window emulation finally works.
  */
 
-#include <config.h>
+#include "config.h"
 #include "gdk.h"               /* For gdk_rectangle_intersect */
 #include "gdkregion.h"
 #include "gdkregion-generic.h"
@@ -75,9 +75,9 @@ static void gdk_window_post_scroll        (GdkWindow          *window,
                                           GdkRegion          *new_clip_region);
 
 void
-_gdk_windowing_window_get_offsets (GdkWindow *window,
-                                  gint      *x_offset,
-                                  gint      *y_offset)
+_gdk_win32_windowing_window_get_offsets (GdkWindow *window,
+                                        gint      *x_offset,
+                                        gint      *y_offset)
 {
   GdkWindowImplWin32 *impl =
     GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
@@ -91,7 +91,7 @@ _gdk_window_init_position (GdkWindow *window)
 {
   GdkWindowParentPos parent_pos;
   GdkWindowImplWin32 *impl;
-  
+
   g_return_if_fail (GDK_IS_WINDOW (window));
   
   impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
@@ -101,51 +101,27 @@ _gdk_window_init_position (GdkWindow *window)
 }
 
 void
-gdk_window_scroll (GdkWindow *window,
-                  gint       dx,
-                  gint       dy)
+_gdk_win32_window_scroll (GdkWindow *window,
+                         gint       dx,
+                         gint       dy)
 {
   GdkRegion *invalidate_region;
   GdkWindowImplWin32 *impl;
   GdkWindowObject *obj;
-  GdkRectangle dest_rect;
   GList *tmp_list;
   GdkWindowParentPos parent_pos;
-  
-  g_return_if_fail (GDK_IS_WINDOW (window));
+  HRGN native_invalidate_region;
 
-  if (GDK_WINDOW_DESTROYED (window))
-    return;
-  
   GDK_NOTE (EVENTS, g_print ("gdk_window_scroll: %p %d,%d\n",
                             GDK_WINDOW_HWND (window), dx, dy));
 
   obj = GDK_WINDOW_OBJECT (window);
   impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);  
 
-  if (dx == 0 && dy == 0)
-    return;
-  
   /* Move the current invalid region */
   if (obj->update_area)
     gdk_region_offset (obj->update_area, dx, dy);
   
-  invalidate_region = gdk_region_rectangle (&impl->position_info.clip_rect);
-  
-  dest_rect = impl->position_info.clip_rect;
-  dest_rect.x += dx;
-  dest_rect.y += dy;
-  gdk_rectangle_intersect (&dest_rect, &impl->position_info.clip_rect, &dest_rect);
-
-  if (dest_rect.width > 0 && dest_rect.height > 0)
-    {
-      GdkRegion *tmp_region;
-
-      tmp_region = gdk_region_rectangle (&dest_rect);
-      gdk_region_subtract (invalidate_region, tmp_region);
-      gdk_region_destroy (tmp_region);
-    }
-  
   gdk_window_compute_parent_pos (impl, &parent_pos);
 
   parent_pos.x += obj->x;
@@ -156,10 +132,13 @@ gdk_window_scroll (GdkWindow *window,
 
   gdk_window_tmp_unset_bg (window);
 
-  if (!ScrollWindowEx (GDK_WINDOW_HWND (window),
-                      dx, dy, NULL, NULL,
-                      NULL, NULL, SW_SCROLLCHILDREN))
-    WIN32_API_FAILED ("ScrollWindowEx");
+  native_invalidate_region = CreateRectRgn (0, 0, 0, 0);
+  if (native_invalidate_region == NULL)
+    WIN32_API_FAILED ("CreateRectRgn");
+
+  API_CALL (ScrollWindowEx, (GDK_WINDOW_HWND (window),
+                            dx, dy, NULL, NULL,
+                            native_invalidate_region, NULL, SW_SCROLLCHILDREN));
 
   if (impl->position_info.no_bg)
     gdk_window_tmp_reset_bg (window);
@@ -167,12 +146,91 @@ gdk_window_scroll (GdkWindow *window,
   tmp_list = obj->children;
   while (tmp_list)
     {
+      GDK_WINDOW_OBJECT(tmp_list->data)->x += dx;
+      GDK_WINDOW_OBJECT(tmp_list->data)->y += dy;
       gdk_window_postmove (tmp_list->data, &parent_pos, FALSE);
       tmp_list = tmp_list->next;
     }
 
-  gdk_window_invalidate_region (window, invalidate_region, TRUE);
+  if (native_invalidate_region != NULL)
+    {
+      invalidate_region = _gdk_win32_hrgn_to_region (native_invalidate_region);
+      gdk_region_offset (invalidate_region, impl->position_info.x_offset,
+                         impl->position_info.y_offset);
+      gdk_window_invalidate_region (window, invalidate_region, TRUE);
+      gdk_region_destroy (invalidate_region);
+      GDI_CALL (DeleteObject, (native_invalidate_region));
+    }
+}
+
+void
+_gdk_win32_window_move_region (GdkWindow       *window,
+                              const GdkRegion *region,
+                              gint             dx,
+                              gint             dy)
+{
+  GdkRegion *invalidate_region;
+  GdkWindowImplWin32 *impl;
+  GdkWindowObject *obj;
+  GdkRectangle src_rect, dest_rect;
+  HRGN hrgn;
+  RECT clipRect, destRect;
+
+  obj = GDK_WINDOW_OBJECT (window);
+  impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);  
+
+  /* Move the current invalid region */
+  if (obj->update_area)
+    gdk_region_offset (obj->update_area, dx, dy);
+  
+  /* impl->position_info.clip_rect isn't meaningful for toplevels */
+  if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD)
+    src_rect = impl->position_info.clip_rect;
+  else
+    {
+      src_rect.x = 0;
+      src_rect.y = 0;
+      src_rect.width = impl->width;
+      src_rect.height = impl->height;
+    }
+  
+  invalidate_region = gdk_region_rectangle (&src_rect);
+
+  dest_rect = src_rect;
+  dest_rect.x += dx;
+  dest_rect.y += dy;
+  gdk_rectangle_intersect (&dest_rect, &src_rect, &dest_rect);
+
+  if (dest_rect.width > 0 && dest_rect.height > 0)
+    {
+      GdkRegion *tmp_region;
+
+      tmp_region = gdk_region_rectangle (&dest_rect);
+      gdk_region_subtract (invalidate_region, tmp_region);
+      gdk_region_destroy (tmp_region);
+    }
+  
+  /* no guffaw scroll on win32 */
+  hrgn = _gdk_win32_gdkregion_to_hrgn(invalidate_region, 0, 0);
   gdk_region_destroy (invalidate_region);
+  destRect.left = dest_rect.y;
+  destRect.top = dest_rect.x;
+  destRect.right = dest_rect.x + dest_rect.width;
+  destRect.bottom = dest_rect.y + dest_rect.height;
+  clipRect.left = src_rect.y;
+  clipRect.top = src_rect.x;
+  clipRect.right = src_rect.x + src_rect.width;
+  clipRect.bottom = src_rect.y + src_rect.height;
+
+  g_print ("ScrollWindowEx(%d, %d, ...) - if you see this work, remove trace;)\n", dx, dy);
+  API_CALL(ScrollWindowEx, (GDK_WINDOW_HWND (window),
+                       dx, dy, /* in: scroll offsets */
+                       NULL, /* in: scroll rect, NULL == entire client area */
+                       &clipRect, /* in: restrict to */
+                       hrgn, /* in: update region */
+                       NULL, /* out: update rect */
+                       SW_INVALIDATE));
+  API_CALL(DeleteObject, (hrgn));
 }
 
 void
@@ -199,24 +257,26 @@ _gdk_window_move_resize_child (GdkWindow *window,
   obj = GDK_WINDOW_OBJECT (window);
   impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
   
-  GDK_NOTE (MISC, g_print ("_gdk_window_move_resize_child: %s@+%d+%d %dx%d@+%d+%d\n",
+  GDK_NOTE (MISC, g_print ("_gdk_window_move_resize_child: %s@%+d%+d %dx%d@%+d%+d\n",
                           _gdk_win32_drawable_description (window),
                           obj->x, obj->y,
                           width, height, x, y));
 
   dx = x - obj->x;
   dy = y - obj->y;
-  
+
   is_move = dx != 0 || dy != 0;
   is_resize = impl->width != width || impl->height != height;
 
   if (!is_move && !is_resize)
     {
-      GDK_NOTE (MISC, g_print ("...neither move or resize\n"));
+      GDK_NOTE (MISC, g_print ("... neither move or resize\n"));
       return;
     }
   
-  GDK_NOTE (MISC, g_print ("...%s%s\n", is_move ? "is_move " : "", is_resize ? "is_resize" : ""));
+  GDK_NOTE (MISC, g_print ("... %s%s\n",
+                          is_move ? "is_move " : "",
+                          is_resize ? "is_resize" : ""));
 
   obj->x = x;
   obj->y = y;
@@ -240,7 +300,7 @@ _gdk_window_move_resize_child (GdkWindow *window,
   
   if (d_xoffset != 0 || d_yoffset != 0)
     {
-      GDK_NOTE (MISC, g_print ("...d_xoffset=%d d_yoffset=%d\n", d_xoffset, d_yoffset));
+      GDK_NOTE (MISC, g_print ("... d_offset=%+d%+d\n", d_xoffset, d_yoffset));
 
       if (!ScrollWindowEx (GDK_WINDOW_HWND (window),
                           -d_xoffset, -d_yoffset, /* in: scroll offsets */
@@ -253,17 +313,20 @@ _gdk_window_move_resize_child (GdkWindow *window,
 
       if (dx != d_xoffset || dy != d_yoffset || is_resize)
        {
-         GDK_NOTE (MISC, g_print ("...SetWindowPos(%p,%dx%d@+%d+%d)\n",
+         GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,%d,%d,"
+                                  "NOACTIVATE|NOZORDER%s%s)\n",
                                   GDK_WINDOW_HWND (window),
+                                  new_info.x, new_info.y, 
                                   new_info.width, new_info.height,
-                                  new_info.x, new_info.y));
-         if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
-                            new_info.x, new_info.y, 
-                            new_info.width, new_info.height,
-                            SWP_NOACTIVATE | SWP_NOZORDER | 
-                            (is_move ? 0 : SWP_NOMOVE) |
-                            (is_resize ? 0 : SWP_NOSIZE)))
-           WIN32_API_FAILED ("SetWindowPos");
+                                  (is_move ? "" : "|NOMOVE"),
+                                  (is_resize ? "" : "|NOSIZE")));
+
+         API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
+                                  new_info.x, new_info.y, 
+                                  new_info.width, new_info.height,
+                                  SWP_NOACTIVATE | SWP_NOZORDER | 
+                                  (is_move ? 0 : SWP_NOMOVE) |
+                                  (is_resize ? 0 : SWP_NOSIZE)));
        }
 
       if (impl->position_info.no_bg)
@@ -271,7 +334,7 @@ _gdk_window_move_resize_child (GdkWindow *window,
 
       if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))
        {
-         GDK_NOTE (MISC, g_print ("...ShowWindow(%p, SW_SHOWNA)\n",
+         GDK_NOTE (MISC, g_print ("... ShowWindow(%p, SW_SHOWNA)\n",
                                   GDK_WINDOW_HWND (window)));
          ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNA);
        }
@@ -289,22 +352,25 @@ _gdk_window_move_resize_child (GdkWindow *window,
     {
       if (impl->position_info.mapped && !new_info.mapped)
        {
-         GDK_NOTE (MISC, g_print ("...ShowWindow(%p, SW_HIDE)\n",
+         GDK_NOTE (MISC, g_print ("... ShowWindow(%p, SW_HIDE)\n",
                                   GDK_WINDOW_HWND (window)));
          ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
        }
       
-      GDK_NOTE (MISC, g_print ("...SetWindowPos(%p,%dx%d@+%d+%d)\n",
+      GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,%d,%d,"
+                              "NOACTIVATE|NOZORDER%s%s)\n",
                               GDK_WINDOW_HWND (window),
+                              new_info.x, new_info.y, 
                               new_info.width, new_info.height,
-                              new_info.x, new_info.y));
-      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
-                         new_info.x, new_info.y, 
-                         new_info.width, new_info.height,
-                         SWP_NOACTIVATE | SWP_NOZORDER | 
-                         (is_move ? 0 : SWP_NOMOVE) |
-                         (is_resize ? 0 : SWP_NOSIZE)))
-        WIN32_API_FAILED ("SetWindowPos");
+                              (is_move ? "" : "|NOMOVE"),
+                              (is_resize ? "" : "|NOSIZE")));
+
+      API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
+                              new_info.x, new_info.y, 
+                              new_info.width, new_info.height,
+                              SWP_NOACTIVATE | SWP_NOZORDER | 
+                              (is_move ? 0 : SWP_NOMOVE) |
+                              (is_resize ? 0 : SWP_NOSIZE)));
 
       tmp_list = obj->children;
       while (tmp_list)
@@ -318,7 +384,7 @@ _gdk_window_move_resize_child (GdkWindow *window,
 
       if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))
        {
-         GDK_NOTE (MISC, g_print ("...ShowWindow(%p, SW_SHOWNA)\n",
+         GDK_NOTE (MISC, g_print ("... ShowWindow(%p, SW_SHOWNA)\n",
                                   GDK_WINDOW_HWND (window)));
          ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNA);
        }
@@ -522,18 +588,18 @@ gdk_window_postmove (GdkWindow          *window,
   
   if (anti_scroll || (anti_scroll = d_xoffset != 0 || d_yoffset != 0))
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_postmove: %s@+%d+%d\n"
-                              "...SetWindowPos(%dx%d@+%d+%d)\n",
+      GDK_NOTE (MISC, g_print ("gdk_window_postmove: %s@%+d%+d\n"
+                              "... SetWindowPos(%p,NULL,%d,%d,0,0,"
+                              "NOREDRAW|NOZORDER|NOACTIVATE|NOSIZE)\n",
                               _gdk_win32_drawable_description (window),
                               obj->x, obj->y,
-                              new_info.width, new_info.height,
+                              GDK_WINDOW_HWND (window),
                               new_info.x, new_info.y));
 
-      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
-                         new_info.x, new_info.y, 
-                         0, 0,
-                         SWP_NOREDRAW | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE))
-        WIN32_API_FAILED ("SetWindowPos");
+      API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
+                              new_info.x, new_info.y, 
+                              0, 0,
+                              SWP_NOREDRAW | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE));
     }
 
   if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))