Getinfo: Add wmfs -g option for get some info about wmfs status
This commit is contained in:
parent
8ff0264736
commit
c9e8e5d691
@ -34,6 +34,7 @@ set(wmfs_src
|
||||
src/event.c
|
||||
src/ewmh.c
|
||||
src/frame.c
|
||||
src/getinfo.c
|
||||
src/infobar.c
|
||||
src/init.c
|
||||
src/launcher.c
|
||||
@ -229,7 +230,7 @@ if(PROJECT_CHANGELOG)
|
||||
install(FILES ${PROJECT_CHANGELOG} DESTINATION ${PROJECT_DATA_PATH})
|
||||
endif()
|
||||
|
||||
install(FILES ${PROJECT_TODO} ${PROJECT_README}
|
||||
install(FILES ${PROJECT_TODO} ${PROJECT_README}
|
||||
${PROJECT_DEFAULT_CONF} DESTINATION ${PROJECT_DATA_PATH})
|
||||
install(FILES ${PROJECT_DEFAULT_CONF} DESTINATION ${WMFS_SYSCONFDIR})
|
||||
install(FILES "wmfs.desktop" DESTINATION ${WMFS_XSESSION_PATH})
|
||||
|
||||
42
src/event.c
42
src/event.c
@ -224,11 +224,23 @@ clientmessageevent(XClientMessageEvent *ev)
|
||||
XFree(ret);
|
||||
}
|
||||
|
||||
/* Manage _WMFS_UPDATE_HINTS */
|
||||
if(mess_t == wmfs_update_hints)
|
||||
{
|
||||
ewmh_get_number_of_desktop();
|
||||
ewmh_update_current_tag_prop();
|
||||
ewmh_get_client_list();
|
||||
ewmh_get_desktop_names();
|
||||
ewmh_set_desktop_geometry();
|
||||
ewmh_set_workarea();
|
||||
screen_count();
|
||||
screen_get_sel();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/** ConfigureRequest & ConfigureNotify handle event
|
||||
/** ConfigureRequest & ConfigureNotify handle events
|
||||
* \param ev XEvent pointer
|
||||
*/
|
||||
void
|
||||
@ -496,6 +508,32 @@ unmapnotify(XUnmapEvent *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
/** Send a client event
|
||||
*\param data Event data
|
||||
*\param atom_name Event atom name
|
||||
*/
|
||||
void
|
||||
send_client_event(long data[5], char *atom_name)
|
||||
{
|
||||
XEvent ev;
|
||||
int i;
|
||||
|
||||
ev.xclient.type = ClientMessage;
|
||||
ev.xclient.serial = 0;
|
||||
ev.xclient.send_event = True;
|
||||
ev.xclient.message_type = ATOM(atom_name);
|
||||
ev.xclient.window = ROOT;
|
||||
ev.xclient.format = 32;
|
||||
|
||||
for(i = 0; i < 5; ++i, ev.xclient.data.l[i] = data[i]);
|
||||
|
||||
XSendEvent(dpy, ROOT, False, SubstructureRedirectMask | SubstructureNotifyMask, &ev);
|
||||
XSync(dpy, False);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/** Event handle function: execute every function
|
||||
* handle by event
|
||||
* \param ev Event
|
||||
@ -505,7 +543,7 @@ getevent(XEvent ev)
|
||||
{
|
||||
int st;
|
||||
|
||||
switch (ev.type)
|
||||
switch(ev.type)
|
||||
{
|
||||
case ButtonPress: buttonpress(&ev.xbutton); break;
|
||||
case ClientMessage: clientmessageevent(&ev.xclient); break;
|
||||
|
||||
20
src/ewmh.c
20
src/ewmh.c
@ -70,15 +70,16 @@ ewmh_init_hints(void)
|
||||
|
||||
/* WMFS hints */
|
||||
net_atom[wmfs_running] = ATOM("_WMFS_RUNNING");
|
||||
net_atom[wmfs_update_hints] = ATOM("_WMFS_UPDATE_HINTS");
|
||||
net_atom[wmfs_statustext] = ATOM("_WMFS_STATUSTEXT");
|
||||
net_atom[wmfs_set_screen] = ATOM("_WMFS_SET_SCREEN");
|
||||
net_atom[wmfs_screen_count] = ATOM("_WMFS_SCREEN_COUNT");
|
||||
net_atom[wmfs_current_tag] = ATOM("_WMFS_CURRENT_TAG");
|
||||
net_atom[wmfs_tag_list] = ATOM("_WMFS_TAG_LIST");
|
||||
net_atom[wmfs_current_screen] = ATOM("_WMFS_CURRENT_SCREEN");
|
||||
net_atom[wmfs_current_layout] = ATOM("_WMFS_CURRENT_LAYOUT");
|
||||
net_atom[wmfs_mwfact] = ATOM("_WMFS_MWFACT");
|
||||
net_atom[wmfs_nmaster] = ATOM("_WMFS_NMASTER");
|
||||
net_atom[wmfs_tag_names] = ATOM("_WMFS_TAG_NAMES");
|
||||
net_atom[wmfs_function] = ATOM("_WMFS_FUNCTION");
|
||||
net_atom[wmfs_cmd] = ATOM("_WMFS_CMD");
|
||||
|
||||
@ -138,7 +139,7 @@ ewmh_update_current_tag_prop(void)
|
||||
PropModeReplace, (uchar*)&tags[selscreen][t + 1].nmaster, 1);
|
||||
|
||||
/* Current layout */
|
||||
XChangeProperty(dpy, ROOT, net_atom[wmfs_current_layout], XA_STRING, 8,
|
||||
XChangeProperty(dpy, ROOT, net_atom[wmfs_current_layout], net_atom[utf8_string], 8,
|
||||
PropModeReplace, (uchar*)tags[selscreen][seltag[selscreen]].layout.symbol,
|
||||
strlen(tags[selscreen][seltag[selscreen]].layout.symbol));
|
||||
|
||||
@ -193,8 +194,11 @@ ewmh_get_desktop_names(void)
|
||||
XChangeProperty(dpy, ROOT, net_atom[net_desktop_names], net_atom[utf8_string], 8,
|
||||
PropModeReplace, (uchar*)str, pos);
|
||||
|
||||
/* _WMFS_TAG_NAMES */
|
||||
XChangeProperty(dpy, ROOT, net_atom[wmfs_tag_names], XA_STRING, 8,
|
||||
for(i = 0; i < pos; ++i)
|
||||
if(str[i] == '\0' && i < pos - 1)
|
||||
str[i] = ' ';
|
||||
|
||||
XChangeProperty(dpy, ROOT, net_atom[wmfs_tag_list], net_atom[utf8_string], 8,
|
||||
PropModeReplace, (uchar*)str, pos);
|
||||
|
||||
free(str);
|
||||
@ -232,10 +236,10 @@ ewmh_set_workarea(void)
|
||||
for(i = 0; i < screen_count(); ++i)
|
||||
for(j = 0; j < conf.ntag[i]; ++j)
|
||||
{
|
||||
data[pos++] = sgeo[i].x - BORDH;
|
||||
data[pos++] = sgeo[i].y - TBARH;
|
||||
data[pos++] = sgeo[i].width;
|
||||
data[pos++] = sgeo[i].height;
|
||||
data[pos++] = spgeo[i].x;
|
||||
data[pos++] = spgeo[i].y;
|
||||
data[pos++] = spgeo[i].width;
|
||||
data[pos++] = spgeo[i].height;
|
||||
}
|
||||
|
||||
XChangeProperty(dpy, ROOT, net_atom[net_workarea], XA_CARDINAL, 32,
|
||||
|
||||
@ -80,10 +80,11 @@ enum
|
||||
utf8_string,
|
||||
/* WMFS HINTS */
|
||||
wmfs_running,
|
||||
wmfs_tag_names,
|
||||
wmfs_update_hints,
|
||||
wmfs_current_tag,
|
||||
wmfs_current_screen,
|
||||
wmfs_current_layout,
|
||||
wmfs_tag_list,
|
||||
wmfs_mwfact,
|
||||
wmfs_nmaster,
|
||||
wmfs_set_screen,
|
||||
|
||||
48
src/wmfs.c
48
src/wmfs.c
@ -284,8 +284,6 @@ check_wmfs_running(void)
|
||||
void
|
||||
exec_uicb_function(char *func, char *cmd)
|
||||
{
|
||||
XEvent ev;
|
||||
int i;
|
||||
long data[5];
|
||||
|
||||
/* Check if wmfs is running (this function is executed when wmfs
|
||||
@ -304,18 +302,7 @@ exec_uicb_function(char *func, char *cmd)
|
||||
XChangeProperty(dpy, ROOT, ATOM("_WMFS_CMD"), ATOM("UTF8_STRING"),
|
||||
8, PropModeReplace, (uchar*)cmd, strlen(cmd));
|
||||
|
||||
ev.xclient.type = ClientMessage;
|
||||
ev.xclient.serial = 0;
|
||||
ev.xclient.send_event = True;
|
||||
ev.xclient.message_type = ATOM("_WMFS_FUNCTION");
|
||||
ev.xclient.window = ROOT;
|
||||
ev.xclient.format = 32;
|
||||
|
||||
for(i = 0; i < 6; ++i)
|
||||
ev.xclient.data.l[i] = data[i];
|
||||
|
||||
XSendEvent(dpy, ROOT, False, SubstructureRedirectMask | SubstructureNotifyMask, &ev);
|
||||
XSync(dpy, False);
|
||||
send_client_event(data, "_WMFS_FUNCTION");
|
||||
|
||||
return;
|
||||
}
|
||||
@ -326,27 +313,14 @@ exec_uicb_function(char *func, char *cmd)
|
||||
void
|
||||
set_statustext(char *str)
|
||||
{
|
||||
XEvent ev;
|
||||
int i;
|
||||
long data[5];
|
||||
|
||||
data[4] = True;
|
||||
|
||||
XChangeProperty(dpy, ROOT, ATOM("_WMFS_STATUSTEXT"), ATOM("UTF8_STRING"),
|
||||
8, PropModeReplace, (unsigned char*)str, strlen(str));
|
||||
8, PropModeReplace, (uchar*)str, strlen(str));
|
||||
|
||||
ev.xclient.type = ClientMessage;
|
||||
ev.xclient.serial = 0;
|
||||
ev.xclient.send_event = True;
|
||||
ev.xclient.message_type = ATOM("_WMFS_STATUSTEXT");
|
||||
ev.xclient.window = ROOT;
|
||||
ev.xclient.format = 32;
|
||||
|
||||
for(i = 0; i < 6; ++i)
|
||||
ev.xclient.data.l[i] = data[i];
|
||||
|
||||
XSendEvent(dpy, ROOT, False, SubstructureRedirectMask | SubstructureNotifyMask, &ev);
|
||||
XSync(dpy, False);
|
||||
send_client_event(data, "_WMFS_STATUSTEXT");
|
||||
|
||||
return;
|
||||
}
|
||||
@ -379,21 +353,22 @@ main(int argc, char **argv)
|
||||
|
||||
argv_global = _strdup(argv[0]);
|
||||
|
||||
while ((i = getopt(argc, argv, "hvic:s:")) != -1)
|
||||
while ((i = getopt(argc, argv, "hvic:s:g:")) != -1)
|
||||
{
|
||||
if(i == 'c' || i == 's')
|
||||
if(i == 'c' || i == 's' || i == 'g')
|
||||
if(!(dpy = XOpenDisplay(NULL)))
|
||||
{
|
||||
fprintf(stderr, "WMFS: cannot open X server.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
switch (i)
|
||||
switch(i)
|
||||
{
|
||||
case 'h':
|
||||
default:
|
||||
printf("usage: %s [-ihv] [-c <uicb function> <cmd> ] [-s <string>]\n"
|
||||
printf("usage: %s [-ihv] [-c <uicb function> <cmd> ] [-g <argument>] [-s <string>]\n"
|
||||
" -c <uicb_function> <cmd> Execute an uicb function to control WMFS\n"
|
||||
" -g <argument> Show information about wmfs status\n"
|
||||
" -s <string> Set the bar(s) statustext\n"
|
||||
" -h Show this page\n"
|
||||
" -i Show informations\n"
|
||||
@ -401,7 +376,7 @@ main(int argc, char **argv)
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'i':
|
||||
printf("WMFS - Window Manager From Scratch By Martin Duquesnoy \n");
|
||||
printf("WMFS - Window Manager From Scratch By Martin Duquesnoy\n");
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'v':
|
||||
@ -422,6 +397,11 @@ main(int argc, char **argv)
|
||||
XCloseDisplay(dpy);
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'g':
|
||||
getinfo(optarg);
|
||||
XCloseDisplay(dpy);
|
||||
exit(EXIT_SUCCESS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
10
src/wmfs.h
10
src/wmfs.h
@ -188,6 +188,7 @@ void init_conf(void);
|
||||
/* event.c */
|
||||
void buttonpress(XButtonEvent *ev);
|
||||
void configureevent(XEvent *ev);
|
||||
void clientmessageevent(XClientMessageEvent *ev);
|
||||
void destroynotify(XDestroyWindowEvent *ev);
|
||||
void enternotify(XCrossingEvent *ev);
|
||||
void expose(XExposeEvent *ev);
|
||||
@ -197,6 +198,7 @@ void keypress(XKeyPressedEvent *ev);
|
||||
void mappingnotify(XMappingEvent *ev);
|
||||
void maprequest(XMapRequestEvent *ev);
|
||||
void propertynotify(XPropertyEvent *ev);
|
||||
void send_client_event(long data[5], char *atom_name);
|
||||
void getevent(XEvent ev);
|
||||
|
||||
/* menu.c */
|
||||
@ -291,6 +293,14 @@ void init_cursor(void);
|
||||
void init_key(void);
|
||||
void init_geometry(void);
|
||||
|
||||
/* getinfo.c */
|
||||
void getinfo_tag(void);
|
||||
void getinfo_screen(void);
|
||||
void getinfo_layout(void);
|
||||
void getinfo_mwfact(void);
|
||||
void getinfo_nmaster(void);
|
||||
void getinfo(char *info);
|
||||
|
||||
/* wmfs.c */
|
||||
int errorhandler(Display *d, XErrorEvent *event);
|
||||
int errorhandlerdummy(Display *d, XErrorEvent *event);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user