diff --git a/config.conf b/config.conf index f4c1ab0..30f9fec 100644 --- a/config.conf +++ b/config.conf @@ -85,6 +85,7 @@ maxmizescreencolor=0x89aa61ff urgentcolor=0xad401fff scratchpadcolor=0x516c93ff globalcolor=0xb153a7ff +overlaycolor=0x14a57cff # layout circle limit # if not set, it will circle all layout @@ -196,6 +197,7 @@ bind=ALT,a,togglemaxmizescreen, bind=ALT,f,togglefullscreen, bind=ALT+SHIFT,f,togglefakefullscreen, bind=SUPER,i,minized, +bind=SUPER,o,toggleoverlay, bind=SUPER+SHIFT,I,restore_minized bind=ALT,z,toggle_scratchpad diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 501979b..aa2c1e7 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -162,6 +162,7 @@ typedef struct { float urgentcolor[4]; float scratchpadcolor[4]; float globalcolor[4]; + float overlaycolor[4]; char autostart[3][256]; @@ -460,6 +461,8 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value) { func = togglefullscreen; } else if (strcmp(func_name, "togglefakefullscreen") == 0) { func = togglefakefullscreen; + } else if (strcmp(func_name, "toggleoverlay") == 0) { + func = toggleoverlay; } else if (strcmp(func_name, "minized") == 0) { func = minized; } else if (strcmp(func_name, "restore_minized") == 0) { @@ -834,6 +837,13 @@ void parse_config_line(Config *config, const char *line) { } else { convert_hex_to_rgba(config->globalcolor, color); } + } else if (strcmp(key, "overlaycolor") == 0) { + long int color = parse_color(value); + if (color == -1) { + fprintf(stderr, "Error: Invalid overlaycolor format: %s\n", value); + } else { + convert_hex_to_rgba(config->overlaycolor, color); + } } else if (strcmp(key, "autostart") == 0) { if (sscanf(value, "%[^,],%[^,],%[^,]", config->autostart[0], config->autostart[1], config->autostart[2]) != 3) { @@ -1272,6 +1282,7 @@ void override_config(void) { memcpy(urgentcolor, config.urgentcolor, sizeof(urgentcolor)); memcpy(scratchpadcolor, config.scratchpadcolor, sizeof(scratchpadcolor)); memcpy(globalcolor, config.globalcolor, sizeof(globalcolor)); + memcpy(overlaycolor, config.overlaycolor, sizeof(overlaycolor)); } void set_value_default() { @@ -1367,6 +1378,7 @@ void set_value_default() { memcpy(config.urgentcolor, urgentcolor, sizeof(urgentcolor)); memcpy(config.scratchpadcolor, scratchpadcolor, sizeof(scratchpadcolor)); memcpy(config.globalcolor, globalcolor, sizeof(globalcolor)); + memcpy(config.overlaycolor, overlaycolor, sizeof(overlaycolor)); } void set_default_key_bindings(Config *config) { diff --git a/src/config/preset_config.h b/src/config/preset_config.h index 20f0a29..5e37709 100644 --- a/src/config/preset_config.h +++ b/src/config/preset_config.h @@ -67,6 +67,7 @@ float maxmizescreencolor[] = COLOR(0x89aa61ff); float urgentcolor[] = COLOR(0xad401fff); float scratchpadcolor[] = COLOR(0x516c93ff); float globalcolor[] = COLOR(0xb153a7ff); +float overlaycolor[] = COLOR(0x14a57cff); // char *cursor_theme = "Bibata-Modern-Ice"; int overviewgappi = 5; /* overview时 窗口与边缘 缝隙大小 */ diff --git a/src/dispatch/dispatch.h b/src/dispatch/dispatch.h index 2f8e8a5..48469f5 100644 --- a/src/dispatch/dispatch.h +++ b/src/dispatch/dispatch.h @@ -50,3 +50,4 @@ void incovgaps(const Arg *arg); void incigaps(const Arg *arg); void defaultgaps(const Arg *arg); void togglefakefullscreen(const Arg *arg); +void toggleoverlay(const Arg *arg); diff --git a/src/maomao.c b/src/maomao.c index 67bc01b..8f4e0f8 100644 --- a/src/maomao.c +++ b/src/maomao.c @@ -231,7 +231,7 @@ struct Client { bool dirty; uint32_t configure_serial; struct wlr_foreign_toplevel_handle_v1 *foreign_toplevel; - int isfloating, isurgent, isfullscreen, isfakefullscreen, need_float_size_reduce, isminied; + int isfloating, isurgent, isfullscreen, isfakefullscreen, need_float_size_reduce, isminied, isoverlay; int ismaxmizescreen; int overview_backup_bw; int fullscreen_backup_x, fullscreen_backup_y, fullscreen_backup_w, @@ -1244,6 +1244,24 @@ void clear_fullscreen_flag(Client *c) { } } +void toggleoverlay(const Arg *arg) { + if (!selmon->sel || !selmon->sel->mon || selmon->sel->isfullscreen) { + return; + } + + selmon->sel->isoverlay ^= 1; + + if (selmon->sel->isoverlay) { + wlr_scene_node_reparent(&selmon->sel->scene->node, + layers[LyrFS]); + wlr_scene_node_raise_to_top(&selmon->sel->scene->node); + } else { + wlr_scene_node_reparent(&selmon->sel->scene->node, + layers[selmon->sel->isfloating ? LyrFloat : LyrTile]); + } + setborder_color(selmon->sel); +} + void minized(const Arg *arg) { if (selmon->sel && !selmon->sel->isminied) { set_minized(selmon->sel); @@ -4094,6 +4112,7 @@ mapnotify(struct wl_listener *listener, void *data) { c->iskilling = 0; c->isglobal = 0; c->isminied = 0; + c->isoverlay = 0; c->is_in_scratchpad = 0; c->is_scratchpad_show = 0; c->need_float_size_reduce = 0; @@ -4695,7 +4714,9 @@ void setborder_color(Client *c) { client_set_border_color(c, scratchpadcolor); } else if (c->isglobal && selmon && c == selmon->sel) { client_set_border_color(c, globalcolor); - } else if (c->ismaxmizescreen && selmon && c == selmon->sel) { + } else if (c->isoverlay && selmon && c == selmon->sel) { + client_set_border_color(c, overlaycolor); + } else if (c->ismaxmizescreen && selmon && c == selmon->sel) { client_set_border_color(c, maxmizescreencolor); } else if (selmon && c == selmon->sel) { client_set_border_color(c, focuscolor);