示例#1
0
文件: gtk_util.py 项目: ilyapoz/Xpra
def get_screen_sizes(xscale=1, yscale=1):
    from xpra.platform.gui import get_workarea, get_workareas
    def xs(v):
        return iround(v/xscale)
    def ys(v):
        return iround(v/yscale)
    def swork(*workarea):
        return xs(workarea[0]), ys(workarea[1]), xs(workarea[2]), ys(workarea[3])
    display = display_get_default()
    i=0
    screen_sizes = []
    n_screens = display.get_n_screens()
    screenlog("get_screen_sizes(%f, %f) found %s screens", xscale, yscale, n_screens)
    while i<n_screens:
        screen = display.get_screen(i)
        j = 0
        monitors = []
        workareas = []
        #native "get_workareas()" is only valid for a single screen (but describes all the monitors)
        #and it is only implemented on win32 right now
        #other platforms only implement "get_workarea()" instead, which is reported against the screen
        n_monitors = screen.get_n_monitors()
        screenlog(" screen %s has %s monitors", i, n_monitors)
        if n_screens==1:
            workareas = get_workareas()
            if workareas and len(workareas)!=n_monitors:
                screenlog(" workareas: %s", workareas)
                screenlog(" number of monitors does not match number of workareas!")
                workareas = []
        while j<screen.get_n_monitors():
            geom = screen.get_monitor_geometry(j)
            plug_name = ""
            if hasattr(screen, "get_monitor_plug_name"):
                plug_name = screen.get_monitor_plug_name(j) or ""
            wmm = -1
            if hasattr(screen, "get_monitor_width_mm"):
                wmm = screen.get_monitor_width_mm(j)
            hmm = -1
            if hasattr(screen, "get_monitor_height_mm"):
                hmm = screen.get_monitor_height_mm(j)
            monitor = [plug_name, xs(geom.x), ys(geom.y), xs(geom.width), ys(geom.height), wmm, hmm]
            screenlog(" monitor %s: %s", j, monitor)
            if workareas:
                w = workareas[j]
                monitor += list(swork(*w))
            monitors.append(tuple(monitor))
            j += 1
        work_x, work_y, work_width, work_height = swork(0, 0, screen.get_width(), screen.get_height())
        workarea = get_workarea()
        if workarea:
            work_x, work_y, work_width, work_height = swork(*workarea)
        screenlog(" workarea=%s", workarea)
        item = (screen.make_display_name(), xs(screen.get_width()), ys(screen.get_height()),
                    screen.get_width_mm(), screen.get_height_mm(),
                    monitors,
                    work_x, work_y, work_width, work_height)
        screenlog(" screen %s: %s", i, item)
        screen_sizes.append(item)
        i += 1
    return screen_sizes
示例#2
0
def get_screen_sizes(xscale=1, yscale=1):
    from xpra.platform.gui import get_workarea, get_workareas
    def xs(v):
        return iround(v/xscale)
    def ys(v):
        return iround(v/yscale)
    def swork(*workarea):
        return xs(workarea[0]), ys(workarea[1]), xs(workarea[2]), ys(workarea[3])
    display = display_get_default()
    i=0
    screen_sizes = []
    n_screens = display.get_n_screens()
    screenlog("get_screen_sizes(%f, %f) found %s screens", xscale, yscale, n_screens)
    while i<n_screens:
        screen = display.get_screen(i)
        j = 0
        monitors = []
        workareas = []
        #native "get_workareas()" is only valid for a single screen (but describes all the monitors)
        #and it is only implemented on win32 right now
        #other platforms only implement "get_workarea()" instead, which is reported against the screen
        n_monitors = screen.get_n_monitors()
        screenlog(" screen %s has %s monitors", i, n_monitors)
        if n_screens==1:
            workareas = get_workareas()
            if workareas and len(workareas)!=n_monitors:
                screenlog(" workareas: %s", workareas)
                screenlog(" number of monitors does not match number of workareas!")
                workareas = []
        while j<screen.get_n_monitors():
            geom = screen.get_monitor_geometry(j)
            plug_name = ""
            if hasattr(screen, "get_monitor_plug_name"):
                plug_name = screen.get_monitor_plug_name(j) or ""
            wmm = -1
            if hasattr(screen, "get_monitor_width_mm"):
                wmm = screen.get_monitor_width_mm(j)
            hmm = -1
            if hasattr(screen, "get_monitor_height_mm"):
                hmm = screen.get_monitor_height_mm(j)
            monitor = [plug_name, xs(geom.x), ys(geom.y), xs(geom.width), ys(geom.height), wmm, hmm]
            screenlog(" monitor %s: %s", j, monitor)
            if workareas:
                w = workareas[j]
                monitor += list(swork(*w))
            monitors.append(tuple(monitor))
            j += 1
        work_x, work_y, work_width, work_height = swork(0, 0, screen.get_width(), screen.get_height())
        workarea = get_workarea()
        if workarea:
            work_x, work_y, work_width, work_height = swork(*workarea)
        screenlog(" workarea=%s", workarea)
        item = (screen.make_display_name(), xs(screen.get_width()), ys(screen.get_height()),
                    screen.get_width_mm(), screen.get_height_mm(),
                    monitors,
                    work_x, work_y, work_width, work_height)
        screenlog(" screen %s: %s", i, item)
        screen_sizes.append(item)
        i += 1
    return screen_sizes
