diff dwt/printing/Printer.d @ 240:ce446666f5a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Mon, 12 May 2008 19:13:01 +0200
parents 380bad9f6852
children 5a30aa9820f3
line wrap: on
line diff
--- a/dwt/printing/Printer.d	Mon May 12 15:36:37 2008 +0200
+++ b/dwt/printing/Printer.d	Mon May 12 19:13:01 2008 +0200
@@ -29,7 +29,7 @@
 import dwt.dwthelper.utils;
 
 static import tango.stdc.stringz;
-static import tango.io.Stdout;
+import tango.io.Stdout;
 import tango.util.Convert;
 
 
@@ -70,8 +70,8 @@
     bool isGCCreated = false;
     Font systemFont;
 
-    String settingsData;
-    int start, end;
+    static String settingsData;
+    static int start, end;
 
     static const String GTK_LPR_BACKEND = "GtkPrintBackendLpr"; //$NON-NLS-1$
 
@@ -88,6 +88,14 @@
     if (OS.GTK_VERSION < OS.buildVERSION (2, 10, 0) || disablePrinting) {
         return printerList;
     }
+    if (!OS.g_thread_supported ()) {
+        OS.g_thread_init (null);
+    }
+    OS.gtk_set_locale();
+    int argc = 0;
+    if (!OS.gtk_init_check ( &argc, null)) {
+        DWT.error (DWT.ERROR_NO_HANDLES, null, " [gtk_init_check() failed]");
+    }
     OS.gtk_enumerate_printers(&GtkPrinterFunc_List, null, null, true);
     return printerList;
 }
@@ -124,6 +132,14 @@
     if (OS.GTK_VERSION < OS.buildVERSION (2, 10, 0) || disablePrinting) {
         return null;
     }
+    if (!OS.g_thread_supported ()) {
+        OS.g_thread_init (null);
+    }
+    OS.gtk_set_locale();
+    int argc = 0;
+    if (!OS.gtk_init_check (&argc, null)) {
+        DWT.error (DWT.ERROR_NO_HANDLES, null, " [gtk_init_check() failed]");
+    }
     OS.gtk_enumerate_printers(&GtkPrinterFunc_Default, null, null, true);
     return printerList[0];
 }
@@ -132,6 +148,8 @@
     if (OS.gtk_printer_is_default(printer)) {
         printerList[0] = printerDataFromGtkPrinter(printer);
         return 1;
+    } else if (OS.GTK_VERSION < OS.buildVERSION(2, 10, 12) && printerDataFromGtkPrinter(printer).driver.equals (GTK_LPR_BACKEND)) {
+        return 1;
     }
     return 0;
 }
@@ -151,6 +169,8 @@
         this.printer = printer;
         OS.g_object_ref(printer);
         return 1;
+    } else if (OS.GTK_VERSION < OS.buildVERSION (2, 10, 12) && pd.driver.equals(GTK_LPR_BACKEND)) {
+        return 1;
     }
     return 0;
 }
@@ -166,6 +186,56 @@
     return new PrinterData (backendType, name);
 }
 
