GDK.Monitor Functions

Linux specific forum
User avatar
mk-soft
Always Here
Always Here
Posts: 6245
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

GDK.Monitor Functions

Post by mk-soft »

I had some time and integrated the GDK.Monitor functions. ;)

Update v1.02.0

Code: Select all

;-TOP by mk-soft, v1.02.0, 02.11.2024

ImportC ""
  gdk_display_get_default()
  gdk_display_get_monitor(*display, monitor_num.i)
  gdk_display_get_monitor_at_point(*display, x.i, y.i)
  gdk_display_get_monitor_at_window(*display, *gdkwindow)
  gdk_display_get_n_monitors(*display)
  gdk_display_get_primary_monitor(*display)
  gdk_monitor_get_display(*monitor)
  gdk_monitor_get_geometry(*monitor, *geometry.GdkRectangle)
  gdk_monitor_get_workarea(*monitor, *workarea.GdkRectangle)
  gdk_monitor_get_width_mm(*monitor)
  gdk_monitor_get_height_mm(*monitor)
  gdk_monitor_get_manufacturer(*monitor)
  gdk_monitor_get_model(*monitor)
  gdk_monitor_get_scale_factor(*monitor)
  gdk_monitor_get_refresh_rate(*monitor)
  gdk_monitor_get_subpixel_layout(*monitor)
  gdk_monitor_is_primary(*monitor)
EndImport

; ********

CompilerIf #PB_Compiler_IsMainFile
  
  ;-TOP
  
  Procedure InfoMonitor(*monitor)
    Protected temp.s, rate.i, dblRate.d, scale.i, width.i, height.i, primary, *char
    
    *char = gdk_monitor_get_manufacturer(*monitor)
    If *char
      temp = "Manufactor: " + PeekS(*char, -1, #PB_UTF8)
      AddGadgetItem(0, -1, temp)
    EndIf
    *char = gdk_monitor_get_model(*monitor)
    If *char
      temp = "Model: " + PeekS(*char, -1, #PB_UTF8)
      AddGadgetItem(0, -1, temp)
    EndIf
    
    gdk_monitor_get_geometry(*monitor, geometry.GdkRectangle)
    With geometry
      temp = "Geometry: " + \x + ", " + \y + " - " + \width + ", " + \height
    EndWith
    AddGadgetItem(0, -1, temp)
    
    gdk_monitor_get_workarea(*monitor, workarea.GdkRectangle)
    With workarea
      temp = "Workarea: " + \x + ", " + \y + " - " + \width + ", " + \height
    EndWith
    AddGadgetItem(0, -1, temp)
    
    scale = gdk_monitor_get_scale_factor(*monitor)
    temp = "Scalefactor: " + scale
    AddGadgetItem(0, -1, temp)
    
    rate.i = gdk_monitor_get_refresh_rate(*monitor)
    dblRate.d = rate / 1000.0
    temp = "Rate: " + StrD(dblRate, 3) + "Hz"
    AddGadgetItem(0, -1, temp)
    
    width = gdk_monitor_get_width_mm(*monitor)
    height = gdk_monitor_get_height_mm(*monitor)
    temp = "Monitor width: " + width + "mm, height: " + height + "mm"
    AddGadgetItem(0, -1, temp)
    
    If gdk_monitor_is_primary(*monitor)
      AddGadgetItem(0, -1, "Monitor is primary")
    Else
      AddGadgetItem(0, -1, "Monitor is not primary")
    EndIf
    
  EndProcedure
  
  Procedure UpdateWindow()
    Protected dx, dy
    dx = WindowWidth(0)
    dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
    ; Resize Gadgets
    ResizeGadget(0, 0, 0, dx, dy)
  EndProcedure
  
  Procedure Main()
    Protected dx, dy
    Protected *monitor, monitors, i
    
    #WinStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
    
    If OpenWindow(0, #PB_Ignore, #PB_Ignore, 600, 400, "Test Window - GDK.Monitor", #WinStyle)
      ; MenuBar
      CreateMenu(0, WindowID(0))
      MenuTitle("File")
      MenuItem(99, "E&xit")
      
      ; StatusBar
      CreateStatusBar(0, WindowID(0))
      AddStatusBarField(#PB_Ignore)
      
      ; Gadgets
      dx = WindowWidth(0)
      dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
      ListViewGadget(0, 0, 0, dx, dy)
      
      ; Bind Events
      BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), 0)
      
      ; Data
      *display = gdk_display_get_default();
      ;*gdkwindow = gdk_get_default_root_window_();
      ;*monitor = gdk_display_get_monitor_at_window(*display, *gdkwindow);
      
      monitors = gdk_display_get_n_monitors(*display)
      If monitors
        For i = 1 To monitors
          *monitor = gdk_display_get_monitor(*display, i - 1)
          If *monitor
            AddGadgetItem(0, -1, "MONITOR " + i + "/" + monitors)
            InfoMonitor(*monitor)
          EndIf
        Next
      Else
        *monitor = gdk_display_get_primary_monitor(*display)
        If *monitor
          AddGadgetItem(0, -1, "PRIMARY MONITOR")
          InfoMonitor(*monitor)
        EndIf
      EndIf
      
      ; Main Loop
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            Select EventWindow()
              Case 0
                Break
            EndSelect
            
          Case #PB_Event_Menu
            Select EventMenu()
              Case 99
                Break
                
            EndSelect
            
          Case #PB_Event_Gadget
            Select EventGadget()
                
            EndSelect
            
        EndSelect
      ForEver
      
    EndIf
    
  EndProcedure : Main()
  
CompilerEndIf
Last edited by mk-soft on Sat Nov 02, 2024 8:15 pm, edited 1 time in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 6245
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: GDK.Monitor Functions

Post by mk-soft »

Update v1.01.2

Can anyone test this with more than one monitor? ;)
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
#NULL
Addict
Addict
Posts: 1499
Joined: Thu Aug 30, 2007 11:54 pm
Location: right here

Re: GDK.Monitor Functions

Post by #NULL »

Thank you, seems to work.

Ubuntu 18.04.6 LTS

Code: Select all

MONITOR 1/2
Model: LVDS-1
Geometry: 0, 0 - 1440, 900
Workarea: 0, 0 - 1440, 875
Scalefactor: 1
Rate: 60.037Hz
Monitor width: 303mm, height: 189mm
Monitor is primary
MONITOR 2/2
Model: HDMI-3
Geometry: 1440, 0 - 1680, 1050
Workarea: 1440, 0 - 1680, 1050
Scalefactor: 1
Rate: 59.974Hz
Monitor width: 474mm, height: 296mm
Monitor is not primary
Ubuntu 24.04.1 LTS

Code: Select all

MONITOR 1/2
Manufactor: GBT
Model: HDMI-2
Geometry: 0, 0 - 1920, 1080
Workarea: 0, 30 - 1920, 1050
Scalefactor: 1
Rate: 60.000Hz
Monitor width: 597mm, height: 336mm
Monitor is primary
MONITOR 2/2
Manufactor: AUO
Model: eDP-1
Geometry: 444, 1080 - 1600, 900
Workarea: 444, 1080 - 1600, 900
Scalefactor: 1
Rate: 60.049Hz
Monitor width: 276mm, height: 155mm
Monitor is not primary
On the Ubuntu 24, even if I changed global scaling to >100, scaling is always reported as 1, even If i change scale type to .f or .d or if I debug gdk_monitor_get_scale_factor() directly. (Maybe I would have to re-login, didn't try that.)
#NULL
Addict
Addict
Posts: 1499
Joined: Thu Aug 30, 2007 11:54 pm
Location: right here

Re: GDK.Monitor Functions

Post by #NULL »

On reading up, it seems this function has nothing to do with the desktop scaling I think, so it's fine.
User avatar
mk-soft
Always Here
Always Here
Posts: 6245
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: GDK.Monitor Functions

Post by mk-soft »

#NULL wrote: Sat Nov 02, 2024 3:17 pm On reading up, it seems this function has nothing to do with the desktop scaling I think, so it's fine.
Thanks for testing. ;)

get_scale_factor is only an ‘int’ and under monitor settings there is also only 100% or 200%
Here the return value also works with 1 or 2
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
Mijikai
Addict
Addict
Posts: 1520
Joined: Sun Sep 11, 2016 2:17 pm

Re: GDK.Monitor Functions

Post by Mijikai »

Nice, thanks :)

