* Sigil 0.7.2 Released
Posted on April 14th, 2013 by John. Filed under Sigil.
I’m pleased to announce the immediate availability of Sigil 0.7.2. This release is primary a bug fix release but does come with a few new features. Please see the changelog for a full listing.
Find & Replace now has a Marked Text option. Basically, you can select a section of text, mark the text and find and replace will only operate in the marked section. If you start typing the marked area will be cleared.
Preview now zooms separately from other views. Previously Preview’s zoom level was linked to Book View’s zoom level.
* Sigil 0.7.1 Released
Posted on March 3rd, 2013 by John. Filed under Sigil.
I’m pleased to announce the immediate availability of Sigil 0.7.1. This release streamlines some of the new features introduced in 0.7.0. It also, as always, includes a handful of bug fixes. Please see the changelog for a full listing.
One really useful new feature is the ability to right click on an image url in Code View and view the image in a separarte window. The image in this window is resizable so it will always fit within the window.
The clean source settings were streamlined. This is part of a set of changes to deal with saving and opening non-well formed content. With 0.7.0 Sigil would allow you to save non-well formed HTML files even though they are invalid. However, this introduced an issue where if auto cleaning was enabled on open Sigil would “fix” the non-well formed content. This would often lead to issues. So now Sigil warns when saving non-well formed content so it’s not done accidentally. Finally, when opening if non-well formed content is encountered Sigil will prompt to ignore cleaning those files.
Spell check and find and replace were both enhanced. User feedback in their behavior and fixes were made for issues reported by users.
Finally, a change was introduced to deal with EPUBs where the filename within the container is not UTF-8 encoded. The EPUB spec says that the filename must be UTF-8 encoded but some tools (and zipping by hand) do not always use UTF-8. Instead they use the standard ZIP encoding (IBM code page 437). This isn’t a problem with ASCII characters but becomes an issue when non-ASCII characters are used in the filename. Specially the filename is decoded incorrectly so it doesn’t match what’s listed in the OPF. Now Sigil will check if the general purpose bit 11 is set which specifies that the filename is UTF-8 encoded. Sigil will only decode the filename using UTF-8 if this bit is set and otherwise decode using cp437.
* Sigil 0.7.0 Released
Posted on February 17th, 2013 by John. Filed under Sigil.
I’m pleased to announce the immediate availability of Sigil 0.7.0. The underlying theme for this release is finishing features. If you look back though previous releases you will see features such as spell check and preview that were added and in subsequent releases further enhanced. The goal all along was to intorduce these features, get feedback then enchance them. We wanted to get the features out there in a useable form and slowly evolve them around people’s needs. We also didn’t want to hold useful features simply because they didn’t do everything we wanted. In this release many of these incremental features are now finished. Please see the changelog for a full listing. This release comprises a number of new features and plenty of bug fixes. Some of the biggest changes are:
Features
Live Preview
When split view was first removed this is what was intended. It’s taken small steps though a few different releases but this is what was always intended. The new live preview is a dockable view that can be removed from Sigi’s main window for placement on a second monitor. As you edit your changes will automatically be displayed in the preview area. This way you can see how your changes will look without having to toggle or click around. In addition the preview will continue to show the content from the last HTML tab you had open when you switch to CSS, for example. This way you can see the changes auxiliary files will have on your actual content.
Spellcheck
A lot of changes here which round out the functionality. You’ll notice the spellcheck button is no longer next word, but opens a dialog. All of your misspelled words are shown (and even all correctly spelled words, with a tooltip in the header showing the count of unique words). You can now click a word to show that word in your HTML file (doubleclick for the next occurrence), and choose to Ignore it, add it to a dictionary, or change every occurrence of the word to something you type or one of the suggestions. And you can enable multiple dictionaries at once – so you can have a standard list of names, places, alongside one for the specific book.
Edit TOC
This has been a long time coming but it’s finally here. If you have an existing TOC in a book and want to make a simple change without having to setup headers everywhere, you can now just edit the TOC.
Clips
This has become a very powerful tool and it is now more accessible. The Clips features have been modified to make them a bit more accessible. So you can enable a Clips Bar toolbar showing you your first 20 clips (and they can have keyboard shortcuts too). In addition to defining Clips for html code, you can also make a button for a special character you use often (e.g. create a curly apostrophe button and ctrl-apostrophe to use it). A Clips window is like the clip editor but you just need a single click to select an entry. Basically you can define your own buttons now (well, for simple items). Oh, and there’s an Autofill in Clips that will scan your CSS files and create entries for them, perhaps to save some typing or just for amusement.
Reports
New reports have been added! The All Files report is included to cover Audio and Video files but is useful to see what is in Misc, how large your font files are, etc. The Links report will tell you every anchor link used in the book and whether or not it points to a valid destination. And if you use anchors for footnotes/endnotes it will tell you if your reverse links match. And a small Characters Used in the Book report to see if anything odd made it into the files, and possibly to help with font subsetting (although its probably not ideal for that although it was the original reason for it).
Saving and non-well-formed content
In previous version of Sigil you could not save your work if it was not well formed. Meaning it was not validly constructed XML. This limitation has been removed. The well formed dialog that would popup has also been removed. A new well formed column has been added to the Reports for HTML files. The preferred method for determining the validity of the EPUB is to use FlightCrew. Combined with Reports these two should be used to determine the quality of the structure.
Audio/Video
You can play audio and video files in Sigil, and all the related functions for inserting images, deleting unused images, editing externally have been updated to handle Audio and Video files as well.
Qt 5
Sigil is now using Qt 5. This brings an update to the underlying HTML rendering engine. This means embedded font’s should now display correctly. It also provides support for Audio and Video preview. Due to the change to Qt 5 a number of core, internal pieces were rewritten to take advantage of Qt 5. Qt 5 is still a big rough around the edges (this is especially prevalent on OS X) but the new features far out weight any issues.
One change due to Qt 5 is Qt is now much harder to compile from scratch. It takes a long time to build Qt on Windows and the Qt Project only provides pre-built binaries for 32 bit Windows. As such this release does not have a 64 bit Windows build. This shouldn’t be an issue because even 64 bit Windows can run 32 bit Windows applications. Also, (as far as my testing has shown) there is no decernable performance difference between running a 32 bit vs a 64 bit build of Sigil. Sigil doesn’t do anything that would really take advantage of being a 64 bit application.
Misc
You can search with wrap on or off now, embedded fonts display correctly and random highlighting issues are gone (finally), the Index and HTML TOC now use separate stylesheets for their formatting, and you can bookmark your location to return to later.
EPUB 3 (Not Yet)
Sigil is still an EPUB 2 editor. While some EPUB 3 features (Audio and Video) have been incorporated Sigil is not an EPUB 3 editor. It’s best to think of this release as EPUB 2+ where the plus is the ability (not requirement) to use some EPUB 3 features.
This leads to the inevitable question of when will Sigil support EPUB 3. Eventually. There are a number of issues and questions that need to be sorted out. That said, EPUB 3 is a focus and with this release incorporating Audio and Video EPUB 3 is not being ignored.
* Sigil 0.6.2 Released
Posted on December 6th, 2012 by John. Filed under Sigil.
Sigil 0.6.2 is now out. This is a small maintenance release to fix issues found in the 0.6.1 release. There is still a known issue with the cursor jumping in CV when saving but it isn’t jumping randomly anymore.
* Sigil 0.6.1 Released
Posted on December 3rd, 2012 by John. Filed under Sigil.
I’m happy to announce the immediate availability of Sigil 0.6.1. This release is mainly bug fixes but it does have a few new features. For a full list of changes please see the Changelog.
A few notable features are:
- Audio and Video tags will no longer be stripped. Audio and Video files are now put into Audio and Video folders and links are updated properly.
- Clean Source has a new (consider it beta) non-destructive pretty printer.
- You can now control when Clean Source is run automatically. There is also a right click menu entry in Code View.
- Sigil is now more tolerant of mal-formed epubs.
- If an html file within the epub is not well-formed it will be read as is into Sigil and will be skipped during the book normalization process. This will cause the file to potentially have invalid links to other resources.
- Handle invalid or duplicate IDs in the OPF.
- Reports have been enhanced
Edit
Two additional changes I forgot to mention. I’m now signing the OS X app with an Apple provided developer certificate. This will allow Sigil to run with Gatekeeper. Also, I’m now providing md5 checksums for all binaries (and source package) on the download page.
Also, The 0.6.1 packages when out without the date for 0.6.1 being set in the changelog. This oversight isn’t a major issue and doesn’t warrant pulling the packages. The Changelog will have the correct release date for 0.6.1 in the next release.
* Sigil 0.6.0 Released
Posted on October 27th, 2012 by John. Filed under Sigil.
I’m pleased to announce the immediate availability of Sigil 0.6.0. This release is the calumniation of thousands of hours of work. It comprises approximately 165 major changes and many more minor ones. Please see the changelog for a full listing.
Stability has been greatly enhanced and crashes should be greatly reduced or non-existant. Cursor positioning between view has also been enhanced and should work consistently (correctly) now.
Some notable new features:
- Goto Link or Style
- Saved Searches
- Clip Manager
- Deleting unused images and styles
- Edit capability in TOC generation
- Inserting special characters
- Change text casing
- Reformatting CSS files
- Various style and file usage reports
- Ease of linking stylesheets and images
- Inserting links and anchors
- Opening files/images with external editors
- Customise the GUI fonts/sizes/colors
- …and so much more…
All of this couldn’t have been accomplished without the help of Grant Drake and Dave Heiland. Without their contributions 0.6.0 would have only had a fraction of these changes.
* KDocker 4.8 Released
Posted on August 4th, 2012 by John. Filed under KDocker.
Version 4.6 is now available for direct download.
This release adds a few new features which I hope will be very helpful.
The biggest new feature is really an enhancement to an existing feature. Matching by name now supports using regular expressions (regex). The -e option was added which allows specifying the matching type. Normal substring matching is still supported and is the default. Regex, unix wildcard, wildcard and xml schema 1.1 are additional choices. Matching has been further enhanced with the addition of the -j option to enable case sensitive matching. The -k option was added to all for regex (when specified) to perform minimal matching.
Another new feature is the ability to hide and show a docked application by using the mouse scroll wheel. When scrolling over the docked icon in the system tray mouse wheel up will show and mouse wheel down will hide.
Finally, the help options are now wrapped at 79 characters. This is a purely aesthetic change and is intended to make the help text easier to read.
* Calling Functions in EXE From Plugins in Windows
Posted on July 15th, 2012 by John. Filed under programming.
When writing an application that uses plugins sometimes it’s necessary to have the plugin call functions from the application. This is fairly easy to do on pretty much any OS but on Windows it requires the plugin to link to the application. Sometimes explicit linking is unreasonable. One situation where you don’t want the plugin linking to the application is when the plugin will be used by multiple applications.
Windows allows for runtime resolution of exported functions (GetProcAddress) and this is typically used to access functions in a loaded DLL. What MSDN’s documentation about GetProcAddress doesn’t say is this function is not exclusive to DLLs. GetProcAddress can also be called from a DLL on an EXE to get and execute functions from within an EXE. The trick (if you can call it that) is to export have the functions in the EXE you want to access exported.
Following is two sample applications and a sample plugin (DLL). Each application provides the same function prototype with a different implementation. The plugin will call the applications function. The basic design is app1 and app2 calls mod1′s test_func wich calls the applications print_hi function. The implementation of print_hi is different between app1 and app2. mod1 can be used by both app1 and app2 and does not require static linking.
The directory structure for this example is app1/ app2/ mod1/. The sample applications look for the module is the relative directory ../mod1. In real world usage it would be better to assume that the module is in the same directory (or a in a modules subdirectory) as the application.
app1
Makefile.msc
TARGET = app1.exe CC = cl AS = ml LD = link AR = lib OBJS = \ app1_hi.obj \ main.obj LDFLAGS = /nologo /release /SUBSYSTEM:CONSOLE DEFINES = /D_CRT_SECURE_NO_DEPRECATE CFLAGS = /nologo /TP /MD /Os /GF $(DEFINES) all: $(TARGET) .c.obj: $(CC) /c $(CFLAGS) /D "NDEBUG" $< $(TARGET): $(OBJS) $(LD) $(LDFLAGS) /out:$@ $(OBJS) kernel32.lib /incremental:no /export:print_hi clean: -del *.obj *.exe *.manifest |
app1_hi.h
#ifndef APP1_HI_H #define APP1_HI_H __declspec(dllexport) void __stdcall print_hi(void); #endif |
app1_hi.c
#include <stdio.h> __declspec(dllexport) void __stdcall print_hi(void) { printf("Hi\n"); } |
main.c
#include <stdio.h> #include <windows.h> typedef void (*test_func)(void); int main(int argc, char **argv) { HMODULE h = LoadLibrary("..\\mod1\\mod1.dll"); if (!h) { printf("Could not load DLL\n"); return 1; } test_func tf; tf = (test_func)GetProcAddress(h, "test_func"); if (!tf) { printf("Could not locate test_func\n"); return 1; } tf(); FreeLibrary(h); return 0; } |
app2
Makefile.msc
TARGET = app2.exe CC = cl AS = ml LD = link AR = lib OBJS = \ app2_hi.obj \ main.obj LDFLAGS = /nologo /release /SUBSYSTEM:CONSOLE DEFINES = /D_CRT_SECURE_NO_DEPRECATE CFLAGS = /nologo /TP /MD /Os /GF $(DEFINES) all: $(TARGET) .c.obj: $(CC) /c $(CFLAGS) /D "NDEBUG" $< $(TARGET): $(OBJS) $(LD) $(LDFLAGS) /out:$@ $(OBJS) kernel32.lib /incremental:no /export:print_hi clean: -del *.obj *.exe *.manifest |
app2_hi.h
#ifndef APP2_HI_H #define APP2_HI_H __declspec(dllexport) void __stdcall print_hi(void); #endif |
app2_hi.c
#include <stdio.h> __declspec(dllexport) void __stdcall print_hi(void) { int a = 12; int b = 99; printf("Hello World!\n"); printf("Also... \n"); printf("a = %i\n", a); printf("b = %i\n", b); printf("a + b = %i", a + b); } |
main.c
#include <stdio.h> #include <windows.h> typedef int (*test_func)(); int main(int argc, char **argv) { HMODULE h = LoadLibrary("..\\mod1\\mod1.dll"); if (!h) { printf("Could not load DLL: %i\n", GetLastError()); return 1; } test_func tf; tf = (test_func)GetProcAddress(h, "test_func"); if (!tf) { printf("Could not locate test_func\n"); return 1; } tf(); FreeLibrary(h); return 0; } |
mod1
Makefile.msc
TARGET = mod1.dll CC = cl AS = ml LD = link AR = lib OBJS = main.obj LDFLAGS = /nologo /release /SUBSYSTEM:CONSOLE DEFINES = /D_CRT_SECURE_NO_DEPRECATE CFLAGS = /nologo /TP /MD /Os /GF $(DEFINES) all: $(TARGET) .c.obj: $(CC) /c $(CFLAGS) /D "NDEBUG" $< $(TARGET): $(OBJS) $(LD) /DLL $(LDFLAGS) /out:$@ $(OBJS) kernel32.lib /incremental:no /def:exp.def clean: -del *.obj *.dll *.manifest |
exp.def
LIBRARY mod1.dll EXPORTS test_func @1 |
main.h
#ifndef MAIN_H #define MAIN_H __declspec(dllexport) void __stdcall test_func(void); #endif |
main.c
#include <stdio.h> #include <windows.h> #include "main.h" typedef void (*print_hi)(void); __declspec(dllexport) void __stdcall test_func(void) { /* There are two ways we can get the function address. */ #if 0 /* Method 1 */ char filename[MAX_PATH] = {0}; GetModuleFileName(NULL, filename, MAX_PATH-1); HMODULE h = LoadLibrary(filename); if (!h) { printf("Could not load EXE\n"); return;; } print_hi ph; ph = (print_hi)GetProcAddress(h, "print_hi"); if (!ph) { printf("Could not locate print_hi\n"); return; } ph(); FreeLibrary(h); #endif /* Method 2 */ print_hi ph = (print_hi)GetProcAddress(GetModuleHandle(NULL), "print_hi"); if (!ph) { printf("Could not locate print_hi\n"); return; } (*ph)(); } |
If you look closely at mod1′s make file you’ll notice that it uses an exports.def file. This is an alternative way to declare exported functions than explicitly putting them in the make file as was done with app1 and app2.
mod1′s main.c also lists two ways to load the functions from the EXE. The first (commented out) method is more explicit but both methods ultimately use GetProcAddress to load the function. The first method gets the name of the running application (the EXE) wich then calls LoadLibrary and passes the returned HMODULE to GetProcAddress. The second method uses GetModuleHandle to get the HMODULE for the currently running process.
* The Future of KDocker
Posted on June 23rd, 2012 by John. Filed under KDocker.
Let me start of by saying that KDocker is not dead and I’m not abandoning it. The past few releases have had minimal changes. This is mainly because I believe KDocker is pretty must feature complete at this point. It docks apps and does a pretty good job doing so. The past few releases have been small (very small) maintenance releases.
For a while I was worried about the relevancy of an application like KDocker. Gnome 3 and Unity attempted to drastically change the desktop metaphor. When both projects were announced and initially released it looked like an application to dock other applications was no longer necessary. This doesn’t seem to be the case in Unity at least. KDE appears to be sicking to the classic desktop metaphor and it doesn’t look like any other desktop environments are following in Gnome 3 and Unity’s foot steps. So KDocker looks like it will be useful for years to come.
One of the biggest problems of developing an open source project is knowing who is using it and how it’s being used. Any small change can potentially have a drastic and unforeseen impact. This hasn’t stopped me from making changes in the past but I at least want to state my intentions to give people a chance to comment. There are two major (somewhat) changes I’ve been thinking about making for quite some time now.
Currently KDocker uses the QtSingleApplication solution to ensure only one instance of KDocker is running. The solution handles checking if KDocker is running and if it is the solution messages the running instance to preform whatever action the user requested. I’ve been thinking about replacing the solution with DBus. The drawback are KDocker would depend on DBus and possibily some type of security issue. KDocker can be used to launch other applications so I would need to look into this further. The advantages of DBus are: it would reduce complexity, it should fix a race condition that can cause two instance of KDocker to be running, and it would allow other applications to message KDocker. The big question is how many people are using KDocker that do not have DBus installed. Any KDE, Gnome, or Unity users will have DBus but the same cannot be said about some other environments.
The other big change is related to how window title matching happens. The current method is substring matching. I’ve been thinking about supporting regular expressions (regex) as part of the name matching. Qt has a regex engine as part of the API. It is not a Perl compatible regular expression engine (PCRE) but it would be good enough in this case. The disadvantage is increased complexity in name matching. The user would need to worry about using a regex instead of a simple substring. This could be mitigated by doing substring matching then regex matching if substring matching doesn’t find a match. However, this could cause false positives. The advantage is there should be less instances of users having trouble docking certain applications. Especially in cases where there is no common substring in the window title.
* KDocker 4.7 released
Posted on June 5th, 2012 by John. Filed under KDocker.
Small maintenance release. No new features. Just a fix for building with GCC 4.7 and fix the icon for the .desktop file. Get it here.
Tags
Archives
- April 2013 (1)
- March 2013 (1)
- February 2013 (1)
- December 2012 (2)
- October 2012 (1)
- August 2012 (1)
- July 2012 (1)
- June 2012 (2)
- April 2012 (1)
- March 2012 (1)
- February 2012 (3)
- January 2012 (3)
- December 2011 (2)
- November 2011 (1)
- October 2011 (3)
- September 2011 (9)
- August 2011 (15)
- July 2011 (5)
- June 2011 (3)
- May 2011 (4)
- April 2011 (2)
- March 2011 (2)
- February 2011 (4)
- January 2011 (4)
- December 2010 (2)
- November 2010 (1)
- October 2010 (1)
- August 2010 (3)
- July 2010 (4)
- June 2010 (1)
- May 2010 (2)
- March 2010 (1)
- January 2010 (8)
- December 2009 (5)
- November 2009 (6)
- October 2009 (4)
- September 2009 (2)
- August 2009 (6)
- July 2009 (6)
- June 2009 (4)
- May 2009 (6)
- April 2009 (4)
- March 2009 (2)
- February 2009 (4)
- January 2009 (4)
- December 2008 (7)
- November 2008 (2)