screen: make tags array overwritable
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
530f27e4a1
commit
40c455046b
3
lua.c
3
lua.c
|
@ -645,7 +645,8 @@ luaA_parserc(const char *confpatharg)
|
||||||
/* Assure there's at least one tag */
|
/* Assure there's at least one tag */
|
||||||
for(screen = 0; screen < globalconf.screens_info->nscreen; screen++)
|
for(screen = 0; screen < globalconf.screens_info->nscreen; screen++)
|
||||||
if(!globalconf.screens[screen].tags.len)
|
if(!globalconf.screens[screen].tags.len)
|
||||||
tag_append_to_screen(tag_new("default", sizeof("default")-1, layout_tile, 0.5, 1, 0), screen);
|
tag_append_to_screen(tag_new("default", sizeof("default")-1, layout_tile, 0.5, 1, 0),
|
||||||
|
&globalconf.screens[screen]);
|
||||||
|
|
||||||
p_delete(&confpath);
|
p_delete(&confpath);
|
||||||
}
|
}
|
||||||
|
|
23
screen.c
23
screen.c
|
@ -308,6 +308,8 @@ luaA_screen_newindex(lua_State *L)
|
||||||
size_t len;
|
size_t len;
|
||||||
const char *buf = luaL_checklstring(L, 2, &len);
|
const char *buf = luaL_checklstring(L, 2, &len);
|
||||||
screen_t *s;
|
screen_t *s;
|
||||||
|
tag_t **tag;
|
||||||
|
int i;
|
||||||
|
|
||||||
s = lua_touserdata(L, 1);
|
s = lua_touserdata(L, 1);
|
||||||
|
|
||||||
|
@ -322,6 +324,27 @@ luaA_screen_newindex(lua_State *L)
|
||||||
|
|
||||||
ewmh_update_workarea(screen_virttophys(s->index));
|
ewmh_update_workarea(screen_virttophys(s->index));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case A_TK_TAGS:
|
||||||
|
luaA_checktable(L, 3);
|
||||||
|
|
||||||
|
/* remove current tags */
|
||||||
|
for(i = 0; i < s->tags.len; i++)
|
||||||
|
s->tags.tab[i]->screen = SCREEN_UNDEF;
|
||||||
|
|
||||||
|
tag_array_wipe(&s->tags);
|
||||||
|
tag_array_init(&s->tags);
|
||||||
|
|
||||||
|
s->need_arrange = true;
|
||||||
|
|
||||||
|
/* push new tags */
|
||||||
|
lua_pushnil(L);
|
||||||
|
while(lua_next(L, 3))
|
||||||
|
{
|
||||||
|
tag = luaA_checkudata(L, -1, "tag");
|
||||||
|
tag_append_to_screen(*tag, s);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
22
tag.c
22
tag.c
|
@ -91,16 +91,16 @@ tag_new(const char *name, ssize_t len, layout_t *layout, double mwfact, int nmas
|
||||||
* \param screen the screen id
|
* \param screen the screen id
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
tag_append_to_screen(tag_t *tag, int screen)
|
tag_append_to_screen(tag_t *tag, screen_t *s)
|
||||||
{
|
{
|
||||||
int phys_screen = screen_virttophys(screen);
|
int phys_screen = screen_virttophys(s->index);
|
||||||
|
|
||||||
tag->screen = screen;
|
tag->screen = s->index;
|
||||||
tag_array_append(&globalconf.screens[screen].tags, tag_ref(&tag));
|
tag_array_append(&s->tags, tag_ref(&tag));
|
||||||
ewmh_update_net_numbers_of_desktop(phys_screen);
|
ewmh_update_net_numbers_of_desktop(phys_screen);
|
||||||
ewmh_update_net_desktop_names(phys_screen);
|
ewmh_update_net_desktop_names(phys_screen);
|
||||||
ewmh_update_workarea(phys_screen);
|
ewmh_update_workarea(phys_screen);
|
||||||
widget_invalidate_cache(screen, WIDGET_CACHE_TAGS);
|
widget_invalidate_cache(s->index, WIDGET_CACHE_TAGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Remove a tag from screen. Tag must be on a screen and have no clients.
|
/** Remove a tag from screen. Tag must be on a screen and have no clients.
|
||||||
|
@ -137,6 +137,7 @@ tag_client(client_t *c, tag_t *t)
|
||||||
if(is_client_tagged(c, t))
|
if(is_client_tagged(c, t))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
tag_ref(&t);
|
||||||
client_array_append(&t->clients, c);
|
client_array_append(&t->clients, c);
|
||||||
client_saveprops(c);
|
client_saveprops(c);
|
||||||
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
|
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
|
||||||
|
@ -153,6 +154,7 @@ untag_client(client_t *c, tag_t *t)
|
||||||
for(int i = 0; i < t->clients.len; i++)
|
for(int i = 0; i < t->clients.len; i++)
|
||||||
if(t->clients.tab[i] == c)
|
if(t->clients.tab[i] == c)
|
||||||
{
|
{
|
||||||
|
tag_unref(&t);
|
||||||
client_array_take(&t->clients, i);
|
client_array_take(&t->clients, i);
|
||||||
client_saveprops(c);
|
client_saveprops(c);
|
||||||
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
|
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
|
||||||
|
@ -401,13 +403,7 @@ luaA_tag_newindex(lua_State *L)
|
||||||
screen = SCREEN_UNDEF;
|
screen = SCREEN_UNDEF;
|
||||||
|
|
||||||
if((*tag)->screen != SCREEN_UNDEF)
|
if((*tag)->screen != SCREEN_UNDEF)
|
||||||
{
|
tag_remove_from_screen(*tag);
|
||||||
if((*tag)->clients.len)
|
|
||||||
luaL_error(L, "unable to remove tag %s from screen %d, it still has clients",
|
|
||||||
(*tag)->name, (*tag)->screen);
|
|
||||||
else
|
|
||||||
tag_remove_from_screen(*tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(screen != SCREEN_UNDEF)
|
if(screen != SCREEN_UNDEF)
|
||||||
{
|
{
|
||||||
|
@ -415,7 +411,7 @@ luaA_tag_newindex(lua_State *L)
|
||||||
luaL_error(L, "a tag with the name `%s' is already on screen %d",
|
luaL_error(L, "a tag with the name `%s' is already on screen %d",
|
||||||
(*tag)->name, screen);
|
(*tag)->name, screen);
|
||||||
|
|
||||||
tag_append_to_screen(*tag, screen);
|
tag_append_to_screen(*tag, &globalconf.screens[screen]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case A_TK_LAYOUT:
|
case A_TK_LAYOUT:
|
||||||
|
|
2
tag.h
2
tag.h
|
@ -44,7 +44,7 @@ void tag_client(client_t *, tag_t *);
|
||||||
void untag_client(client_t *, tag_t *);
|
void untag_client(client_t *, tag_t *);
|
||||||
bool is_client_tagged(client_t *, tag_t *);
|
bool is_client_tagged(client_t *, tag_t *);
|
||||||
void tag_view_only_byindex(int, int);
|
void tag_view_only_byindex(int, int);
|
||||||
void tag_append_to_screen(tag_t *, int);
|
void tag_append_to_screen(tag_t *, screen_t *);
|
||||||
int luaA_tag_userdata_new(lua_State *, tag_t *);
|
int luaA_tag_userdata_new(lua_State *, tag_t *);
|
||||||
|
|
||||||
DO_RCNT(tag_t, tag, tag_delete)
|
DO_RCNT(tag_t, tag, tag_delete)
|
||||||
|
|
Loading…
Reference in New Issue