Package:thunderbird
Version:91.7.0esr

I have a printing problem, Canon printers using the cnijfilter2 driver cannot print in black and white I reported it to Mozilla with a solution. It has been adopted and will be applied on version 100
The problem is that the implementation of Portal for printing is faulty.
The test proposed by emilio (Emilio Cobos Álvarez) works if Portal is not activated: "Can you confirm that going to about:config and setting print.cups.monochrome.extra_settings to CNGrayscale:True makes it behave as you expect? Thanks." Mozilla has removed its portal implementation, Gtk printing uses portal transparently: https://phabricator.services.mozilla.com/D139594 I have disabled Portal in version 91.7 of firefox-esr and thunderbird, I attach the patch. Do you think that this patch can be integrated quickly in Thunderbird and Firefox-esr.

Thierry Huchard
Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 firefox-esr (91.7.0esr-1s2~deb9u1) misc; urgency=medium
 .
   * Port to Ordissimo.
Author: Thierry HUCHARD <thie...@ordissimo.com>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2022-03-23

--- firefox-esr-91.7.0esr.orig/widget/gtk/nsDeviceContextSpecG.cpp
+++ firefox-esr-91.7.0esr/widget/gtk/nsDeviceContextSpecG.cpp
@@ -231,7 +231,7 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::In
   mGtkPageSetup = gtk_page_setup_copy(mGtkPageSetup);
   mGtkPrintSettings = gtk_print_settings_copy(mGtkPrintSettings);
 
-  if (!aPS->GetPrintInColor() && StaticPrefs::print_cups_monochrome_enabled()) {
+  if (!aPS->GetPrintInColor()) {
     for (const auto& setting : kKnownMonochromeSettings) {
       gtk_print_settings_set(mGtkPrintSettings, setting.mKey, setting.mValue);
     }
@@ -294,71 +294,18 @@ gboolean nsDeviceContextSpecGTK::Printer
 
 void nsDeviceContextSpecGTK::StartPrintJob() {
   // When using flatpak, we have to call the Print method of the portal
-  nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  bool shouldUsePortal;
-  giovfs->ShouldUseFlatpakPortal(&shouldUsePortal);
-  if (shouldUsePortal) {
-    GError* error = nullptr;
-    GDBusProxy* dbusProxy = g_dbus_proxy_new_for_bus_sync(
-        G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, nullptr,
-        "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop",
-        "org.freedesktop.portal.Print", nullptr, &error);
-    if (dbusProxy == nullptr) {
-      NS_WARNING(
-          nsPrintfCString("Unable to create dbus proxy: %s", error->message)
-              .get());
-      g_error_free(error);
-      return;
-    }
-    int fd = open(mSpoolName.get(), O_RDONLY | O_CLOEXEC);
-    if (fd == -1) {
-      NS_WARNING("Failed to open spool file.");
-      return;
-    }
-    static auto s_g_unix_fd_list_new = reinterpret_cast<GUnixFDList* (*)(void)>(
-        dlsym(RTLD_DEFAULT, "g_unix_fd_list_new"));
-    NS_ASSERTION(s_g_unix_fd_list_new,
-                 "Cannot find g_unix_fd_list_new function.");
-
-    GUnixFDList* fd_list = s_g_unix_fd_list_new();
-    static auto s_g_unix_fd_list_append =
-        reinterpret_cast<gint (*)(GUnixFDList*, gint, GError**)>(
-            dlsym(RTLD_DEFAULT, "g_unix_fd_list_append"));
-    int idx = s_g_unix_fd_list_append(fd_list, fd, NULL);
-    close(fd);
-
-    // We'll pass empty options as long as we don't have token from PreparePrint
-    // dbus call (which we don't use). This unfortunatelly lead to showing
-    // gtk print dialog and also the duplex or printer specific settings
-    // is not honored, so this needs to be fixed when the portal provides
-    // more options.
-    GVariantBuilder opt_builder;
-    g_variant_builder_init(&opt_builder, G_VARIANT_TYPE_VARDICT);
-
-    g_dbus_proxy_call_with_unix_fd_list(
-        dbusProxy, "Print",
-        g_variant_new("(ssh@a{sv})", "", /* window */
-                      "Print",           /* title */
-                      idx, g_variant_builder_end(&opt_builder)),
-        G_DBUS_CALL_FLAGS_NONE, -1, fd_list, NULL,
-        NULL,      // portal result cb function
-        nullptr);  // userdata
-    g_object_unref(fd_list);
-    g_object_unref(dbusProxy);
-  } else {
-    GtkPrintJob* job =
-        gtk_print_job_new(mTitle.get(), mPrintSettings->GetGtkPrinter(),
-                          mGtkPrintSettings, mGtkPageSetup);
-
-    if (!gtk_print_job_set_source_file(job, mSpoolName.get(), nullptr)) return;
-
-    // Now gtk owns the print job, and will be released via our callback.
-    gtk_print_job_send(job, print_callback, mSpoolFile.forget().take(),
-                       [](gpointer aData) {
-                         auto* spoolFile = static_cast<nsIFile*>(aData);
-                         NS_RELEASE(spoolFile);
-                       });
-  }
+  GtkPrintJob* job =
+      gtk_print_job_new(mTitle.get(), mPrintSettings->GetGtkPrinter(),
+                        mGtkPrintSettings, mGtkPageSetup);
+
+  if (!gtk_print_job_set_source_file(job, mSpoolName.get(), nullptr)) return;
+
+  // Now gtk owns the print job, and will be released via our callback.
+  gtk_print_job_send(job, print_callback, mSpoolFile.forget().take(),
+                     [](gpointer aData) {
+                       auto* spoolFile = static_cast<nsIFile*>(aData);
+                       NS_RELEASE(spoolFile);
+                     });
 }
 
 void nsDeviceContextSpecGTK::EnumeratePrinters() {
@@ -432,21 +379,6 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::En
     // different numbers of bits for their permissions)
     destFile->SetPermissions(0666 & ~(mask));
 
-    // Notify flatpak printing portal that file is completely written
-    nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-    bool shouldUsePortal;
-    if (giovfs) {
-      giovfs->ShouldUseFlatpakPortal(&shouldUsePortal);
-      if (shouldUsePortal) {
-        // Use the name of the file for printing to match with
-        // nsFlatpakPrintPortal
-        nsCOMPtr<nsIObserverService> os =
-            mozilla::services::GetObserverService();
-        // Pass filename to be sure that observer process the right data
-        os->NotifyObservers(nullptr, "print-to-file-finished",
-                            targetPath.get());
-      }
-    }
   }
   return NS_OK;
 }
--- firefox-esr-91.7.0esr.orig/widget/nsPrinterCUPS.h
+++ firefox-esr-91.7.0esr/widget/nsPrinterCUPS.h
@@ -135,6 +135,7 @@ class nsPrinterCUPS final : public nsPri
       macro_("BRMonoColor", "Mono")               /* Brother */                \
       macro_("BRPrintQuality", "Black")           /* Brother */                \
       macro_("CNIJGrayScale", "1")                /* Canon */                  \
+      macro_("CNGrayscale", "True")               /* Canon */                  \
       macro_("INK", "MONO")                       /* Epson */                  \
       macro_("HPColorMode", "GrayscalePrint")     /* HP */                     \
       macro_("ColorMode", "Mono")                 /* Samsung */                \

Reply via email to