Improvement: Try to reduce reg_ignore regenerations

- Try to reduce regenerations of reg_ignore. Highly experimental and
  could lead to very obscure bugs. More testing needed.

- Introduce to_paint in struct _win to keep track of whether this window
  was painted last time.

- Drop CAN_DO_USABLE support. Its usage looks pretty limited.

- Fix a bug that possibly causes rendering issues on frame width changes
  if frame_opacity is enabled.

- Detect other borders (instead of only top border) when determining
  frame opacity.

- Change the type of w->mode from int to an enumeration type.

- Ignore ShapeNotify if the window is not mapped, to avoid loss of
  w->border_size in some cases, which breaks the fading out process of
  shaped windows.

- Stop rendering a window if its picture is lost and it's unmapped, to
  avoid a series of X errors and possible rendering problems.
This commit is contained in:
Richard Grenville
2012-10-31 08:54:09 +08:00
parent 56e181309e
commit 35c9e44de2
2 changed files with 169 additions and 198 deletions

View File

@ -6,8 +6,6 @@
// === Options ===
#define CAN_DO_USABLE 0
// Debug options, enable them using -D in CFLAGS
// #define DEBUG_REPAINT 1
// #define DEBUG_EVENTS 1
@ -106,10 +104,6 @@ extern struct timeval time_start;
#define OPAQUE 0xffffffff
#define REGISTER_PROP "_NET_WM_CM_S"
#define WINDOW_SOLID 0
#define WINDOW_TRANS 1
#define WINDOW_ARGB 2
#define FADE_DELTA_TOLERANCE 0.2
#define SW_OPTI_TOLERANCE 1000
@ -147,6 +141,12 @@ typedef enum {
NUM_WINTYPES
} wintype;
typedef enum {
WINDOW_SOLID,
WINDOW_TRANS,
WINDOW_ARGB
} winmode;
typedef struct _ignore {
struct _ignore *next;
unsigned long sequence;
@ -186,11 +186,7 @@ typedef struct _win {
Window client_win;
Pixmap pixmap;
XWindowAttributes a;
#if CAN_DO_USABLE
Bool usable; /* mapped and all damaged at one point */
XRectangle damage_bounds; /* bounds of damage */
#endif
int mode;
winmode mode;
int damaged;
Damage damage;
Picture picture;
@ -207,6 +203,8 @@ typedef struct _win {
Bool bounding_shaped;
/// Whether the window just have rounded corners.
Bool rounded_corners;
/// Whether this window is to be painted
Bool to_paint;
// Blacklist related members
char *name;
@ -393,6 +391,7 @@ extern int root_height, root_width;
extern Atom atom_client_attr;
extern Bool idling;
extern Bool shape_exists;
extern Bool reg_ignore_expire;
/**
* Functions
@ -830,6 +829,18 @@ wid_bounding_shaped(Display *dpy, Window wid) {
return False;
}
static inline void
update_reg_ignore_expire(const win *w) {
if (w->to_paint && WINDOW_SOLID == w->mode)
reg_ignore_expire = True;
}
static inline bool
win_has_frame(const win *w) {
return w->top_width || w->left_width || w->right_width
|| w->bottom_width;
}
static void
win_rounded_corners(Display *dpy, win *w);