mirror of
				https://github.com/DreamMaoMao/maomaowm.git
				synced 2025-11-03 09:01:47 -05:00 
			
		
		
		
	opt: scroller window no cross monitor
This commit is contained in:
		
							parent
							
								
									17225685c1
								
							
						
					
					
						commit
						f2d307b1d1
					
				
					 1 changed files with 106 additions and 70 deletions
				
			
		
							
								
								
									
										176
									
								
								maomao.c
									
										
									
									
									
								
							
							
						
						
									
										176
									
								
								maomao.c
									
										
									
									
									
								
							| 
						 | 
					@ -78,6 +78,7 @@
 | 
				
			||||||
/* macros */
 | 
					/* macros */
 | 
				
			||||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
 | 
					#define MAX(A, B) ((A) > (B) ? (A) : (B))
 | 
				
			||||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
 | 
					#define MIN(A, B) ((A) < (B) ? (A) : (B))
 | 
				
			||||||
 | 
					#define GEZERO(A) ((A) >= 0 ? (A) : 0)
 | 
				
			||||||
#define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS)
 | 
					#define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS)
 | 
				
			||||||
#define VISIBLEON(C, M)                                                        \
 | 
					#define VISIBLEON(C, M)                                                        \
 | 
				
			||||||
  ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags]))
 | 
					  ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags]))
 | 
				
			||||||
