f2237fa0c8
There's two meanings of "frame" there! Since SSD frames are now rendered by an external client, and there are no actual mechanism that ensures the frame did already get painted when the client did respond to its NET_WM_FRAME_SYNC_REQUEST request, there may be artifacts when resizing windows. In order to get always the best visual result, we should actually synchronize rendering with both the client window and the window frame window. This commit adds these mechanisms, so a sync alarm update is expected on both windows until further resizes are allowed, this ensures window and frame stay in sync, even after moving rendering elsewhere. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2175>
84 lines
2.6 KiB
C
84 lines
2.6 KiB
C
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
|
|
/* Mutter X window decorations */
|
|
|
|
/*
|
|
* Copyright (C) 2001 Havoc Pennington
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef META_FRAME_PRIVATE_H
|
|
#define META_FRAME_PRIVATE_H
|
|
|
|
#include "core/window-private.h"
|
|
|
|
#include "x11/meta-sync-counter.h"
|
|
|
|
struct _MetaFrame
|
|
{
|
|
/* window we frame */
|
|
MetaWindow *window;
|
|
|
|
/* reparent window */
|
|
Window xwindow;
|
|
|
|
/* This rect is trusted info from where we put the
|
|
* frame, not the result of ConfigureNotify
|
|
*/
|
|
MetaRectangle rect;
|
|
|
|
MetaFrameBorders cached_borders; /* valid if borders_cached is set */
|
|
|
|
MetaSyncCounter sync_counter;
|
|
|
|
/* position of client, size of frame */
|
|
int child_x;
|
|
int child_y;
|
|
int right_width;
|
|
int bottom_height;
|
|
|
|
guint borders_cached : 1;
|
|
};
|
|
|
|
void meta_window_ensure_frame (MetaWindow *window);
|
|
void meta_window_destroy_frame (MetaWindow *window);
|
|
|
|
MetaFrameFlags meta_frame_get_flags (MetaFrame *frame);
|
|
Window meta_frame_get_xwindow (MetaFrame *frame);
|
|
|
|
/* These should ONLY be called from meta_window_move_resize_internal */
|
|
void meta_frame_calc_borders (MetaFrame *frame,
|
|
MetaFrameBorders *borders);
|
|
|
|
gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
|
gboolean need_resize);
|
|
|
|
void meta_frame_clear_cached_borders (MetaFrame *frame);
|
|
|
|
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
|
|
|
void meta_frame_get_mask (MetaFrame *frame,
|
|
cairo_rectangle_int_t *frame_rect,
|
|
cairo_t *cr);
|
|
|
|
gboolean meta_frame_handle_xevent (MetaFrame *frame,
|
|
XEvent *event);
|
|
|
|
GSubprocess * meta_frame_launch_client (MetaX11Display *x11_display,
|
|
const char *display_name);
|
|
|
|
MetaSyncCounter * meta_frame_get_sync_counter (MetaFrame *frame);
|
|
|
|
#endif
|