1*4882a593SmuzhiyunFrom c4b8f02cca601a25767de29392940f0dc5ef2e24 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Thu, 7 May 2020 08:55:42 +0800 4*4882a593SmuzhiyunSubject: [PATCH 20/79] HACK: Support setting surface flags activate and alpha 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunSupport setting surface flags activate and alpha through app_id or 7*4882a593Smuzhiyuntitle, for example: 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunxdg_toplevel_set_app_id("flags=stay-on-top|stay-on-bottom|no-focus") 10*4882a593Smuzhiyunxdg_toplevel_set_title("requests=activate") 11*4882a593Smuzhiyunxdg_toplevel_set_app_id("attrs=alpha:0.5") 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 14*4882a593Smuzhiyun--- 15*4882a593Smuzhiyun desktop-shell/shell.c | 29 ++++- 16*4882a593Smuzhiyun desktop-shell/shell.h | 2 + 17*4882a593Smuzhiyun include/libweston/libweston.h | 13 +++ 18*4882a593Smuzhiyun libweston-desktop/surface.c | 193 ++++++++++++++++++++++++++++++++++ 19*4882a593Smuzhiyun libweston/compositor.c | 10 +- 20*4882a593Smuzhiyun 5 files changed, 244 insertions(+), 3 deletions(-) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyundiff --git a/desktop-shell/shell.c b/desktop-shell/shell.c 23*4882a593Smuzhiyunindex 8b4ed45..4cb29dd 100644 24*4882a593Smuzhiyun--- a/desktop-shell/shell.c 25*4882a593Smuzhiyun+++ b/desktop-shell/shell.c 26*4882a593Smuzhiyun@@ -1895,6 +1895,11 @@ shell_surface_update_layer(struct shell_surface *shsurf) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun new_layer_link = shell_surface_calculate_layer_link(shsurf); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun+ if (surface->flags & SURFACE_STAY_ON_TOP) 31*4882a593Smuzhiyun+ new_layer_link = &shsurf->shell->top_layer.view_list; 32*4882a593Smuzhiyun+ else if (surface->flags & SURFACE_STAY_ON_BOTTOM) 33*4882a593Smuzhiyun+ new_layer_link = &shsurf->shell->bottom_layer.view_list; 34*4882a593Smuzhiyun+ 35*4882a593Smuzhiyun if (new_layer_link == NULL) 36*4882a593Smuzhiyun return; 37*4882a593Smuzhiyun if (new_layer_link == &shsurf->view->layer_link) 38*4882a593Smuzhiyun@@ -3220,6 +3225,10 @@ resume_desktop(struct desktop_shell *shell) 39*4882a593Smuzhiyun weston_layer_set_position(&shell->panel_layer, 40*4882a593Smuzhiyun WESTON_LAYER_POSITION_UI); 41*4882a593Smuzhiyun weston_layer_set_position(&ws->layer, WESTON_LAYER_POSITION_NORMAL); 42*4882a593Smuzhiyun+ weston_layer_set_position(&shell->top_layer, 43*4882a593Smuzhiyun+ WESTON_LAYER_POSITION_TOP_UI); 44*4882a593Smuzhiyun+ weston_layer_set_position(&shell->bottom_layer, 45*4882a593Smuzhiyun+ WESTON_LAYER_POSITION_BOTTOM_UI); 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun restore_focus_state(shell, get_current_workspace(shell)); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun@@ -3781,7 +3790,7 @@ activate(struct desktop_shell *shell, struct weston_view *view, 50*4882a593Smuzhiyun struct weston_surface *main_surface; 51*4882a593Smuzhiyun struct focus_state *state; 52*4882a593Smuzhiyun struct workspace *ws; 53*4882a593Smuzhiyun- struct weston_surface *old_es; 54*4882a593Smuzhiyun+ struct weston_surface *old_es = NULL; 55*4882a593Smuzhiyun struct shell_surface *shsurf, *shsurf_child; 56*4882a593Smuzhiyun struct shell_seat *shseat = get_shell_seat(seat); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun@@ -3801,6 +3810,9 @@ activate(struct desktop_shell *shell, struct weston_view *view, 59*4882a593Smuzhiyun if (shsurf->output) 60*4882a593Smuzhiyun lower_fullscreen_layer(shell, shsurf->output); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun+ if (view->surface->flags & SURFACE_NO_FOCUS) 63*4882a593Smuzhiyun+ goto no_focus; 64*4882a593Smuzhiyun+ 65*4882a593Smuzhiyun weston_view_activate_input(view, seat, flags); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun if (shseat && shseat->focused_surface) { 68*4882a593Smuzhiyun@@ -3821,6 +3833,7 @@ activate(struct desktop_shell *shell, struct weston_view *view, 69*4882a593Smuzhiyun old_es = state->keyboard_focus; 70*4882a593Smuzhiyun focus_state_set_focus(state, es); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun+no_focus: 73*4882a593Smuzhiyun if (weston_desktop_surface_get_fullscreen(shsurf->desktop_surface) && 74*4882a593Smuzhiyun flags & WESTON_ACTIVATE_FLAG_CONFIGURE) 75*4882a593Smuzhiyun shell_configure_fullscreen(shsurf); 76*4882a593Smuzhiyun@@ -3829,7 +3842,7 @@ activate(struct desktop_shell *shell, struct weston_view *view, 77*4882a593Smuzhiyun * order as appropriate. */ 78*4882a593Smuzhiyun shell_surface_update_layer(shsurf); 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun- if (shell->focus_animation_type != ANIMATION_NONE) { 81*4882a593Smuzhiyun+ if (old_es && shell->focus_animation_type != ANIMATION_NONE) { 82*4882a593Smuzhiyun ws = get_current_workspace(shell); 83*4882a593Smuzhiyun animate_focus_change(shell, ws, get_default_view(old_es), get_default_view(es)); 84*4882a593Smuzhiyun } 85*4882a593Smuzhiyun@@ -3942,6 +3955,8 @@ lock(struct desktop_shell *shell) 86*4882a593Smuzhiyun if (shell->showing_input_panels) 87*4882a593Smuzhiyun weston_layer_unset_position(&shell->input_panel_layer); 88*4882a593Smuzhiyun weston_layer_unset_position(&ws->layer); 89*4882a593Smuzhiyun+ weston_layer_unset_position(&shell->top_layer); 90*4882a593Smuzhiyun+ weston_layer_unset_position(&shell->bottom_layer); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun weston_layer_set_position(&shell->lock_layer, 93*4882a593Smuzhiyun WESTON_LAYER_POSITION_LOCK); 94*4882a593Smuzhiyun@@ -4822,6 +4837,8 @@ shell_for_each_layer(struct desktop_shell *shell, 95*4882a593Smuzhiyun func(shell, &shell->background_layer, data); 96*4882a593Smuzhiyun func(shell, &shell->lock_layer, data); 97*4882a593Smuzhiyun func(shell, &shell->input_panel_layer, data); 98*4882a593Smuzhiyun+ func(shell, &shell->top_layer, data); 99*4882a593Smuzhiyun+ func(shell, &shell->bottom_layer, data); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun wl_array_for_each(ws, &shell->workspaces.array) 102*4882a593Smuzhiyun func(shell, &(*ws)->layer, data); 103*4882a593Smuzhiyun@@ -5115,6 +5132,8 @@ shell_destroy(struct wl_listener *listener, void *data) 104*4882a593Smuzhiyun workspace_destroy(*ws); 105*4882a593Smuzhiyun wl_array_release(&shell->workspaces.array); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun+ desktop_shell_destroy_layer(&shell->bottom_layer); 108*4882a593Smuzhiyun+ desktop_shell_destroy_layer(&shell->top_layer); 109*4882a593Smuzhiyun desktop_shell_destroy_layer(&shell->panel_layer); 110*4882a593Smuzhiyun desktop_shell_destroy_layer(&shell->background_layer); 111*4882a593Smuzhiyun desktop_shell_destroy_layer(&shell->lock_layer); 112*4882a593Smuzhiyun@@ -5270,6 +5289,8 @@ wet_shell_init(struct weston_compositor *ec, 113*4882a593Smuzhiyun weston_layer_init(&shell->background_layer, ec); 114*4882a593Smuzhiyun weston_layer_init(&shell->lock_layer, ec); 115*4882a593Smuzhiyun weston_layer_init(&shell->input_panel_layer, ec); 116*4882a593Smuzhiyun+ weston_layer_init(&shell->top_layer, ec); 117*4882a593Smuzhiyun+ weston_layer_init(&shell->bottom_layer, ec); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun weston_layer_set_position(&shell->fullscreen_layer, 120*4882a593Smuzhiyun WESTON_LAYER_POSITION_FULLSCREEN); 121*4882a593Smuzhiyun@@ -5277,6 +5298,10 @@ wet_shell_init(struct weston_compositor *ec, 122*4882a593Smuzhiyun WESTON_LAYER_POSITION_UI); 123*4882a593Smuzhiyun weston_layer_set_position(&shell->background_layer, 124*4882a593Smuzhiyun WESTON_LAYER_POSITION_BACKGROUND); 125*4882a593Smuzhiyun+ weston_layer_set_position(&shell->top_layer, 126*4882a593Smuzhiyun+ WESTON_LAYER_POSITION_TOP_UI); 127*4882a593Smuzhiyun+ weston_layer_set_position(&shell->bottom_layer, 128*4882a593Smuzhiyun+ WESTON_LAYER_POSITION_BOTTOM_UI); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun wl_array_init(&shell->workspaces.array); 131*4882a593Smuzhiyun wl_list_init(&shell->workspaces.client_list); 132*4882a593Smuzhiyundiff --git a/desktop-shell/shell.h b/desktop-shell/shell.h 133*4882a593Smuzhiyunindex b06b906..e0a0620 100644 134*4882a593Smuzhiyun--- a/desktop-shell/shell.h 135*4882a593Smuzhiyun+++ b/desktop-shell/shell.h 136*4882a593Smuzhiyun@@ -148,6 +148,8 @@ struct desktop_shell { 137*4882a593Smuzhiyun struct weston_layer background_layer; 138*4882a593Smuzhiyun struct weston_layer lock_layer; 139*4882a593Smuzhiyun struct weston_layer input_panel_layer; 140*4882a593Smuzhiyun+ struct weston_layer top_layer; 141*4882a593Smuzhiyun+ struct weston_layer bottom_layer; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun struct wl_listener pointer_focus_listener; 144*4882a593Smuzhiyun struct weston_surface *grab_surface; 145*4882a593Smuzhiyundiff --git a/include/libweston/libweston.h b/include/libweston/libweston.h 146*4882a593Smuzhiyunindex 24e44a2..7bc01e3 100644 147*4882a593Smuzhiyun--- a/include/libweston/libweston.h 148*4882a593Smuzhiyun+++ b/include/libweston/libweston.h 149*4882a593Smuzhiyun@@ -1469,6 +1469,14 @@ struct weston_pointer_constraint { 150*4882a593Smuzhiyun struct wl_listener surface_activate_listener; 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun+enum weston_surface_flags { 154*4882a593Smuzhiyun+ SURFACE_NO_FOCUS = 1 << 0, 155*4882a593Smuzhiyun+ SURFACE_STAY_ON_TOP = 1 << 1, 156*4882a593Smuzhiyun+ SURFACE_STAY_ON_BOTTOM = 1 << 2, 157*4882a593Smuzhiyun+ SURFACE_BLOCKED = 1 << 3, 158*4882a593Smuzhiyun+ SURFACE_TRANS_INPUT = 1 << 4, 159*4882a593Smuzhiyun+}; 160*4882a593Smuzhiyun+ 161*4882a593Smuzhiyun struct weston_surface { 162*4882a593Smuzhiyun struct wl_resource *resource; 163*4882a593Smuzhiyun struct wl_signal destroy_signal; /* callback argument: this surface */ 164*4882a593Smuzhiyun@@ -1575,6 +1583,11 @@ struct weston_surface { 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* Transparent hole region(excluding it's lower subsurface area) */ 167*4882a593Smuzhiyun pixman_region32_t hole; 168*4882a593Smuzhiyun+ 169*4882a593Smuzhiyun+ /* Hacky surface flags */ 170*4882a593Smuzhiyun+ enum weston_surface_flags flags; 171*4882a593Smuzhiyun+ 172*4882a593Smuzhiyun+ double alpha; 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct weston_subsurface { 176*4882a593Smuzhiyundiff --git a/libweston-desktop/surface.c b/libweston-desktop/surface.c 177*4882a593Smuzhiyunindex 21ff080..e86ef52 100644 178*4882a593Smuzhiyun--- a/libweston-desktop/surface.c 179*4882a593Smuzhiyun+++ b/libweston-desktop/surface.c 180*4882a593Smuzhiyun@@ -695,12 +695,202 @@ weston_desktop_surface_set_position(struct weston_desktop_surface *surface, 181*4882a593Smuzhiyun weston_view_set_position(view->view, x, y); 182*4882a593Smuzhiyun } 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun+static bool 185*4882a593Smuzhiyun+weston_desktop_surface_set_flags(struct weston_desktop_surface *surface, 186*4882a593Smuzhiyun+ char *s) 187*4882a593Smuzhiyun+{ 188*4882a593Smuzhiyun+ struct weston_surface *wsurface = surface->surface; 189*4882a593Smuzhiyun+ char *p; 190*4882a593Smuzhiyun+ 191*4882a593Smuzhiyun+#define SURFACE_FLAG_PREFIX "flags=" 192*4882a593Smuzhiyun+ s = strstr(s, SURFACE_FLAG_PREFIX); 193*4882a593Smuzhiyun+ if (!s) 194*4882a593Smuzhiyun+ return false; 195*4882a593Smuzhiyun+ 196*4882a593Smuzhiyun+ s += strlen(SURFACE_FLAG_PREFIX); 197*4882a593Smuzhiyun+ 198*4882a593Smuzhiyun+ p = strtok(s, "|"); 199*4882a593Smuzhiyun+ while (p) { 200*4882a593Smuzhiyun+ enum weston_surface_flags flag = 0; 201*4882a593Smuzhiyun+ bool clear = false; 202*4882a593Smuzhiyun+ 203*4882a593Smuzhiyun+ switch (p[0]) { 204*4882a593Smuzhiyun+ case ';': 205*4882a593Smuzhiyun+ /* fall through */ 206*4882a593Smuzhiyun+ case '&': 207*4882a593Smuzhiyun+ return true; 208*4882a593Smuzhiyun+ case '-': 209*4882a593Smuzhiyun+ clear = true; 210*4882a593Smuzhiyun+ /* fall through */ 211*4882a593Smuzhiyun+ case '+': 212*4882a593Smuzhiyun+ p++; 213*4882a593Smuzhiyun+ default: 214*4882a593Smuzhiyun+ break; 215*4882a593Smuzhiyun+ } 216*4882a593Smuzhiyun+ 217*4882a593Smuzhiyun+ if (!strcmp(p, "no-focus")) 218*4882a593Smuzhiyun+ flag = SURFACE_NO_FOCUS; 219*4882a593Smuzhiyun+ else if (!strcmp(p, "stay-on-top")) 220*4882a593Smuzhiyun+ flag = SURFACE_STAY_ON_TOP; 221*4882a593Smuzhiyun+ else if (!strcmp(p, "stay-on-bottom")) 222*4882a593Smuzhiyun+ flag = SURFACE_STAY_ON_BOTTOM; 223*4882a593Smuzhiyun+ else if (!strcmp(p, "blocked")) 224*4882a593Smuzhiyun+ flag = SURFACE_BLOCKED; 225*4882a593Smuzhiyun+ else if (!strcmp(p, "trans-input")) 226*4882a593Smuzhiyun+ flag = SURFACE_TRANS_INPUT; 227*4882a593Smuzhiyun+ else 228*4882a593Smuzhiyun+ weston_log("%s: warning: unsupported flag: %s\n", 229*4882a593Smuzhiyun+ __func__, p); 230*4882a593Smuzhiyun+ 231*4882a593Smuzhiyun+ if (clear) 232*4882a593Smuzhiyun+ wsurface->flags &= ~flag; 233*4882a593Smuzhiyun+ else 234*4882a593Smuzhiyun+ wsurface->flags |= flag; 235*4882a593Smuzhiyun+ 236*4882a593Smuzhiyun+ p = strtok(NULL, "|"); 237*4882a593Smuzhiyun+ }; 238*4882a593Smuzhiyun+ 239*4882a593Smuzhiyun+ return true; 240*4882a593Smuzhiyun+} 241*4882a593Smuzhiyun+ 242*4882a593Smuzhiyun+static bool 243*4882a593Smuzhiyun+weston_desktop_surface_set_requests(struct weston_desktop_surface *surface, 244*4882a593Smuzhiyun+ char *s) 245*4882a593Smuzhiyun+{ 246*4882a593Smuzhiyun+ struct weston_surface *wsurface = surface->surface; 247*4882a593Smuzhiyun+ char *p; 248*4882a593Smuzhiyun+ 249*4882a593Smuzhiyun+#define SURFACE_REQUEST_PREFIX "requests=" 250*4882a593Smuzhiyun+ s = strstr(s, SURFACE_REQUEST_PREFIX); 251*4882a593Smuzhiyun+ if (!s) 252*4882a593Smuzhiyun+ return false; 253*4882a593Smuzhiyun+ 254*4882a593Smuzhiyun+ s += strlen(SURFACE_REQUEST_PREFIX); 255*4882a593Smuzhiyun+ 256*4882a593Smuzhiyun+ p = strtok(s, "|"); 257*4882a593Smuzhiyun+ while (p) { 258*4882a593Smuzhiyun+ switch (p[0]) { 259*4882a593Smuzhiyun+ case ';': 260*4882a593Smuzhiyun+ /* fall through */ 261*4882a593Smuzhiyun+ case '&': 262*4882a593Smuzhiyun+ return true; 263*4882a593Smuzhiyun+ default: 264*4882a593Smuzhiyun+ break; 265*4882a593Smuzhiyun+ } 266*4882a593Smuzhiyun+ 267*4882a593Smuzhiyun+ if (!strcmp(p, "activate")) { 268*4882a593Smuzhiyun+ if (weston_surface_is_mapped(wsurface)) 269*4882a593Smuzhiyun+ weston_surface_unmap(wsurface); 270*4882a593Smuzhiyun+ 271*4882a593Smuzhiyun+ weston_desktop_api_committed(surface->desktop, 272*4882a593Smuzhiyun+ surface, 0, 0); 273*4882a593Smuzhiyun+ } else { 274*4882a593Smuzhiyun+ weston_log("%s: warning: unsupported request: %s\n", 275*4882a593Smuzhiyun+ __func__, p); 276*4882a593Smuzhiyun+ } 277*4882a593Smuzhiyun+ 278*4882a593Smuzhiyun+ p = strtok(NULL, "|"); 279*4882a593Smuzhiyun+ }; 280*4882a593Smuzhiyun+ 281*4882a593Smuzhiyun+ return true; 282*4882a593Smuzhiyun+} 283*4882a593Smuzhiyun+ 284*4882a593Smuzhiyun+static void 285*4882a593Smuzhiyun+weston_surface_set_alpha(struct weston_surface *wsurface, float alpha) 286*4882a593Smuzhiyun+{ 287*4882a593Smuzhiyun+ struct weston_subsurface *sub; 288*4882a593Smuzhiyun+ struct weston_view *view; 289*4882a593Smuzhiyun+ 290*4882a593Smuzhiyun+ wsurface->alpha = alpha; 291*4882a593Smuzhiyun+ wsurface->is_opaque = !(alpha < 1.0); 292*4882a593Smuzhiyun+ 293*4882a593Smuzhiyun+ wl_list_for_each(view, &wsurface->views, 294*4882a593Smuzhiyun+ surface_link) { 295*4882a593Smuzhiyun+ view->alpha = alpha; 296*4882a593Smuzhiyun+ weston_view_geometry_dirty(view); 297*4882a593Smuzhiyun+ } 298*4882a593Smuzhiyun+ 299*4882a593Smuzhiyun+ wl_list_for_each(sub, &wsurface->subsurface_list, 300*4882a593Smuzhiyun+ parent_link) { 301*4882a593Smuzhiyun+ if (sub->surface != wsurface) 302*4882a593Smuzhiyun+ weston_surface_set_alpha(sub->surface, alpha); 303*4882a593Smuzhiyun+ } 304*4882a593Smuzhiyun+} 305*4882a593Smuzhiyun+ 306*4882a593Smuzhiyun+static bool 307*4882a593Smuzhiyun+weston_desktop_surface_set_attrs(struct weston_desktop_surface *surface, 308*4882a593Smuzhiyun+ char *s) 309*4882a593Smuzhiyun+{ 310*4882a593Smuzhiyun+ struct weston_surface *wsurface = surface->surface; 311*4882a593Smuzhiyun+ char *p; 312*4882a593Smuzhiyun+ 313*4882a593Smuzhiyun+#define SURFACE_ATTRS_PREFIX "attrs=" 314*4882a593Smuzhiyun+ s = strstr(s, SURFACE_ATTRS_PREFIX); 315*4882a593Smuzhiyun+ if (!s) 316*4882a593Smuzhiyun+ return false; 317*4882a593Smuzhiyun+ 318*4882a593Smuzhiyun+ s += strlen(SURFACE_ATTRS_PREFIX); 319*4882a593Smuzhiyun+ 320*4882a593Smuzhiyun+ p = strtok(s, "|"); 321*4882a593Smuzhiyun+ while (p) { 322*4882a593Smuzhiyun+ switch (p[0]) { 323*4882a593Smuzhiyun+ case ';': 324*4882a593Smuzhiyun+ /* fall through */ 325*4882a593Smuzhiyun+ case '&': 326*4882a593Smuzhiyun+ return true; 327*4882a593Smuzhiyun+ default: 328*4882a593Smuzhiyun+ break; 329*4882a593Smuzhiyun+ } 330*4882a593Smuzhiyun+ 331*4882a593Smuzhiyun+#define SURFACE_ATTR_ALPHA "alpha:" 332*4882a593Smuzhiyun+ if (!strncmp(p, SURFACE_ATTR_ALPHA, 333*4882a593Smuzhiyun+ strlen(SURFACE_ATTR_ALPHA))) { 334*4882a593Smuzhiyun+ double alpha = atof(p + strlen(SURFACE_ATTR_ALPHA)); 335*4882a593Smuzhiyun+ 336*4882a593Smuzhiyun+ weston_surface_set_alpha(wsurface, alpha); 337*4882a593Smuzhiyun+ } else { 338*4882a593Smuzhiyun+ weston_log("%s: warning: unsupported attr: %s\n", 339*4882a593Smuzhiyun+ __func__, p); 340*4882a593Smuzhiyun+ } 341*4882a593Smuzhiyun+ 342*4882a593Smuzhiyun+ p = strtok(NULL, "|"); 343*4882a593Smuzhiyun+ }; 344*4882a593Smuzhiyun+ 345*4882a593Smuzhiyun+ return true; 346*4882a593Smuzhiyun+} 347*4882a593Smuzhiyun+ 348*4882a593Smuzhiyun+static bool 349*4882a593Smuzhiyun+weston_desktop_surface_handle_config(struct weston_desktop_surface *surface, 350*4882a593Smuzhiyun+ const char *s) 351*4882a593Smuzhiyun+{ 352*4882a593Smuzhiyun+ char *tmp; 353*4882a593Smuzhiyun+ bool handled = false; 354*4882a593Smuzhiyun+ 355*4882a593Smuzhiyun+ tmp = strdup(s); 356*4882a593Smuzhiyun+ if (tmp == NULL) 357*4882a593Smuzhiyun+ return false; 358*4882a593Smuzhiyun+ 359*4882a593Smuzhiyun+ handled |= weston_desktop_surface_set_flags(surface, tmp); 360*4882a593Smuzhiyun+ 361*4882a593Smuzhiyun+ strcpy(tmp, s); 362*4882a593Smuzhiyun+ handled |= weston_desktop_surface_set_requests(surface, tmp); 363*4882a593Smuzhiyun+ 364*4882a593Smuzhiyun+ strcpy(tmp, s); 365*4882a593Smuzhiyun+ handled |= weston_desktop_surface_set_attrs(surface, tmp); 366*4882a593Smuzhiyun+ 367*4882a593Smuzhiyun+ free(tmp); 368*4882a593Smuzhiyun+ return handled; 369*4882a593Smuzhiyun+} 370*4882a593Smuzhiyun+ 371*4882a593Smuzhiyun void 372*4882a593Smuzhiyun weston_desktop_surface_set_title(struct weston_desktop_surface *surface, 373*4882a593Smuzhiyun const char *title) 374*4882a593Smuzhiyun { 375*4882a593Smuzhiyun char *tmp, *old; 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun+ if (weston_desktop_surface_handle_config(surface, title)) 378*4882a593Smuzhiyun+ return; 379*4882a593Smuzhiyun+ 380*4882a593Smuzhiyun tmp = strdup(title); 381*4882a593Smuzhiyun if (tmp == NULL) 382*4882a593Smuzhiyun return; 383*4882a593Smuzhiyun@@ -717,6 +907,9 @@ weston_desktop_surface_set_app_id(struct weston_desktop_surface *surface, 384*4882a593Smuzhiyun { 385*4882a593Smuzhiyun char *tmp, *old; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun+ if (weston_desktop_surface_handle_config(surface, app_id)) 388*4882a593Smuzhiyun+ return; 389*4882a593Smuzhiyun+ 390*4882a593Smuzhiyun tmp = strdup(app_id); 391*4882a593Smuzhiyun if (tmp == NULL) 392*4882a593Smuzhiyun return; 393*4882a593Smuzhiyundiff --git a/libweston/compositor.c b/libweston/compositor.c 394*4882a593Smuzhiyunindex 0aa9d1a..b959424 100644 395*4882a593Smuzhiyun--- a/libweston/compositor.c 396*4882a593Smuzhiyun+++ b/libweston/compositor.c 397*4882a593Smuzhiyun@@ -412,7 +412,7 @@ weston_view_create(struct weston_surface *surface) 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun pixman_region32_init(&view->clip); 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun- view->alpha = 1.0; 402*4882a593Smuzhiyun+ view->alpha = surface->alpha; 403*4882a593Smuzhiyun pixman_region32_init(&view->transform.opaque); 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun wl_list_init(&view->geometry.transformation_list); 406*4882a593Smuzhiyun@@ -608,6 +608,8 @@ weston_surface_create(struct weston_compositor *compositor) 407*4882a593Smuzhiyun surface->compositor = compositor; 408*4882a593Smuzhiyun surface->ref_count = 1; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun+ surface->alpha = 1.0; 411*4882a593Smuzhiyun+ 412*4882a593Smuzhiyun surface->buffer_viewport.buffer.transform = WL_OUTPUT_TRANSFORM_NORMAL; 413*4882a593Smuzhiyun surface->buffer_viewport.buffer.scale = 1; 414*4882a593Smuzhiyun surface->buffer_viewport.buffer.src_width = wl_fixed_from_int(-1); 415*4882a593Smuzhiyun@@ -2217,6 +2219,12 @@ weston_compositor_pick_view(struct weston_compositor *compositor, 416*4882a593Smuzhiyun view_ix, view_iy, NULL)) 417*4882a593Smuzhiyun continue; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun+ if (view->surface->flags & SURFACE_BLOCKED) 420*4882a593Smuzhiyun+ break; 421*4882a593Smuzhiyun+ 422*4882a593Smuzhiyun+ if (view->surface->flags & SURFACE_TRANS_INPUT) 423*4882a593Smuzhiyun+ continue; 424*4882a593Smuzhiyun+ 425*4882a593Smuzhiyun *vx = view_x; 426*4882a593Smuzhiyun *vy = view_y; 427*4882a593Smuzhiyun return view; 428*4882a593Smuzhiyun-- 429*4882a593Smuzhiyun2.20.1 430*4882a593Smuzhiyun 431