示例#3
0
 def get_screen_sizes(self):
     display = display_get_default()
     i = 0
     screen_sizes = []
     n_screens = display.get_n_screens()
     screenlog("get_screen_sizes() found %s screens", n_screens)
     while i < n_screens:
         screen = display.get_screen(i)
         j = 0
         monitors = []
         workareas = []
         #native "get_workareas()" is only valid for a single screen (but describes all the monitors)
         #and it is only implemented on win32 right now
         #other platforms only implement "get_workarea()" instead, which is reported against the screen
         n_monitors = screen.get_n_monitors()
         screenlog("get_screen_sizes() screen %s has %s monitors", i,
                   n_monitors)
         if n_screens == 1:
             workareas = get_workareas()
             if len(workareas) != n_monitors:
                 screenlog(
                     "number of monitors does not match number of workareas!"
                 )
                 workareas = []
         while j < screen.get_n_monitors():
             geom = screen.get_monitor_geometry(j)
             plug_name = ""
             if hasattr(screen, "get_monitor_plug_name"):
                 plug_name = screen.get_monitor_plug_name(j) or ""
             wmm = -1
             if hasattr(screen, "get_monitor_width_mm"):
                 wmm = screen.get_monitor_width_mm(j)
             hmm = -1
             if hasattr(screen, "get_monitor_height_mm"):
                 hmm = screen.get_monitor_height_mm(j)
             monitor = [
                 plug_name, geom.x, geom.y, geom.width, geom.height, wmm,
                 hmm
             ]
             screenlog("get_screen_sizes() monitor %s: %s", j, monitor)
             if workareas:
                 w = workareas[j]
                 monitor += list(w)
             monitors.append(tuple(monitor))
             j += 1
         work_x, work_y = 0, 0
         work_width, work_height = screen.get_width(), screen.get_height()
         workarea = get_workarea()
         if workarea:
             work_x, work_y, work_width, work_height = workarea
         screenlog("get_screen_sizes() workarea=%s", workarea)
         item = (screen.make_display_name(), screen.get_width(),
                 screen.get_height(), screen.get_width_mm(),
                 screen.get_height_mm(), monitors, work_x, work_y,
                 work_width, work_height)
         screenlog("get_screen_sizes() screen %s: %s", i, item)
         screen_sizes.append(item)
         i += 1
     return screen_sizes
