I like wmx, but my mouse wheel makes using the middle mouse button to access the program menu a pain, so I ended up creating my own patch and installing wmx from ports instead of pkg. Based on what I found in Web searches, I think I'm doing this the right way, but I haven't talked to any FreeBSD porters to make sure. I just wanted something customized for my own PCs.
When I wrote this page, I was using FreeBSD 12.0-RELEASE-p8.
The pages that most influenced me are:
I used vim when editing originally, but I'm going to use ed(1) here to show editing. See the ed(1) manpage and other tutorials if you're not familiar with it. I don't use much here.
First, I got a root shell, changed into the wmx port directory, and extracted the wmx source:
$ su - Password: root@tinkerbell:~ # cd /usr/ports/x11-wm/wmx/ root@tinkerbell:/usr/ports/x11-wm/wmx # make extract ===> wmx-8 depends on file: /usr/local/sbin/pkg - found => wmx-8.tar.gz doesn't seem to exist in /usr/ports/distfiles/. => Attempting to fetch http://www.all-day-breakfast.com/wmx/wmx-8.tar.gz wmx-8.tar.gz 137 kB 222 kBps 00s ===> Fetching all distfiles required by wmx-8 for building ===> Extracting for wmx-8 => SHA256 Checksum OK for wmx-8.tar.gz. root@tinkerbell:/usr/ports/x11-wm/wmx #
Once extracted, I changed into the wmx work directory. The mouse button
settings are in
Config.h, a reasonably well-documented file, so that's
the file I edited. However, in order to make a patch, I had to preserve
the original file first. To do that, I made a copy of
root@tinkerbell:/usr/ports/x11-wm/wmx # cd work/wmx-8/ root@tinkerbell:/usr/ports/x11-wm/wmx/work/wmx-8 # cp -i Config.h Config.h.orig root@tinkerbell:/usr/ports/x11-wm/wmx/work/wmx-8 #
Next, I read the Config.h file and found the line numbers the settings were on:
less -N Config.h
less command is useful for reading and understanding the file, of
course, but with the -N switch, it also gives the line number of every
In my copy of wmx, the settings are on lines 263 and 264, at the end of what the author called Section II:
254 255 // Mouse Configuration 256 // Use this section to remap your mouse button actions. 257 // Button1 = LMB, Button2 = MMB, Button3 = RMB 258 // Button4 = WheelUp, Button5 = WheelDown 259 // To prevent one or more of these from being supported 260 // at all, define it to CONFIG_NO_BUTTON. 261 #define CONFIG_NO_BUTTON 999 262 #define CONFIG_CLIENTMENU_BUTTON Button1 263 #define CONFIG_COMMANDMENU_BUTTON Button2 264 #define CONFIG_CIRCULATE_BUTTON Button3 // switch window, when over fr 264 ame 265 #define CONFIG_PREVCHANNEL_BUTTON Button5 // flip channel, when over fra 265 me 266 #define CONFIG_NEXTCHANNEL_BUTTON Button4 // flip channel, when over fra 266 me 267 268 269 // ============================== 270 // Section III. Colours and fonts 271 // ==============================
Now all I had to do was edit lines 263 and 264, swapping Button2 and Button3:
root@tinkerbell:/usr/ports/x11-wm/wmx/work/wmx-8 # ed Config.h 16240 263s/\(Button\)2/\13/ 264s/\(Button\)3/\12/ 263,264p #define CONFIG_COMMANDMENU_BUTTON Button3 #define CONFIG_CIRCULATE_BUTTON Button2 // switch window, when over frame wq 16240 root@tinkerbell:/usr/ports/x11-wm/wmx/work/wmx-8 #
(See subexpressions and backreferences in the ed(1) manpage and online tutorials if you want to know why the "s/" command magic I used works and saves typing.)
Making the patch
Now with the original and edited files, I took a diff of them. The ports system has a "makepatch" target that automatically makes diffs of the source tree and saves the resulting patches in the port's patch directory.
root@tinkerbell:/usr/ports/x11-wm/wmx/work/wmx-8 # cd ../.. root@tinkerbell:/usr/ports/x11-wm/wmx # make makepatch Generated patch-Config.h root@tinkerbell:/usr/ports/x11-wm/wmx #
Saving the patch
Finally, before building and installing wmx, I made a shell archive of the patched wmx so that I can reinstall the patch if a ports tree upgrade deletes the patch:
root@tinkerbell:/usr/ports/x11-wm/wmx # make clean ===> Cleaning for wmx-8 root@tinkerbell:/usr/ports/x11-wm/wmx # cd .. root@tinkerbell:/usr/ports/x11-wm # shar `find wmx/files/ -print` \ ? > ~/wmx-8-personal-freebsd-patch.shar root@tinkerbell:/usr/ports/x11-wm #
Ordinarily when building a patch to submit to a port maintainer, you
want to make a shell archive of the clean and whole port, but all I want
is an archive of the patch, not the whole port. If you were making a
port change to submit to the port's maintainer, the find command would
find wmx/ -print instead, and the output name would not be the one
Restoring the patch if it gets removed
Now, if anything happens to the wmx port in the ports tree and my patch gets deleted, all I'd have to do to restore my patch and reinstall wmx is:
root@tinkerbell:~ # cd /usr/ports/x11-wm/ root@tinkerbell:/usr/ports/x11-wm # sh ~/wmx-8-personal-freebsd-patch.shar c - wmx/files/ x - wmx/files/patch-Config.h root@tinkerbell:/usr/ports/x11-wm # cd wmx root@tinkerbell:/usr/ports/x11-wm/wmx # make clean build deinstall install clean ^v^v^v^v [a whole bunch of output snipped] ^v^v^v^v root@tinkerbell:/usr/ports/x11-wm/wmx #
The only thing I'll have to watch out for is if an upgraded version lands in the ports tree. If I'm still using wmx when that happens, I can't count on the author keeping Config.h unchanged between versions, so I'll have to make a new patch for that new version.
As infrequently as wmx is upgraded (only 8 version upgrades over 22 years, a testament to its simple design, if you ask me), that shouldn't happen anytime soon.