[Xfce4-commits] r26782 - xfwm4/trunk/src
Olivier Fourdan
olivier at xfce.org
Sat Apr 5 11:56:37 CEST 2008
Author: olivier
Date: 2008-04-05 09:56:37 +0000 (Sat, 05 Apr 2008)
New Revision: 26782
Modified:
xfwm4/trunk/src/client.c
xfwm4/trunk/src/client.h
xfwm4/trunk/src/compositor.c
xfwm4/trunk/src/events.c
xfwm4/trunk/src/focus.c
xfwm4/trunk/src/frame.c
xfwm4/trunk/src/frame.h
xfwm4/trunk/src/netwm.c
Log:
Implements asynchronous frames update
Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/client.c 2008-04-05 09:56:37 UTC (rev 26782)
@@ -206,7 +206,7 @@
g_free (c->name);
c->name = name;
FLAG_SET (c->flags, CLIENT_FLAG_NAME_CHANGED);
- frameQueueDraw (c);
+ frameQueueDraw (c, TRUE);
}
}
}
@@ -281,7 +281,7 @@
}
if (mask & UPDATE_FRAME)
{
- frameDraw (c, TRUE);
+ frameQueueDraw (c, TRUE);
}
}
@@ -325,7 +325,7 @@
if (c != clientGetFocus ())
{
FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_SEEN_ACTIVE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
return (TRUE);
}
@@ -341,7 +341,7 @@
if (c->blink_timeout_id)
{
g_source_remove (c->blink_timeout_id);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
FLAG_UNSET (c->wm_flags, WM_FLAG_URGENT);
@@ -363,7 +363,7 @@
&& (c != clientGetFocus ()))
{
FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_SEEN_ACTIVE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
@@ -663,7 +663,7 @@
if (WIN_RESIZED || (flags & CFG_FORCE_REDRAW))
{
- frameDraw (c, (flags & CFG_FORCE_REDRAW));
+ frameQueueDraw (c, (flags & CFG_FORCE_REDRAW));
}
change_values.x = frameLeft (c);
@@ -1106,7 +1106,7 @@
}
else if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_IS_RESIZABLE) != previous_value)
{
- frameQueueDraw (c);
+ frameQueueDraw (c, FALSE);
}
}
else
@@ -1536,7 +1536,7 @@
{
clientUnstick (c, TRUE);
}
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
else if ((action & WIN_STATE_MAXIMIZED)
@@ -1656,7 +1656,7 @@
clientUpdateIconPix (c);
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_VISIBLE))
{
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
c->icon_timeout_id = 0;
@@ -1770,7 +1770,7 @@
c->size = NULL;
c->flags = 0L;
c->wm_flags = 0L;
- c->xfwm_flags = CLIENT_FLAG_INITIAL_VALUES;
+ c->xfwm_flags = XFWM_FLAG_INITIAL_VALUES;
c->x = attr.x;
c->y = attr.y;
c->width = attr.width;
@@ -1839,7 +1839,10 @@
c->opacity_applied = c->opacity;
c->opacity_flags = 0;
- c->opacity_locked = getOpacityLock (display_info, c->window);
+ if (getOpacityLock (display_info, c->window))
+ {
+ FLAG_SET (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+ }
/* Timout for asynchronous icon update */
c->icon_timeout_id = 0;
@@ -3045,7 +3048,7 @@
c->win_state &= ~WIN_STATE_MAXIMIZED;
FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
clientSetNetState (c);
}
@@ -3498,7 +3501,7 @@
c->opacity_flags = (c->opacity_flags & ~clear) ^ xor;
- if (c->opacity_locked)
+ if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED))
{
applied = c->opacity;
}
@@ -3548,7 +3551,7 @@
return;
}
- if ((c->opacity > OPACITY_SET_MIN) && !(c->opacity_locked ))
+ if ((c->opacity > OPACITY_SET_MIN) && !(FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED)))
{
clientSetOpacity (c, c->opacity - OPACITY_SET_STEP, 0, 0);
}
@@ -3568,7 +3571,7 @@
return;
}
- if ((c->opacity < NET_WM_OPAQUE) && !(c->opacity_locked ))
+ if ((c->opacity < NET_WM_OPAQUE) && !(FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED)))
{
guint opacity = c->opacity + OPACITY_SET_STEP;
@@ -4342,7 +4345,9 @@
#endif /* SHOW_POSITION */
/* Set window translucent while moving, looks nice */
- if ((screen_info->params->move_opacity < 100) && !(screen_info->params->box_move) && !(c->opacity_locked))
+ if ((screen_info->params->move_opacity < 100) &&
+ !(screen_info->params->box_move) &&
+ !FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED))
{
clientSetOpacity (c, c->opacity, OPACITY_MOVE, OPACITY_MOVE);
}
@@ -4906,7 +4911,9 @@
#endif /* HAVE_XSYNC */
/* Set window translucent while resizing, doesn't looks too nice :( */
- if ((screen_info->params->resize_opacity < 100) && !(screen_info->params->box_resize) && !(c->opacity_locked))
+ if ((screen_info->params->resize_opacity < 100) &&
+ !(screen_info->params->box_resize) &&
+ !FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED))
{
clientSetOpacity (c, c->opacity, OPACITY_RESIZE, OPACITY_RESIZE);
}
@@ -5234,14 +5241,14 @@
if ((xevent->xcrossing.mode != NotifyGrab) && (xevent->xcrossing.mode != NotifyUngrab))
{
c->button_status[b] = BUTTON_STATE_PRESSED;
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
break;
case LeaveNotify:
if ((xevent->xcrossing.mode != NotifyGrab) && (xevent->xcrossing.mode != NotifyUngrab))
{
c->button_status[b] = BUTTON_STATE_NORMAL;
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
break;
case ButtonRelease:
@@ -5314,7 +5321,7 @@
passdata.b = b;
c->button_status[b] = BUTTON_STATE_PRESSED;
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
TRACE ("entering button press loop");
eventFilterPush (display_info->xfilter, clientButtonPressEventFilter, &passdata);
@@ -5376,7 +5383,7 @@
default:
break;
}
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
Modified: xfwm4/trunk/src/client.h
===================================================================
--- xfwm4/trunk/src/client.h 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/client.h 2008-04-05 09:56:37 UTC (rev 26782)
@@ -124,6 +124,8 @@
#define XFWM_FLAG_FIRST_MAP (1L<<19)
#define XFWM_FLAG_LEGACY_FULLSCREEN (1L<<20)
#define XFWM_FLAG_MOVING_RESIZING (1L<<21)
+#define XFWM_FLAG_NEEDS_REDRAW (1L<<22)
+#define XFWM_FLAG_OPACITY_LOCKED (1L<<23)
#define CLIENT_FLAG_HAS_STRUT (1L<<0)
#define CLIENT_FLAG_HAS_STRUT_PARTIAL (1L<<1)
@@ -152,7 +154,7 @@
#define WM_FLAG_CONTEXT_HELP (1L<<3)
#define WM_FLAG_URGENT (1L<<4)
-#define CLIENT_FLAG_INITIAL_VALUES XFWM_FLAG_HAS_BORDER | \
+#define XFWM_FLAG_INITIAL_VALUES XFWM_FLAG_HAS_BORDER | \
XFWM_FLAG_HAS_MENU | \
XFWM_FLAG_HAS_MAXIMIZE | \
XFWM_FLAG_HAS_STICK | \
@@ -160,7 +162,8 @@
XFWM_FLAG_HAS_CLOSE | \
XFWM_FLAG_HAS_MOVE | \
XFWM_FLAG_HAS_RESIZE | \
- XFWM_FLAG_FIRST_MAP
+ XFWM_FLAG_FIRST_MAP | \
+ XFWM_FLAG_NEEDS_REDRAW
#define ALL_WORKSPACES (int) 0xFFFFFFFF
@@ -292,7 +295,6 @@
guint opacity;
guint opacity_applied;
guint opacity_flags;
- gboolean opacity_locked;
#ifdef HAVE_LIBSTARTUP_NOTIFICATION
/* Startup notification */
Modified: xfwm4/trunk/src/compositor.c
===================================================================
--- xfwm4/trunk/src/compositor.c 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/compositor.c 2008-04-05 09:56:37 UTC (rev 26782)
@@ -1869,7 +1869,7 @@
cw->native_opacity = FALSE;
if (c)
{
- cw->opacity_locked = c->opacity_locked;
+ cw->opacity_locked = FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
cw->opacity = c->opacity_applied;
cw->native_opacity = WIN_IS_OPAQUE(cw);
}
@@ -2269,7 +2269,14 @@
cw->opacity_locked = getOpacityLock (display_info, cw->id);
if (cw->c)
{
- cw->c->opacity_locked = cw->opacity_locked;
+ if (cw->opacity_locked)
+ {
+ FLAG_SET (cw->c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+ }
+ else
+ {
+ FLAG_UNSET (cw->c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+ }
}
}
}
Modified: xfwm4/trunk/src/events.c
===================================================================
--- xfwm4/trunk/src/events.c 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/events.c 2008-04-05 09:56:37 UTC (rev 26782)
@@ -404,7 +404,7 @@
if (CLIENT_CAN_STICK_WINDOW(c))
{
clientToggleSticky (c, TRUE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
break;
case KEY_RAISE_WINDOW:
@@ -1528,7 +1528,7 @@
}
if (need_redraw)
{
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
/* No need to process the event any further */
@@ -1682,7 +1682,7 @@
}
if (need_redraw)
{
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
/* No need to process the event any further */
@@ -1968,7 +1968,7 @@
{
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_WINDOW_TYPE notify", c->name, c->window);
clientGetNetWmType (c);
- frameQueueDraw (c);
+ frameQueueDraw (c, TRUE);
}
else if ((ev->atom == display_info->atoms[NET_WM_STRUT]) ||
(ev->atom == display_info->atoms[NET_WM_STRUT_PARTIAL]))
@@ -2009,7 +2009,14 @@
else if (ev->atom == display_info->atoms[NET_WM_WINDOW_OPACITY_LOCKED])
{
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_OPACITY_LOCKED notify", c->name, c->window);
- c->opacity_locked = getOpacityLock (display_info, c->window);
+ if (getOpacityLock (display_info, c->window))
+ {
+ FLAG_SET (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+ }
+ else
+ {
+ FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+ }
}
else if ((screen_info->params->show_app_icon) &&
((ev->atom == display_info->atoms[NET_WM_ICON]) ||
@@ -2129,7 +2136,7 @@
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_STICK) && !FLAG_TEST (c->flags, CLIENT_FLAG_STICKY))
{
clientStick (c, TRUE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
else
@@ -2137,7 +2144,7 @@
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_STICK) && FLAG_TEST (c->flags, CLIENT_FLAG_STICKY))
{
clientUnstick (c, TRUE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
if (ev->data.l[0] != c->win_workspace)
{
@@ -2328,7 +2335,7 @@
}
if (!update)
{
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
@@ -2568,11 +2575,11 @@
{
clientHide (c, c->win_workspace, TRUE);
}
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
break;
case MENU_OP_MINIMIZE_ALL:
clientHideAll (c, c->win_workspace);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
break;
case MENU_OP_UNMINIMIZE:
clientShow (c, TRUE);
@@ -2585,26 +2592,26 @@
case MENU_OP_STICK:
case MENU_OP_UNSTICK:
clientToggleSticky (c, TRUE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
break;
case MENU_OP_WORKSPACES:
clientSetWorkspace (c, GPOINTER_TO_INT (item_data), TRUE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
break;
case MENU_OP_DELETE:
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
clientClose (c);
break;
case MENU_OP_CONTEXT_HELP:
clientEnterContextMenuState (c);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
break;
case MENU_OP_ABOVE:
case MENU_OP_NORMAL:
clientToggleAbove (c);
/* Fall thru */
default:
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
break;
}
}
@@ -2642,7 +2649,7 @@
y = py;
c->button_status[MENU_BUTTON] = BUTTON_STATE_PRESSED;
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
y = (gdouble) c->y;
ops = MENU_OP_DELETE | MENU_OP_MINIMIZE_ALL | MENU_OP_WORKSPACES;
insensitive = 0;
@@ -2789,7 +2796,7 @@
TRACE ("Cannot open menu");
gdk_beep ();
c->button_status[MENU_BUTTON] = BUTTON_STATE_NORMAL;
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
xfwmWindowDelete (&menu_event_window);
menu_free (menu);
}
Modified: xfwm4/trunk/src/focus.c
===================================================================
--- xfwm4/trunk/src/focus.c 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/focus.c 2008-04-05 09:56:37 UTC (rev 26782)
@@ -468,7 +468,7 @@
}
data[0] = c->window;
clientAdjustFullscreenLayer (c, TRUE);
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
else
{
@@ -481,7 +481,7 @@
clientAdjustFullscreenLayer (c2, FALSE);
/* clientRaise (c, None); */
}
- frameDraw (c2, FALSE);
+ frameQueueDraw (c2, FALSE);
}
data[1] = None;
XChangeProperty (display_info->dpy, screen_info->xroot,
@@ -572,7 +572,7 @@
if (c2)
{
- frameDraw (c2, FALSE);
+ frameQueueDraw (c2, FALSE);
XChangeProperty (clientGetXDisplay (c2), c2->screen_info->xroot, display_info->atoms[NET_ACTIVE_WINDOW], XA_WINDOW, 32,
PropModeReplace, (unsigned char *) data, 2);
}
Modified: xfwm4/trunk/src/frame.c
===================================================================
--- xfwm4/trunk/src/frame.c 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/frame.c 2008-04-05 09:56:37 UTC (rev 26782)
@@ -831,7 +831,7 @@
}
void
-frameDraw (Client * c, gboolean clear_all)
+frameDraw (Client * c)
{
ScreenInfo *screen_info;
FramePixmap frame_pix;
@@ -891,18 +891,12 @@
FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_FIRST_MAP);
/* Cache mgmt */
- if (clear_all)
+ if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW))
{
width_changed = TRUE;
height_changed = TRUE;
requires_clearing = TRUE;
frameClearQueueDraw (c);
- if (c->frame_timeout_id)
- {
- g_source_remove (c->frame_timeout_id);
- c->frame_timeout_id = 0;
- }
-
}
else
{
@@ -917,6 +911,7 @@
c->previous_height = c->height;
}
}
+ FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW);
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
&& !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
@@ -1185,7 +1180,7 @@
c = (Client *) data;
g_return_val_if_fail (c, FALSE);
- frameDraw (c, TRUE);
+ frameDraw (c);
c->frame_timeout_id = 0;
return FALSE;
@@ -1206,12 +1201,22 @@
}
void
-frameQueueDraw (Client * c)
+frameQueueDraw (Client * c, gboolean clear_all)
{
g_return_if_fail (c);
TRACE ("entering frameQueueDraw for \"%s\" (0x%lx)", c->name, c->window);
+ /* Reschedule update */
+ if (c->frame_timeout_id)
+ {
+ frameClearQueueDraw (c);
+ }
+ if (clear_all)
+ {
+ FLAG_SET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW);
+ }
+ /* Otherwise leave previous schedule */
if (c->frame_timeout_id == 0)
{
c->frame_timeout_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
Modified: xfwm4/trunk/src/frame.h
===================================================================
--- xfwm4/trunk/src/frame.h 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/frame.h 2008-04-05 09:56:37 UTC (rev 26782)
@@ -42,9 +42,9 @@
int frameY (Client *);
int frameWidth (Client *);
int frameHeight (Client *);
-void frameDraw (Client *,
+void frameDraw (Client *);
+void frameClearQueueDraw (Client *);
+void frameQueueDraw (Client *,
gboolean);
-void frameClearQueueDraw (Client *);
-void frameQueueDraw (Client *);
#endif /* INC_FRAME_H */
Modified: xfwm4/trunk/src/netwm.c
===================================================================
--- xfwm4/trunk/src/netwm.c 2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/netwm.c 2008-04-05 09:56:37 UTC (rev 26782)
@@ -331,7 +331,7 @@
{
clientToggleSticky (c, TRUE);
}
- frameDraw (c, FALSE);
+ frameQueueDraw (c, FALSE);
}
}
@@ -411,7 +411,7 @@
clientSetNetState (c);
clientWindowType (c);
}
- frameDraw (c, TRUE);
+ frameQueueDraw (c, TRUE);
}
if ((first == display_info->atoms[NET_WM_STATE_FULLSCREEN]) ||
@@ -524,7 +524,7 @@
FLAG_TOGGLE (c->flags, CLIENT_FLAG_SKIP_TASKBAR);
clientSetNetState (c);
}
- frameDraw (c, TRUE);
+ frameQueueDraw (c, TRUE);
}
if ((first == display_info->atoms[NET_WM_STATE_DEMANDS_ATTENTION]) ||
More information about the Xfce4-commits
mailing list