+/*
+* Restore printer settings and page_setup data from data.
+*/
+static void restore(char[] data, GtkPrintSettings* settings, GtkPageSetup* page_setup) {
+    settingsData = data;
+    start = end = 0;
+    while (end < settingsData.length && settingsData[end] !is 0) {
+        start = end;
+        while (end < settingsData.length && settingsData[end] !is 0) end++;
+        end++;
+        char [] keyBuffer = new char [end - start];
+        System.arraycopy (settingsData, start, keyBuffer, 0, keyBuffer.length);
+        start = end;
+        while (end < settingsData.length && settingsData[end] !is 0) end++;
+        end++;
+        char [] valueBuffer = new char [end - start];
+        System.arraycopy (settingsData, start, valueBuffer, 0, valueBuffer.length);
+        OS.gtk_print_settings_set(settings, keyBuffer.ptr, valueBuffer.ptr);
+        if (DEBUG) Stdout.formatln("{}: {}", keyBuffer, valueBuffer );
+    }
+    end++; // skip extra null terminator
+
+    /* Retrieve stored page_setup data.
+     * Note that page_setup properties must be stored (in PrintDialog) and restored (here) in the same order.
+     */
+    OS.gtk_page_setup_set_orientation(page_setup, restoreInt("orientation")); //$NON-NLS-1$
+    OS.gtk_page_setup_set_top_margin(page_setup, restoreDouble("top_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
+    OS.gtk_page_setup_set_bottom_margin(page_setup, restoreDouble("bottom_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
+    OS.gtk_page_setup_set_left_margin(page_setup, restoreDouble("left_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
+    OS.gtk_page_setup_set_right_margin(page_setup, restoreDouble("right_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
+    char [] name = restoreBytes("paper_size_name", true); //$NON-NLS-1$
+    char [] display_name = restoreBytes("paper_size_display_name", true); //$NON-NLS-1$
+    char [] ppd_name = restoreBytes("paper_size_ppd_name", true); //$NON-NLS-1$
+    double width = restoreDouble("paper_size_width"); //$NON-NLS-1$
+    double height = restoreDouble("paper_size_height"); //$NON-NLS-1$
+    bool custom = restoreBoolean("paper_size_is_custom"); //$NON-NLS-1$
+    GtkPaperSize* paper_size = null;
+    if (custom) {
+        if (ppd_name.length > 0) {
+            paper_size = OS.gtk_paper_size_new_from_ppd(ppd_name.ptr, display_name.ptr, width, height);
+        } else {
+            paper_size = OS.gtk_paper_size_new_custom(name.ptr, display_name.ptr, width, height, OS.GTK_UNIT_MM);
+        }
+    } else {
+        paper_size = OS.gtk_paper_size_new(name.ptr);
+    }
+    OS.gtk_page_setup_set_paper_size(page_setup, paper_size);
+    OS.gtk_paper_size_free(paper_size);
+}
+
 static void setScope(GtkPrintSettings* settings, int scope_, int startPage, int endPage) {
     switch (scope_) {
     case PrinterData.ALL_PAGES:
@@ -235,22 +305,22 @@
     super(checkNull(data));
 }
 
-int restoreInt(String key) {
+static int restoreInt(String key) {
     char [] value = restoreBytes(key, false);
     return to!(int)( value );
 }
 
-double restoreDouble(String key) {
+static double restoreDouble(String key) {
     char [] value = restoreBytes(key, false);
     return to!(double)( value );
 }
 
-bool restoreBoolean(String key) {
+static bool restoreBoolean(String key) {
     char [] value = restoreBytes(key, false);
     return to!(bool)( value );
 }
 
-String restoreBytes(String key, bool nullTerminate) {
+static String restoreBytes(String key, bool nullTerminate) {
     //get key
     start = end;
     while (end < settingsData.length && settingsData[end] !is 0) end++;
@@ -328,7 +398,10 @@
         data.drawable = drawable;
         data.background = getSystemColor (DWT.COLOR_WHITE).handle;
         data.foreground = getSystemColor (DWT.COLOR_BLACK).handle;
-        data.font = getSystemFont ().handle;
+        data.font = getSystemFont ();
+        //TODO: We are supposed to return this in pixels, but GTK_UNIT_PIXELS is currently not implemented (gtk bug 346245)
+        data.width = cast(int)OS.gtk_page_setup_get_paper_width (pageSetup, OS.GTK_UNIT_POINTS);
+        data.height = cast(int)OS.gtk_page_setup_get_paper_height (pageSetup, OS.GTK_UNIT_POINTS);
         if (cairo is null) DWT.error(DWT.ERROR_NO_HANDLES);
         data.cairo = cairo;
         isGCCreated = true;
@@ -656,51 +729,7 @@
     settings = OS.gtk_print_settings_new();
     pageSetup = OS.gtk_page_setup_new();
     if (data.otherData !is null) {
-        /* Retreive stored printer_settings data. */
-        settingsData = data.otherData;
-        start = end = 0;
-        while (end < settingsData.length && settingsData[end] !is 0) {
-            start = end;
-            while (end < settingsData.length && settingsData[end] !is 0) end++;
-            end++;
-            char [] keyBuffer = new char [end - start];
-            System.arraycopy (settingsData, start, keyBuffer, 0, keyBuffer.length);
-            start = end;
-            while (end < settingsData.length && settingsData[end] !is 0) end++;
-            end++;
-            char [] valueBuffer = new char [end - start];
-            System.arraycopy (settingsData, start, valueBuffer, 0, valueBuffer.length);
-            OS.gtk_print_settings_set(settings, keyBuffer.ptr, valueBuffer.ptr);
-            if (DEBUG) tango.io.Stdout.Stdout.formatln("{}: {}", keyBuffer, valueBuffer);
-        }
-        end++; // skip extra null terminator
-
-        /* Retreive stored page_setup data.
-         * Note that page_setup properties must be stored (in PrintDialog) and restored (here) in the same order.
-         */
-        OS.gtk_page_setup_set_orientation(pageSetup, restoreInt("orientation")); //$NON-NLS-1$
-        OS.gtk_page_setup_set_top_margin(pageSetup, restoreDouble("top_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
-        OS.gtk_page_setup_set_bottom_margin(pageSetup, restoreDouble("bottom_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
-        OS.gtk_page_setup_set_left_margin(pageSetup, restoreDouble("left_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
-        OS.gtk_page_setup_set_right_margin(pageSetup, restoreDouble("right_margin"), OS.GTK_UNIT_MM); //$NON-NLS-1$
-        char [] name = restoreBytes("paper_size_name", true); //$NON-NLS-1$
-        char [] display_name = restoreBytes("paper_size_display_name", true); //$NON-NLS-1$
-        char [] ppd_name = restoreBytes("paper_size_ppd_name", true); //$NON-NLS-1$
-        double width = restoreDouble("paper_size_width"); //$NON-NLS-1$
-        double height = restoreDouble("paper_size_height"); //$NON-NLS-1$
-        bool custom = restoreBoolean("paper_size_is_custom"); //$NON-NLS-1$
-        GtkPaperSize* paper_size;
-        if (custom) {
-            if (ppd_name.length > 0) {
-                paper_size = OS.gtk_paper_size_new_from_ppd(ppd_name.ptr, display_name.ptr, width, height);
-            } else {
-                paper_size = OS.gtk_paper_size_new_custom(name.ptr, display_name.ptr, width, height, OS.GTK_UNIT_MM);
-            }
-        } else {
-            paper_size = OS.gtk_paper_size_new(name.ptr);
-        }
-        OS.gtk_page_setup_set_paper_size(pageSetup, paper_size);
-        OS.gtk_paper_size_free(paper_size);
+        restore(data.otherData, settings, pageSetup);
     }
 
     /* Set values of settings from PrinterData. */