Bug 520286 - Non-deletable window has no minimize / maximize buttons
2008-03-10 Tor Lillqvist <tml@novell.com> Bug 520286 - Non-deletable window has no minimize / maximize buttons * gdk/win32/gdkmain-win32.c (_gdk_win32_window_style_to_string): New debugging output function that decodes a set of WS_* bits. * gdk/win32/gdkprivate-win32.h: Declare it. * gdk/win32/gdkwindow-win32.c (update_single_system_menu_entry): New function that enables or disables one menu entry in the system menu of a top-level window. (The corresponding decoration will then also be enabled or disabled (grayed).) (update_style_bits): Do as the comment says and don't try to update the window style based on the GdkWMFunctions set for the window. (update_system_menu): New function that enables or disables the system menu entries based on a window's stored set of GdkWMFunctions. (gdk_window_set_functions): Call update_system_menu() instead of update_style_bits(). svn path=/trunk/; revision=19743
This commit is contained in:
committed by
Tor Lillqvist
parent
a0d427dd99
commit
0f7099e308
25
ChangeLog
25
ChangeLog
@ -1,3 +1,28 @@
|
||||
2008-03-10 Tor Lillqvist <tml@novell.com>
|
||||
|
||||
Bug 520286 - Non-deletable window has no minimize / maximize buttons
|
||||
|
||||
* gdk/win32/gdkmain-win32.c (_gdk_win32_window_style_to_string):
|
||||
New debugging output function that decodes a set of WS_* bits.
|
||||
|
||||
* gdk/win32/gdkprivate-win32.h: Declare it.
|
||||
|
||||
* gdk/win32/gdkwindow-win32.c (update_single_system_menu_entry):
|
||||
New function that enables or disables one menu entry in the system
|
||||
menu of a top-level window. (The corresponding decoration will
|
||||
then also be enabled or disabled (grayed).)
|
||||
|
||||
(update_style_bits): Do as the comment says and don't try to
|
||||
update the window style based on the GdkWMFunctions set for the
|
||||
window.
|
||||
|
||||
(update_system_menu): New function that enables or disables the
|
||||
system menu entries based on a window's stored set of
|
||||
GdkWMFunctions.
|
||||
|
||||
(gdk_window_set_functions): Call update_system_menu() instead of
|
||||
update_style_bits().
|
||||
|
||||
2008-03-10 Emmanuele Bassi <ebassi@gnome.org>
|
||||
|
||||
* README.in: Reword the 2.14 release notes entry about the
|
||||
|
||||
@ -543,6 +543,48 @@ _gdk_win32_window_state_to_string (GdkWindowState state)
|
||||
return static_printf ("%s", buf);
|
||||
}
|
||||
|
||||
gchar *
|
||||
_gdk_win32_window_style_to_string (LONG style)
|
||||
{
|
||||
gchar buf[1000];
|
||||
gchar *bufp = buf;
|
||||
gchar *s = "";
|
||||
|
||||
buf[0] = '\0';
|
||||
|
||||
#define BIT(x) \
|
||||
if (style & WS_ ## x) \
|
||||
(bufp += sprintf (bufp, "%s" #x, s), s = "|")
|
||||
|
||||
/* Note that many of the WS_* macros are in face several bits.
|
||||
* Handle just the individual bits here. Sort as in w32api's
|
||||
* winuser.h.
|
||||
*/
|
||||
BIT (BORDER);
|
||||
BIT (CHILD);
|
||||
BIT (CLIPCHILDREN);
|
||||
BIT (CLIPSIBLINGS);
|
||||
BIT (DISABLED);
|
||||
BIT (DLGFRAME);
|
||||
BIT (GROUP);
|
||||
BIT (HSCROLL);
|
||||
BIT (ICONIC);
|
||||
BIT (MAXIMIZE);
|
||||
BIT (MAXIMIZEBOX);
|
||||
BIT (MINIMIZE);
|
||||
BIT (MINIMIZEBOX);
|
||||
BIT (POPUP);
|
||||
BIT (SIZEBOX);
|
||||
BIT (SYSMENU);
|
||||
BIT (TABSTOP);
|
||||
BIT (THICKFRAME);
|
||||
BIT (VISIBLE);
|
||||
BIT (VSCROLL);
|
||||
#undef BIT
|
||||
|
||||
return static_printf ("%s", buf);
|
||||
}
|
||||
|
||||
gchar *
|
||||
_gdk_win32_rop2_to_string (int rop2)
|
||||
{
|
||||
|
||||
@ -296,6 +296,7 @@ gchar *_gdk_win32_join_style_to_string (GdkJoinStyle join_style);
|
||||
gchar *_gdk_win32_line_style_to_string (GdkLineStyle line_style);
|
||||
gchar *_gdk_win32_gcvalues_mask_to_string (GdkGCValuesMask mask);
|
||||
gchar *_gdk_win32_window_state_to_string (GdkWindowState state);
|
||||
gchar *_gdk_win32_window_style_to_string (LONG style);
|
||||
gchar *_gdk_win32_drawable_description (GdkDrawable *d);
|
||||
|
||||
gchar *_gdk_win32_rop2_to_string (int rop2);
|
||||
|
||||
@ -2867,14 +2867,15 @@ gdk_window_set_group (GdkWindow *window,
|
||||
}
|
||||
|
||||
static void
|
||||
update_single_bit (LONG *style,
|
||||
BOOL all,
|
||||
int gdk_bit,
|
||||
int style_bit)
|
||||
update_single_bit (LONG *style,
|
||||
gboolean all,
|
||||
int gdk_bit,
|
||||
int style_bit)
|
||||
{
|
||||
/* all controls the interpretation of gdk_bit -- if all is true, gdk_bit
|
||||
indicates whether style_bit is off; if all is false, gdk bit indicate whether
|
||||
style_bit is on */
|
||||
/* all controls the interpretation of gdk_bit -- if all is TRUE,
|
||||
* gdk_bit indicates whether style_bit is off; if all is FALSE, gdk
|
||||
* bit indicate whether style_bit is on
|
||||
*/
|
||||
if ((!all && gdk_bit) || (all && !gdk_bit))
|
||||
*style |= style_bit;
|
||||
else
|
||||
@ -2885,9 +2886,8 @@ static void
|
||||
update_style_bits (GdkWindow *window)
|
||||
{
|
||||
GdkWMDecoration decorations;
|
||||
GdkWMFunction functions;
|
||||
LONG style, exstyle;
|
||||
BOOL all;
|
||||
gboolean all;
|
||||
RECT rect, before, after;
|
||||
|
||||
style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
|
||||
@ -2897,6 +2897,8 @@ update_style_bits (GdkWindow *window)
|
||||
after = before;
|
||||
AdjustWindowRectEx (&before, style, FALSE, exstyle);
|
||||
|
||||
GDK_NOTE (MISC, g_print ("update_style_bits: style: %s", _gdk_win32_window_style_to_string (style)));
|
||||
|
||||
if (get_effective_window_decorations (window, &decorations))
|
||||
{
|
||||
all = (decorations & GDK_DECOR_ALL);
|
||||
@ -2908,18 +2910,8 @@ update_style_bits (GdkWindow *window)
|
||||
update_single_bit (&style, all, decorations & GDK_DECOR_MAXIMIZE, WS_MAXIMIZEBOX);
|
||||
}
|
||||
|
||||
/* XXX this is actually incorrect. The menu entries should be added or removed
|
||||
from the system menu without affecting the window style. */
|
||||
if (_gdk_window_get_functions (window, &functions))
|
||||
{
|
||||
all = (functions & GDK_DECOR_ALL);
|
||||
update_single_bit (&style, all, functions & GDK_FUNC_RESIZE, WS_THICKFRAME);
|
||||
update_single_bit (&style, all, functions & GDK_FUNC_MOVE, WS_THICKFRAME | WS_SYSMENU);
|
||||
update_single_bit (&style, all, functions & GDK_FUNC_MINIMIZE, WS_MINIMIZE);
|
||||
update_single_bit (&style, all, functions & GDK_FUNC_MOVE, WS_MAXIMIZE);
|
||||
update_single_bit (&style, all, functions & GDK_FUNC_CLOSE, WS_SYSMENU);
|
||||
}
|
||||
|
||||
GDK_NOTE (MISC, g_print (" => %s\n", _gdk_win32_window_style_to_string (style)));
|
||||
|
||||
SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
|
||||
|
||||
AdjustWindowRectEx (&after, style, FALSE, exstyle);
|
||||
@ -2935,6 +2927,42 @@ update_style_bits (GdkWindow *window)
|
||||
rect.right - rect.left, rect.bottom - rect.top,
|
||||
SWP_FRAMECHANGED | SWP_NOACTIVATE |
|
||||
SWP_NOREPOSITION | SWP_NOZORDER);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
update_single_system_menu_entry (HMENU hmenu,
|
||||
gboolean all,
|
||||
int gdk_bit,
|
||||
int menu_entry)
|
||||
{
|
||||
/* all controls the interpretation of gdk_bit -- if all is TRUE,
|
||||
* gdk_bit indicates whether menu entry is disabled; if all is
|
||||
* FALSE, gdk bit indicate whether menu entry is enabled
|
||||
*/
|
||||
if ((!all && gdk_bit) || (all && !gdk_bit))
|
||||
EnableMenuItem (hmenu, menu_entry, MF_BYCOMMAND | MF_ENABLED);
|
||||
else
|
||||
EnableMenuItem (hmenu, menu_entry, MF_BYCOMMAND | MF_GRAYED);
|
||||
}
|
||||
|
||||
static void
|
||||
update_system_menu (GdkWindow *window)
|
||||
{
|
||||
GdkWMFunction functions;
|
||||
BOOL all;
|
||||
|
||||
if (_gdk_window_get_functions (window, &functions))
|
||||
{
|
||||
HMENU hmenu = GetSystemMenu (GDK_WINDOW_HWND (window), FALSE);
|
||||
|
||||
all = (functions & GDK_DECOR_ALL);
|
||||
update_single_system_menu_entry (hmenu, all, functions & GDK_FUNC_RESIZE, SC_SIZE);
|
||||
update_single_system_menu_entry (hmenu, all, functions & GDK_FUNC_MOVE, SC_MOVE);
|
||||
update_single_system_menu_entry (hmenu, all, functions & GDK_FUNC_MINIMIZE, SC_MINIMIZE);
|
||||
update_single_system_menu_entry (hmenu, all, functions & GDK_FUNC_MAXIMIZE, SC_MAXIMIZE);
|
||||
update_single_system_menu_entry (hmenu, all, functions & GDK_FUNC_CLOSE, SC_CLOSE);
|
||||
}
|
||||
}
|
||||
|
||||
static GQuark
|
||||
@ -3020,7 +3048,7 @@ gdk_window_set_functions (GdkWindow *window,
|
||||
*functions_copy = functions;
|
||||
g_object_set_qdata_full (G_OBJECT (window), get_functions_quark (), functions_copy, g_free);
|
||||
|
||||
update_style_bits (window);
|
||||
update_system_menu (window);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
||||
Reference in New Issue
Block a user