summaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
2017-12-29charts: fix ancestor siblings check segfaultVito Caputo
This loop assumed ancestor->parent was !NULL, and that's not necessarily always true. Due to these circular linked lists from the kernel's list.h, they're not simply NULL delimited and we need the pointer to the actual head to detect the end of the list. In libvmon, the head for the siblings list is either the parent proc's children member, or the processes member of the vmon struct. It may be more elegant to switch to always having a root proc in libvmon, even if it's just synthetic, for simplifying this crap. But for now, just determine which head is relevant and check against it for loop termination. Under some heavy parallel kernel compilations I was seeing occasional vwm segfaults, and the addr2line of the ip in dmesg mapped to this particular loop. I'm assuming the ancestor walk landed on a top-level process and then this sibling detection tried dereferencing the top-level proc's NULL parent and boom, segfault.
2017-11-28window: discover allscreen on configure tooVito Caputo
Previously only windows fitting the screen dimensions @ assimilate would become automagically "allscreened". Newer mplayer seems to break this heuristic, so expand the application of the heuristic to include configure requests as well.
2017-11-28screen: raw rectangle coords for vwm_screen_find()Vito Caputo
Adds VWM_SCREEN_REL_RECT so a screen can be located without a formal xwin, just supply the x,y,width,height.
2017-11-27window: improve vwm_win_manage_xwin() tracingVito Caputo
Use VWM_TRACE_WIN() and add a trace for when we try manage an xwin.
2017-11-27xwindow: use VWM_TRACE_WIN() in vwm_xwin_create()Vito Caputo
2017-11-27vwm: include window XID in event tracesVito Caputo
2017-11-27util: introduce VWM_TRACE_WIN() convenience macroVito Caputo
2017-10-05*: handle FocusIn eventsVito Caputo
Some programs call XSetInputFocus(), so we should select FocusChangeEvent and handle FocusIn events, calling vwm_win_set_focus() when appropriate. It's rare, but SDL2 programs in particular seem to do this and vwm gets in a pretty annoying state when it does occur. This change should improve the situation.
2017-10-05window: split out focused window setterVito Caputo
vwm_win_focus() previously simultaneously told the X server to set the input focus on the window (if mapped) and set the internal vwm state of the window to focused. These are really two separate operations: 1. request the X server to focus the window 2. change vwm's concept of the currently focused window Since clients can call XSetInputFocus() as well, there's need for doing step 2 discretely in response to FocusIn events. Nothing is functionally different after this commit, it just exposes step 2 as a separate vwm_win_set_focused() function for a future commit to leverage in handling of FocusIn events.
2017-10-05*: s/vwm_win_focused/vwm_win_get_focused/Vito Caputo
2017-10-04clickety: always (re)focus clicked windowVito Caputo
Currently vwm doesn't notice when something else takes the input focus. In some situations, this can leave a desktop without any focused windows, and no way to focus one because the only window is already focused as far as vwm knows. As a stop-gap solution, remove the !focused condition to the focus-on-window-click block. This way one can always force a window to be focused by simply mod-clicking the window.
2017-04-07window: move console identification to helperVito Caputo
2017-04-04window: drop configuring member from vwm_window_tVito Caputo
Rather than setting this configuring flag for the sake of vwm_screen_is_empty() to ignore, simply supply the xwin to ignore if desired.
2017-03-27*: update email address: s/gnugeneration/pengaru/Vito Caputo
2017-03-27charts: don't copy or free zero chartsVito Caputo
This was mixed up a bit in the cleanups... charts of !width represent the uninitialized charts, so don't copy or free them instead of inhibiting just the copy.
2017-03-27charts: reduce CHART_MAX_ARGC from 512 to 64Vito Caputo
`make tags` in the linux kernel revealed that XDrawText can return a BadLength error, which is not mentioned in the man page. Glancing at the xorg-server source for doPolyText() this is found: 1192 else { /* print a string */ 1193 1194 unsigned char *pNextElt; 1195 1196 pNextElt = c->pElt + TextEltHeader + (*c->pElt) * itemSize; 1197 if (pNextElt > c->endReq) { 1198 err = BadLength; 1199 goto bail; 1200 } So there appears to bea fairly arbitrary ceiling on how many items one can pass to XDrawText, and it probably depends on the cumulative length of the individual items overflowing the maximum request length. Well.. that's lame, and shrinking the maximum items makes it less likely to trip over this in practice, but it probably just takes a long enough individual item to trigger it again. I had erred on the side of "excessively long" assuming XDrawText would just deal and clip the text to the bounds of the destination drawable, just in case there was an argv with lots of tiny items, then that would be covered. This approach is incompatible with the potential for BadLength errors, so drastically shrinking the maximum number of items until further notice.
2017-03-25libvmon: wrap X-Macro parser state in a structVito Caputo
This makes no functional difference, but silences warnings about unused variables when -Wall is enabled.
2017-03-25*: add some missing includesVito Caputo
2017-03-25vmon: two trivial cleanupsVito Caputo
2017-03-25overlays: rename overlays.[ch]->charts.[ch]Vito Caputo
2017-03-25overlays: rename overlays->chartsVito Caputo
vmon introduces a non-overlay usage, monitors is correct but ambiguous, graphs is also amiguous, charts is short and distinctive. renaming of the files comes in a separate, future commit.
2017-03-25overlays: define the libvmon wantsVito Caputo
2017-03-25overlays: handle errors in vwm_overlays_create()Vito Caputo
The font one in particular is likely on random systems...
2017-03-25overlays: just some tidying of the chaosVito Caputo
This is nowhere near done, but it's a step in the right direction. Making an attempt to clarify the overlays code and reduce the amount of awful muddy raw Xrender calls scattered all over the place.
2017-03-25*: more minor style fixupsVito Caputo
2017-03-25composite: fix root_buffer leak on invalidate rootVito Caputo
This doesn't happen frequently and has gone utterly unnoticed as harmless, but it's something I noticed in reviewing the code for more lingering style issues.
2017-03-25*: restore old indentation of switch casesVito Caputo
In the course of applying the new style over the rest of the code I decided it's obnoxiouos and prefer the old way of indenting the cases one level from the switch. I know it wastes horizontal space and can see the value of flattening the cases with the switch, but once you start having variables at the start of the switch body, and blocked cases, it just starts becoming quite unattractive without the indentation.
2017-03-25*: s/malloc/calloc/Vito Caputo
Eliminate some 0/NULL initializations.
2017-03-25xwindow: s/xwindow->mapped/xwindow->client_mapped/Vito Caputo
This member reflects if the window is mapped from the client's perspective, not necessarily if the window is currently mapped (since vwm maps and unmaps windows the client has mapped in the course of providing virtual desktops) Changing the name for better clarity, since it's a bit ambiguous as-is.
2017-03-25xevent: use vwm_win_map() instead of XMapWindow()Vito Caputo
In vwm_xevent_handle_map_request() XMapWindow was always directly being called. When we have a vwin, we really shouldn't be calling XMapWindow() since we can't detect the generated MapNotify like we can with vwm_win_map().
2017-03-24xevent: cleanup vwm_xevent_handle_map_request()Vito Caputo
Long overdue tidying of the map request handling. This moves all the window classifying and placement stuff into a separate helper, adding a call to that in vwm_win_manage_xwin(), where this always belonged. The map request handling now just manages windows that aren't already managed, then lets the usual "is this window mapped?" logic filter the map request. This should fix a lingering bug where a window on the unfocused desktop would become spuriously visible if the client mapped it. Firefox started doing this recently when a page finished loading.
2017-03-24util: switch VWM_BUG macro from including strerrorVito Caputo
2017-03-24window: cleanup vwm_win_focused()Vito Caputo
We can assume (vwm->focused_desktop != NULL), the initial desktop is created early in startup and the last one can't be destroyed.
2017-03-24xwindow: drop configurable HONOR_OVERRIDE_REDIRECTVito Caputo
It's far too obnoxious to use without this enabled. Some spurious cleanups in the surrounding code landed here as well.
2017-03-24xwindow: cleanup vwm_xwin_is_mapped()Vito Caputo
No functional changes here.
2017-03-21*: update copyrights for 2017Vito Caputo
2017-03-21libvmon: use pread() instead of lseek()+read()Vito Caputo
I had assumed pread wouldn't work on /proc files and that lseek to the start was the only safe form of seeking, but this seems to be working acceptably well even with buffer sizes of 2 requiring many sequential reads per sample. The lseek syscalls aren't free and it's nice to omit them entirely, and we're essentially being sequential in our pread() use, and always use a buffer that is large enough to fit everything in the first read anyways.
2017-03-21libvmon: use local buffers for constructing pathsVito Caputo
The vmon->buf[_bis] buffers are nice to shrink to absurdly small sizes for testing changes, but we can't do that when they're reused for path construction. Just use local on-stack buffers for constructing paths, and now things continue to function just slower with vmon->buf[8].
2017-03-21libvmon: shirt-circuit parse loop on final stateVito Caputo
This trivial change eliminates the final EOF realization read() syscall on every /proc file consumed for every process on every sample, which adds up.
2017-03-21vmon: uninline is_flag mistaken inlineVito Caputo
I think I've developed a force of habit typing `static inline` after the ray tracer in rototiller.
2017-03-21libvmon: style cleanupsVito Caputo
Bring libvmon code inline with the direction vwm has headed in terms of coding style. Entirely mechanical changes with one exception replacing a free()/=NULL idiom with try_free().
2017-03-21vmon: introduce vmon utilityVito Caputo
vmon exposes the monitoring overlays of vwm through a standalone commandline utility by creating dedicated window for presenting the overlay. At this time a single preexisting PID may be specified, forming the root of a recursively monitored heirarchy. Alternatively, a command may specified which vmon will then fork and execute on your behalf, automatically monitoring the child and its descendants for you, in a style similar to strace. Examples: Monitor a linux kernel build in fullscreen mode, note the --: `vmon --fullscreen -- make -C /usr/src/linux -j8` Monitor the entire system: `vmon --fullscreen --pid 1` For convenience, omitting --pid and a command to run assumes PID 1: `vmon --fullscreen` is analogous to `vmon --fullscreen --pid 1` Monitor a linux kernel build fullscreen at 50Hz: `vmon --fullscreen --hertz 50 -- make -C /usr/src/linux -j8` Do the same thing but don't exit when the make completes: `vmon --linger --fullscreen --hertz 50 -- make -C /usr/src/linux -j8` Help is provided via `vmon --help`, where you'll find all flags described with their short and long forms. Some important TODO items include: - Support for specifying multiple top-level processes - Support for mixing --pid and running a command (useful for watching specific system processes while you're running something specific) - Support for scrolling within the window. The overlays in general need to evolve a bit to better support the vmon use case. In vwm there wasn't any intention of accomodating the entire space if it exceeded what was naturally available in the existing window's dimensions. That makes sense for vwm, but vmon not so much. You can achieve the same thing more or less by resizing the window to be larger than the screen (easy to do in vwm using a combination of Mod1-Right-Click to resize, then Mod1-Left-Click to drag the window, repeatedly. Then just Mod1-Left-Click to grab the window and "scroll" it by moving the desired part on-screen, repeatedly. Cumbersome, but works fine in a pinch. Not all window managers can do this though... Of course it would be less costly to only render what's visible, like a scrollable window would achieve. This is probably the top priority TODO. - Support for monitoring of memory use, files, per-process IO activity. libvmon supports substantially more than is being visualized currently. - Support for changing the font.
2017-03-20overlays: add ability to explicitly set rateVito Caputo
In vwm it was only necessary to relatively increase/decrease the sample rate. With vmon being primarily a cli tool, explicit setting of the rate is desirable. This commit reworks things a little de-specializing the zero value of overlays->sampling_interval, while switching this to instead of being an index into the intervals table simply contain the float interval itself. The math.h INFINITY macro becomes the new paused/zero value, and simply gets an entry of its own in the intervals table as the lowest one.
2017-03-15overlays: paramize vwm_overlay_render() Render opVito Caputo
In vwm we were always doing a transparent overlay to preserve underlying window visibility. With vmon this is undesirable and we just want to copy the currently cached composited contents to the window, which is also substantially less costly to perform. Parameterize the operation so vwm and vmon can specify what's appropriate.
2017-03-14*: trivial code formatting cleanupsVito Caputo
I'm no longer fond of combining one-line conditional statements on the same line as their conditional expression.
2017-03-14overlays: extricate overlays from vwm internalsVito Caputo
- Move vmon_proc_t under vwm_overlay_t. - Privatize vwm_overlay_t. - Update xwindow.c to dynamically create and destroy overlays. - Cease supplying vwm_t to vwm_overlays_create(), now just pass in the bare vwm_xserver_t. - Update all vwm_overlay_* functions to operate on vwm_overlays_t and vwm_overlay_t. Only vwm_overlays_create() receives the xserver, which it then embeds within the returned vwm_overlay_t. - Eliminate _xwin_ flavors of overlay functions, largely mechanical rename eliminating the _xwin_ from the names during the previous pass of switching from vwm_t & vwm_xwindow_t to vwm_overlays_t & vwm_overlay_t parameters. - Change vwm_overlay_compose() to store damage in supplied pointer, the caller is expected to make use of the damage information now because the overlay code doesn't know about the window its coordinate space.
2017-03-14xwindow: use calloc in vwm_xwindow_create()Vito Caputo
Eliminate some initialization cruft.
2017-03-14xwindow: add vwm_xwin_get_pid() helperVito Caputo
2017-03-14vwm: minor tidying of vwm.hVito Caputo
2017-03-14overlays: encapsulate global overlays stateVito Caputo
Introduce vwm_overlays_t and create/destroy functions, use in vwm_startup() and vwm_shutdown(). Supply to methods operating on the global overlays state vwm_overlays_update(), vwm_overlays_rate_increase(), vwm_overlays_rate_decrease(). This is a fairly minimal adoption of these changes with vwm_t still being supplyed to the overlay functions. A future commit will further cleanup the interactions and cease all knowledge of vwm_t in overlays.c, but for now everything overlay-oriented still accesses the overlays_t instance via vwm_t. Instead of supplying the vwm_t to vwm_overlays_create() the bare vwm_xserver_t will be supplied, as this is the future shared component across vmon and vwm (in addition to overlays).
© All Rights Reserved