示例#4
0
 def get_screen_sizes(self):
     display = display_get_default()
     i=0
     screen_sizes = []
     n_screens = display.get_n_screens()
     screenlog("get_screen_sizes() found %s screens", n_screens)
     while i<n_screens:
         screen = display.get_screen(i)
         j = 0
         monitors = []
         workareas = []
         #native "get_workareas()" is only valid for a single screen (but describes all the monitors)
         #and it is only implemented on win32 right now
         #other platforms only implement "get_workarea()" instead, which is reported against the screen
         n_monitors = screen.get_n_monitors()
         screenlog("get_screen_sizes() screen %s has %s monitors", i, n_monitors)
         if n_screens==1:
             workareas = get_workareas()
             if len(workareas)!=n_monitors:
                 screenlog("number of monitors does not match number of workareas!")
                 workareas = []
         while j<screen.get_n_monitors():
             geom = screen.get_monitor_geometry(j)
             plug_name = ""
             if hasattr(screen, "get_monitor_plug_name"):
                 plug_name = screen.get_monitor_plug_name(j) or ""
             wmm = -1
             if hasattr(screen, "get_monitor_width_mm"):
                 wmm = screen.get_monitor_width_mm(j)
             hmm = -1
             if hasattr(screen, "get_monitor_height_mm"):
                 hmm = screen.get_monitor_height_mm(j)
             monitor = [plug_name, geom.x, geom.y, geom.width, geom.height, wmm, hmm]
             screenlog("get_screen_sizes() monitor %s: %s", j, monitor)
             if workareas:
                 w = workareas[j]
                 monitor += list(w)
             monitors.append(tuple(monitor))
             j += 1
         work_x, work_y = 0, 0
         work_width, work_height = screen.get_width(), screen.get_height()
         workarea = get_workarea()
         if workarea:
             work_x, work_y, work_width, work_height = workarea
         screenlog("get_screen_sizes() workarea=%s", workarea)
         item = (screen.make_display_name(), screen.get_width(), screen.get_height(),
                     screen.get_width_mm(), screen.get_height_mm(),
                     monitors,
                     work_x, work_y, work_width, work_height)
         screenlog("get_screen_sizes() screen %s: %s", i, item)
         screen_sizes.append(item)
         i += 1
     return screen_sizes
