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

_protocol-_example_8md_source.html « public - gitlab.com/Remmina/remminadoc.gitlab.io.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 92fe57847770e57dc788b12f0282f2cac8144de3 (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: Protocol-Example.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.30</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('_protocol-_example_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">Protocol-Example.md</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_protocol-_example_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;# Example plugin to provide a new protocol</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;</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;```python</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;import sys</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;import remmina</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;import enum</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;import gi</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;import inspect</div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;gi.require_version(&quot;Gtk&quot;, &quot;3.0&quot;)</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;from gi.repository import Gtk, GLib</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;</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;class VncFeature:</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;&quot;&quot;&quot;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;   Internal data struct to hold ids to feature settings.</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;&quot;&quot;&quot;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;    PrefQuality = 1</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;    PrefViewonly = 2</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;    PrefDisableserverinput = 3</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;    ToolRefresh = 4</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;    ToolChat = 5</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;    ToolSendCtrlAltDel = 6</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;    Scale = 7</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;    Unfocus = 8</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;class VncData:</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;&quot;&quot;&quot;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;   Internal data struct to hold state.</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;&quot;&quot;&quot;</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    def __init__(self):</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;        self.connected = False</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;        self.running = False</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;        self.auth_called = False</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;        self.auth_first = False</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;        self.drawing_area = False</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;        self.vnc_buffer = False</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;        self.rgb_buffer = False</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;class Plugin:</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;&quot;&quot;&quot;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;   Plugin implementation</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;&quot;&quot;&quot;</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    def __init__(self):</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;        # This constructor is called before Remmina attempts to register the plugin since it this class has to be instantiated before registering it.</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;        self.name = &quot;A short name of the plugin that also appears in the &#39;Plugin&#39; column in the main dialog.&quot;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;        # One of possible values: &quot;pref&quot;, &quot;tool&quot;, &quot;entry&quot;, &quot;protocol&quot; or &quot;secret&quot;. This value decides which methods are expected to be defined</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;        # in this class.</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;        self.type = &quot;protocol&quot;</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        self.description = &quot;VNC but in Python!&quot;</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;        self.version = &quot;1.0&quot;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;        self.icon_name = &quot;org.remmina.Remmina-vnc-symbolic&quot;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        self.icon_name_ssh = &quot;org.remmina.Remmina-vnc-ssh-symbolic&quot;</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        # Specifies which settings are available for this protocol</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;        self.ssh_setting = remmina.PROTOCOL_SSH_SETTING_TUNNEL</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;        self.gpdata = VncData()</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;        self.qualities = (&quot;0&quot;, &quot;Poor Pixelmess&quot;, &quot;1&quot;,&quot;Mhh kayy&quot;, &quot;2&quot;,&quot;Nice&quot;, &quot;9&quot;,&quot;hot sh*t&quot;)</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;        # Define the features this module supports:</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;        self.features = [</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;            remmina.Feature(</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;                type=remmina.PROTOCOL_FEATURE_TYPE_PREF,</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;                id=VncFeature.PrefQuality,</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;                opt1=remmina.PROTOCOL_FEATURE_PREF_RADIO,</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;                opt2=&quot;quality&quot;,</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;                opt3=self.qualities)</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_PREF, VncFeature.PrefViewonly, remmina.PROTOCOL_FEATURE_PREF_CHECK, &quot;viewonly&quot;, None)</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_PREF, VncFeature.PrefDisableserverinput, remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableserverinput&quot;, &quot;Disable server input&quot;)</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_TOOL, VncFeature.ToolRefresh, &quot;Refresh&quot;, &quot;face-smile&quot;, None)</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_TOOL, VncFeature.ToolChat, &quot;Open Chat…&quot;, &quot;face-smile&quot;, None)</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_TOOL, VncFeature.ToolSendCtrlAltDel,     &quot;Send Ctrl+Alt+Delete&quot;, None, None)</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_SCALE, VncFeature.Scale, None, None, None)</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;            ,remmina.Feature(remmina.PROTOCOL_FEATURE_TYPE_UNFOCUS, VncFeature.Unfocus, None, None, None)</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;        ]</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;        colordepths = (&quot;8&quot;, &quot;256 colors (8 bpp)&quot;, &quot;16&quot;, &quot;High color (16 bpp)&quot;, &quot;32&quot;, &quot;True color (32 bpp)&quot;)</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;        self.basic_settings = [</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;            remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_SERVER,  name=&quot;server&quot;,    label=&quot;&quot;,             compact=False, opt1=&quot;_rfb._tcp&quot;,opt2=None)</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_TEXT,    name=&quot;proxy&quot;,     label=&quot;Repeater&quot;,     compact=False, opt1=None,       opt2=None)</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_TEXT,    name=&quot;username&quot;,  label=&quot;Username&quot;,     compact=False, opt1=None,       opt2=None)</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_PASSWORD,name=&quot;password&quot;,  label=&quot;User password&quot;,compact=False, opt1=None,       opt2=None)</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_SELECT,  name=&quot;colordepth&quot;,label=&quot;Color depth&quot;,  compact=False, opt1=colordepths,opt2=None)</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_SELECT,  name=&quot;quality&quot;,   label=&quot;Quality&quot;,      compact=False, opt1=self.qualities, opt2=None)</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;            , remmina.Setting(type=remmina.PROTOCOL_SETTING_TYPE_KEYMAP,  name=&quot;keymap&quot;,    label=&quot;&quot;,             compact=False, opt1=None,       opt2=None)</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;        ]</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;        self.advanced_settings = [</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;            remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;showcursor&quot;,             &quot;Show remote cursor&quot;,       True,  None, None)</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;viewonly&quot;,               &quot;View only&quot;,                False, None, None)</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableclipboard&quot;,       &quot;Disable clipboard sync&quot;,   True,  None, None)</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableencryption&quot;,      &quot;Disable encryption&quot;,       False, None, None)</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disableserverinput&quot;,     &quot;Disable server input&quot;,     True,  None, None)</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disablepasswordstoring&quot;, &quot;Disable password storing&quot;, True, None, None)</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;            , remmina.Setting(remmina.PROTOCOL_SETTING_TYPE_CHECK, &quot;disablesmoothscrolling&quot;, &quot;Disable smooth scrolling&quot;, True, None, None)</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;        ]</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    def init(self, gp):</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;        # this is called when the plugin is loaded from Remmina.</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;        cfile = gp.get_file()</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;        self.gpdata.disable_smooth_scrolling = cfile.get_setting(key=&quot;disablesmoothscrolling&quot;, default=False)</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;        self.gpdata.drawing_area = gp.get_viewport()</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;        return True</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    def open_connection(self, gp):</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;        # Is called when the user wants to open a connection whith this plugin.</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;        # Write code to initiate the connection. Example:</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;        connection_file = gp.get_file()</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;        connection_file.set_setting(&quot;disablepasswordstoring&quot;, False)</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;        password = None</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;        # Determine if passwords should not be allowed to be stored.</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;        dont_save_passwords = connection_file.get_setting(&quot;disablepasswordstoring&quot;, False)</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;        # Open a dialog prompting connection information and credentials</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;        ret = remmina.protocol_plugin_init_auth(widget=gp,</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;                                                flags= remmina.REMMINA_MESSAGE_PANEL_FLAG_USERNAME | remmina.REMMINA_MESSAGE_PANEL_FLAG_USERNAME_READONLY | remmina.REMMINA_MESSAGE_PANEL_FLAG_DOMAIN | remmina.REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD,</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;                                                title=&quot;Python Rocks!&quot;,</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;                                                default_username=&quot;&quot;,</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;                                                default_password=connection_file.get_setting(&quot;password&quot;, &quot;&quot;),</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;                                                default_domain=&quot;&quot;,</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;                                                password_prompt=&quot;Your Password Rocks!&quot;)</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;        # Process the result of the dialog</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;        if ret == Gtk.ResponseType.CANCEL:</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;            return False</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;        elif ret == Gtk.ResponseType.OK:</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;            # Indicate that the connection has been established!</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;            remmina.protocol_plugin_signal_connection_opened(gp)</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;        return True</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    def close_connection(self, gp):</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;        # The user requested to close the connection.</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;        remmina.protocol_plugin_signal_connection_closed(gp)</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    def query_feature(self, gp, feature):</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;        # Remmina asks if the given feature is available (remember Features registered in the construtor).</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;        return True</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    def map_event(self, gp):</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        # This is called when the widget is again on screen.</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;        return True</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    def unmap_event(self, gp):</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        # This is called when the widget is again not being shown on screen anymore. Any intensive graphical output</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;        # can be halted.</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;        return True</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    def call_feature(self, gp, feature):</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;        # Remmina asks to execute on of the features.</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;        if feature.type == remmina.REMMINA_PROTOCOL_FEATURE_TYPE_PREF and feature.id is VncFeature.PrefQuality:</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;            file = gp.get_file()</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;            quality = file.get_setting(&quot;quality&quot;, 0)</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;            if quality == 9:</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;                print(&quot;Ramping up graphics. Enjoy!&quot;)</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;            if quality == 0:</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                print(&quot;Squeezing image into a few pixels...&quot;)</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;            if quality == 1:</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                print(&quot;More the average guy, eh?&quot;)</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;            if quality == 2:</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                print(&quot;Not great, not terrible...&quot;)</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    def send_keystrokes(self, gp, strokes):</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;        # Remmina received a key stroke and wants to pass it to the remote.</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;        return True</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    def get_plugin_screenshot(self, gp, data):</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;        # data is of type RemminaScreenshotData and should contain the raw pixels for the screenshot. Remmina takes care of storing it into a jpg.</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;        # Return True when a screenshot has been done. Otherwise False.</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;        return False</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;# Instantiate &amp; Register</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;myPlugin = Plugin()</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;remmina.register_plugin(myPlugin)</div><div class="line"><a name="l00177"></a><span class="lineno">  177</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="_protocol-_example_8md.html">Protocol-Example.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>