Welcome to mirror list, hosted at ThFree Co, Russian Federation.

_remmina-_r_d_p-and-_hi_d_p_i-scaling_8md_source.html « public - gitlab.com/Remmina/remminadoc.gitlab.io.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 28f1a2ac0526357e7ee47ba5bc0487f4945f2baf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Remmina - The GTK+ Remote Desktop Client: Remmina-RDP-and-HiDPI-scaling.md Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="org.remmina.Remmina.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Remmina - The GTK+ Remote Desktop Client
   &#160;<span id="projectnumber">v1.4.33</span>
   </div>
   <div id="projectbrief">Remmina is a remote desktop client written in GTK+, aiming to be useful for system administrators and travellers, who need to work with lots of remote computers in front of either large monitors or tiny netbooks. Remmina supports multiple network protocols in an integrated and consistent user interface. Currently RDP, VNC, NX, XDMCP and SSH are supported.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_remmina-_r_d_p-and-_hi_d_p_i-scaling_8md.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Remmina-RDP-and-HiDPI-scaling.md</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_remmina-_r_d_p-and-_hi_d_p_i-scaling_8md.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;TL;DR all the RDP remote desktops are blurred on a HiDPI monitor with scaling enabled. And there is no way to fix it under Gnome Shell. Read issues #1778 #1878 to find a workaround for gnome shell, or switch to KDE desktop.</div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;## How is it supposed to work</div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;The RDP protocol, starting with Windows 8.1, requires that scaling be done at the server-side. Your local Remmina client should simply draw unscaled the bitmaps it receives from the server.</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;## Why it does not work</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;GTK3 and Gnome Shell have a horrible implementation of HiDPI scaling.</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;When you enable scaling on your Gnome Shell settings, you enable an integer scaling factor, i.e. 1x 2x 3x. After enabling scaling under Gnome Shell, GTK 3 will scale all bitmaps we draw to a GtkDrawingArea by that scaling factor. It will also scale all cursor bitmaps and mouse positions/movement.</div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;As we told before, RDP requires that all those scaling operations to be done at the server-side by windows, not by the client.</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;We tried to neutralize GTK integral scaling factor for Remmina application, but we did not reach acceptable results:</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;* Neutralize bitmap scaling: can be done in code with cairo, but requires some dozen lines of code in various Remmina parts</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;* Neutralize cursor position scaling: can be done just by multiplying by the scaling factor, but we lose precision in mouse position.</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;* Neutralize window dimension/allocation scaling: again this can be done by multiplying or dividing by the scaling factor the GtkDrawingArea width and height. But we lose precision.</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;* Neutralize cursor scaling: seems to be impossible to do with GTK. So we could scale down the cursor bitmap, but it will be shown pixelated due to the duplication of pixels done by GTK.</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;All this effort took around 100 lines of code, 3-4 hours of development and many hours of testing. And the result is really bad: cursor is still bad, code became more complex, a bit of mouse precision is lost.</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;Note that the first problem &quot;neutralize bitmap scaling&quot; could be also partially solved using the current Remmina scaler and a fix remote resolution, provided that every time you change the remote resolution you should recalculate your local window size. A simpler approach is to enable the Remmina scaler, set the remote resolution as your monitor full resolution and use Remmina full screen only. But cursors are still not scaled See [issue 1878](https://gitlab.com/Remmina/Remmina/issues/1878).</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;## Even worse: fractional scaling experimental feature</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;Recently an experimental feature has been added to Gnome Shell to enable fractional scaling (i.e: 1.7x), both for X.Org and Wayland. This feature seems to set GTK scaling to 2x and then apply a global screen scaling via Xrandr or similar (the compositor).</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;This makes Remmina impossible to correctly deal with local scaling: Remmina can no longer disable scaling done by Xrandr, and is also unable to determine your current monitor scaling factor to send to the remote server. The result is very blurry.</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;## How should it work</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;Windows 10, MacOS, KDE/Qt have a simple approach to HiDPI: an application can declare itself to be HiDPI aware. When the application declares itself HiDPI aware, all graphical drawings to the monitor are not scaled, all pointer motions are not scaled, all mouse cursor are not scaled. But all wigets of the application, like buttons, texts are still correctly rendered at bigger dimensions. Under Qt this can obtained with a single line of code: `QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling);`</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;Unfortunately, Remmina is not a Qt application, it&#39;s a GTK application. And Gnome Shell is not Plasma.</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;## Updates</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;Freedesktop.org in 2022 implemented [wp-fractional-scale-v1](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/143) in the Wayland Protocol. But as said in that MR, &quot;GTK4 only has integer scaling, no expectation for this to change until at least GTK5&quot;. So we must wait GTK5 and see if GTK5 will also expose an API to disable automatic scaling.</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;April 2023: GTK is preparing to support HiDPI wayland fractional scale: [GTK MR5767](https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/5767) and [GTK MR5763](https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/5763)</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;</div></div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="_remmina-_r_d_p-and-_hi_d_p_i-scaling_8md.html">Remmina-RDP-and-HiDPI-scaling.md</a></li>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>