示例#5
0
文件: gtk_util.py 项目: qmutz/xpra
def get_screen_sizes(xscale=1, yscale=1):
    from xpra.platform.gui import get_workarea, get_workareas

    def xs(v):
        return iround(v / xscale)

    def ys(v):
        return iround(v / yscale)

    def swork(*workarea):
        return xs(workarea[0]), ys(workarea[1]), xs(workarea[2]), ys(
            workarea[3])

    display = Gdk.Display.get_default()
    if not display:
        return ()
    MIN_DPI = envint("XPRA_MIN_DPI", 10)
    MAX_DPI = envint("XPRA_MIN_DPI", 500)

    def dpi(size_pixels, size_mm):
        if size_mm == 0:
            return 0
        return iround(size_pixels * 254 / size_mm / 10)

    n_screens = display.get_n_screens()
    get_n_monitors = getattr(display, "get_n_monitors", None)
    if get_n_monitors:
        #GTK 3.22: always just one screen
        n_monitors = get_n_monitors()
        workareas = get_workareas()
        if workareas and len(workareas) != n_monitors:
            screenlog(" workareas: %s", workareas)
            screenlog(
                " number of monitors does not match number of workareas!")
            workareas = []
        monitors = []
        for j in range(n_monitors):
            monitor = display.get_monitor(j)
            geom = monitor.get_geometry()
            manufacturer, model = monitor.get_manufacturer(
            ), monitor.get_model()
            if manufacturer and model:
                plug_name = "%s %s" % (manufacturer, model)
            elif manufacturer:
                plug_name = manufacturer
            elif model:
                plug_name = model
            else:
                plug_name = "%i" % j
            wmm, hmm = monitor.get_width_mm(), monitor.get_height_mm()
            monitor_info = [
                plug_name,
                xs(geom.x),
                ys(geom.y),
                xs(geom.width),
                ys(geom.height), wmm, hmm
            ]
            screenlog(" monitor %s: %s", j, monitor)
            if GTK_WORKAREA and hasattr(monitor, "get_workarea"):
                rect = monitor.get_workarea()
                monitor_info += list(
                    swork(rect.x, rect.y, rect.width, rect.height))
            elif workareas:
                w = workareas[j]
                monitor_info += list(swork(*w))
            monitors.append(tuple(monitor_info))
        screen = display.get_default_screen()
        sw, sh = screen.get_width(), screen.get_height()
        work_x, work_y, work_width, work_height = swork(0, 0, sw, sh)
        workarea = get_workarea()  #pylint: disable=assignment-from-none
        if workarea:
            work_x, work_y, work_width, work_height = swork(*workarea)  #pylint: disable=not-an-iterable
        screenlog(" workarea=%s", workarea)
        wmm = screen.get_width_mm()
        hmm = screen.get_height_mm()
        xdpi = dpi(sw, wmm)
        ydpi = dpi(sh, hmm)
        if xdpi < MIN_DPI or xdpi > MAX_DPI or ydpi < MIN_DPI or ydpi > MAX_DPI:
            log("ignoring invalid screen size %ix%imm", wmm, hmm)
            if os.environ.get("WAYLAND_DISPLAY"):
                log(" (wayland display?)")
            if n_monitors > 0:
                wmm = sum(
                    display.get_monitor(i).get_width_mm()
                    for i in range(n_monitors))
                hmm = sum(
                    display.get_monitor(i).get_height_mm()
                    for i in range(n_monitors))
                xdpi = dpi(sw, wmm)
                ydpi = dpi(sh, hmm)
            if xdpi < MIN_DPI or xdpi > MAX_DPI or ydpi < MIN_DPI or ydpi > MAX_DPI:
                #still invalid, generate one from DPI=96
                wmm = iround(sw * 25.4 / 96)
                hmm = iround(sh * 25.4 / 96)
            log(" using %ix%i mm", wmm, hmm)
        item = (screen.make_display_name(), xs(sw), ys(sh), wmm, hmm, monitors,
                work_x, work_y, work_width, work_height)
        screenlog(" screen: %s", item)
        screen_sizes = [item]
    else:
        i = 0
        screen_sizes = []
        #GTK2 or GTK3<3.22:
        screenlog("get_screen_sizes(%f, %f) found %s screens", xscale, yscale,
                  n_screens)
        while i < n_screens:
            screen = display.get_screen(i)
            j = 0
            monitors = []
            workareas = []
            #native "get_workareas()" is only valid for a single screen (but describes all the monitors)
            #and it is only implemented on win32 right now
            #other platforms only implement "get_workarea()" instead, which is reported against the screen
            n_monitors = screen.get_n_monitors()
            screenlog(" screen %s has %s monitors", i, n_monitors)
            if n_screens == 1:
                workareas = get_workareas()
                if workareas and len(workareas) != n_monitors:
                    screenlog(" workareas: %s", workareas)
                    screenlog(
                        " number of monitors does not match number of workareas!"
                    )
                    workareas = []
            while j < screen.get_n_monitors():
                geom = screen.get_monitor_geometry(j)
                plug_name = ""
                if hasattr(screen, "get_monitor_plug_name"):
                    plug_name = screen.get_monitor_plug_name(j) or ""
                wmm = -1
                if hasattr(screen, "get_monitor_width_mm"):
                    wmm = screen.get_monitor_width_mm(j)
                hmm = -1
                if hasattr(screen, "get_monitor_height_mm"):
                    hmm = screen.get_monitor_height_mm(j)
                monitor = [
                    plug_name,
                    xs(geom.x),
                    ys(geom.y),
                    xs(geom.width),
                    ys(geom.height), wmm, hmm
                ]
                screenlog(" monitor %s: %s", j, monitor)
                if workareas:
                    w = workareas[j]
                    monitor += list(swork(*w))
                monitors.append(tuple(monitor))
                j += 1
            work_x, work_y, work_width, work_height = swork(
                0, 0, screen.get_width(), screen.get_height())
            workarea = get_workarea()  #pylint: disable=assignment-from-none
            if workarea:
                work_x, work_y, work_width, work_height = swork(*workarea)  #pylint: disable=not-an-iterable
            screenlog(" workarea=%s", workarea)
            item = (screen.make_display_name(), xs(screen.get_width()),
                    ys(screen.get_height()), screen.get_width_mm(),
                    screen.get_height_mm(), monitors, work_x, work_y,
                    work_width, work_height)
            screenlog(" screen %s: %s", i, item)
            screen_sizes.append(item)
            i += 1
    return screen_sizes
