diff --git a/src/dispatch/bind_define.h b/src/dispatch/bind_define.h index 6544cab..80512d7 100644 --- a/src/dispatch/bind_define.h +++ b/src/dispatch/bind_define.h @@ -31,8 +31,14 @@ int bind_to_view(const Arg *arg) { } int chvt(const Arg *arg) { + + if (selmon) { + chvt_backup_tag = selmon->pertag->curtag; + strncpy(chvt_backup_selmon, selmon->wlr_output->name, + sizeof(chvt_backup_selmon) - 1); + } wlr_session_change_vt(session, arg->ui); - return 0; + return 1; } int create_virtual_output(const Arg *arg) { diff --git a/src/mango.c b/src/mango.c index 230387c..fe5f4cb 100644 --- a/src/mango.c +++ b/src/mango.c @@ -845,6 +845,9 @@ static double swipe_dy = 0; bool render_border = true; +uint32_t chvt_backup_tag = 0; +char chvt_backup_selmon[32] = {0}; + struct dvec2 *baked_points_move; struct dvec2 *baked_points_open; struct dvec2 *baked_points_tag; @@ -2705,7 +2708,6 @@ void createmon(struct wl_listener *listener, void *data) { m->isoverview = 0; m->sel = NULL; m->is_in_hotarea = 0; - m->tagset[0] = m->tagset[1] = 1; float scale = 1; m->mfact = default_mfact; m->nmaster = default_nmaster; @@ -2777,7 +2779,16 @@ void createmon(struct wl_listener *listener, void *data) { wl_list_insert(&mons, &m->link); m->pertag = calloc(1, sizeof(Pertag)); - m->pertag->curtag = m->pertag->prevtag = 1; + if (chvt_backup_tag && + regex_match(chvt_backup_selmon, m->wlr_output->name)) { + m->tagset[0] = m->tagset[1] = (1 << (chvt_backup_tag - 1)) & TAGMASK; + m->pertag->curtag = m->pertag->prevtag = chvt_backup_tag; + chvt_backup_tag = 0; + memset(chvt_backup_selmon, 0, sizeof(chvt_backup_selmon)); + } else { + m->tagset[0] = m->tagset[1] = 1; + m->pertag->curtag = m->pertag->prevtag = 1; + } for (i = 0; i <= LENGTH(tags); i++) { m->pertag->nmasters[i] = m->nmaster; @@ -4232,10 +4243,18 @@ void rendermon(struct wl_listener *listener, void *data) { LayerSurface *l = NULL, *tmpl = NULL; int i; struct wl_list *layer_list; - + bool frame_allow_tearing = false; struct timespec now; bool need_more_frames = false; - bool frame_allow_tearing = check_tearing_frame_allow(m); + + if (session && !session->active) { + return; + } + + if (!m->wlr_output->enabled) + return; + + frame_allow_tearing = check_tearing_frame_allow(m); // 绘制层和淡出效果 for (i = 0; i < LENGTH(m->layers); i++) {