I do this:

Code: Select all

ImportC ""
  gdk_display_get_default.i()
  gdk_display_get_monitor.i(*display,monitor_num.i)
  gdk_display_get_monitor_at_point.i(*display,x.i,y.i)
  gdk_display_get_monitor_at_window.i(*display,*gdkwindow)
  gdk_display_get_n_monitors.i(*display)
  gdk_display_get_primary_monitor.i(*display)
  gdk_monitor_get_display.i(*monitor)
  gdk_monitor_get_geometry.i(*monitor,*geometry.GdkRectangle)
  gdk_monitor_get_workarea.i(*monitor,*workarea.GdkRectangle)
  gdk_monitor_get_width_mm.i(*monitor)
  gdk_monitor_get_height_mm.i(*monitor)
  gdk_monitor_get_manufacturer.i(*monitor)
  gdk_monitor_get_model.i(*monitor)
  gdk_monitor_get_scale_factor.i(*monitor)
  gdk_monitor_get_refresh_rate.i(*monitor)
  gdk_monitor_get_subpixel_layout.i(*monitor)
  gdk_monitor_is_primary.i(*monitor)
EndImport
User avatar
mk-soft
Always Here
Always Here
Posts: 6245
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: GDK.Monitor Functions

Post by mk-soft »

Update v1.02.0

You're right. Strangely enough, the ImportC did not work first. I must have mistyped

Thanks for the proof that this works ;)
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Post Reply