Revert "[lua] Add a hook on standard fd activity"
This reverts commit 785c41f089
.
Too much potential deadlock problems.
This commit is contained in:
parent
4b3e7f766c
commit
b1467494ea
72
awesome.c
72
awesome.c
|
@ -279,15 +279,12 @@ main(int argc, char **argv)
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
const char *confpath = NULL;
|
const char *confpath = NULL;
|
||||||
int r, xfd, csfd, dbusfd, i, screen_nbr, opt;
|
int r, xfd, csfd, dbusfd, i, screen_nbr, opt;
|
||||||
ssize_t len = 1;
|
ssize_t cmdlen = 1;
|
||||||
const xcb_query_extension_reply_t *shape_query, *randr_query;
|
const xcb_query_extension_reply_t *shape_query, *randr_query;
|
||||||
fd_set rd;
|
fd_set rd;
|
||||||
xcb_generic_event_t *ev;
|
xcb_generic_event_t *ev;
|
||||||
struct sockaddr_un *addr;
|
struct sockaddr_un *addr;
|
||||||
client_t *c;
|
client_t *c;
|
||||||
int pstdout[2], pstderr[2],
|
|
||||||
rstderr = -1, rstdout = -1,
|
|
||||||
a_stderr, a_stdout;
|
|
||||||
static struct option long_options[] =
|
static struct option long_options[] =
|
||||||
{
|
{
|
||||||
{"help", 0, NULL, 'h'},
|
{"help", 0, NULL, 'h'},
|
||||||
|
@ -301,15 +298,15 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
/* save argv */
|
/* save argv */
|
||||||
for(i = 0; i < argc; i++)
|
for(i = 0; i < argc; i++)
|
||||||
len += a_strlen(argv[i]) + 1;
|
cmdlen += a_strlen(argv[i]) + 1;
|
||||||
|
|
||||||
globalconf.argv = p_new(char, len);
|
globalconf.argv = p_new(char, cmdlen);
|
||||||
a_strcpy(globalconf.argv, len, argv[0]);
|
a_strcpy(globalconf.argv, cmdlen, argv[0]);
|
||||||
|
|
||||||
for(i = 1; i < argc; i++)
|
for(i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
a_strcat(globalconf.argv, len, " ");
|
a_strcat(globalconf.argv, cmdlen, " ");
|
||||||
a_strcat(globalconf.argv, len, argv[i]);
|
a_strcat(globalconf.argv, cmdlen, argv[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check args */
|
/* check args */
|
||||||
|
@ -379,33 +376,6 @@ main(int argc, char **argv)
|
||||||
atom_cache_list_init(&globalconf.atoms);
|
atom_cache_list_init(&globalconf.atoms);
|
||||||
ewmh_init_atoms();
|
ewmh_init_atoms();
|
||||||
|
|
||||||
/* grab stdout and stderr */
|
|
||||||
if(pipe(pstdout) == -1)
|
|
||||||
{
|
|
||||||
perror("unable to pipe");
|
|
||||||
a_stdout = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rstdout = dup(fileno(stdout));
|
|
||||||
dup2(pstdout[1], fileno(stdout));
|
|
||||||
a_stdout = pstdout[0];
|
|
||||||
/* stop making stdout buffered */
|
|
||||||
setvbuf(stdout, NULL, _IONBF, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pipe(pstderr) == -1)
|
|
||||||
{
|
|
||||||
perror("unable to pipe");
|
|
||||||
a_stderr = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rstderr = dup(fileno(stderr));
|
|
||||||
dup2(pstderr[1], fileno(stderr));
|
|
||||||
a_stderr = pstderr[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* init screens struct */
|
/* init screens struct */
|
||||||
globalconf.screens_info = screensinfo_new(globalconf.connection);
|
globalconf.screens_info = screensinfo_new(globalconf.connection);
|
||||||
globalconf.screens = p_new(screen_t, globalconf.screens_info->nscreen);
|
globalconf.screens = p_new(screen_t, globalconf.screens_info->nscreen);
|
||||||
|
@ -516,41 +486,15 @@ main(int argc, char **argv)
|
||||||
FD_SET(csfd, &rd);
|
FD_SET(csfd, &rd);
|
||||||
if(dbusfd >= 0)
|
if(dbusfd >= 0)
|
||||||
FD_SET(dbusfd, &rd);
|
FD_SET(dbusfd, &rd);
|
||||||
if(a_stdout >= 0)
|
|
||||||
FD_SET(a_stdout, &rd);
|
|
||||||
if(a_stderr >= 0)
|
|
||||||
FD_SET(a_stderr, &rd);
|
|
||||||
FD_SET(xfd, &rd);
|
FD_SET(xfd, &rd);
|
||||||
|
if(select(MAX(MAX(xfd, csfd), dbusfd) + 1, &rd, NULL, NULL, NULL) == -1)
|
||||||
if(select(MAX(MAX(MAX(MAX(xfd, csfd), dbusfd), a_stdout), a_stderr) + 1,
|
|
||||||
&rd, NULL, NULL, NULL) == -1)
|
|
||||||
{
|
{
|
||||||
if(errno == EINTR)
|
if(errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
eprint("select failed");
|
eprint("select failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read and write stdout */
|
|
||||||
if(a_stdout >= 0 && FD_ISSET(a_stdout, &rd))
|
|
||||||
{
|
|
||||||
len = read(a_stdout, buf, sizeof(buf));
|
|
||||||
write(rstdout, buf, len);
|
|
||||||
/* call hook */
|
|
||||||
lua_pushlstring(globalconf.L, buf, len);
|
|
||||||
luaA_dofunction(globalconf.L, globalconf.hooks.fdactivity, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(a_stderr >= 0 && FD_ISSET(a_stderr, &rd))
|
|
||||||
{
|
|
||||||
len = read(a_stderr, buf, sizeof(buf));
|
|
||||||
write(rstderr, buf, len);
|
|
||||||
/* call hook */
|
|
||||||
lua_pushlstring(globalconf.L, buf, len);
|
|
||||||
luaA_dofunction(globalconf.L, globalconf.hooks.fdactivity, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(csfd >= 0 && FD_ISSET(csfd, &rd))
|
if(csfd >= 0 && FD_ISSET(csfd, &rd))
|
||||||
switch(r = recv(csfd, buf, sizeof(buf) - 1, MSG_TRUNC))
|
switch(r = recv(csfd, buf, sizeof(buf)-1, MSG_TRUNC))
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
warn("error reading UNIX domain socket: %s", strerror(errno));
|
warn("error reading UNIX domain socket: %s", strerror(errno));
|
||||||
|
|
|
@ -87,21 +87,6 @@ for s = 1, screen.count() do
|
||||||
mystatusbar:widget_add(mylayoutbox[s])
|
mystatusbar:widget_add(mylayoutbox[s])
|
||||||
mystatusbar:add(s)
|
mystatusbar:add(s)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Create a textbox widget for debug messages on screen 1
|
|
||||||
mydebugbox = widget.new({ type = "textbox", name = "mydebugbox", align = "left" })
|
|
||||||
mydebugbox:set("text", "No debug information.")
|
|
||||||
mydebugbar = statusbar.new({ position = "off", name = "mydebugbar",
|
|
||||||
fg = "white", bg = "black" })
|
|
||||||
mydebugbar:widget_add(mydebugbox)
|
|
||||||
mydebugbar:add(1)
|
|
||||||
awesome.key({ modkey }, "d", function ()
|
|
||||||
if mydebugbar:position_get() == "off" then
|
|
||||||
mydebugbar:position_set("bottom")
|
|
||||||
else
|
|
||||||
mydebugbar:position_set("off")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
-- {{{ Mouse bindings
|
-- {{{ Mouse bindings
|
||||||
|
@ -220,20 +205,12 @@ function hook_arrange(screen)
|
||||||
mylayoutbox[screen]:set("image", "@iconsdir@/layouts/" .. layout .. "w.png")
|
mylayoutbox[screen]:set("image", "@iconsdir@/layouts/" .. layout .. "w.png")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Hook function to print errors message
|
|
||||||
-- WARNING: you should _NOT_ print anything in this function
|
|
||||||
-- or you go into infinite loop
|
|
||||||
function hook_fdactivity(text)
|
|
||||||
mydebugbox:set("text", "<span font_desc=\"fixed 10\">" .. text .. "</span>")
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Set up some hooks
|
-- Set up some hooks
|
||||||
hooks.focus(hook_focus)
|
hooks.focus(hook_focus)
|
||||||
hooks.unfocus(hook_unfocus)
|
hooks.unfocus(hook_unfocus)
|
||||||
hooks.newclient(hook_newclient)
|
hooks.newclient(hook_newclient)
|
||||||
hooks.mouseover(hook_mouseover)
|
hooks.mouseover(hook_mouseover)
|
||||||
hooks.arrange(hook_arrange)
|
hooks.arrange(hook_arrange)
|
||||||
hooks.fdactivity(hook_fdactivity)
|
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
-- Respect size hints
|
-- Respect size hints
|
||||||
|
|
15
lua.c
15
lua.c
|
@ -359,20 +359,6 @@ luaA_hooks_titleupdate(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set the function called on standard file descriptor (stdout and stderr) activity.
|
|
||||||
* This function is called with the output buffer text as argument.
|
|
||||||
* \param A function to call on each standard file descriptor activity.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
luaA_hooks_fdactivity(lua_State *L)
|
|
||||||
{
|
|
||||||
luaA_checkfunction(L, 1);
|
|
||||||
if(globalconf.hooks.fdactivity)
|
|
||||||
luaL_unref(L, LUA_REGISTRYINDEX, globalconf.hooks.fdactivity);
|
|
||||||
globalconf.hooks.fdactivity = luaL_ref(L, LUA_REGISTRYINDEX);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set default font.
|
/** Set default font.
|
||||||
* \param A string with a font name in Pango format.
|
* \param A string with a font name in Pango format.
|
||||||
*/
|
*/
|
||||||
|
@ -451,7 +437,6 @@ luaA_parserc(const char *rcfile)
|
||||||
{ "mouseover", luaA_hooks_mouseover },
|
{ "mouseover", luaA_hooks_mouseover },
|
||||||
{ "arrange", luaA_hooks_arrange },
|
{ "arrange", luaA_hooks_arrange },
|
||||||
{ "titleupdate", luaA_hooks_titleupdate },
|
{ "titleupdate", luaA_hooks_titleupdate },
|
||||||
{ "fdactivity", luaA_hooks_fdactivity },
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,8 @@ statusbar_draw(statusbar_t *statusbar)
|
||||||
int left = 0, right = 0;
|
int left = 0, right = 0;
|
||||||
area_t rectangle = { 0, 0, 0, 0, NULL, NULL };
|
area_t rectangle = { 0, 0, 0, 0, NULL, NULL };
|
||||||
|
|
||||||
|
statusbar->need_update.value = false;
|
||||||
|
|
||||||
if(!statusbar->position)
|
if(!statusbar->position)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -97,8 +99,6 @@ statusbar_refresh(void *p)
|
||||||
pthread_cond_wait(&statusbar->need_update.cond, &statusbar->need_update.lock);
|
pthread_cond_wait(&statusbar->need_update.cond, &statusbar->need_update.lock);
|
||||||
|
|
||||||
statusbar_draw(statusbar);
|
statusbar_draw(statusbar);
|
||||||
statusbar->need_update.value = false;
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&statusbar->need_update.lock);
|
pthread_mutex_unlock(&statusbar->need_update.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -429,8 +429,6 @@ struct awesome_t
|
||||||
luaA_function arrange;
|
luaA_function arrange;
|
||||||
/** Command to run on title change */
|
/** Command to run on title change */
|
||||||
luaA_function titleupdate;
|
luaA_function titleupdate;
|
||||||
/** Command to run on every standard output printing */
|
|
||||||
luaA_function fdactivity;
|
|
||||||
} hooks;
|
} hooks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue