Xlib taskbar in D
Posted 2020-08-17
Blog
Articles- String interpolation DIP prototype
- terminal inline syntax highlighting, sdpy fonts improved
- January 18, 2021
- gdb debugging tips
- A little work on sdpy/terminal interop and apng debugging
- New plain tcp fiber socket class (with "how it works" docs), new arsd docs started, new dub subpackages in arsd. Also Turkish newsgroups added to forum.dlang.org
- Little audio player in D
- Thoughts on tutorial writing benefits, D marketing, and some simpledisplay.d improvements.
- arsd 9.0 rollup release, my thoughts on "google it" culture and related practices
- dpldocs.info cross-package search finally released! and more terminal getline enhancements
- I did a dconf livestream!
- New selective mouse input in terminal stack, Xft used in simpledisplay to improve TrueType font support
- simpleaudio now has playOgg, Mp3, Wav with resampling and can access multiple soundcards on Linux, adrdox gets ddoc on function params
- Weekend experiment: declarative GUI in D
- October 26, 2020
- My DConf livestream sneak preview
- Off topic jrpg video game review
- My thoughts on breakage, and I'll be in DConf Online 2020
- cgi.d hybrid server basically working, terminal.d can redirect stdout to a window if requested
- Some talk on cgi.d in benchmarks
- September 14, 2020
- New D update "dwidder" website launched, making-of post here
- white noise app in D
- More modern opengl in simpledisplay, document undocumented on dpldocs.info, tip on default template args
- Xlib taskbar in D
- D Tetris running on Webassembly
- Tetris in D
- Zero-runtime classes
- DConf online in the works for Nov 21-22, image copy/paste coming to sdpy soon
- July 13, 2020
- July 6, 2020
- simpledisplay getting dynamic loads, terminal gui gracefully degrades, i muse on scope raii classes
- Adam's dynamic link transition
- June 15, 2020
- June 8, 2020
- June 1, 2020
- foot pedal and midi fun, some dmd speed enhancements. Forum argues about @safe by default on extern.
- May 18, 2020
- simpleaudio dev work, rasp pi gpio module, static foreach rant, gcc 10's D support upped
- May 4, 2020
- my http more compatible with ssl, script+jsvar can do subclasses of D objects
- i want to make a jrpg, and have eye damage.
- Dustmite post on official blog
- What if I were dictator?
- March 30, 2020
- terminal.d with built-in emulator option releaed
- Online DConf in the works
- Dconf 2020 cancelled, Adam plays with terminal gui integration
- March 2, 2020
- some adrdox/dpldocsinfo updates
- terminal.d gets clipboard functions, ldc 1.20 out.
- DConf keynote speaker announced: Lua architect Roberto Ierusalimschy, Named args DIP discussed
- February 3, 2020
- Adam's terminal suite explained
- Understanding mixin templates, terminal.d improvements
- My attribute-by-default proposal. Also dmd 2.090 came out.
- DConf 2020 announced: June 17-20 in London. @safe by default debated. Adam did: Android, JNI, WebSocket in arsd libs
- tar.xz, --DRT tip, dom bug fixes, more Android and JNI, link to old phobos docs
- LDC 1.19 - Android, AVR. My rant on tests, update on JNI and COM.
- Walter's string interpolation proposal is OK but not great. My Android thing nearing beta release. dub downtime explained.
- Android project update, introduction to arsd.jni
- New pattern about interface contracts
- Adam shares Windows console secrets - DO NOT USE chcp!!
- Adam's rant on benchmarks
- Socket tutorial
- November 4, 2019
- October 28, 2019
- arsd package updates, forum nonsense
- Update on Android
- Adam does iOS "goodbye world"
- September 30, 2019
- D turns 20, Adam rants on software freedom
- Named arg DIPs and my thoughts on code organization
- September 9, 2019
- I wrote about mixin templates vs string mixins on Stack Overflow
- August 26, 2019
- Bug bounty in D again - my hot take, on reusing code, a fun picture, my tentative plan for the next month
- Time invested is worth a lot
- cgi.d's new scheduler, static this tricks
- July 29, 2019
- July 22, 2019
- Solving vs managing problems
- A big week in the arsd repo
- July 1, 2019
- June 24, 2019
- June 17, 2019
- CRTP thoughts, named arguments DIP review, DConf videos now on youtube
- musings on hybrid CT/RT tests, some more progress on new web framework
- a little more webassembly
- May 20, 2019
- Adam's string interpolation proposal
- DMD 2.086 live, GCC 9 with D support formally released, DConf coming soon, links to posts on builder pattern and disallowing implicit conversions with templates, and 2d array op overloads
- template constraint error improvements coming?
- dmd 2.086 beta, dstep 1.0 released, Adam works on memory usage
- obj-c and webassembly report, tips on is expressions linked.
- new ldc, new dmd, dpp on the blog
- D's future discussed in forums
- LDC beta, DConf blog link, Adam introduces gamehelpers.d
- March 18, 2019
- LDC 1.15.0-beta1, responsive design rant
- dmd 2.085.0 released
- Obj-C interop and D without druntime code to copy/paste
- dmd beta, more info coming next time, demo of new web framework initial prototype
- automatic web interface discussion, reflection tips and tricks
- Adam busy with weather and a move, lots of community announcements
- January 28, 2019
- Working on official blog 2018 retro, C++ new wrapped, dmd reading zips?
- dmd obj-c growing, Adam static foreaches an interface to RPC
- dmd 2.084, hope for future, but busy non-D week for me
- IDE tools released, my cgi.d gets new features
- DConf announced, tip, Adam rants: mouse trap
- This Week in D is back!
Continuing my "X in D" series, here I'll talk about my custom taskbar in D with xlib.
Core D Development Statistics
In the community
Community announcements
See more at the announce forum.
Taskbar in D
Here's the code: https://github.com/adamdruppe/taskbar
Be advised that the paths in the makefile assume my computer, but it is simple to change if you want to compile it. Moreover, other constants in the code are specialized for me - the colors, position, etc., so if you actually want to use this, don't be afraid to edit things!
Anyway, I've been using this myself for about 13 years now as part of my custom Linux user environment (together with my 100% custom terminal emulator, my hacked version of the Blackbox window manager - which I wouldn't mind porting to D some day - and many other things). I wanted something that was easy for me to customize, shows my windows with their icons, and lets me quickly interact with them.
It started in C
As the README file says, it started out as a fork of a little program in C that I got off the internet. Then, I did some pretty heavy modifications to make it fit what I wanted, and eventually ported it over to D and added more features like a notification area/systray (along with simpledisplay.d speaking the other side of the protocol), more icon image support, and slight tweaks to the ui like being able to reorder/pin windows with a middle click.
You can see this heritage and evolution in the code: the code still looks like C. And I consider that one of D's strengths: porting code from C to D is reasonably easy and your existing knowledge carries on, but then you can start adding in more and more D parts as you like. (And you don't need -betterC for this btw, but it is there if you want it.)
I import simpledisplay.d here but don't use a lot of its classes; I'm using it mostly because it is a nice self-contained set of translated headers for Xlib. While more is available, since it was already written in C, I kept writing with a C style here.
D can access the whole system
In X, there's some special programs that aren't really that special, like taskbars and window managers. They are special in that they serve a particular role to the user, but they aren't really that special because they just call the same APIs and speak similar protocols to every other program on the system.
The taskbar here wants to get a list of open windows and monitor changes in their state, and it does this through the same low-level Xlib calls as programs call to set this.
And the D language is with you all the way. It doesn't always help - you need to bring in function prototypes and struct definitions yourself*, but this is generally easy - you can see one at the bottom of taskbar.d to bring in another function. But this is why I imported simpledisplay - it already translated a good chunk of the X headers.
But even when D doesn't help directly, it never gets in the way. You can access these functions easily enough and then build whatever you want on top of it, and this ported taskbar is a nice example to prove it.
* there are projects to automatically translate headers from C but you still need to at least run those.