libkdeprint
John Layt
johnlayt at yahoo.com.au
Tue Oct 16 19:58:46 BST 2007
Right.
In this e-mail I'll address printFiles() and leave the other issues to
separate e-mails.
I spent half my day at work today looking through the KDEPrint code to see
exactly how printFiles does its magic, and I think the solution is fairly
easy, depending on how fancy we want it to be.
printFiles() takes the list of files to print, then applies any valid
pre-filters chosen in the print dialog to the files, then passes the file
list to the specific printer system implementation you are using (CUPS, LPR,
etc). The implementation then reads the settings from KPrinter, translates
them into the printer system specific commandline options, and executes the
command.
In the case of CUPS, this is a KDEPrint utility found in
kdelibs/kdeprint/cups/cupsdoprint.c which you pass the printer name, printer
options and filenames. It then calls the CUPS api for you and your files
print. For LPR the command is obviously 'lpr'.
Now, there's a fair bit of code wrapped around that, most just for nice job
management, but some to respect the settings chosen in the print dialog.
This can be found in classes like KPrinterImpl, KCupsPrinterImpl,
KLprPrinterImpl, KDEPrintD and KPrintProcess.
My proposal is a 3 step one:
1) This is the proof of concept step. Write a basic printFiles() that takes a
QPrinter and a file list, reads the printer name from QPrinter, and executes
cupsdoprint to send all the files to CUPS. The key thing here is that
QPrinter::printerName() provides a name usable for CUPS, which it appears to
do.
2) Add code to detect between CUPS/LPR and add LPR support.
3) Add code to pass along other important settings, like print range and
copies.
This won't be supported under Windows or OSX (but then the old one didn't work
either), or other *nix backends like rlpr. However some file formats
supported by Okular use the normal QPainter which will be supported, so
Okular will need to pop up a message telling the users "Sorry this file
format printing not supported on Win/Mac, but x, y and z do work"
Nice plus is this method will work for any file format supported by CUPS.
Does this all look feasible? Obviously there is no way it could be completed
and QA'ed in time to make kdelibs for 4.0, so the 3 apps affected will have
to include it directly for now, but it will only be a small amount of code.
If no-one else gets there first, I’ll start on this next week.
Another problem is the non-continuous page selection which Qt doesn’t
support, e.g. selecting random pages from the preview list in KGhostView (I
don't think Okular currently supports this?). The work-around is that CUPS
does support being passed a file and a list of non-continuous pages to print.
So if a user has selected pages from the GUI, when we display the
QPrintDialog we set the page range to Selection rather than All. If they
leave it at Selection, then we send the full file and the selected list of
pages to CUPS to do the processing. If they switch to All or Pages then we
use those instead. If they are not using CUPS (e.g. on LPR, Windows or OSX),
then we first we pop up a message box saying "not supported, select All or a
continuous range in Pages instead", then show the QPrintDialog with Selection
disabled.
This is a nice to have but not vital, as the user can stll select continuous
page ranges instead.
Now I just have to explain to the boss why that design document isn't
ready :-)
John.
--
Send instant messages to your online friends http://au.messenger.yahoo.com
More information about the kde-core-devel
mailing list