mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 22:32:46 +00:00
Bug 125078 Implement InitPrintSettingsFromPrinter for GTK+/Xlib
patch by Roland.Mainz@informatik.med.uni-giessen.de r=rods sr=attinasi
This commit is contained in:
parent
314f07116a
commit
730236c715
@ -37,6 +37,15 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* Store per-printer features in temp. prefs vars that the
|
||||
* print dialog can pick them up... */
|
||||
#define SET_PRINTER_FEATURES_VIA_PREFS 1
|
||||
#define PRINTERFEATURES_PREF "print.tmp.printerfeatures"
|
||||
|
||||
#define FORCE_PR_LOG /* Allow logging in the release build */
|
||||
#define PR_LOGGING 1
|
||||
#include "prlog.h"
|
||||
|
||||
#include "nsDeviceContextSpecG.h"
|
||||
|
||||
#include "nsIPref.h"
|
||||
@ -51,10 +60,23 @@
|
||||
#include "nsReadableUtils.h"
|
||||
#include "nsISupportsArray.h"
|
||||
|
||||
#include "nsPrintfCString.h"
|
||||
|
||||
#ifdef USE_XPRINT
|
||||
#include "xprintutil.h"
|
||||
#endif /* USE_XPRINT */
|
||||
|
||||
#ifdef USE_POSTSCRIPT
|
||||
/* Fetch |postscript_module_paper_sizes| */
|
||||
#include "nsPostScriptObj.h"
|
||||
#endif /* USE_POSTSCRIPT */
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
static PRLogModuleInfo *DeviceContextSpecGTKLM = PR_NewLogModule("DeviceContextSpecGTK");
|
||||
#endif /* PR_LOGGING */
|
||||
/* Macro to make lines shorter */
|
||||
#define DO_PR_DEBUG_LOG(x) PR_LOG(DeviceContextSpecGTKLM, PR_LOG_DEBUG, x)
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// The printer data is shared between the PrinterEnumerator and the nsDeviceContextSpecGTK
|
||||
// The PrinterEnumerator creates the printer info
|
||||
@ -72,6 +94,7 @@ public:
|
||||
PRBool PrintersAreAllocated() { return mGlobalPrinterList != nsnull; }
|
||||
PRInt32 GetNumPrinters() { return mGlobalNumPrinters; }
|
||||
nsString* GetStringAt(PRInt32 aInx) { return mGlobalPrinterList->StringAt(aInx); }
|
||||
void GetDefaultPrinterName(PRUnichar **aDefaultPrinterName);
|
||||
|
||||
protected:
|
||||
GlobalPrinters() {}
|
||||
@ -79,8 +102,8 @@ protected:
|
||||
static GlobalPrinters mGlobalPrinters;
|
||||
static nsStringArray* mGlobalPrinterList;
|
||||
static int mGlobalNumPrinters;
|
||||
|
||||
};
|
||||
|
||||
//---------------
|
||||
// static members
|
||||
GlobalPrinters GlobalPrinters::mGlobalPrinters;
|
||||
@ -90,11 +113,13 @@ int GlobalPrinters::mGlobalNumPrinters = 0;
|
||||
|
||||
nsDeviceContextSpecGTK::nsDeviceContextSpecGTK()
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("nsDeviceContextSpecGTK::nsDeviceContextSpecGTK()\n"));
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsDeviceContextSpecGTK::~nsDeviceContextSpecGTK()
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("nsDeviceContextSpecGTK::~nsDeviceContextSpecGTK()\n"));
|
||||
}
|
||||
|
||||
/* Use both PostScript and Xprint module */
|
||||
@ -127,6 +152,7 @@ static nsresult DisplayXPDialog(nsIPrintSettings* aPS,
|
||||
const char* aChromeURL,
|
||||
PRBool& aClickedOK)
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("nsDeviceContextSpecGTK::DisplayXPDialog()\n"));
|
||||
NS_ASSERTION(aPS, "Must have a print settings!");
|
||||
|
||||
aClickedOK = PR_FALSE;
|
||||
@ -199,8 +225,9 @@ static nsresult DisplayXPDialog(nsIPrintSettings* aPS,
|
||||
*
|
||||
* ** Please update the other toolkits when changing this function.
|
||||
*/
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings* aPS, PRBool aQuiet)
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings *aPS, PRBool aQuiet)
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("nsDeviceContextSpecGTK::Init(aPS=%p. qQuiet=%d)\n", aPS, (int)aQuiet));
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
mPrintSettings = aPS;
|
||||
@ -215,8 +242,25 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings* aPS, PRBool aQuiet)
|
||||
}
|
||||
}
|
||||
|
||||
char *path;
|
||||
PRBool canPrint = PR_FALSE;
|
||||
|
||||
rv = GlobalPrinters::GetInstance()->InitializeGlobalPrinters();
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (!aQuiet) {
|
||||
rv = DisplayXPDialog(mPrintSettings,
|
||||
"chrome://global/content/printdialog.xul", canPrint);
|
||||
} else {
|
||||
rv = NS_OK;
|
||||
canPrint = PR_TRUE;
|
||||
}
|
||||
|
||||
GlobalPrinters::GetInstance()->FreeGlobalPrinters();
|
||||
|
||||
if (NS_SUCCEEDED(rv) && canPrint) {
|
||||
if (aPS) {
|
||||
PRBool reversed = PR_FALSE;
|
||||
PRBool color = PR_FALSE;
|
||||
PRBool tofile = PR_FALSE;
|
||||
@ -233,23 +277,6 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings* aPS, PRBool aQuiet)
|
||||
double dtop = 0.5;
|
||||
double dbottom = 0.5;
|
||||
|
||||
rv = GlobalPrinters::GetInstance()->InitializeGlobalPrinters();
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (!aQuiet ) {
|
||||
rv = DisplayXPDialog(mPrintSettings,
|
||||
"chrome://global/content/printdialog.xul", canPrint);
|
||||
}
|
||||
else {
|
||||
canPrint = PR_TRUE;
|
||||
}
|
||||
|
||||
GlobalPrinters::GetInstance()->FreeGlobalPrinters();
|
||||
|
||||
if (canPrint) {
|
||||
if (aPS != nsnull) {
|
||||
aPS->GetPrinterName(&printer);
|
||||
aPS->GetPrintReversed(&reversed);
|
||||
aPS->GetPrintInColor(&color);
|
||||
@ -266,36 +293,21 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings* aPS, PRBool aQuiet)
|
||||
aPS->GetMarginBottom(&dbottom);
|
||||
aPS->GetMarginRight(&dright);
|
||||
|
||||
if (command != nsnull && printfile != nsnull) {
|
||||
// ToDo: Use LocalEncoding instead of UTF-8 (see bug 73446)
|
||||
strcpy(mCommand, NS_ConvertUCS2toUTF8(command).get());
|
||||
if (printfile)
|
||||
strcpy(mPath, NS_ConvertUCS2toUTF8(printfile).get());
|
||||
}
|
||||
if (printer != nsnull)
|
||||
if (command)
|
||||
strcpy(mCommand, NS_ConvertUCS2toUTF8(command).get());
|
||||
if (printer)
|
||||
strcpy(mPrinter, NS_ConvertUCS2toUTF8(printer).get());
|
||||
#ifdef DEBUG_rods
|
||||
printf("margins: %5.2f,%5.2f,%5.2f,%5.2f\n",
|
||||
dtop, dleft, dbottom, dright);
|
||||
printf("printRange %d\n", printRange);
|
||||
printf("fromPage %d\n", fromPage);
|
||||
printf("toPage %d\n", toPage);
|
||||
printf("tofile %d\n", tofile);
|
||||
printf("printfile %s\n",
|
||||
printfile? NS_ConvertUCS2toUTF8(printfile).get():"NULL");
|
||||
printf("command %s\n",
|
||||
command? NS_ConvertUCS2toUTF8(command).get():"NULL");
|
||||
printf("printer %s\n",
|
||||
printer? NS_ConvertUCS2toUTF8(printer).get():"NULL");
|
||||
#endif /* DEBUG_rods */
|
||||
} else {
|
||||
#ifdef VMS
|
||||
// Note to whoever puts the "lpr" into the prefs file. Please contact me
|
||||
// as I need to make the default be "print" instead of "lpr" for OpenVMS.
|
||||
strcpy(mCommand, "print");
|
||||
#else
|
||||
strcpy(mCommand, "lpr ${MOZ_PRINTER_NAME:+'-P'}${MOZ_PRINTER_NAME}");
|
||||
#endif /* VMS */
|
||||
}
|
||||
|
||||
DO_PR_DEBUG_LOG(("margins: %5.2f,%5.2f,%5.2f,%5.2f\n", dtop, dleft, dbottom, dright));
|
||||
DO_PR_DEBUG_LOG(("printRange %d\n", printRange));
|
||||
DO_PR_DEBUG_LOG(("fromPage %d\n", fromPage));
|
||||
DO_PR_DEBUG_LOG(("toPage %d\n", toPage));
|
||||
DO_PR_DEBUG_LOG(("tofile %d\n", tofile));
|
||||
DO_PR_DEBUG_LOG(("printfile '%s'\n", printfile? NS_ConvertUCS2toUTF8(printfile).get():"<NULL>"));
|
||||
DO_PR_DEBUG_LOG(("command '%s'\n", command? NS_ConvertUCS2toUTF8(command).get():"<NULL>"));
|
||||
DO_PR_DEBUG_LOG(("printer '%s'\n", printer? NS_ConvertUCS2toUTF8(printer).get():"<NULL>"));
|
||||
|
||||
mTop = dtop;
|
||||
mBottom = dbottom;
|
||||
@ -306,27 +318,7 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings* aPS, PRBool aQuiet)
|
||||
mOrientation = orientation;
|
||||
mToPrinter = !tofile;
|
||||
mCopies = copies;
|
||||
|
||||
// PWD, HOME, or fail
|
||||
|
||||
if (!printfile) {
|
||||
if ( ( path = PR_GetEnv( "PWD" ) ) == (char *) nsnull )
|
||||
if ( ( path = PR_GetEnv( "HOME" ) ) == (char *) nsnull )
|
||||
strcpy(mPath, "mozilla.ps");
|
||||
|
||||
if ( path != (char *) nsnull )
|
||||
sprintf(mPath, "%s/mozilla.ps", path);
|
||||
else
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
if (command != nsnull) {
|
||||
nsMemory::Free(command);
|
||||
}
|
||||
if (printfile != nsnull) {
|
||||
nsMemory::Free(printfile);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return rv;
|
||||
@ -416,11 +408,17 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::GetPageSizeInTwips(PRInt32 *aWidth, PRInt3
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDeviceContextSpecGTK::GetPrintMethod(PrintMethod &aMethod)
|
||||
{
|
||||
return GetPrintMethod(mPrinter, aMethod);
|
||||
}
|
||||
|
||||
/* static !! */
|
||||
nsresult nsDeviceContextSpecGTK::GetPrintMethod(const char *aPrinter, PrintMethod &aMethod)
|
||||
{
|
||||
#if defined(USE_POSTSCRIPT) && defined(USE_XPRINT)
|
||||
/* printer names for the PostScript module alwas start with
|
||||
* the NS_POSTSCRIPT_DRIVER_NAME string */
|
||||
if (strncmp(mPrinter, NS_POSTSCRIPT_DRIVER_NAME,
|
||||
if (strncmp(aPrinter, NS_POSTSCRIPT_DRIVER_NAME,
|
||||
NS_POSTSCRIPT_DRIVER_NAME_LEN) != 0)
|
||||
aMethod = pmXprint;
|
||||
else
|
||||
@ -442,6 +440,67 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::ClosePrintManager()
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* Get prefs for printer
|
||||
* Search order:
|
||||
* - Get prefs per printer name and module name
|
||||
* - Get prefs per printer name
|
||||
* - Get prefs per module name
|
||||
* - Get prefs
|
||||
*/
|
||||
static
|
||||
nsresult CopyPrinterCharPref(nsIPref *pref, const char *modulename, const char *printername, const char *prefname, char **return_buf)
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("CopyPrinterCharPref('%s', '%s', '%s')\n", modulename, printername, prefname));
|
||||
|
||||
NS_ENSURE_ARG_POINTER(return_buf);
|
||||
|
||||
nsXPIDLCString name;
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
if (printername && modulename) {
|
||||
/* Get prefs per printer name and module name */
|
||||
name = nsPrintfCString(512, "print.%s.printer_%s.%s", modulename, printername, prefname);
|
||||
DO_PR_DEBUG_LOG(("trying to get '%s'\n", name.get()));
|
||||
rv = pref->CopyCharPref(name, return_buf);
|
||||
}
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
if (printername) {
|
||||
/* Get prefs per printer name */
|
||||
name = nsPrintfCString(512, "print.printer_%s.%s", printername, prefname);
|
||||
DO_PR_DEBUG_LOG(("trying to get '%s'\n", name.get()));
|
||||
rv = pref->CopyCharPref(name, return_buf);
|
||||
}
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
if (modulename) {
|
||||
/* Get prefs per module name */
|
||||
name = nsPrintfCString(512, "print.%s.%s", modulename, prefname);
|
||||
DO_PR_DEBUG_LOG(("trying to get '%s'\n", name.get()));
|
||||
rv = pref->CopyCharPref(name, return_buf);
|
||||
}
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
/* Get prefs */
|
||||
name = nsPrintfCString(512, "print.%s", prefname);
|
||||
DO_PR_DEBUG_LOG(("trying to get '%s'\n", name.get()));
|
||||
rv = pref->CopyCharPref(name, return_buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PR_LOG
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
DO_PR_DEBUG_LOG(("CopyPrinterCharPref returning '%s'.\n", *return_buf));
|
||||
}
|
||||
else
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("CopyPrinterCharPref failure.\n"));
|
||||
}
|
||||
#endif /* PR_LOG */
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Printer Enumerator
|
||||
nsPrinterEnumeratorGTK::nsPrinterEnumeratorGTK()
|
||||
@ -482,7 +541,6 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::EnumeratePrinters(PRUint32* aCount, PRUnic
|
||||
int count = 0;
|
||||
while( count < numPrinters )
|
||||
{
|
||||
|
||||
PRUnichar *str = ToNewUnicode(*GlobalPrinters::GetInstance()->GetStringAt(count));
|
||||
|
||||
if (!str) {
|
||||
@ -504,23 +562,247 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::EnumeratePrinters(PRUint32* aCount, PRUnic
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Return the Default Printer name
|
||||
/* readonly attribute wstring defaultPrinterName; */
|
||||
NS_IMETHODIMP nsPrinterEnumeratorGTK::GetDefaultPrinterName(PRUnichar * *aDefaultPrinterName)
|
||||
NS_IMETHODIMP nsPrinterEnumeratorGTK::GetDefaultPrinterName(PRUnichar **aDefaultPrinterName)
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("nsPrinterEnumeratorGTK::GetDefaultPrinterName()\n"));
|
||||
NS_ENSURE_ARG_POINTER(aDefaultPrinterName);
|
||||
*aDefaultPrinterName = nsnull;
|
||||
|
||||
GlobalPrinters::GetInstance()->GetDefaultPrinterName(aDefaultPrinterName);
|
||||
|
||||
DO_PR_DEBUG_LOG(("GetDefaultPrinterName(): default printer='%s'.\n", NS_ConvertUCS2toUTF8(*aDefaultPrinterName).get()));
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void initPrintSettingsFromPrinter (in wstring aPrinterName, in nsIPrintSettings aPrintSettings); */
|
||||
NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnichar *aPrinterName, nsIPrintSettings *aPrintSettings)
|
||||
{
|
||||
DO_PR_DEBUG_LOG(("nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter()"));
|
||||
nsresult rv;
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aPrinterName);
|
||||
NS_ENSURE_ARG_POINTER(aPrintSettings);
|
||||
|
||||
if (!*aPrinterName) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
if (aPrintSettings == nsnull) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIPref> pPrefs = do_GetService(NS_PREF_CONTRACTID, &rv);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
nsXPIDLCString printerName;
|
||||
printerName.Assign(NS_ConvertUCS2toUTF8(aPrinterName));
|
||||
DO_PR_DEBUG_LOG(("printerName='%s'\n", printerName.get()));
|
||||
|
||||
PrintMethod type = pmInvalid;
|
||||
rv = nsDeviceContextSpecGTK::GetPrintMethod(printerName, type);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
#ifdef USE_POSTSCRIPT
|
||||
/* "Demangle" postscript printer name */
|
||||
if (type == pmPostScript) {
|
||||
/* Strip the leading NS_POSTSCRIPT_DRIVER_NAME from |printerName|,
|
||||
* e.g. turn "PostScript/foobar" to "foobar" */
|
||||
printerName.Cut(0, NS_POSTSCRIPT_DRIVER_NAME_LEN);
|
||||
}
|
||||
#endif /* USE_POSTSCRIPT */
|
||||
|
||||
#ifdef SET_PRINTER_FEATURES_VIA_PREFS
|
||||
/* Defaults to FALSE */
|
||||
pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", printerName.get()).get(), PR_FALSE);
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
|
||||
/* These switches may be dynamic in the future... */
|
||||
PRBool doingFilename = PR_TRUE;
|
||||
PRBool doingNumCopies = PR_TRUE;
|
||||
PRBool doingOrientation = PR_TRUE;
|
||||
PRBool doingPaperSize = PR_TRUE;
|
||||
PRBool doingCommand = PR_TRUE;
|
||||
|
||||
if (doingFilename) {
|
||||
nsXPIDLCString filename;
|
||||
if (NS_FAILED(CopyPrinterCharPref(pPrefs, nsnull, printerName, "filename", getter_Copies(filename)))) {
|
||||
const char *path;
|
||||
|
||||
if (!(path = PR_GetEnv("PWD")))
|
||||
path = PR_GetEnv("HOME");
|
||||
|
||||
if (path)
|
||||
filename = nsPrintfCString(PATH_MAX, "%s/mozilla.ps", path);
|
||||
else
|
||||
filename.Assign("mozilla.ps");
|
||||
}
|
||||
|
||||
DO_PR_DEBUG_LOG(("Setting default filename to '%s'\n", filename.get()));
|
||||
aPrintSettings->SetToFileName(NS_ConvertUTF8toUCS2(filename).get());
|
||||
}
|
||||
|
||||
#ifdef USE_XPRINT
|
||||
if (type == pmXprint) {
|
||||
DO_PR_DEBUG_LOG(("InitPrintSettingsFromPrinter() for Xprint printer\n"));
|
||||
|
||||
Display *pdpy;
|
||||
XPContext pcontext;
|
||||
if (XpuGetPrinter(printerName, &pdpy, &pcontext) != 1)
|
||||
return NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND;
|
||||
|
||||
if (doingOrientation) {
|
||||
XpuOrientationList olist;
|
||||
int ocount;
|
||||
XpuOrientationRec *default_orientation;
|
||||
|
||||
/* Get list of supported orientations */
|
||||
olist = XpuGetOrientationList(pdpy, pcontext, &ocount);
|
||||
if (olist) {
|
||||
default_orientation = &olist[0]; /* First entry is the default one */
|
||||
|
||||
if (!strcasecmp(default_orientation->orientation, "portrait")) {
|
||||
DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n"));
|
||||
aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation);
|
||||
}
|
||||
else if (!strcasecmp(default_orientation->orientation, "landscape")) {
|
||||
DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n"));
|
||||
aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation);
|
||||
}
|
||||
else {
|
||||
DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", default_orientation->orientation));
|
||||
}
|
||||
|
||||
XpuFreeOrientationList(olist);
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup Number of Copies */
|
||||
if (doingNumCopies) {
|
||||
#ifdef NOT_IMPLEMENTED_YET
|
||||
aPrintSettings->SetNumCopies(PRInt32(aDevMode->dmCopies));
|
||||
#endif /* NOT_IMPLEMENTED_YET */
|
||||
}
|
||||
|
||||
if (doingPaperSize) {
|
||||
XpuMediumSourceSizeList mlist;
|
||||
int mcount;
|
||||
XpuMediumSourceSizeRec *default_medium;
|
||||
|
||||
mlist = XpuGetMediumSourceSizeList(pdpy, pcontext, &mcount);
|
||||
if (mlist) {
|
||||
default_medium = &mlist[0]; /* First entry is the default one */
|
||||
double total_width = default_medium->ma1 + default_medium->ma2,
|
||||
total_height = default_medium->ma3 + default_medium->ma4;
|
||||
|
||||
DO_PR_DEBUG_LOG(("setting default paper size to %g/%g mm\n", total_width, total_height));
|
||||
aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined);
|
||||
aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters);
|
||||
aPrintSettings->SetPaperWidth(total_width);
|
||||
aPrintSettings->SetPaperHeight(total_height);
|
||||
|
||||
#ifdef SET_PRINTER_FEATURES_VIA_PREFS
|
||||
pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", printerName.get()).get(), PR_TRUE);
|
||||
|
||||
int i;
|
||||
for( i = 0 ; i < mcount ; i++ )
|
||||
{
|
||||
XpuMediumSourceSizeRec *curr = &mlist[i];
|
||||
double total_width = curr->ma1 + curr->ma2,
|
||||
total_height = curr->ma3 + curr->ma4;
|
||||
pPrefs->SetCharPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.name", printerName.get(), i).get(), curr->medium_name);
|
||||
pPrefs->SetIntPref( nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.width_mm", printerName.get(), i).get(), PRInt32(total_width));
|
||||
pPrefs->SetIntPref( nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.height_mm", printerName.get(), i).get(), PRInt32(total_height));
|
||||
pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.is_inch", printerName.get(), i).get(), PR_FALSE);
|
||||
}
|
||||
pPrefs->SetIntPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.count", printerName.get(), i).get(), (PRInt32)mcount);
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
|
||||
XpuFreeMediumSourceSizeList(mlist);
|
||||
}
|
||||
}
|
||||
|
||||
XpuClosePrinterDisplay(pdpy, pcontext);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
else
|
||||
#endif /* USE_XPRINT */
|
||||
|
||||
#ifdef USE_POSTSCRIPT
|
||||
if (type == pmPostScript) {
|
||||
DO_PR_DEBUG_LOG(("InitPrintSettingsFromPrinter() for PostScript printer\n"));
|
||||
|
||||
if (doingNumCopies) {
|
||||
/* Not implemented yet */
|
||||
}
|
||||
|
||||
if (doingOrientation) {
|
||||
nsXPIDLCString orientation;
|
||||
if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "orientation", getter_Copies(orientation)))) {
|
||||
if (!strcasecmp(orientation, "portrait")) {
|
||||
DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n"));
|
||||
aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation);
|
||||
}
|
||||
else if (!strcasecmp(orientation, "landscape")) {
|
||||
DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n"));
|
||||
aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation);
|
||||
}
|
||||
else {
|
||||
DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", orientation.get()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (doingPaperSize) {
|
||||
/* Not implemented yet */
|
||||
nsXPIDLCString papername;
|
||||
if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) {
|
||||
int i;
|
||||
double width = 0.,
|
||||
height = 0.;
|
||||
|
||||
for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ )
|
||||
{
|
||||
const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i];
|
||||
|
||||
if (!strcasecmp(papername, curr->name)) {
|
||||
width = curr->width;
|
||||
height = curr->height;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (width!=0.0 && height!=0.0) {
|
||||
DO_PR_DEBUG_LOG(("setting default paper size to %g/%g inch\n", width, height));
|
||||
aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined);
|
||||
aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches);
|
||||
aPrintSettings->SetPaperWidth(width);
|
||||
aPrintSettings->SetPaperHeight(height);
|
||||
}
|
||||
else {
|
||||
DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (doingCommand) {
|
||||
nsXPIDLCString command;
|
||||
if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "print_command", getter_Copies(command)))) {
|
||||
DO_PR_DEBUG_LOG(("setting default print command to '%s'\n", command.get()));
|
||||
aPrintSettings->SetPrintCommand(NS_ConvertUTF8toUCS2(command).get());
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
#endif /* USE_POSTSCRIPT */
|
||||
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsPrinterEnumeratorGTK::DisplayPropertiesDlg(const PRUnichar *aPrinter, nsIPrintSettings* aPrintSettings)
|
||||
NS_IMETHODIMP nsPrinterEnumeratorGTK::DisplayPropertiesDlg(const PRUnichar *aPrinter, nsIPrintSettings *aPrintSettings)
|
||||
{
|
||||
/* fixme: We simply ignore the |aPrinter| argument here
|
||||
* We should get the supported printer attributes from the printer and
|
||||
@ -625,8 +907,35 @@ nsresult GlobalPrinters::InitializeGlobalPrinters ()
|
||||
//----------------------------------------------------------------------
|
||||
void GlobalPrinters::FreeGlobalPrinters()
|
||||
{
|
||||
if (mGlobalPrinterList) {
|
||||
delete mGlobalPrinterList;
|
||||
mGlobalPrinterList = nsnull;
|
||||
mGlobalNumPrinters = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
GlobalPrinters::GetDefaultPrinterName(PRUnichar **aDefaultPrinterName)
|
||||
{
|
||||
*aDefaultPrinterName = nsnull;
|
||||
|
||||
PRBool allocate = (GlobalPrinters::GetInstance()->PrintersAreAllocated() == PR_FALSE);
|
||||
|
||||
if (allocate) {
|
||||
nsresult rv = GlobalPrinters::GetInstance()->InitializeGlobalPrinters();
|
||||
if (NS_FAILED(rv)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
NS_ASSERTION(GlobalPrinters::GetInstance()->PrintersAreAllocated(), "no GlobalPrinters");
|
||||
|
||||
if (GlobalPrinters::GetInstance()->GetNumPrinters() == 0)
|
||||
return;
|
||||
|
||||
*aDefaultPrinterName = ToNewUnicode(*GlobalPrinters::GetInstance()->GetStringAt(0));
|
||||
|
||||
if (allocate) {
|
||||
GlobalPrinters::GetInstance()->FreeGlobalPrinters();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,6 +91,7 @@ public:
|
||||
NS_IMETHOD GetLandscape (PRBool &aLandscape);
|
||||
NS_IMETHOD GetUserCancelled(PRBool &aCancel);
|
||||
NS_IMETHOD GetPrintMethod(PrintMethod &aMethod);
|
||||
static nsresult GetPrintMethod(const char *aPrinter, PrintMethod &aMethod);
|
||||
NS_IMETHOD GetPageSizeInTwips(PRInt32 *aWidth, PRInt32 *aHeight);
|
||||
virtual ~nsDeviceContextSpecGTK();
|
||||
|
||||
@ -99,7 +100,6 @@ protected:
|
||||
PRBool mToPrinter; /* If PR_TRUE, print to printer */
|
||||
PRBool mFpf; /* If PR_TRUE, first page first */
|
||||
PRBool mGrayscale; /* If PR_TRUE, print grayscale */
|
||||
int mSize; /* Paper size e.g., SizeLetter */
|
||||
int mOrientation; /* Orientation e.g. Portrait */
|
||||
char mCommand[PATH_MAX]; /* Print command e.g., lpr */
|
||||
char mPath[PATH_MAX]; /* If toPrinter = PR_FALSE, dest file */
|
||||
@ -121,10 +121,6 @@ public:
|
||||
nsPrinterEnumeratorGTK();
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIPRINTERENUMERATOR
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
||||
#endif /* !nsDeviceContextSpecGTK_h___ */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user