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]) || _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits