; Module/File: Printer_CupsAPIConsole_Demo.pb ; Function: Demo: List cups printers, get/set infos, server and user-default-printer - Linux ; Author: Omi ; Date: Apr. 03, 2016 ; Version: 0.2, updated 02-2017 ; Target Compiler: PureBasic 5.22/5.31/5.40 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ;-------------------------------------------------------------- ; Linux only ? ; Query Cups printers and User-default printer with terminal-commands ; Set user-default and server-default printer ; (Querying the server-printer-name needs Cups-API) ; no installations required ; ; see: Printer_CupsAPI_Demo.pb too EnableExplicit Enumeration #CupsNPrinter #CupsListPrinters #CupsListOptions #CupsSetUserDef #CupsSetServerDef EndEnumeration Global.i gEvent, gQuit Global.i gNPrinters Global.s gDefaultPrinterName Procedure.s RunProgram_GetOutput(Command.s, Parameter.s, Path.s, OpenRead.i) Protected.i ProgramId Protected.s PrgOut= "" ProgramId= RunProgram(Command, Parameter, Path, OpenRead) If ProgramId While ProgramRunning(ProgramId) If AvailableProgramOutput(ProgramId) PrgOut + ReadProgramString(ProgramId) + #LF$ EndIf Wend EndIf ProcedureReturn PrgOut EndProcedure Procedure Cups_GetOptionsForPrinter(PrinterName.s, LIG_Options) Protected.i I, O, PosTemp Protected.s PrgOutAll= "", PrgOutLine, Options ;Options for PrinterName PrgOutAll= RunProgram_GetOutput("lpoptions", "-p " + PrinterName + " -l", "", #PB_Program_Open | #PB_Program_Read) ClearGadgetItems(LIG_Options) If PrgOutAll <> "" For I= 1 To CountString(PrgOutAll, #LF$)+ 1 PrgOutLine= StringField(PrgOutAll, I, #LF$) PosTemp = FindString(PrgOutLine, ": ") If PosTemp AddGadgetItem(LIG_Options, -1, Left(PrgOutLine, PosTemp+ 1)); option name PrgOutLine= Mid(PrgOutLine, PosTemp+ 2) Options = "" For O= 1 To CountString(PrgOutLine, " ")+ 1 Options+ StringField(PrgOutLine, O, " ")+ #LF$; option values Next O Options= RTrim(Options, #LF$) SetGadgetItemText(LIG_Options, CountGadgetItems(LIG_Options)- 1, Options, 1) EndIf Next I EndIf EndProcedure Procedure Cups_ListPrinters(LIG_Printers) Protected.i I, PosTemp Protected.s PrgOutAll= "", PrgOutLine, PrinterName ;list printer names PrgOutAll= RunProgram_GetOutput("lpstat", "-p", "", #PB_Program_Open | #PB_Program_Read) If PrgOutAll <> "" Debug PrgOutAll gNPrinters= CountString(PrgOutAll, #LF$) For I= 1 To gNPrinters PrgOutLine= StringField(PrgOutAll, I, #LF$) Debug PrgOutLine PosTemp = FindString(PrgOutLine, "printer ") If PosTemp PrinterName= Mid(PrgOutLine, PosTemp+ 8, FindString(PrgOutLine, " ", 9)- 9); extract printer name AddGadgetItem(LIG_Printers, -1, PrinterName) EndIf Next I EndIf EndProcedure Procedure Cups_MarkDefaultPrinter(LIG_Printers) Protected.i I Protected.s PrgOutAll= "" ;Query user default printer names PrgOutAll= RunProgram_GetOutput("lpstat", "-d", "", #PB_Program_Open | #PB_Program_Read) If FindString(PrgOutAll, "system default destination: ") PrgOutAll= RTrim(Mid(PrgOutAll, 29), #LF$) For I= 0 To CountGadgetItems(LIG_Printers)- 1 If GetGadgetItemText(LIG_Printers, I, 0) = PrgOutAll SetGadgetItemText(LIG_Printers, I, "1", 1) gDefaultPrinterName= PrgOutAll Else SetGadgetItemText(LIG_Printers, I, "0", 1) EndIf Next I EndIf EndProcedure Procedure Cups_SetDefaultUserPrinter(LIG_Printers) Protected.i I ;Set user default printer from name If RunProgram("lpoptions", "-d " + GetGadgetItemText(LIG_Printers, GetGadgetState(LIG_Printers), 0), ""); set user default printer + DefaultPrinterName,e.g. 'hp-LaserJet-1150' For I= 0 To CountGadgetItems(LIG_Printers)- 1 If I = GetGadgetState(LIG_Printers) SetGadgetItemText(LIG_Printers, I, "1", 1) gDefaultPrinterName= GetGadgetItemText(LIG_Printers, I, 1) Else SetGadgetItemText(LIG_Printers, I, "0", 1) EndIf Next I EndIf EndProcedure Procedure Cups_SetDefaultServerPrinter(LIG_Printers) ;Set server default printer from name RunProgram("lpadmin", "-d " + GetGadgetItemText(LIG_Printers, GetGadgetState(LIG_Printers), 0), ""); set user default printer + DefaultPrinterName 'hp-LaserJet-1150' EndProcedure If OpenWindow(0, 300, 200, 800, 320, "Cups printers: List & set default printer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) TextGadget(#PB_Any, 5, 10, 400, 22, "Cups printers with console commands: ") TextGadget(#CupsNPrinter, 5, 35, 170, 22, "") ListIconGadget(#CupsListPrinters, 5, 60, 350, 170, "Printer name", 250, #PB_ListIcon_GridLines) AddGadgetColumn(#CupsListPrinters, 2, "User-Default", 70) gtk_tree_selection_set_mode_(gtk_tree_view_get_selection_(GadgetID(#CupsListPrinters)), #GTK_SELECTION_BROWSE) ListIconGadget(#CupsListOptions, 360, 60, 430, 244, "Option name:", 250, #PB_ListIcon_GridLines) AddGadgetColumn(#CupsListOptions, 1, "Value:", 130) gtk_tree_selection_set_mode_(gtk_tree_view_get_selection_(GadgetID(#CupsListOptions)), #GTK_SELECTION_NONE) ButtonGadget(#CupsSetUserDef, 5, 240, 350, 28, "Selected printer as user default") ButtonGadget(#CupsSetServerDef, 5, 275, 350, 28, "Selected printer as server default") Cups_ListPrinters(#CupsListPrinters) Cups_MarkDefaultPrinter(#CupsListPrinters) SetGadgetText(#CupsNPrinter, "Listed Cups printers: "+ Str(gNPrinters)) GadgetToolTip(#CupsSetUserDef, "The presetted printer in requesters." + #LF$ + "E.g. 'hearted' in Xubuntu/Mint printer-dial.") GadgetToolTip(#CupsSetServerDef, "The server main printer." + #LF$ + "E.g. the 'checked' one in printer dial.") Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Gadget Select EventGadget() Case #CupsListPrinters If EventType() = #PB_EventType_Change If GetGadgetState(#CupsListPrinters) > -1 Cups_GetOptionsForPrinter(GetGadgetItemText(#CupsListPrinters, GetGadgetState(#CupsListPrinters), 0), #CupsListOptions) EndIf EndIf Case #CupsSetUserDef If GetGadgetState(#CupsListPrinters) > -1 Cups_SetDefaultUserPrinter(#CupsListPrinters) EndIf Case #CupsSetServerDef If GetGadgetState(#CupsListPrinters) > -1 Cups_SetDefaultServerPrinter(#CupsListPrinters) EndIf EndSelect EndSelect Until gQuit EndIf ; IDE Options = PureBasic 5.51 (Linux - x86) ; CursorPosition = 4 ; Folding = -- ; EnableXP ; EnableUnicode