diff --git a/demos/gtk-demo/makefile.msc.in b/demos/gtk-demo/makefile.msc.in index a468f96718..eb4065d27a 100644 --- a/demos/gtk-demo/makefile.msc.in +++ b/demos/gtk-demo/makefile.msc.in @@ -39,19 +39,23 @@ DEMOS = \ appwindow.c \ button_box.c \ colorsel.c \ - dialog.c \ + dialog.c \ drawingarea.c \ - editable_cells.c \ - images.c \ - item_factory.c \ + editable_cells.c \ + entry_completion.c \ + expander.c \ + hypertext.c \ + images.c \ list_store.c \ menus.c \ panes.c \ - pixbufs.c \ + pixbufs.c \ sizegroup.c \ stock_browser.c \ textview.c \ tree_store.c \ + ui_manager.c \ + demos.h: $(DEMOS) geninclude.pl $(PERL) geninclude.pl $(DEMOS) > demos.h @@ -59,12 +63,15 @@ demos.h: $(DEMOS) geninclude.pl OBJECTS = \ appwindow.obj \ button_box.obj \ + changedisplay.obj \ colorsel.obj \ dialog.obj \ drawingarea.obj \ - editable_cells.obj \ + editable_cells.obj \ + entry_completion.obj \ + expander.obj \ + hypertext.obj \ images.obj \ - item_factory.obj \ list_store.obj \ menus.obj \ panes.obj \ @@ -73,6 +80,7 @@ OBJECTS = \ stock_browser.obj \ textview.obj \ tree_store.obj \ + ui_manager.obj \ main.obj \ gtk-demo.exe : demos.h $(OBJECTS) diff --git a/gdk/gdk.def b/gdk/gdk.def index 9c6069f57d..a459533c63 100644 --- a/gdk/gdk.def +++ b/gdk/gdk.def @@ -531,6 +531,7 @@ EXPORTS gdk_window_set_debug_updates gdk_window_set_decorations gdk_window_set_events + gdk_window_set_focus_on_map gdk_window_set_functions gdk_window_set_geometry_hints gdk_window_set_group diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 79813cd67c..cd585b1aec 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -1,6 +1,7 @@ /* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * Copyright (C) 1998-2002 Tor Lillqvist + * Copyright (C) 1998-2004 Tor Lillqvist + * Copyright (C) 2001-2004 Hans Breuer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -953,7 +954,8 @@ show_window_internal (GdkWindow *window, { GdkWindowObject *private; HWND old_active_window; - + gboolean focus_on_map = TRUE; + private = (GdkWindowObject *) window; if (private->destroyed) @@ -996,9 +998,12 @@ show_window_internal (GdkWindow *window, /* Other cases */ if (!GDK_WINDOW_IS_MAPPED (window)) - gdk_synthesize_window_state (window, - GDK_WINDOW_STATE_WITHDRAWN, - 0); + { + gdk_synthesize_window_state (window, + GDK_WINDOW_STATE_WITHDRAWN, + 0); + focus_on_map = private->focus_on_map; + } /* Use SetWindowPos to show transparent windows so automatic redraws * in other windows can be suppressed. @@ -1008,7 +1013,7 @@ show_window_internal (GdkWindow *window, UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE; if (!raise) flags |= SWP_NOZORDER; - if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP) + if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map) flags |= SWP_NOACTIVATE; SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0, flags); @@ -1036,7 +1041,7 @@ show_window_internal (GdkWindow *window, ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE); else if (private->state & GDK_WINDOW_STATE_ICONIFIED) ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE); - else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP) + else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map) ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE); else ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL); diff --git a/gtk/gtk.def b/gtk/gtk.def index 8ad7a45962..d220fd8efe 100755 --- a/gtk/gtk.def +++ b/gtk/gtk.def @@ -77,6 +77,7 @@ EXPORTS gtk_action_group_set_translate_func gtk_action_group_set_translation_domain gtk_action_group_set_visible + gtk_action_group_translate_string gtk_action_is_sensitive gtk_action_is_visible gtk_action_new @@ -388,8 +389,11 @@ EXPORTS gtk_combo_box_entry_set_text_column gtk_combo_box_get_active gtk_combo_box_get_active_iter + gtk_combo_box_get_column_span_column gtk_combo_box_get_model + gtk_combo_box_get_row_span_column gtk_combo_box_get_type + gtk_combo_box_get_wrap_width gtk_combo_box_insert_text gtk_combo_box_new gtk_combo_box_new_text @@ -2611,6 +2615,7 @@ EXPORTS gtk_window_get_default_size gtk_window_get_destroy_with_parent gtk_window_get_focus + gtk_window_get_focus_on_map gtk_window_get_frame_dimensions gtk_window_get_gravity gtk_window_get_has_frame @@ -2660,6 +2665,7 @@ EXPORTS gtk_window_set_default_size gtk_window_set_destroy_with_parent gtk_window_set_focus + gtk_window_set_focus_on_map gtk_window_set_frame_dimensions gtk_window_set_geometry_hints gtk_window_set_gravity diff --git a/gtk/gtkactiongroup.c b/gtk/gtkactiongroup.c index 1072db14b4..8af5aaead0 100644 --- a/gtk/gtkactiongroup.c +++ b/gtk/gtkactiongroup.c @@ -1067,7 +1067,7 @@ gtk_action_group_translate_string (GtkActionGroup *action_group, GtkTranslateFunc translate_func; gpointer translate_data; - g_return_if_fail (GTK_IS_ACTION_GROUP (action_group)); + g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), string); translate_func = action_group->private_data->translate_func; translate_data = action_group->private_data->translate_data; diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 35549aeea1..5e02eb2df0 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -3468,8 +3468,8 @@ gtk_combo_box_get_active_text (GtkComboBox *combo_box) GtkTreeIter iter; gchar *text = NULL; - g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); - g_return_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model)); + g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), NULL); + g_return_val_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model), NULL); if (gtk_combo_box_get_active_iter (combo_box, &iter)) gtk_tree_model_get (combo_box->priv->model, &iter, diff --git a/gtk/gtkfilesystemwin32.c b/gtk/gtkfilesystemwin32.c index 3d2c5aec16..1ecc940478 100644 --- a/gtk/gtkfilesystemwin32.c +++ b/gtk/gtkfilesystemwin32.c @@ -1,6 +1,7 @@ /* GTK - The GIMP Toolkit * gtkfilesystemwin32.c: Default implementation of GtkFileSystem for Windows * Copyright (C) 2003, Red Hat, Inc. + * Copyright (C) 2004, Hans Breuer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -933,53 +934,91 @@ extract_icon (const char* filename) GdkPixbuf *pixbuf = NULL; WORD iicon; HICON hicon; + char filename_copy[MAX_PATH]; if (!filename || !filename[0]) return NULL; - hicon = ExtractAssociatedIcon (GetModuleHandle (NULL), filename, &iicon); + /* the ugly ExtractAssociatedIcon modifies filename in place - at least on win98 */ + strcpy(filename_copy, filename); + hicon = ExtractAssociatedIcon (GetModuleHandle (NULL), filename_copy, &iicon); if (hicon > (HICON)1) { ICONINFO ii; if (GetIconInfo (hicon, &ii)) { - SIZE size; - GdkPixmap *pixmap; - GdkGC *gc; - HDC hdc; + struct + { + BITMAPINFOHEADER bi; + RGBQUAD colors[2]; + } bmi; + HDC hdc; - if (!GetBitmapDimensionEx (ii.hbmColor, &size)) - g_warning ("GetBitmapDimensionEx failed."); + memset (&bmi, 0, sizeof (bmi)); + bmi.bi.biSize = sizeof (bmi.bi); + hdc = CreateCompatibleDC (NULL); - if (size.cx < 1) size.cx = 32; - if (size.cy < 1) size.cy = 32; - - pixmap = gdk_pixmap_new (NULL, size.cx, size.cy, - gdk_screen_get_system_visual (gdk_screen_get_default ())->depth); - gc = gdk_gc_new (pixmap); - hdc = gdk_win32_hdc_get (GDK_DRAWABLE (pixmap), gc, 0); + if (GetDIBits (hdc, ii.hbmColor, 0, 1, NULL, (BITMAPINFO *)&bmi, DIB_RGB_COLORS)) + { + gchar *pixels, *bits; + gint rowstride, x, y, w = bmi.bi.biWidth, h = bmi.bi.biHeight; - if (!DrawIcon (hdc, 0, 0, hicon)) - g_warning ("DrawIcon failed"); + bmi.bi.biBitCount = 24; + bmi.bi.biCompression = BI_RGB; + bmi.bi.biHeight = -h; + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, w, h); + bits = g_malloc (4 * w * h); - gdk_win32_hdc_release (GDK_DRAWABLE (pixmap), gc, 0); + /* color data */ + if (!GetDIBits (hdc, ii.hbmColor, 0, h, bits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS)) + g_warning(G_STRLOC ": Failed to get dibits"); - pixbuf = gdk_pixbuf_get_from_drawable ( - NULL, pixmap, - gdk_screen_get_system_colormap (gdk_screen_get_default ()), - 0, 0, 0, 0, size.cx, size.cy); - g_object_unref (pixmap); - g_object_unref (gc); + pixels = gdk_pixbuf_get_pixels (pixbuf); + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + pixels[2] = bits[(x+y*w) * 3]; + pixels[1] = bits[(x+y*w) * 3 + 1]; + pixels[0] = bits[(x+y*w) * 3 + 2]; + pixels += 4; + } + pixels += (w * 4 - rowstride); + } + /* transparency */ + if (!GetDIBits (hdc, ii.hbmMask, 0, h, bits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS)) + g_warning(G_STRLOC ": Failed to get dibits"); + pixels = gdk_pixbuf_get_pixels (pixbuf); + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + pixels[3] = 255 - bits[(x + y * w) * 3]; + pixels += 4; + } + pixels += (w * 4 - rowstride); + } + + /* release temporary resources */ + g_free (bits); + if (!DeleteObject (ii.hbmColor) || !DeleteObject (ii.hbmMask)) + g_warning(G_STRLOC ": Leaking Icon Bitmaps ?"); + } + else + g_warning(G_STRLOC ": GetDIBits () failed, %s", g_win32_error_message (GetLastError ())); + + DeleteDC (hdc); } else - g_print ("GetIconInfo failed: %s\n", g_win32_error_message (GetLastError ())); + g_warning(G_STRLOC ": GetIconInfo failed: %s\n", g_win32_error_message (GetLastError ())); if (!DestroyIcon (hicon)) - g_warning ("DestroyIcon failed"); + g_warning(G_STRLOC ": DestroyIcon failed"); } else - g_print ("ExtractAssociatedIcon failed: %s\n", g_win32_error_message (GetLastError ())); + g_print ("ExtractAssociatedIcon(%s) failed: %s\n", filename, g_win32_error_message (GetLastError ())); return pixbuf; } @@ -1048,7 +1087,7 @@ gtk_file_system_win32_render_icon (GtkFileSystem *file_system, case DRIVE_CDROM : icon_set = gtk_style_lookup_icon_set (widget->style, GTK_STOCK_CDROM); break; - case DRIVE_FIXED : /* need a hard disk icon */ + case DRIVE_FIXED : icon_set = gtk_style_lookup_icon_set (widget->style, GTK_STOCK_HARDDISK); break; default : diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index 66145faee7..9aeb6f740b 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -1124,9 +1124,11 @@ _gtk_selection_request (GtkWidget *widget, if (initialize) gtk_selection_init (); +#if defined DEBUG_SELECTION && !defined GDK_WINDOWING_X11 g_message ("max request sizes %ld %ld\n", XMaxRequestSize(GDK_DISPLAY_XDISPLAY(display)), XExtendedMaxRequestSize(GDK_DISPLAY_XDISPLAY(display))); +#endif selection_max_size = GTK_SELECTION_MAX_SIZE (display); /* Check if we own selection */