示例#6
0
def get_screen_sizes(xscale=1, yscale=1):
    from xpra.platform.gui import get_workarea, get_workareas

    def xs(v):
        return round(v / xscale)

    def ys(v):
        return round(v / yscale)

    def swork(*workarea):
        return xs(workarea[0]), ys(workarea[1]), xs(workarea[2]), ys(
            workarea[3])

    display = Gdk.Display.get_default()
    if not display:
        return ()
    MIN_DPI = envint("XPRA_MIN_DPI", 10)
    MAX_DPI = envint("XPRA_MIN_DPI", 500)

    def dpi(size_pixels, size_mm):
        if size_mm == 0:
            return 0
        return round(size_pixels * 254 / size_mm / 10)

    #GTK 3.22 onwards always returns just a single screen,
    #potentially with multiple monitors
    n_monitors = display.get_n_monitors()
    workareas = get_workareas()
    if workareas and len(workareas) != n_monitors:
        screenlog(" workareas: %s", workareas)
        screenlog(" number of monitors does not match number of workareas!")
        workareas = []
    monitors = []
    for j in range(n_monitors):
        monitor = display.get_monitor(j)
        geom = monitor.get_geometry()
        manufacturer, model = monitor.get_manufacturer(), monitor.get_model()
        if manufacturer == "unknown":
            manufacturer = ""
        if model == "unknown":
            model = ""
        if manufacturer and model:
            plug_name = "%s %s" % (manufacturer, model)
        elif manufacturer:
            plug_name = manufacturer
        elif model:
            plug_name = model
        else:
            plug_name = "%i" % j
        wmm, hmm = monitor.get_width_mm(), monitor.get_height_mm()
        monitor_info = [
            plug_name,
            xs(geom.x),
            ys(geom.y),
            xs(geom.width),
            ys(geom.height), wmm, hmm
        ]
        screenlog(" monitor %s: %s, model=%s, manufacturer=%s", j,
                  type(monitor).__name__, monitor.get_model(),
                  monitor.get_manufacturer())
        if GTK_WORKAREA and hasattr(monitor, "get_workarea"):
            rect = monitor.get_workarea()
            monitor_info += list(swork(rect.x, rect.y, rect.width,
                                       rect.height))
        elif workareas:
            w = workareas[j]
            monitor_info += list(swork(*w))
        monitors.append(tuple(monitor_info))
    screen = display.get_default_screen()
    sw, sh = screen.get_width(), screen.get_height()
    work_x, work_y, work_width, work_height = swork(0, 0, sw, sh)
    workarea = get_workarea()  #pylint: disable=assignment-from-none
    if workarea:
        work_x, work_y, work_width, work_height = swork(*workarea)  #pylint: disable=not-an-iterable
    screenlog(" workarea=%s", workarea)
    wmm = screen.get_width_mm()
    hmm = screen.get_height_mm()
    xdpi = dpi(sw, wmm)
    ydpi = dpi(sh, hmm)
    if xdpi < MIN_DPI or xdpi > MAX_DPI or ydpi < MIN_DPI or ydpi > MAX_DPI:
        log("ignoring invalid screen size %ix%imm", wmm, hmm)
        if os.environ.get("WAYLAND_DISPLAY"):
            log(" (wayland display?)")
        if n_monitors > 0:
            wmm = 0
            for mi in range(n_monitors):
                monitor = display.get_monitor(mi)
                log(" monitor %i: %s, model=%s, manufacturer=%s", mi, monitor,
                    monitor.get_model(), monitor.get_manufacturer())
                wmm += monitor.get_width_mm()
                hmm += monitor.get_height_mm()
            wmm /= n_monitors
            hmm /= n_monitors
            xdpi = dpi(sw, wmm)
            ydpi = dpi(sh, hmm)
        if xdpi < MIN_DPI or xdpi > MAX_DPI or ydpi < MIN_DPI or ydpi > MAX_DPI:
            #still invalid, generate one from DPI=96
            wmm = round(sw * 25.4 / 96)
            hmm = round(sh * 25.4 / 96)
        log(" using %ix%i mm", wmm, hmm)
    screen0 = (screen.make_display_name(), xs(sw), ys(sh), wmm, hmm, monitors,
               work_x, work_y, work_width, work_height)
    screenlog(" screen: %s", screen0)
    return [screen0]