]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkwindow-win32.c
gtk/gtkmain.c Use the new
[~andy/gtk] / gdk / win32 / gdkwindow-win32.c
index 629c73092b2b58b62f431b112031f026610ff3ce..6a7fc6abec1b30dc751d487611b7ca111cd42cd8 100644 (file)
@@ -44,6 +44,7 @@ static void         gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
 static void         gdk_window_impl_win32_get_size     (GdkDrawable *drawable,
                                                        gint *width,
                                                        gint *height);
+static GdkRegion*  gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
 static void gdk_window_impl_win32_init       (GdkWindowImplWin32      *window);
 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
 static void gdk_window_impl_win32_finalize   (GObject                 *object);
@@ -112,6 +113,10 @@ gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
   drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
   drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
   drawable_class->get_size = gdk_window_impl_win32_get_size;
+
+  /* Visible and clip regions are the same */
+  drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
+  drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
 }
 
 static void
@@ -158,6 +163,7 @@ gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
       drawable_impl->colormap == NULL)
     {
       drawable_impl->colormap = gdk_colormap_get_system ();
+      gdk_colormap_ref (drawable_impl->colormap);
     }
   
   return drawable_impl->colormap;
@@ -195,6 +201,22 @@ gdk_window_impl_win32_get_size (GdkDrawable *drawable,
     *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
 }
 
+static GdkRegion*
+gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
+{
+  GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
+  GdkRectangle result_rect;
+
+  result_rect.x = 0;
+  result_rect.y = 0;
+  result_rect.width = impl->width;
+  result_rect.height = impl->height;
+
+  gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
+
+  return gdk_region_rectangle (&result_rect);
+}
+
 void
 _gdk_windowing_window_init (void)
 {
@@ -394,9 +416,6 @@ gdk_window_new (GdkWindow     *parent,
   int width, height;
   int x, y;
   char *title;
-  gint titlelen;
-  wchar_t *wctitle;
-  gint wlen;
   char *mbtitle;
 
   g_return_val_if_fail (attributes != NULL, NULL);
@@ -406,6 +425,14 @@ gdk_window_new (GdkWindow     *parent,
 
   g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
   
+  GDK_NOTE (MISC,
+           g_print ("gdk_window_new: %s\n",
+                    (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
+                     (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
+                      (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
+                       (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
+                        "???"))))));
+
   parent_private = (GdkWindowObject*) parent;
   if (GDK_WINDOW_DESTROYED (parent))
     return NULL;
@@ -453,7 +480,7 @@ gdk_window_new (GdkWindow     *parent,
     title = attributes->title;
   else
     title = g_get_prgname ();
-  if (!title)
+  if (!title || !*title)
     title = "GDK client window";
 
   impl->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
@@ -479,14 +506,16 @@ gdk_window_new (GdkWindow     *parent,
        {
          if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
             {
-              draw_impl->colormap =
-                gdk_colormap_get_system ();
+              draw_impl->colormap = gdk_colormap_get_system ();
               gdk_colormap_ref (draw_impl->colormap);
+             GDK_NOTE (MISC, g_print ("...using system colormap %p\n",
+                                      draw_impl->colormap));
             }
          else
             {
-              draw_impl->colormap =
-                gdk_colormap_new (visual, FALSE);
+              draw_impl->colormap = gdk_colormap_new (visual, FALSE);
+             GDK_NOTE (MISC, g_print ("...using new colormap %p\n",
+                                      draw_impl->colormap));
             }
        }
     }
@@ -496,6 +525,7 @@ gdk_window_new (GdkWindow     *parent,
       private->depth = 0;
       private->input_only = TRUE;
       draw_impl->colormap = NULL;
+      GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, NULL colormap\n"));
     }
 
   if (parent_private)
@@ -564,13 +594,7 @@ gdk_window_new (GdkWindow     *parent,
       height = impl->height;
     }
 
-  titlelen = strlen (title);
-  wctitle = g_new (wchar_t, titlelen + 1);
-  mbtitle = g_new (char, 3*titlelen + 1);
-  wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
-  wctitle[wlen] = 0;
-  WideCharToMultiByte (GetACP (), 0, wctitle, -1,
-                      mbtitle, 3*titlelen, NULL, NULL);
+  mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
   
 #ifdef WITHOUT_WM_CREATE
   draw_impl->handle = CreateWindowEx (dwExStyle,
@@ -623,13 +647,8 @@ gdk_window_new (GdkWindow     *parent,
 #endif
 
   GDK_NOTE (MISC,
-           g_print ("gdk_window_new: %s %s %dx%d@+%d+%d %#x = %#x\n"
-                    "...locale %#x codepage %d\n",
-                    (private->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
-                     (private->window_type == GDK_WINDOW_CHILD ? "CHILD" :
-                      (private->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
-                       (private->window_type == GDK_WINDOW_TEMP ? "TEMP" :
-                        "???")))),
+           g_print ("... \"%s\" %dx%d@+%d+%d %#x = %#x\n"
+                    "... locale %#x codepage %d\n",
                     mbtitle,
                     width, height, (x == CW_USEDEFAULT ? -9999 : x), y, 
                     (guint) hparent,
@@ -638,7 +657,6 @@ gdk_window_new (GdkWindow     *parent,
                     (guint) impl->charset_info.ciACP));
 
   g_free (mbtitle);
-  g_free (wctitle);
 
   if (draw_impl->handle == NULL)
     {
@@ -798,13 +816,24 @@ gdk_window_show (GdkWindow *window)
        }
       else
        {
-         ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
-         ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
-         SetForegroundWindow (GDK_WINDOW_HWND (window));
-         BringWindowToTop (GDK_WINDOW_HWND (window));
+          if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
+           {
+             SetWindowPos(GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0,
+                          SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE);
+           }
+          else
+            {
+             GdkWindow *parent = private->parent;
+
+             ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
+             ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
+              if (parent == gdk_parent_root)
+                SetForegroundWindow (GDK_WINDOW_HWND (window));
+             BringWindowToTop (GDK_WINDOW_HWND (window));
 #if 0
-         ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
+             ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
 #endif
+           }
        }
     }
 }
@@ -826,7 +855,15 @@ gdk_window_hide (GdkWindow *window)
       if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
        ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
 
-      ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
+      if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
+       {
+         SetWindowPos(GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
+                      SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
+       }
+      else
+       {
+         ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
+       }
     }
 }
 
@@ -1377,10 +1414,7 @@ void
 gdk_window_set_title (GdkWindow   *window,
                      const gchar *title)
 {
-  gint titlelen;
-  wchar_t *wcstr;
-  gint wlen;
-  char *mbstr;
+  char *mbtitle;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -1398,19 +1432,11 @@ gdk_window_set_title (GdkWindow   *window,
       /* As the title is in UTF-8 we must translate it
        * to the system codepage.
        */
-      titlelen = strlen (title);
-      wcstr = g_new (wchar_t, titlelen + 1);
-      mbstr = g_new (char, 3*titlelen + 1);
-      wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
-      wcstr[wlen] = 0;
-      WideCharToMultiByte (GetACP (), 0, wcstr, -1,
-                          mbstr, 3*titlelen, NULL, NULL);
-
-      if (!SetWindowText (GDK_WINDOW_HWND (window), mbstr))
+      mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
+      if (!SetWindowText (GDK_WINDOW_HWND (window), mbtitle))
        WIN32_API_FAILED ("SetWindowText");
 
-      g_free (mbstr);
-      g_free (wcstr);
+      g_free (mbtitle);
     }
 }