| 
						 | 
					@ -247,7 +248,7 @@ struct Client {
 | 
				
			||||||
  // struct wl_event_source *timer_tick;
 | 
					  // struct wl_event_source *timer_tick;
 | 
				
			||||||
  pid_t pid;
 | 
					  pid_t pid;
 | 
				
			||||||
  Client *swallowing, *swallowedby;
 | 
					  Client *swallowing, *swallowedby;
 | 
				
			||||||
  bool need_scale_first_frame;
 | 
					  bool is_clip_to_hide;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -708,6 +709,10 @@ struct vec2 {
 | 
				
			||||||
  double x, y;
 | 
					  double x, y;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct uvec2 {
 | 
				
			||||||
 | 
					  int x, y;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BAKED_POINTS_COUNT 256
 | 
					#define BAKED_POINTS_COUNT 256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct vec2 *baked_points_move;
 | 
					struct vec2 *baked_points_move;
 | 
				
			||||||
| 
						 | 
					@ -964,37 +969,38 @@ void client_actual_size(Client *c, uint32_t *width, uint32_t *height) {
 | 
				
			||||||
  *height = c->animation.current.height;
 | 
					  *height = c->animation.current.height;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void set_rect_size(struct wlr_scene_rect *rect, int width, int height) {
 | 
				
			||||||
 | 
					  wlr_scene_rect_set_size(rect, GEZERO(width), GEZERO(height));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void apply_border(Client *c, struct wlr_box clip_box, int offsetx,
 | 
					void apply_border(Client *c, struct wlr_box clip_box, int offsetx,
 | 
				
			||||||
                  int offsety) {
 | 
					                  int offsety) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (c->iskilling || !client_surface(c)->mapped)
 | 
					  if (c->iskilling || !client_surface(c)->mapped)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(clip_box.width <= 0 || clip_box.height <= 0)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw);
 | 
					  wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw);
 | 
				
			||||||
  wlr_scene_rect_set_size(c->border[0], clip_box.width, c->bw);
 | 
					  set_rect_size(c->border[0], clip_box.width, c->bw);
 | 
				
			||||||
  wlr_scene_rect_set_size(c->border[1], clip_box.width, c->bw);
 | 
					  set_rect_size(c->border[1], clip_box.width, c->bw);
 | 
				
			||||||
  wlr_scene_rect_set_size(c->border[2], c->bw, clip_box.height - 2 * c->bw);
 | 
					  set_rect_size(c->border[2], c->bw, clip_box.height - 2 * c->bw);
 | 
				
			||||||
  wlr_scene_rect_set_size(c->border[3], c->bw, clip_box.height - 2 * c->bw);
 | 
					  set_rect_size(c->border[3], c->bw, clip_box.height - 2 * c->bw);
 | 
				
			||||||
  wlr_scene_node_set_position(&c->border[0]->node, 0, 0);
 | 
					  wlr_scene_node_set_position(&c->border[0]->node, 0, 0);
 | 
				
			||||||
  wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw);
 | 
					  wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw);
 | 
				
			||||||
  wlr_scene_node_set_position(&c->border[1]->node, 0, clip_box.height - c->bw);
 | 
					  wlr_scene_node_set_position(&c->border[1]->node, 0, clip_box.height - c->bw);
 | 
				
			||||||
  wlr_scene_node_set_position(&c->border[3]->node, clip_box.width - c->bw,
 | 
					  wlr_scene_node_set_position(&c->border[3]->node, clip_box.width - c->bw,
 | 
				
			||||||
                              c->bw);
 | 
					                              c->bw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (c->animation.running && c->animation.action != MOVE) {
 | 
					  if (c->istiled) {
 | 
				
			||||||
    if (c->animation.current.x < c->mon->m.x) {
 | 
					    if (c->animation.current.x < c->mon->m.x) {
 | 
				
			||||||
      wlr_scene_rect_set_size(c->border[2], 0, 0);
 | 
					      set_rect_size(c->border[2], 0, 0);
 | 
				
			||||||
    } else if (c->animation.current.x + c->animation.current.width >
 | 
					    } else if (c->animation.current.x + c->animation.current.width >
 | 
				
			||||||
               c->mon->m.x + c->mon->m.width) {
 | 
					               c->mon->m.x + c->mon->m.width) {
 | 
				
			||||||
      wlr_scene_rect_set_size(c->border[3], 0, 0);
 | 
					      set_rect_size(c->border[3], 0, 0);
 | 
				
			||||||
    } else if (c->animation.current.y < c->mon->m.y) {
 | 
					    } else if (c->animation.current.y < c->mon->m.y) {
 | 
				
			||||||
      wlr_scene_rect_set_size(c->border[0], 0, 0);
 | 
					      set_rect_size(c->border[0], 0, 0);
 | 
				
			||||||
    } else if (c->animation.current.y + c->animation.current.height >
 | 
					    } else if (c->animation.current.y + c->animation.current.height >
 | 
				
			||||||
               c->mon->m.y + c->mon->m.height) {
 | 
					               c->mon->m.y + c->mon->m.height) {
 | 
				
			||||||
      wlr_scene_rect_set_size(c->border[1], 0, 0);
 | 
					      set_rect_size(c->border[1], 0, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1006,27 +1012,82 @@ void apply_border(Client *c, struct wlr_box clip_box, int offsetx,
 | 
				
			||||||
      &c->border[3]->node, clip_box.width - c->bw + offsetx, c->bw + offsety);
 | 
					      &c->border[3]->node, clip_box.width - c->bw + offsetx, c->bw + offsety);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct uvec2 clip_to_hide(Client *c, struct wlr_box *clip_box) {
 | 
				
			||||||
 | 
					  int offsetx=0;
 | 
				
			||||||
 | 
					  int offsety=0;
 | 
				
			||||||
 | 
					  struct uvec2 offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // // make tagout tagin animations not visible in other monitors
 | 
				
			||||||
 | 
					  if (c->istiled) {
 | 
				
			||||||
 | 
					    if (c->animation.current.x <= c->mon->m.x) {
 | 
				
			||||||
 | 
					      offsetx = c->mon->m.x - c->animation.current.x;
 | 
				
			||||||
 | 
					      clip_box->x = clip_box->x + offsetx;
 | 
				
			||||||
 | 
					      clip_box->width = clip_box->width - offsetx;
 | 
				
			||||||
 | 
					    } else if (c->animation.current.x + c->animation.current.width >=
 | 
				
			||||||
 | 
					               c->mon->m.x + c->mon->m.width) {
 | 
				
			||||||
 | 
					      clip_box->width = clip_box->width -
 | 
				
			||||||
 | 
					                       (c->animation.current.x + c->animation.current.width -
 | 
				
			||||||
 | 
					                        c->mon->m.x - c->mon->m.width);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (c->animation.current.y <= c->mon->m.y) {
 | 
				
			||||||
 | 
					      offsety = c->mon->m.y - c->animation.current.y;
 | 
				
			||||||
 | 
					      clip_box->y = clip_box->y + offsety;
 | 
				
			||||||
 | 
					      clip_box->height = clip_box->height - offsety;
 | 
				
			||||||
 | 
					    } else if (c->animation.current.y + c->animation.current.height >=
 | 
				
			||||||
 | 
					               c->mon->m.y + c->mon->m.height) {
 | 
				
			||||||
 | 
					      clip_box->height = clip_box->height -
 | 
				
			||||||
 | 
					                        (c->animation.current.y + c->animation.current.height -
 | 
				
			||||||
 | 
					                         c->mon->m.y - c->mon->m.height);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  offset.x = offsetx;
 | 
				
			||||||
 | 
					  offset.y = offsety;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if((clip_box->width <= 0 || clip_box->height <= 0) && (c->istiled)) {
 | 
				
			||||||
 | 
					    c->is_clip_to_hide = true;
 | 
				
			||||||
 | 
					    wlr_scene_node_set_enabled(&c->scene->node, false);
 | 
				
			||||||
 | 
					  } else if(c->is_clip_to_hide && VISIBLEON(c, c->mon)) {
 | 
				
			||||||
 | 
					    c->is_clip_to_hide = false;
 | 
				
			||||||
 | 
					    wlr_scene_node_set_enabled(&c->scene->node, true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return offset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void apply_buffer_scale(Client *c, struct wlr_box clip_box ) {
 | 
				
			||||||
 | 
					  animationScale scale_data;
 | 
				
			||||||
 | 
					  scale_data.width = clip_box.width - 2 * c->bw;
 | 
				
			||||||
 | 
					  scale_data.height = clip_box.height - 2 * c->bw;
 | 
				
			||||||
 | 
					  scale_data.m = c->mon;
 | 
				
			||||||
 | 
					  scale_data.width_scale = (float)clip_box.width / c->current.width;
 | 
				
			||||||
 | 
					  scale_data.height_scale = (float)clip_box.height / c->current.height;
 | 
				
			||||||
 | 
					  buffer_set_size(c, scale_data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void client_apply_clip(Client *c) {
 | 
					void client_apply_clip(Client *c) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (c->iskilling || !client_surface(c)->mapped)
 | 
					  if (c->iskilling || !client_surface(c)->mapped)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  struct wlr_box clip_box;
 | 
					  struct wlr_box clip_box;
 | 
				
			||||||
 | 
					  struct uvec2 offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!animations) {
 | 
					  if (!animations) {
 | 
				
			||||||
    c->animation.running = false;
 | 
					    c->animation.running = false;
 | 
				
			||||||
    c->need_output_flush = false;
 | 
					    c->need_output_flush = false;
 | 
				
			||||||
    c->animainit_geom = c->current = c->pending = c->animation.current =
 | 
					    c->animainit_geom = c->current = c->pending = c->animation.current =
 | 
				
			||||||
        c->geom;
 | 
					        c->geom;
 | 
				
			||||||
    apply_border(c, c->geom, 0, 0);
 | 
					 | 
				
			||||||
    client_get_clip(c, &clip_box);
 | 
					    client_get_clip(c, &clip_box);
 | 
				
			||||||
 | 
					    offset = clip_to_hide(c, &clip_box);
 | 
				
			||||||
 | 
					    apply_border(c, clip_box, offset.x, offset.y);
 | 
				
			||||||
    wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip_box);
 | 
					    wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip_box);
 | 
				
			||||||
 | 
					    /* apply_buffer_scale(c, clip_box); */
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint32_t width, height;
 | 
					  uint32_t width, height;
 | 
				
			||||||
  client_actual_size(c, &width, &height);
 | 
					  client_actual_size(c, &width, &height);
 | 
				
			||||||
  int offsetx = 0;
 | 
					 | 
				
			||||||
  int offsety = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  struct wlr_box geometry;
 | 
					  struct wlr_box geometry;
 | 
				
			||||||
  client_get_geometry(c, &geometry);
 | 
					  client_get_geometry(c, &geometry);
 | 
				
			||||||
| 
						 | 
					@ -1042,41 +1103,11 @@ void client_apply_clip(Client *c) {
 | 
				
			||||||
    clip_box.y = 0;
 | 
					    clip_box.y = 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // // make tagout tagin animations not visible in other monitors
 | 
					  offset = clip_to_hide(c, &clip_box);
 | 
				
			||||||
  if (c->animation.running && c->animation.action != MOVE) {
 | 
					 | 
				
			||||||
    if (c->animation.current.x <= c->mon->m.x) {
 | 
					 | 
				
			||||||
      offsetx = c->mon->m.x - c->animation.current.x;
 | 
					 | 
				
			||||||
      clip_box.x = clip_box.x + offsetx;
 | 
					 | 
				
			||||||
      clip_box.width = clip_box.width - offsetx;
 | 
					 | 
				
			||||||
    } else if (c->animation.current.x + c->animation.current.width >=
 | 
					 | 
				
			||||||
               c->mon->m.x + c->mon->m.width) {
 | 
					 | 
				
			||||||
      clip_box.width = clip_box.width -
 | 
					 | 
				
			||||||
                       (c->animation.current.x + c->animation.current.width -
 | 
					 | 
				
			||||||
                        c->mon->m.x - c->mon->m.width);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (c->animation.current.y <= c->mon->m.y) {
 | 
					 | 
				
			||||||
      offsety = c->mon->m.y - c->animation.current.y;
 | 
					 | 
				
			||||||
      clip_box.y = clip_box.y + offsety;
 | 
					 | 
				
			||||||
      clip_box.height = clip_box.height - offsety;
 | 
					 | 
				
			||||||
    } else if (c->animation.current.y + c->animation.current.height >=
 | 
					 | 
				
			||||||
               c->mon->m.y + c->mon->m.height) {
 | 
					 | 
				
			||||||
      clip_box.height = clip_box.height -
 | 
					 | 
				
			||||||
                        (c->animation.current.y + c->animation.current.height -
 | 
					 | 
				
			||||||
                         c->mon->m.y - c->mon->m.height);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  animationScale scale_data;
 | 
					 | 
				
			||||||
  scale_data.width = clip_box.width - 2 * c->bw;
 | 
					 | 
				
			||||||
  scale_data.height = clip_box.height - 2 * c->bw;
 | 
					 | 
				
			||||||
  scale_data.m = c->mon;
 | 
					 | 
				
			||||||
  wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip_box);
 | 
					  wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip_box);
 | 
				
			||||||
  apply_border(c, clip_box, offsetx, offsety);
 | 
					  apply_border(c, clip_box, offset.x, offset.y);
 | 
				
			||||||
 | 
					  apply_buffer_scale(c,clip_box);
 | 
				
			||||||
  scale_data.width_scale = (float)clip_box.width / c->current.width;
 | 
					 | 
				
			||||||
  scale_data.height_scale = (float)clip_box.height / c->current.height;
 | 
					 | 
				
			||||||
  buffer_set_size(c, scale_data);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool client_draw_frame(Client *c) {
 | 
					bool client_draw_frame(Client *c) {
 | 
				
			||||||
| 
						 | 
					@ -1526,6 +1557,9 @@ void // 17
 | 
				
			||||||
arrange(Monitor *m, bool want_animation) {
 | 
					arrange(Monitor *m, bool want_animation) {
 | 
				
			||||||
  Client *c;
 | 
					  Client *c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(!m)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!m->wlr_output->enabled)
 | 
					  if (!m->wlr_output->enabled)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1541,7 +1575,10 @@ arrange(Monitor *m, bool want_animation) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (c->mon == m) {
 | 
					    if (c->mon == m) {
 | 
				
			||||||
      if (VISIBLEON(c, m)) {
 | 
					      if (VISIBLEON(c, m)) {
 | 
				
			||||||
        wlr_scene_node_set_enabled(&c->scene->node, true);
 | 
					        if(!c->is_clip_to_hide || strcmp(c->mon->pertag->ltidxs[c->mon->pertag->curtag]->name,
 | 
				
			||||||
 | 
					             "scroller") != 0) {
 | 
				
			||||||
 | 
					          wlr_scene_node_set_enabled(&c->scene->node, true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        client_set_suspended(c, false);
 | 
					        client_set_suspended(c, false);
 | 
				
			||||||
        if (!c->animation.from_rule && want_animation &&
 | 
					        if (!c->animation.from_rule && want_animation &&
 | 
				
			||||||
            m->pertag->prevtag != 0 && m->pertag->curtag != 0 && animations) {
 | 
					            m->pertag->prevtag != 0 && m->pertag->curtag != 0 && animations) {
 | 
				
			||||||
| 
						 | 
					@ -1550,7 +1587,7 @@ arrange(Monitor *m, bool want_animation) {
 | 
				
			||||||
            c->animainit_geom.x =
 | 
					            c->animainit_geom.x =
 | 
				
			||||||
                c->animation.running
 | 
					                c->animation.running
 | 
				
			||||||
                    ? c->animation.current.x
 | 
					                    ? c->animation.current.x
 | 
				
			||||||
                    : c->geom.x + c->mon->m.width - (c->geom.x - c->mon->m.x);
 | 
					                    : c->mon->m.x + c->mon->m.width;
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            c->animainit_geom.x = c->animation.running ? c->animation.current.x
 | 
					            c->animainit_geom.x = c->animation.running ? c->animation.current.x
 | 
				
			||||||
                                                       : m->m.x - c->geom.width;
 | 
					                                                       : m->m.x - c->geom.width;
 | 
				
			||||||
| 
						 | 
					@ -1575,7 +1612,7 @@ arrange(Monitor *m, bool want_animation) {
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            c->pending = c->geom;
 | 
					            c->pending = c->geom;
 | 
				
			||||||
            c->pending.x =
 | 
					            c->pending.x =
 | 
				
			||||||
                c->geom.x + c->mon->m.width - (c->geom.x - c->mon->m.x);
 | 
					                c->mon->m.x + c->mon->m.width;
 | 
				
			||||||
            resize(c, c->geom, 0);
 | 
					            resize(c, c->geom, 0);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
| 
						 | 
					@ -2233,15 +2270,16 @@ void commitnotify(struct wl_listener *listener, void *data) {
 | 
				
			||||||
  if (c == grabc)
 | 
					  if (c == grabc)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint32_t width, height;
 | 
					  if(!c->dirty)
 | 
				
			||||||
  client_actual_size(c, &width, &height);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if(c->geom.width == width && c->geom.height == height) 
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // if don't do this, some client may resize uncompleted
 | 
						wlr_log(WLR_DEBUG, "app commit event handle:%s",client_get_appid(c));
 | 
				
			||||||
  resize(c, c->geom, (c->isfloating && !c->isfullscreen));
 | 
					  resize(c, c->geom, (c->isfloating && !c->isfullscreen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint32_t width, height;
 | 
				
			||||||
 | 
					  client_actual_size(c, &width, &height);
 | 
				
			||||||
 | 
					  if(width == c->geom.width && height == c->geom.height)
 | 
				
			||||||
 | 
					    c->dirty = false;
 | 
				
			||||||
  // if (c->configure_serial && c->configure_serial <=
 | 
					  // if (c->configure_serial && c->configure_serial <=
 | 
				
			||||||
  // c->surface.xdg->current.configure_serial) 	c->configure_serial = 0;
 | 
					  // c->surface.xdg->current.configure_serial) 	c->configure_serial = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3683,7 +3721,6 @@ mapnotify(struct wl_listener *listener, void *data) {
 | 
				
			||||||
  c->istiled = 0;
 | 
					  c->istiled = 0;
 | 
				
			||||||
  c->iskilling = 0;
 | 
					  c->iskilling = 0;
 | 
				
			||||||
  c->scroller_proportion = scroller_default_proportion;
 | 
					  c->scroller_proportion = scroller_default_proportion;
 | 
				
			||||||
  c->need_scale_first_frame = true;
 | 
					 | 
				
			||||||
  // nop
 | 
					  // nop
 | 
				
			||||||
  if (new_is_master &&
 | 
					  if (new_is_master &&
 | 
				
			||||||
      strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name,
 | 
					      strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name,
 | 
				
			||||||
| 
						 | 
					@ -4143,6 +4180,7 @@ void scene_buffer_apply_opacity(struct wlr_scene_buffer *buffer, int sx, int sy,
 | 
				
			||||||
  wlr_scene_buffer_set_opacity(buffer, *(double *)data);
 | 
					  wlr_scene_buffer_set_opacity(buffer, *(double *)data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx, int sy,
 | 
					void scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx, int sy,
 | 
				
			||||||
                             void *data) {
 | 
					                             void *data) {
 | 
				
			||||||
  animationScale *scale_data = (animationScale *)data;
 | 
					  animationScale *scale_data = (animationScale *)data;
 | 
				
			||||||
| 
						 | 
					@ -4167,13 +4205,12 @@ void scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx, int sy,
 | 
				
			||||||
  surface_width *= scale_data->width_scale;
 | 
					  surface_width *= scale_data->width_scale;
 | 
				
			||||||
  surface_height *= scale_data->height_scale;
 | 
					  surface_height *= scale_data->height_scale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (wlr_subsurface_try_from_wlr_surface(surface) != NULL && 
 | 
					  if (wlr_subsurface_try_from_wlr_surface(surface) != NULL && 
 | 
				
			||||||
      surface_width <= scale_data->m->m.width && 
 | 
					      surface_width <= scale_data->m->m.width && 
 | 
				
			||||||
      surface_height <= scale_data->m->m.height &&
 | 
					      surface_height <= scale_data->m->m.height &&
 | 
				
			||||||
      surface_height > 0 && surface_width > 0) {
 | 
					      surface_height > 0 && surface_width > 0) {
 | 
				
			||||||
    wlr_scene_buffer_set_dest_size(buffer, surface_width, surface_height);
 | 
					    wlr_scene_buffer_set_dest_size(buffer, surface_width, surface_height);
 | 
				
			||||||
  } else {
 | 
					  } else if(scale_data->width >0 && scale_data->height > 0) {
 | 
				
			||||||
    wlr_scene_buffer_set_dest_size(buffer, scale_data->width,
 | 
					    wlr_scene_buffer_set_dest_size(buffer, scale_data->width,
 | 
				
			||||||
                                   scale_data->height);
 | 
					                                   scale_data->height);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -4187,15 +4224,8 @@ void snap_scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void buffer_set_size(Client *c, animationScale data) {
 | 
					void buffer_set_size(Client *c, animationScale data) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (c->animation.current.width <= c->geom.width &&
 | 
					  if (c->iskilling || c->animation.tagouting ||
 | 
				
			||||||
      c->animation.current.height <= c->geom.height && !c->need_scale_first_frame) {
 | 
					      c->animation.tagouted || c->animation.tagining) {
 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  c->need_scale_first_frame = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (c->iskilling || c->animation.tagouting || c->animation.tagining ||
 | 
					 | 
				
			||||||
      c->animation.tagouted) {
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4440,6 +4470,7 @@ void set_open_animaiton(Client *c, struct wlr_box geo) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void resize(Client *c, struct wlr_box geo, int interact) {
 | 
					void resize(Client *c, struct wlr_box geo, int interact) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 动画设置的起始函数,这里用来计算一些动画的起始值
 | 
					  // 动画设置的起始函数,这里用来计算一些动画的起始值
 | 
				
			||||||
| 
						 | 
					@ -4454,8 +4485,9 @@ void resize(Client *c, struct wlr_box geo, int interact) {
 | 
				
			||||||
  if (!c->mon)
 | 
					  if (!c->mon)
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // wl_event_source_timer_update(c->timer_tick, 10);
 | 
					  // wl_event_source_timer_update(c->timer_tick, 10);
 | 
				
			||||||
  c->need_output_flush = true;
 | 
					  c->need_output_flush = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // oldgeom = c->geom;
 | 
					  // oldgeom = c->geom;
 | 
				
			||||||
  bbox = interact ? &sgeom : &c->mon->w;
 | 
					  bbox = interact ? &sgeom : &c->mon->w;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4471,6 +4503,10 @@ void resize(Client *c, struct wlr_box geo, int interact) {
 | 
				
			||||||
        c, bbox); // 去掉这个推荐的窗口大小,因为有时推荐的窗口特别大导致平铺异常
 | 
					        c, bbox); // 去掉这个推荐的窗口大小,因为有时推荐的窗口特别大导致平铺异常
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(c->geom.width <0 || c->geom.height <0) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!c->is_open_animation) {
 | 
					  if (!c->is_open_animation) {
 | 
				
			||||||
    c->animation.begin_fade_in = false;
 | 
					    c->animation.begin_fade_in = false;
 | 
				
			||||||
    client_set_opacity(c, 1);
 | 
					    client_set_opacity(c, 1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue