What to expect from KoroIRC 0.4

Since I started this blog, which was kind of supposed to be the KoroIRC developer blog, I went on many ramblings about random stuff, but never actually took the time to talk about the main subject. This is what I do today.

Changes in this version

Here I will talk a little about what will change and what will not.

Modularity

In version 0.3, the source code of the main executable contained about three big categories of code:

  1. User interface code: This is the code that manages the windows, switchbar, pane, all the settings dialogs, etc. Everything you can see or interact with is here.
  2. IRC code: This is what manages the actual connections, parses the protocol and notifies the user interface. Also, all CTCP, DCC and Identity management is here.
  3. Helper and “glue” code:This is all the code that does common tasks. Initialization, custom memory management, string parsing, threads, etc. This part was very big.

Of course, all of it was compiled into a giant monolithic executable that has everything embedded in it. Therefore, the goal for this version is to try and make KoroIRC 0.4 more modular.

In order to achieve this goal, the main executable code has been split into many parts. First, all the common code has been made into a new library, kirccore.dll. This also allows the other executables and DLLs to reuse that code too, reducing them in code size. Most of the extraneous functions of KoroIRC are in the process of being moved to plugins (.kpl files), with kircapi.dll as their “call gate” into the main executable code. As such, it is possible to have a super minimalist, no-frills KoroIRC installation in only three files:

I shall also take the occasion to mention that KoroIRC can be used as a portable application since its very birth. The installer is provided merely as a convenience. If KoroIRC finds an INI file in the same folder as itself, it will use it for loading/saving settings.

Operating system requirements

In version 0.3, I had three separate builds to maintain: an Unicode build, an ANSI build and an x64 build. This was all magically hidden to the user by the installer, which automatically installed the right one.

Back in 2005, when I started version 0.3, I still knew a bunch of people stuck with old computers, still on Windows 98. So it was only natural to support these old operating systems, since they were still used. However, having to support them often meant a lot of glue code, such as loading stuff with LoadLibrary / GetProcAddress and having an “alternate code path” if the functionality was not present. This increased code size and complexity a lot, and limited my choice of APIs to use.

Thankfully, these days everybody uses Windows XP or Windows Vista now, so I think it is safe to remove support for the old operating systems. So version 0.4 will only support Windows 2000 and higher, and the code is being cleaned of old code paths. A good example of this is in the updater code, where I could just stick a call to CheckTokenMembership — which is only available starting with Windows 2000 — instead of having to manually loop through the groups in the token.

User interface changes

There won’t be much major user interface changes for this version. But there is one thing worthy of noting. I’m currently in the process of replacing all message boxes with much more user-friendlier task dialogs instead. The very cool thing is that it works in Windows 2000 and Windows XP too! And, since I’m doing that, I’ve also started using string table resources.

Also, I’m working hard in order to have High-DPI support. KoroIRC 0.3 only had that partially, which is why the executable wasn’t marked as “DPI-aware” under Windows Vista. I’m working hard to remove all remaining hardcoded sizes (which are often for bitmaps or icons) and making sure everything scales well no matter the size. Also, this is an area I’m dogfooding much, as I myself run at 120DPI on my new LCD monitor.

Also, for all those who complained that it was imposible to hide the lower pane, this version won’t have the possibility to hide it either, sorry. However, know that I heard you and that it is definitely planned for the following version, along with a slew of other user interface changes.

Tools

I have also added my own crash reporter. Yeah, I know this reeks of NIH, especially when Microsoft has Windows Error Reporting, but there are hard entry conditions on WER, and also my own crash reporting tool allows to collect additional information from the user before sending the dump file.

I have also added a “Files” pane as an optional plugin, which is merely an embedding of a shell folder right into the lower pane. It is very useful to be able to drag and drop files to send them to somebody real fast, without having to switch windows.

I plan to redo the user interface of the DCC Information Tool. For those who didn’t know, every time you receive a file by DCC, KoroIRC stores additional information from the DCC into an alternate data stream of the file. This tool allows you to see that stored information.

Status

I have much done, enough to say that KoroIRC 0.4 is already significantly different from version 0.3. However, there is still much work to be done in all areas, so I’d say it’s at about 50% done.

Why is development so slow?

The short answer is: because I’m not paid to do it. The long answer is that coding is an activity best done at night, and also needs long times of having nothing to do in order to be properly set in motion.

Thing is, with school and work being much more demanding than before, I simply do not have as much free time as I’d like to, and when I get some, I don’t necessarily feel like coding much. Back in 2004, I had whole months free, with nothing better to do than sleeping in the day and coding in the night, and thus KoroIRC 0.2 was born in about four months of concentrated efforts.

Sadly, this is not the case anymore, and sometimes months can pass without me writing a single line of code on KoroIRC. This is why it takes so much time to release new versions now.

7 Responses to “What to expect from KoroIRC 0.4”

  1. Rue says:

    Well, I just downloaded you IRC client program. Tell you the truth Im just starting to use these programs…but Im gonna see, what its like. Although, I do like that you are trying to keep the program portable…but it seems like you will have a huge task at hand. I hope you succeed.

    Thanks, for the program.

  2. sato says:

    How do you make it portable? There is no INI file in the directory.. If I need to create one first, what do I name it? I don’t want it saving identity files in user directories either, it should all be localized when portable. I would actually prefer a .zip option with the portable INI all ready to go, instead of just the .exe option.

    Next.. how do you join channels (ones that you don’t have saved)? There is no “Join Channel” dialog box (a “last joined” list of channels would also be nice).

    There is no “Connect to Server” dialog either. The loading of identities every time is confusing! How do I connect to a server that wasn’t the first I added? “Connect” always connects to the same server, even when I am already connected to it. I want to connect to 2 different (or more) servers at once.

    Finally, bravo on the DCC resume! I’ve been going through quite a few clients that can’t manage it right. However, the transfers window is not configurable (add/remove/rearrange detail columns), and they do not sort by column-click.

  3. Koro says:

    You have to create an empty INI file in the directory. It should be named KoroIRC.ini. As for “user directories”, well paths will still be saved as absolute (generated on first run) in the INI file, I guess I’ll have to fix that.

    To join channels, use the /join command.

    The point of identities is making ONE per server you wish to connect to. An identity is the details of one connection, saved to a file. The point of putting multiple servers in the same identity is only to allow to connect to the next one if the current server is unavailable.

    You can enable a more classic “Connect to Server” dialog by checking “Use old-style connection dialog” in Settings->Behavior. But it won’t remember what you put in here, that’s the job of identities.

    Thanks for the DCC resume. I tried really well to stick to the protocol. As for sorting, well, I never imagined somebody would want to sort them, but I could look into it I guess.

  4. sato says:

    The old-style connection is definitely more to my liking – though I’d prefer being able to load my different servers or “identities” from a drop-down in the main menu without having to load up a wizard or browse for a file. Or at least if it could load the last used profile and connect on start-up, I’d be happier.

    Also, I successfully created the KoroIRC.ini file, and saw that it was populated after the next run and I was able to “port” the entire directory to a different machine. Yay!

    Oh! The items I miss the most from the DCC transfer window are “time remaining” and “% complete” columns. ;D

    Thanks for your work!

  5. Koro says:

    Yeah, I prefer the old-style connection dialog much more too. Only 2 clicks to load an identity.

    The problem is that it didn’t fly with users at all. They’d just kinda stare at it and use it all wrong, and then complained KoroIRC was hard to use. Everytime I’d have somebody install it, I’d have to take time to explain to them how to connect to a server and why they should save it to an Identity (they assumed – rightly – that the dialog would retain its values like in mIRC). So I created the wizard to guide them in doing that and got much positive response, suddenly KoroIRC wasn’t so hard to use, somebody could use it correctly on first try without explanation! But, I kept the old-style dialog for me and others who don’t like to have to click through dozens of pages just to connect to a server.

    As for DCC information, you can double-click a transfer in the pane to pop up a window with all the information you could ever dream of.

  6. sato says:

    I bet the confusion users had with the connection dialog (which led to the creation of the connection wizard) is actually the concept of “identities,” when most people expect to supply/select server info. I had the same confusion, and didn’t understand how to connect to different servers “with the same identity” until I asked you. Your concept makes sense now and works fine, but it is novel to most people. Maybe the term “Server Identity” is more clear. I for one thought identity meant “user identity.”

    As for the DCC info, I did realize I could open up the details, but they open in separate windows which clutter my taskbar – could you have them originate and minimize to the left-pane inside KoroIRC like mIRC does? But I’d still just prefer more details in the transfers window, and have them sortable. hehe ;p

    So, I’ve been playing with it more, and have a few more comments/suggestions! (Hope you don’t mind..)

    1. When the wizard or connection dialog are not set to show on startup, KoroIRC should automatically connect with the last used identity when started.

    2. KoroIRC doesn’t yet support the normal irc select-text to copy to clipboard.

    3. When a server is disconnected, on reconnect, client should rejoin open channels. (I also noticed when my internet connection fails, KoroIRC doesn’t notice and I have to manually “disconnect” to be able to connect again.)

    4. When following irc links from a web browser, open new channels with the same server connection (if they are the same server)

  7. ITF says:

    I really like the old connection better, and I think there’s an option for that in the tools section or somewhere.

    I hope the new version you won’t try to “pretty” up the UI with your “slew of user interface changes”.

    I really like the UI the way it is now, simple as possible but very useful in features. If you do decide to pretty it up, I hope the default stays simple and users who want easy or pretty UIs have the option to theme (with icons and all that).

Leave a Reply