SetDefaultPrinter / GetDefaultPrinter ... ?

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
pickelrobert
Beiträge: 207
Registriert: 09.12.2004 22:09

SetDefaultPrinter / GetDefaultPrinter ... ?

Beitrag von pickelrobert »

Ich beziehe mich auf folgendes Beispiel aus dem Jahr 2010 von TS-Soft: viewtopic.php?p=263605#p263605

Code: Alles auswählen

EnableExplicit
Prototype.s GetDefaultPrinter(Printer.s, *buffer)
Prototype.i SetDefaultPrinter(Printer.p-unicode)

Procedure.s GetDefaultPrinter()
  Protected DLL.i = OpenLibrary(#PB_Any, "winspool.drv")
  Protected _GetDefaultPrinter.GetDefaultPrinter
  Protected Size.i, Result.s
  
  If DLL
    CompilerIf #PB_Compiler_Unicode
      _GetDefaultPrinter = GetFunction(DLL, "GetDefaultPrinterW")
    CompilerElse
      _GetDefaultPrinter = GetFunction(DLL, "GetDefaultPrinterA")
    CompilerEndIf
    
    If _GetDefaultPrinter
      _GetDefaultPrinter(#NUL$, @Size)
      If Size
        Result = Space(Size)
        _GetDefaultPrinter(Result, @Size)
      EndIf
    EndIf
    CloseLibrary(DLL)
  EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure.i SetDefaultPrinter(Printer.s)
  Protected DLL.i = OpenLibrary(#PB_Any, "winspool.drv")
  Protected _SetDefaultPrinter.Setdefaultprinter
  Protected Result.i
  
  If DLL
    _SetDefaultPrinter = GetFunction(DLL, "SetDefaultPrinterW")
    If _SetDefaultPrinter
      Result = _SetDefaultPrinter(Printer)
    EndIf
    CloseLibrary(DLL) 
  EndIf
  
  ProcedureReturn Result
EndProcedure

; erst den DefaultPrinter zwischenspeichern
Define.s DefaultPrinter = Getdefaultprinter()

; jetzt Deinen Drucker setzen (in diesem Beispiel den PDF-Drucker von Adobe)
If SetDefaultPrinter("Adobe PDF")
  
  ; hier drucken
  ; DefaultPrinter()
  ; StartPrinting(JobName$)
  ; ....
  ; StopPrinting()
  
  ; Drucker zurücksetzen
  SetDefaultPrinter(DefaultPrinter)
EndIf
Gibt es da auch etwas für Linux?
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: SetDefaultPrinter / GetDefaultPrinter ... ?

Beitrag von Shardik »

Das folgende Beispiel zeigt in einem ListViewGadget alle im Common Unix Printing System (CUPS) definierten Drucker an. Die Statuszeile zeigt den aktuell definierten Standard-Drucker an. Ein Doppelklick mit der linken Maustaste auf einen Drucker in der Liste ändert den Standard-Drucker. Ich habe das Beispiel erfolgreich auf Linux Mint 21.3 'Virginia' x64 mit Cinnamon und PB 6.12 x64 getestet.

Code: Alles auswählen

EnableExplicit

Define DefaultPrinter.S

NewList Printer.S()

ImportC ""
  gtk_enumerate_printers(PrinterEnumerationCallback.I, UserData.I,
    DestroyUserDataCallback.I, WaitUntilFinished.I)
  gtk_printer_get_name(*Printer)
  gtk_printer_is_default(*Printer)
EndImport

ProcedureC PrinterEnumerationCallback(*Printer, UserData.I)
  Shared DefaultPrinter.S
  Shared Printer.S()
  
  AddElement(Printer())
  Printer() = PeekS(gtk_printer_get_name(*Printer), -1, #PB_UTF8)

  If gtk_printer_is_default(*Printer)
    DefaultPrinter = Printer()
  EndIf
EndProcedure

Procedure.I SetDefaultPrinter(PrinterName.S)
  Shared DefaultPrinter.S
  Shared Printer.S()

  Protected Result.I

  DefaultPrinter = PrinterName

  If RunProgram("lpoptions", "-d " + PrinterName, "")
    ClearList(Printer())
    StatusBarText(0, 0, "Defauft printer: " + DefaultPrinter,
      #PB_StatusBar_Center)
  EndIf
EndProcedure

Define DefaultPrinter.S

OpenWindow(0, 270, 100, 280, 200, "Available Printers")
CreateStatusBar(0, WindowID(0))
AddStatusBarField(#PB_Ignore)
ListViewGadget(0, 10, 10, WindowWidth(0) - 20,
  WindowHeight(0) - StatusBarHeight(0) - 20)
gtk_enumerate_printers(@PrinterEnumerationCallback(), 0, 0, #True)

If ListSize(Printer()) = 0
  MessageRequester("Error", "No printers were detected!")
Else
  ForEach Printer()
    AddGadgetItem(0, -1, Printer())
  Next

  If DefaultPrinter <> ""
    StatusBarText(0, 0, "Defauft printer: " + DefaultPrinter,
      #PB_StatusBar_Center)
  EndIf

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        If EventGadget() = 0
          If EventType() = #PB_EventType_LeftDoubleClick
            SetDefaultPrinter(GetGadgetText(0))
          EndIf
        EndIf
    EndSelect
  ForEver
EndIf
pickelrobert
Beiträge: 207
Registriert: 09.12.2004 22:09

Re: SetDefaultPrinter / GetDefaultPrinter ... ?

Beitrag von pickelrobert »

Das macht einen guten Eindruck. Habe es unter Debian 12 getestet. Vielen Dank.
Antworten