summaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
2023-02-21charts: remove INFINITY (0Hz) from intervalsVito Caputo
It's nice to be able to blindly hit Mod1+Left a bunch to minimize the monitoring overhead, like when trying to preserve battery etc. But I've found myself sometimes annoyed that I've completely disabled the monitors when I reach for the overlays. This change removes the 0Hz option from the preset intervals, so now when you lower monitoring by blindly hitting Mod1+Left a bunch it'll bottom out at 1HZ. A subsequent commit will wire up disabling the monitors to an explicit vwm key combo (probably Mod1+z).
2022-02-06charts: ensure first update always samplesVito Caputo
vmon steps on this edge case, in vwm it was largely benign since nothing ever happens immediately at vwm startup. But in vmon you do things monitor commands which might immediately send SIGUSR1 to vmon for .png snapshots, producing an empty .png because the first update didn't sample because the time delta hadn't passed. This change just maintains a "primed" charts flag to ensure the initial charts update always samples. This way if got_sigusr1 is already set on the first iteration, at least the first charts update will have sampled and composited *something*.
2022-02-06vmon: suppress "(null)" name in snapshot filenamesVito Caputo
When this code changed to use a local, potentially heap-allocated name variable, it started producing "(null)" when no -n/--name was supplied, that wasn't intended. Just use a "" name when NULL, enabling bare date-derived snapshot filenames. This seems preferable since even if you supplied an empty -n/--name you'd get a hyphen at the start of the name. I can see scenarios where you have unnamed files labeled by the output dir instead.
2022-02-06vmon: remove vestigal puts("DONE!")Vito Caputo
I don't think I intended this to be permanent, though it might be nice to have /something/ printed to signify the transition to breaking the main loop. Something more appropriate can come back if necessary.
2022-02-06vmon: add %P fmt specifier for getpid()Vito Caputo
vmon already handles SIGUSR1 for producing png snapshots on demand, adding a fmt specifier for substituting the vmon PID makes for convenient scripting of triggering such snapshots. i.e: $ vmon -- /bin/bash -c 'for((i = 0; i < 10; i++)); do kill -USR1 %P; sleep 1s; done' Would produce ten png snapshots of the charts on 1-second intervals.
2022-02-05key: create desktop on isolated window mru migrateVito Caputo
When the context has a lone desktop, attempting a migrate to the next MRU desktop does nothing. This change treats the situation exceptionally and creates a new desktop in the context for receiving the migrated window, as it's likely the desired result.
2022-01-27vmon: interpolate command execution argumentsVito Caputo
This adds runtime expansion of the executed command's argv, to support things like passing the vmon X window id to the executed command, session name, and output dir. Format specifiers currently supported by this commit: %W X window id for vmon in hexadecimal %n verbatim name supplied via --name %N filename-safe variant of name supplied via --name %O output directory supplied via --output-dir (or ".") %% literal % There's not curerrently any escaping syntax implemented, relying entirely on %-stuffing to escape interpolation. i.e. use %%N to express %N post-interpolation. This commit also adds SIGINT and SIGQUIT handlers when executing a command. The first such signal received is simply propagated to the child command's process, which upon exiting will trigger the existing SIGCHLD behavior (snapshot if requested, exit). If a subsequent repeated SIGINT or SIGQUIT is received, an abrupt exit is performed without waiting for SIGCHLD or otherwise synchronizing with the child process. The impetus for this is to enable running recordMyDesktop alongside the executed command to record the vmon window while running things like benchmarks or other high-level profiling/CPU usage over time observations. The recordMyDesktop utility already responds to SIGINT for ending a recording, so SIGINT propagation should be sufficient for recording vmon sessions - provided the recordMyDesktop process is positioned to receive signals in the executed command. i.e. is the foreground process or session leader if executed via something like a `/bin/bash -c` construction. Some effort has been made to ensure the vmon window is mapped before running the executed command (XMapWindow() && XSync()). But with SubstructureRedirect in play, as when a window manager is active, this alone isn't sufficient to ensure the window is actually mapped and viewable. This poses a problem with for the current `recordMyDesktop --windowid` implementation, which hard fails when the specified window isn't already mapped and visible. Depending on who wins the race, the window may not yet actually be mapped by the window manager by the time recordMyDesktop queries its attributes. But this is something to fix in recordMyDesktop, even if vmon waited for a MapNotify event before executing the command, the window could become unmapped by the window manager - or maybe it wouldn't even become mapped in a timely fashion if it's placed on a hidden virtual desktop at the time. The recording tool needs to just be more robust in this regard, and should really follow the window around anyways, as well as do things like maybe pause the recording when unmapped, etc. Out of scope for vmon. The aforementioned `recordMyDesktop --windowid` race has been filed as an issue @ https://github.com/recordmydesktop/recordmydesktop/issues/7
2021-12-25xwindow: include >= fullscreen in vwm_xwin_should_manage()Vito Caputo
Just expanding the heuristic to everything >= fullscreen instead of precisely fullscreen. The specific impetus for this was fullscreen games, but from a security standpoint it makes sense to manage everything larger as well.
2021-12-25*: test override_redirect via vwm_xwin_should_manage()Vito Caputo
Now vwm ignores override_redirect for fullscreen windows.
2021-12-25xwindow: introduce vwm_xwin_should_manage()Vito Caputo
Preparatory commit for applying a heuristic to honoring override_redirect. The X11 specification more or less requires honoring this window flag, but it's really a disaster to blindly do so. This function will be used to evaluate override_redirect wherever it's currently being directly used to determine wether a window should be managed or not. As-implemented it only ignores override_redirect when the window dimensions match its screen dimensions (fullscreen windows). In the future this might get loosened up a bit to encompass windows covering more than something unexpectedly large for a tooltip/popup, like 50% of the screen, since valid override_redirect uses should arguably be limited to small windows.
2021-12-24window: fix VWM_TRACE() vestigial desktop name printVito Caputo
Once upon a time names were going to be added, but that never came to be and at some point that unused member was removed. Turns out -DTRACE builds have been broken since.
2021-11-03vmon: drop unnecessary default: caseVito Caputo
Lack of any statement angers some compilers, just drop it.
2021-10-23window: don't crash in assimilate unexpected caseVito Caputo
the non-empty focused_desktop having NULL focused_window shouldn't be possible, but it just happened to me again while playing with eon's WIP windowed/fullscreen/fillscreen tristate branch. Though exceedingly rare, it's annoying, so log the bug and don't crash.
2021-09-21charts: Wall=??s if proc_stat->start is > boottimeVito Caputo
Since libvmon samples the sys_wants before proc_wants, it's entirely possible the proc_stat->start will be later than sys_stat->boottime by the time a given process gets sampled. Simply treat this analogous to being unable to sample the start, either of which will only leave the Wall as ??s in the highly ephemeral short-lived process scenario. In the > boottime case, the next sample for the same process would have start <= boottime
2021-09-20charts: fixup VWM_COLUMN_PROC_TREE indentationVito Caputo
Tidying some vestigial cruft from the pre-VWM_COLUMN* transition, still feels relatively crufty and fragile, but this is about all I have time for spending on this at the moment...
2021-09-16vmon: save snapshots on SIGUSR1 as wellVito Caputo
This adds an externally triggered means of snapshotting, which is always available, not only with --snapshot.
2021-09-16vmon: only save SIGCHLD snapshot w/{-s,--snapshot}Vito Caputo
Apparently I never actually made this conditional on the flag...
2021-09-16vmon: rename -{x,y} flags to -{W,H}Vito Caputo
also sort flags alphabetically in help output
2021-09-16vmon: add --version flagVito Caputo
2021-09-16vmon: bump copyright years up to 2021Vito Caputo
2021-09-16vmon: exit w/error on unrecognized flag-like argumentVito Caputo
2021-09-13charts: show ??s when proc_stat->start is unsetVito Caputo
When libvmon fails to successfully sample proc_stat, it will leave this value as 0, which isn't really otherwise a normal process start value. Handle this by producing "??s" for the Wall time normally derived from (sys_stat->boottime - proc_stat->start), to prevent producing an incorrect Wall time equal to sys_stat->boottime. There should probably be a more robust means of communicating these libvmon sampling failures to vwm/vmon, but I've thus far been resisting adding something like an errno to every sample store, or worse every sample store's datum. It's kind of non-trivial to do without bloating the sample stores, especially since the stores consolidate multiple proc files under a single store/want. Having a single errno in the store would prevent letting the valid portions of the store be usable while ignoring the errored portions. Perhaps just a per-store errno with a bitfield to indicate which subset are errored would suffice...
2021-09-12charts: kludgey fixup of scribbled columnsVito Caputo
2021-09-12charts: refactor overlay text to @runtime columnsVito Caputo
This is a first pass at cleaning up the overlay content rendering with an eye towards enabling runtime configuration of which columns are present and their layout. Nothing is runtime configurable yet, but this changes the drawing to at least be data-driven using two arrays of column structs, one for the list of active processes in the upper portion of the chart, and another for the lower "snowflakes" exited processes/threads portion.
2021-09-12charts: don't show argv for threadsVito Caputo
comm is where the thread name will be if set, and when set it can be awkward to then see the process' argv following the thread name. This reduces the amount of clutter and visual noise for threaded processes...
2021-09-12charts: darken shadow by bumping opacity a bitVito Caputo
2021-09-12list: constify list_empty()Vito Caputo
2021-09-09lbvmon: expose clock_gettime(CLOCK_BOOTTIME)Vito Caputo
Exposed as VMON_SYS_STAT_BOOTTIME, so part of VMON_WANT_SYS_STAT, in units of ticks to normalize with SYS_STAT_CPU* times. This also introduces vmon->ticks_per_sec, which callers can access as well for convenience since vmon_t is all public and this library doesn't aspire to keep anything private. It's initialized via sysconf(_SC_CLK_TCK) @ vmon_init().
2021-08-26vmon: bump max --name length in snapshot filenameVito Caputo
16+NUL was clearly too short for descriptive names, pushed it all up to get closer to the common 256 fs limit.
2021-08-26charts: use composed height pixmap/ximage rendersVito Caputo
Was using the underlying chart dimensions which mirror the window dimensions, which worked fine but this wastes less space in the produced images when there's not much vertical content.
2021-08-26charts: add name to charts overlayVito Caputo
Currently only vmon wires this up to --name, but vwm could get the window title of the window being overlayed and pass that in if set...
2021-08-26vmon: implement --nameVito Caputo
Shows in the window title and the start of snapshot filenames
2021-08-26vmon: implement --snapshotVito Caputo
This implements saving the chart contents to a PNG file created in the output dir upon receiving SIGCHLD.
2021-08-26vmon: implement --output-dirVito Caputo
Preparatory commit; saved PNGs need a place to go, and the user needs a way to control that. Defaults to CWD (".")
2021-08-26vmon: track start timeVito Caputo
Preparatory commit; PNG snapshots will be named using the start time
2021-08-25charts: add vwm_chart_render_as_{pixmap,ximage}()Vito Caputo
Preparatory work for supporting --snapshot-on-sigchld to vmon; add a way to access a chart's pixels outside of the X server.
2021-01-09context_colors: drop brownVito Caputo
It's really only necessary to have 0-9, and brown is both ugly and too similar to magenta
2021-01-03vmon: handle WM_DELETE_WINDOW client messagesVito Caputo
This makes vmon exit more cooperatively when window managers kindly ask it to with a message rather than requiring XKillClient().
2021-01-03charts: round up Hz integral of sampling intervalVito Caputo
Cosmetic change, the plain truncation would occasionally result in unexpected Hz values in the charts like 59Hz particularly using vmon w/arbitrary --hertz values.
2021-01-02*: replace the "shelf" with "contexts"Vito Caputo
This is unfortunately a bit of a large commit, but it's at least pretty much all on-topic for the generalized "contexts" feature. Rather than waste time trying to split this further into smaller commits, I'm just landing it as-is, now that I've lived with the interaction model long enough to not completely hate it. I fully expect to revisit this in the future. One TODO item in particular I'd like to note is "sending" windows to contexts always creates a new virtual desktop for the sent window in the destination context. What should really happen is the destination context should be checked for an empty desktop, and a new desktop created only when there isn't an empty one to be reused for receiving the sent window. Note this only affects non-migrate sends, as migrates (modified by Shift) explicitly use the existing focused desktop at the destination context. See the README for more information on how contexts work and what's different about the interaction model. It's fairly minimal, most of what you already know how to do should keep working as-is. The only oddity would be Mos1-s no longer "shelves" windows, it's now a modifier to turn "migrates" into "sends", and by itself is a noop now. Colors used for contexts haven't been refined and are enumerated in src/context_colors.def.
2021-01-02context_colors: introduce context colors list X-MacroVito Caputo
preparatory commit for generalized contexts replacing the shelf
2021-01-01*: return MRU object from _mru() funcsVito Caputo
minor ergonomic improvement; enables plain wrapping of creates or other relevant object pointers with _mru() calls without requiring an intermediate storage variable.
2020-12-23desktop: drop unused desktop namesVito Caputo
At some point I wanted to support naming virtual desktops, but that never materialized and I don't find myself wishing it was there.
2020-12-23*: introduce and use direction parameterVito Caputo
This adds a direction parameter to vwm_desktop_next{_mru}() and vwm_win_focus_next(), deprecating _prev() variants in favor of a vwm_direction_t parameter. XK_r has been wired up as a modifier for reversing the direction of actions like Mod1+Tab (window next MRU cycle) and Mod1+Space (desktop next MRU cycle). So now if you overshoot, simply hold the "r" key and repeat the operation to go back, much like how Shift is often used for reversing alt+tab in i.e. Windows.
2020-12-23direction: introduce vwm_direction_t enum typeVito Caputo
Preparations for adding support for reversing {window,desktop} list traversal directions. A subsequent commit will introduce a direction flag of this type to the relevant functions.
2020-05-09libvmon: trivial cosmetic changesVito Caputo
The code is still quite messy, just some minor cleanups.
2020-05-08libvmon: remove unused _MOVE_STALE_TO_FRONT stuffVito Caputo
This was an experimental thing that isn't applicable to vwm, and will only become less relevant as time progresses if libvmon receives some attention.
2020-05-08libvmon: fix bug in proc_follow_children()Vito Caputo
There's an optimization where the search start pointer is advanced on matches, to resume searching from the last matched position. The assumption is that the in-memory list order and the order coming out of the proc file will align. Except using the standard list iterator, this would treat the list head @ &proc->children as just another node in the list. In the unlikely case where &proc->children treated as a siblings member in a vmon_proc_t actually resulted in contents lining up as a match, the generation update would scribble over part of the parent pointer member, making things crashy when the parent was dereferenced later in the fuction. This commit just makes it skip over the &proc->children node if encountered, just like in proc_follow_threads(). Hopefully this eliminates the remaining very rare vwm crashes that occur during big parallel builds of the kernel or systemd.
2019-09-23charts: introduce snprintf helper snpf()Vito Caputo
Cleanup previous commit that littered MIN length clamping everywhere %n was being used w/snprintf. Removed the %n usage altogether and just clamps the return value out of snprintf to the buffer size minus one for the null terminator. The standard C library has such awful warts :/
2019-07-14charts: clamp %n length to buffer sizeVito Caputo
It appears I overlooked that %n returns the length that would have been printed regardless of the destination buffer size, not what was actually written. The man page is misleading here: n The number of characters written so far is stored into the integer pointed to by the corresponding argument. That argument shall be an int *, or variant whose size matches the (optionally) supplied integer length modifier. No argu‐ ment is converted. (This specifier is not supported by the bionic C library.) The behavior is undefined if the conver‐ sion specification includes any flags, a field width, or a precision. In testing, it isn't the count of what's actually written. It's oblivious of truncated output scenarios where the output buffer has been exhausted before reaching the %n. The man page should be clarified here. This commit does the simplest thing and simply clamps the length to the destination buffer - 1 (for the \0). %n is being used to avoid needing an strlen() in this somewhat hot path, but it might make sense to instead use the snprintf return value similarly clamped instead of %n since %n isn't doing what was expected.
© All Rights Reserved