📄 gdkwindow-win32.c
字号:
*y = rect.y; GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %p: +%d+%d\n", GDK_WINDOW_HWND (window), rect.x, rect.y));}voidgdk_window_get_frame_extents (GdkWindow *window, GdkRectangle *rect){ GdkWindowObject *private; HWND hwnd; RECT r; g_return_if_fail (GDK_IS_WINDOW (window)); g_return_if_fail (rect != NULL); private = GDK_WINDOW_OBJECT (window); rect->x = 0; rect->y = 0; rect->width = 1; rect->height = 1; if (GDK_WINDOW_DESTROYED (window)) return; /* FIXME: window is documented to be a toplevel GdkWindow, so is it really * necessary to walk its parent chain? */ while (private->parent && ((GdkWindowObject*) private->parent)->parent) private = (GdkWindowObject*) private->parent; hwnd = GDK_WINDOW_HWND (window); API_CALL (GetWindowRect, (hwnd, &r)); rect->x = r.left + _gdk_offset_x; rect->y = r.top + _gdk_offset_y; rect->width = r.right - r.left; rect->height = r.bottom - r.top; GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@+%ld+%ld\n", GDK_WINDOW_HWND (window), r.right - r.left, r.bottom - r.top, r.left, r.top));}GdkWindow*_gdk_windowing_window_get_pointer (GdkDisplay *display, GdkWindow *window, gint *x, gint *y, GdkModifierType *mask){ GdkWindow *return_val; POINT screen_point, point; HWND hwnd, hwndc; BYTE kbd[256]; g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL); return_val = NULL; GetCursorPos (&screen_point); point = screen_point; ScreenToClient (GDK_WINDOW_HWND (window), &point); *x = point.x; *y = point.y; if (window == _gdk_parent_root) { *x += _gdk_offset_x; *y += _gdk_offset_y; } hwnd = WindowFromPoint (screen_point); if (hwnd != NULL) { gboolean done = FALSE; while (!done) { point = screen_point; ScreenToClient (hwnd, &point); hwndc = ChildWindowFromPoint (hwnd, point); if (hwndc == NULL) done = TRUE; else if (hwndc == hwnd) done = TRUE; else hwnd = hwndc; } return_val = gdk_window_lookup ((GdkNativeWindow) hwnd); } else return_val = NULL; GetKeyboardState (kbd); *mask = 0; if (kbd[VK_SHIFT] & 0x80) *mask |= GDK_SHIFT_MASK; if (kbd[VK_CAPITAL] & 0x80) *mask |= GDK_LOCK_MASK; if (kbd[VK_CONTROL] & 0x80) *mask |= GDK_CONTROL_MASK; if (kbd[VK_MENU] & 0x80) *mask |= GDK_MOD1_MASK; if (kbd[VK_LBUTTON] & 0x80) *mask |= GDK_BUTTON1_MASK; if (kbd[VK_MBUTTON] & 0x80) *mask |= GDK_BUTTON2_MASK; if (kbd[VK_RBUTTON] & 0x80) *mask |= GDK_BUTTON3_MASK; return return_val;}void_gdk_windowing_get_pointer (GdkDisplay *display, GdkScreen **screen, gint *x, gint *y, GdkModifierType *mask){ GdkScreen *default_screen = gdk_display_get_default_screen (display); GdkWindow *root_window = gdk_screen_get_root_window (default_screen); *screen = default_screen; _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);}GdkWindow*_gdk_windowing_window_at_pointer (GdkDisplay *display, gint *win_x, gint *win_y){ GdkWindow *window; POINT point, pointc; HWND hwnd, hwndc; RECT rect; GetCursorPos (&pointc); point = pointc; hwnd = WindowFromPoint (point); if (hwnd == NULL) { window = _gdk_parent_root; *win_x = pointc.x + _gdk_offset_x; *win_y = pointc.y + _gdk_offset_y; return window; } ScreenToClient (hwnd, &point); do { hwndc = ChildWindowFromPoint (hwnd, point); ClientToScreen (hwnd, &point); ScreenToClient (hwndc, &point); } while (hwndc != hwnd && (hwnd = hwndc, 1)); window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd); if (window && (win_x || win_y)) { GetClientRect (hwnd, &rect); *win_x = point.x - rect.left; *win_y = point.y - rect.top; } GDK_NOTE (MISC, g_print ("_gdk_windowing_window_at_pointer: +%d+%d %p%s\n", *win_x, *win_y, hwnd, (window == NULL ? " NULL" : ""))); return window;}GdkEventMask gdk_window_get_events (GdkWindow *window){ g_return_val_if_fail (window != NULL, 0); g_return_val_if_fail (GDK_IS_WINDOW (window), 0); if (GDK_WINDOW_DESTROYED (window)) return 0; return GDK_WINDOW_OBJECT (window)->event_mask;}void gdk_window_set_events (GdkWindow *window, GdkEventMask event_mask){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better * set it here, too. Not that I know or remember why it is * necessary, will have to test some day. */ GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;}voidgdk_window_shape_combine_mask (GdkWindow *window, GdkBitmap *mask, gint x, gint y){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (!mask) { GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n", GDK_WINDOW_HWND (window))); SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE); } else { HRGN hrgn; RECT rect; /* Convert mask bitmap to region */ hrgn = _gdk_win32_bitmap_to_hrgn (mask); GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: %p\n", GDK_WINDOW_HWND (window), GDK_WINDOW_HWND (mask))); _gdk_win32_get_adjusted_client_rect (window, &rect); OffsetRgn (hrgn, -rect.left, -rect.top); OffsetRgn (hrgn, x, y); /* If this is a top-level window, add the title bar to the region */ if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL) { HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top); CombineRgn (hrgn, hrgn, tmp, RGN_OR); DeleteObject (tmp); } SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE); }}voidgdk_window_set_override_redirect (GdkWindow *window, gboolean override_redirect){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); g_warning ("gdk_window_set_override_redirect not implemented");}voidgdk_window_set_accept_focus (GdkWindow *window, gboolean accept_focus){ GdkWindowObject *private; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); private = (GdkWindowObject *)window; accept_focus = accept_focus != FALSE; if (private->accept_focus != accept_focus) private->accept_focus = accept_focus;}voidgdk_window_set_focus_on_map (GdkWindow *window, gboolean focus_on_map){ GdkWindowObject *private; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); private = (GdkWindowObject *)window; focus_on_map = focus_on_map != FALSE; if (private->focus_on_map != focus_on_map) private->focus_on_map = focus_on_map;}void gdk_window_set_icon_list (GdkWindow *window, GList *pixbufs){ GdkPixbuf *pixbuf, *big_pixbuf, *small_pixbuf; gint big_diff, small_diff; gint big_w, big_h, small_w, small_h; gint w, h; gint dw, dh, diff; HICON small_hicon, big_hicon; GdkWindowImplWin32 *impl; gint i, big_i, small_i; g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl); /* ideal sizes for small and large icons */ big_w = GetSystemMetrics (SM_CXICON); big_h = GetSystemMetrics (SM_CYICON); small_w = GetSystemMetrics (SM_CXSMICON); small_h = GetSystemMetrics (SM_CYSMICON); /* find closest sized icons in the list */ big_pixbuf = NULL; small_pixbuf = NULL; big_diff = 0; small_diff = 0; i = 0; while (pixbufs) { pixbuf = (GdkPixbuf*) pixbufs->data; w = gdk_pixbuf_get_width (pixbuf); h = gdk_pixbuf_get_height (pixbuf); dw = ABS (w - big_w); dh = ABS (h - big_h); diff = dw*dw + dh*dh; if (big_pixbuf == NULL || diff < big_diff) { big_pixbuf = pixbuf; big_diff = diff; big_i = i; } dw = ABS(w - small_w); dh = ABS(h - small_h); diff = dw*dw + dh*dh; if (small_pixbuf == NULL || diff < small_diff) { small_pixbuf = pixbuf; small_diff = diff; small_i = i; } pixbufs = g_list_next (pixbufs); i++; } /* Create the icons */ big_hicon = _gdk_win32_pixbuf_to_hicon (big_pixbuf); small_hicon = _gdk_win32_pixbuf_to_hicon (small_pixbuf); /* Set the icons */ SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG, (LPARAM)big_hicon); SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_SMALL, (LPARAM)small_hicon); /* Store the icons, destroying any previous icons */ if (impl->hicon_big) GDI_CALL (DestroyIcon, (impl->hicon_big)); impl->hicon_big = big_hicon; if (impl->hicon_small) GDI_CALL (DestroyIcon, (impl->hicon_small)); impl->hicon_small = small_hicon;}void gdk_window_set_icon (GdkWindow *window, GdkWindow *icon_window, GdkPixmap *pixmap, GdkBitmap *mask){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); /* do nothing, use gdk_window_set_icon_list instead */}voidgdk_window_set_icon_name (GdkWindow *window, const gchar *name){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) return; API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), name));}GdkWindow *gdk_window_get_group (GdkWindow *window){ g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL); if (GDK_WINDOW_DESTROYED (window)) return NULL; g_warning ("gdk_window_get_group not yet implemented"); return NULL;}void gdk_window_set_group (GdkWindow *window, GdkWindow *leader){ g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); g_return_if_fail (leader != NULL); g_return_if_fail (GDK_IS_WINDOW (leader)); if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader)) return; g_warning ("gdk_window_set_group not implemented");}voidgdk_window_set_decorations (GdkWindow *window, GdkWMDecoration decorations){ LONG style, bits; const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p: %s%s%s%s%s%s%s\n", GDK_WINDOW_HWND (window), (decorations & GDK_DECOR_ALL ? "ALL " : ""), (decorations & GDK_DECOR_BORDER ? "BORDER " : ""), (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""), (decorations & GDK_DECOR_TITLE ? "TITLE " : ""), (decorations & GDK_DECOR_MENU ? "MENU " : ""), (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""), (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : ""))); style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE); bits = 0; if (decorations & GDK_DECOR_BORDER) bits |= WS_BORDER; if (decorations & GDK_DECOR_RESIZEH) bits |= WS_THICKFRAME; if (decorations & GDK_DECOR_TITLE) bits |= WS_CAPTION; if (decorations & GDK_DECOR_MENU) bits |= WS_SYSMENU; if (decorations & GDK_DECOR_MINIMIZE) bits |= WS_MINIMIZEBOX; if (decorations & GDK_DECOR_MAXIMIZE) bits |= WS_MAXIMIZEBOX; if (decorations & GDK_DECOR_ALL) style |= settable_bits, style &= ~bits; else style &= ~settable_bits, style |= bits; SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style); SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);}gbooleangdk_window_get_decorations(GdkWindow *window, GdkWMDecoration *decorations){ LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE); *decorations = 0; if (style & WS_BORDER) *decorations |= GDK_DECOR_BORDER; if (style & WS_THICKFRAME) *decorations |= GDK_DECOR_RESIZEH; if (style & WS_CAPTION)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -