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

x2go__plugin_8c_source.html « public - gitlab.com/Remmina/remminadoc.gitlab.io.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 282ea96bf05eb166109e1ed108de1f9363c0b9c2 (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
<!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: x2go_plugin.c 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('x2go__plugin_8c_source.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">x2go_plugin.c</div>  </div>
</div><!--header-->
<div class="contents">
<a href="x2go__plugin_8c.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;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> *     Project: Remmina Plugin X2Go</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> * Description: Remmina protocol plugin to connect via X2Go using PyHocaCLI</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> *      Author: Mike Gabriel &lt;mike.gabriel@das-netzwerkteam.de&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *              Antenore Gatta &lt;antenore@simbiosi.org&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> *   Copyright: 2010-2011 Vic Lee</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> *              2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *              2015 Antenore Gatta</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *              2016-2018 Antenore Gatta, Giovanni Panozzo</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *              2019 Mike Gabriel</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *              2021 Daniel Teichmann</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *     License: GPL-2+</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> * This program is free software; you can redistribute it and/or modify</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> * it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * the Free Software Foundation; either version 2 of the License, or</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * (at your option) any later version.</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * GNU General Public License for more details.</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * along with this program; if not, write to the Free Software</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor,</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> * Boston, MA  02110-1301, USA.</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="comment"> *  In addition, as a special exception, the copyright holders give</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="comment"> *  permission to link the code of portions of this program with the</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> *  OpenSSL library under certain conditions as described in each</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> *  individual source file, and distribute linked combinations</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"> *  including the two.</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="comment"> *  You must obey the GNU General Public License in all respects</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment"> *  for all of the code used other than OpenSSL. *  If you modify</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment"> *  file(s) with this exception, you may extend this exception to your</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="comment"> *  version of the file(s), but you are not obligated to do so. *  If you</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="comment"> *  do not wish to do so, delete this exception statement from your</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="comment"> *  version. *  If you delete this exception statement from all source</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment"> *  files in the program, then also delete it here.</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="x2go__plugin_8h.html">x2go_plugin.h</a>&quot;</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="remmina__plugin_8h.html">common/remmina_plugin.h</a>&quot;</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#include &lt;gtk/gtkx.h&gt;</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#ifdef GDK_WINDOWING_X11</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#include &lt;gdk/gdkx.h&gt;</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="preprocessor">#elif defined(GDK_WINDOWING_WAYLAND)</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#include &lt;gdk/gdkwayland.h&gt;</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="preprocessor">#include &lt;X11/Xlib.h&gt;</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="preprocessor">#include &lt;X11/XKBlib.h&gt;</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="preprocessor">#include &lt;X11/extensions/XKBrules.h&gt;</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="preprocessor">#include &lt;sys/types.h&gt;</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="preprocessor">#include &lt;signal.h&gt;</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="preprocessor">#include &lt;time.h&gt;</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="preprocessor">#include &lt;ctype.h&gt;</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="preprocessor">#define FEATURE_AVAILABLE(gpdata, feature) \</span></div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="preprocessor">        gpdata-&gt;available_features ? (g_list_find_custom( \</span></div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="preprocessor">                        gpdata-&gt;available_features, \</span></div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="preprocessor">                        feature, \</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="preprocessor">                        (GCompareFunc) g_strcmp0 \</span></div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="preprocessor">                         ) ? TRUE : FALSE) : FALSE</span></div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;<span class="preprocessor">#define FEATURE_NOT_AVAIL_STR(feature) \</span></div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="preprocessor">    g_strdup_printf(_(&quot;The command-line feature &#39;%s&#39; is not available! Attempting &quot; \</span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="preprocessor">              &quot;to start PyHoca-CLI without using this feature…&quot;), feature)</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;<span class="preprocessor">#define GET_PLUGIN_DATA(gp) \</span></div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="preprocessor">        (RemminaPluginX2GoData*) g_object_get_data(G_OBJECT(gp), &quot;plugin-data&quot;)</span></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;<span class="comment">// --------- SESSIONS ------------</span></div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="preprocessor">#define SET_RESUME_SESSION(gp, resume_data) \</span></div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="preprocessor">        g_object_set_data_full(G_OBJECT(gp), &quot;resume-session-data&quot;, \</span></div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="preprocessor">                       resume_data, \</span></div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="preprocessor">                           g_free)</span></div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="preprocessor">#define GET_RESUME_SESSION(gp) \</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="preprocessor">        (gchar*) g_object_get_data(G_OBJECT(gp), &quot;resume-session-data&quot;)</span></div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;<span class="comment">// A session is selected if the returning value is something other than 0.</span></div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="preprocessor">#define IS_SESSION_SELECTED(gp) \</span></div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="preprocessor">        g_object_get_data(G_OBJECT(gp), &quot;session-selected&quot;) ? TRUE : FALSE</span></div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="comment">// We don&#39;t use the function as a real pointer but rather as a boolean value.</span></div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="preprocessor">#define SET_SESSION_SELECTED(gp, is_session_selected) \</span></div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;<span class="preprocessor">        g_object_set_data_full(G_OBJECT(gp), &quot;session-selected&quot;, \</span></div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="preprocessor">                       is_session_selected, \</span></div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;<span class="preprocessor">                       NULL)</span></div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="comment">// -------------------</span></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;<span class="preprocessor">#define REMMINA_PLUGIN_INFO(fmt, ...) \</span></div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_info(&quot;[%s] &quot; fmt, \</span></div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="preprocessor">                         PLUGIN_NAME, ##__VA_ARGS__)</span></div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="preprocessor">#define REMMINA_PLUGIN_MESSAGE(fmt, ...) \</span></div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_message(&quot;[%s] &quot; fmt, \</span></div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="preprocessor">                            PLUGIN_NAME, ##__VA_ARGS__)</span></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;<span class="preprocessor">#define REMMINA_PLUGIN_DEBUG(fmt, ...) \</span></div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_debug(__func__, &quot;[%s] &quot; fmt, \</span></div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="preprocessor">                          PLUGIN_NAME, ##__VA_ARGS__)</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="preprocessor">#define REMMINA_PLUGIN_WARNING(fmt, ...) \</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_warning(__func__, &quot;[%s] &quot; fmt, \</span></div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="preprocessor">                            PLUGIN_NAME, ##__VA_ARGS__)</span></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;<span class="preprocessor">#define REMMINA_PLUGIN_AUDIT(fmt, ...) \</span></div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_audit(__func__, fmt, ##__VA_ARGS__)</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;<span class="preprocessor">#define REMMINA_PLUGIN_ERROR(fmt, ...) \</span></div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_error(__func__, &quot;[%s] &quot; fmt, \</span></div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="preprocessor">                          PLUGIN_NAME, ##__VA_ARGS__)</span></div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="preprocessor">#define REMMINA_PLUGIN_CRITICAL(fmt, ...) \</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;_remmina_critical(__func__, &quot;[%s] &quot; fmt, \</span></div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="preprocessor">                             PLUGIN_NAME, ##__VA_ARGS__)</span></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;<span class="preprocessor">#define GET_PLUGIN_STRING(value) \</span></div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="preprocessor">        g_strdup(rm_plugin_service-&gt;file_get_string(remminafile, value))</span></div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="preprocessor">#define GET_PLUGIN_PASSWORD(value) \</span></div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;<span class="preprocessor">        GET_PLUGIN_STRING(value)</span></div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;<span class="preprocessor">#define GET_PLUGIN_INT(value, default_value) \</span></div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;file_get_int(remminafile, value, default_value)</span></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;<span class="preprocessor">#define GET_PLUGIN_BOOLEAN(value) \</span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="preprocessor">        rm_plugin_service-&gt;file_get_int(remminafile, value, FALSE)</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ab54b79eb5b8f9560d3e785cf16c45a9b">  136</a></span>&#160;<span class="keyword">static</span> <a class="code" href="struct___remmina_plugin_service.html">RemminaPluginService</a> *<a class="code" href="x2go__plugin_8c.html#ab54b79eb5b8f9560d3e785cf16c45a9b">rm_plugin_service</a> = NULL;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html">  138</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct___remmina_plugin_x2_go_data.html">_RemminaPluginX2GoData</a> {</div><div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">  139</a></span>&#160;    GtkWidget *<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">  140</a></span>&#160;    gint <a class="code" href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">socket_id</a>;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">  142</a></span>&#160;    pthread_t <a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a>;</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">  144</a></span>&#160;    Display *<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>;</div><div class="line"><a name="l00145"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">  145</a></span>&#160;    Window <a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a>;</div><div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">  146</a></span>&#160;    int (*<a class="code" href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">orig_handler</a>)(Display *, XErrorEvent *);</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">  148</a></span>&#160;    GPid <a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a>;</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"><a class="line" href="struct___remmina_plugin_x2_go_data.html#a3fe6e076459db4ee337d70ef2c1d838a">  150</a></span>&#160;    gboolean <a class="code" href="struct___remmina_plugin_x2_go_data.html#a3fe6e076459db4ee337d70ef2c1d838a">disconnected</a>;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="struct___remmina_plugin_x2_go_data.html#a642dc28885abcd14f90fd8710b220e2e">  152</a></span>&#160;    GList* <a class="code" href="struct___remmina_plugin_x2_go_data.html#a642dc28885abcd14f90fd8710b220e2e">available_features</a>;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;} <a class="code" href="x2go__plugin_8c.html#a37d3729bb8c4dbd3be32eeea7d04c7d5">RemminaPluginX2GoData</a>;</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="struct___x2_go_custom_user_data.html">  159</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct___x2_go_custom_user_data.html">_X2GoCustomUserData</a> {</div><div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">  160</a></span>&#160;    <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>* <a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a>;</div><div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">  161</a></span>&#160;    gpointer <a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a>;</div><div class="line"><a name="l00162"></a><span class="lineno"><a class="line" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">  162</a></span>&#160;    gpointer <a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a>;</div><div class="line"><a name="l00163"></a><span class="lineno"><a class="line" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">  163</a></span>&#160;    gpointer <a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a>;</div><div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">  164</a></span>&#160;    gpointer <a class="code" href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">opt2</a>;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;} <a class="code" href="x2go__plugin_8c.html#ab0e7b0c28fbb5ac24d7ed481250494b4">X2GoCustomUserData</a>;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165">  174</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165">SESSION_PROPERTIES</a> {</div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165add30b4757006df4bc3c06e54f6bfce3a">  175</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165add30b4757006df4bc3c06e54f6bfce3a">SESSION_DISPLAY</a> = 0,</div><div class="line"><a name="l00176"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2c8abd8773006b6629df76a38b2ecd9b">  176</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2c8abd8773006b6629df76a38b2ecd9b">SESSION_STATUS</a>,</div><div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">  177</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>,</div><div class="line"><a name="l00178"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a081555600c90a11ad962e0b69cb9dfa0">  178</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a081555600c90a11ad962e0b69cb9dfa0">SESSION_SUSPENDED_SINCE</a>,</div><div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a8b54a36c337ab651bb8e7eb213fe7172">  179</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a8b54a36c337ab651bb8e7eb213fe7172">SESSION_CREATE_DATE</a>,</div><div class="line"><a name="l00180"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165af379eb48356f9912f3fe1d39ac163e03">  180</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165af379eb48356f9912f3fe1d39ac163e03">SESSION_AGENT_PID</a>,</div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a6e4a495faba4c73cc560b9f388cdc961">  181</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a6e4a495faba4c73cc560b9f388cdc961">SESSION_USERNAME</a>,</div><div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2b7999cf0576ea2a030696831b30ec7a">  182</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2b7999cf0576ea2a030696831b30ec7a">SESSION_HOSTNAME</a>,</div><div class="line"><a name="l00183"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a068cdca754cf1240547311a7896f0817">  183</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a068cdca754cf1240547311a7896f0817">SESSION_COOKIE</a>,</div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a695a5bbc86348af93dd91c566ff36f53">  184</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a695a5bbc86348af93dd91c566ff36f53">SESSION_GRAPHIC_PORT</a>,</div><div class="line"><a name="l00185"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165aebbdaf08ac05790b9d8c6cc1ed1f4fb7">  185</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165aebbdaf08ac05790b9d8c6cc1ed1f4fb7">SESSION_SND_PORT</a>,</div><div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a0161356b9e8d820c86dfc81d4ad2903b">  186</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a0161356b9e8d820c86dfc81d4ad2903b">SESSION_SSHFS_PORT</a>,</div><div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">  187</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>,</div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">  188</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a> <span class="comment">// Must be last. Counts all enum elements.</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;};</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="comment">// Following str2int code was adapted from Stackoverflow:</span></div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="comment">// https://stackoverflow.com/questions/7021725/how-to-convert-a-string-to-integer-in-c</span></div><div class="line"><a name="l00193"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11">  193</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11">_str2int_errno</a> {</div><div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a9e40a7e8442f48c6ddf3a291fa0ad1d1">  194</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a9e40a7e8442f48c6ddf3a291fa0ad1d1">STR2INT_SUCCESS</a>,</div><div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">  195</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">STR2INT_OVERFLOW</a>,</div><div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">  196</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">STR2INT_UNDERFLOW</a>,</div><div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">  197</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a>,</div><div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">  198</a></span>&#160;    <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">STR2INT_INVALID_DATA</a></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;} <a class="code" href="x2go__plugin_8c.html#aeaf38d9ed0a9dc7abcd71e1cd97fdb7b">str2int_errno</a>;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a303c6e8a94bccf82dd36e4e2f28f6645">  217</a></span>&#160;<a class="code" href="x2go__plugin_8c.html#aeaf38d9ed0a9dc7abcd71e1cd97fdb7b">str2int_errno</a> <a class="code" href="x2go__plugin_8c.html#a303c6e8a94bccf82dd36e4e2f28f6645">str2int</a>(gint *out, gchar *s, gint base)</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;{</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    gchar *end;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    <span class="keywordflow">if</span> (!s || !out || base &lt;= 0) <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">STR2INT_INVALID_DATA</a>;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="keywordflow">if</span> (s[0] == <span class="charliteral">&#39;\0&#39;</span> || isspace(s[0])) <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a>;</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    errno = 0;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    glong l = strtol(s, &amp;end, base);</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <span class="comment">/* Both checks are needed because INT_MAX == LONG_MAX is possible. */</span></div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="keywordflow">if</span> (l &gt; INT_MAX || (errno == ERANGE &amp;&amp; l == LONG_MAX)) <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">STR2INT_OVERFLOW</a>;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <span class="keywordflow">if</span> (l &lt; INT_MIN || (errno == ERANGE &amp;&amp; l == LONG_MIN)) <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">STR2INT_UNDERFLOW</a>;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <span class="keywordflow">if</span> (*end != <span class="charliteral">&#39;\0&#39;</span>) <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a>;</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    *out = l;</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a9e40a7e8442f48c6ddf3a291fa0ad1d1">STR2INT_SUCCESS</a>;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;}</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno"><a class="line" href="struct___dialog_data.html">  267</a></span>&#160;<span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a></div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;{</div><div class="line"><a name="l00269"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">  269</a></span>&#160;    GtkWindow   *<a class="code" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">parent</a>;</div><div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">  270</a></span>&#160;    GtkDialogFlags  <a class="code" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">flags</a>;</div><div class="line"><a name="l00271"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a1c48cea48c8dadf952e6ad684b8f89bb">  271</a></span>&#160;    GtkMessageType  <a class="code" href="struct___dialog_data.html#a1c48cea48c8dadf952e6ad684b8f89bb">type</a>;</div><div class="line"><a name="l00272"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a3cee753dca9f060cde0638c54e1466c4">  272</a></span>&#160;    GtkButtonsType  <a class="code" href="struct___dialog_data.html#a3cee753dca9f060cde0638c54e1466c4">buttons</a>;</div><div class="line"><a name="l00273"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">  273</a></span>&#160;    gchar       *<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a>;</div><div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">  274</a></span>&#160;    gchar       *<a class="code" href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">message</a>;</div><div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">  275</a></span>&#160;    GCallback   <a class="code" href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">callbackfunc</a>;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;    <span class="comment">// If the dialog needs to be custom.</span></div><div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">  278</a></span>&#160;    GCallback   <a class="code" href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">dialog_factory_func</a>;</div><div class="line"><a name="l00279"></a><span class="lineno"><a class="line" href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">  279</a></span>&#160;    gpointer    <a class="code" href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">dialog_factory_data</a>;</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;};</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">  290</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">rmplugin_x2go_open_dialog</a>(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data)</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;{</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    <span class="keywordflow">if</span> (!custom_data || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a>) {</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;            _(<span class="stringliteral">&quot;Parameter &#39;custom_data&#39; is not initialized!&quot;</span>)</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        ));</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    }</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp = (<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a>;</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    <span class="keyword">struct</span> <a class="code" href="struct___dialog_data.html">_DialogData</a> *ddata = (<span class="keyword">struct</span> <a class="code" href="struct___dialog_data.html">_DialogData</a>*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a>;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <span class="keywordflow">if</span> (ddata) {</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;        <span class="comment">// Can&#39;t check type, flags or buttons</span></div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;        <span class="comment">// because they are enums and &#39;0&#39; is a valid value</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;        <span class="keywordflow">if</span> (!ddata-&gt;title || !ddata-&gt;message) {</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;            REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Broken `DialogData`! Aborting…&quot;</span>));</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;            <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;        }</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Can&#39;t retrieve `DialogData`! Aborting…&quot;</span>));</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;    }</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;`DialogData` checks passed. Now showing dialog…&quot;</span>);</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    GtkWidget* widget_gtk_dialog = NULL;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;    <span class="keywordflow">if</span> (ddata-&gt;dialog_factory_func != NULL) {</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Calling *custom* dialog factory function…&quot;</span>);</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;        GCallback dialog_factory_func = G_CALLBACK(ddata-&gt;dialog_factory_func);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;        gpointer  dialog_factory_data = ddata-&gt;dialog_factory_data;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;        <span class="comment">// Calling dialog_factory_func(custom_data, dialog_factory_data);</span></div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;        widget_gtk_dialog = ((GtkWidget* (*)(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a>*, gpointer))</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;            dialog_factory_func)(custom_data, dialog_factory_data);</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;        widget_gtk_dialog = gtk_message_dialog_new(ddata-&gt;parent,</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;                               ddata-&gt;flags,</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;                               ddata-&gt;type,</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;                               ddata-&gt;buttons,</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;                               <span class="stringliteral">&quot;%s&quot;</span>, ddata-&gt;title);</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;        gtk_message_dialog_format_secondary_text(</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;            GTK_MESSAGE_DIALOG(widget_gtk_dialog), <span class="stringliteral">&quot;%s&quot;</span>, ddata-&gt;message);</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    }</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    <span class="keywordflow">if</span> (!widget_gtk_dialog) {</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;Error! Aborting.&quot;</span>);</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;    }</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;    <span class="keywordflow">if</span> (ddata-&gt;callbackfunc) {</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;        g_signal_connect_swapped(G_OBJECT(widget_gtk_dialog), <span class="stringliteral">&quot;response&quot;</span>,</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;                     G_CALLBACK(ddata-&gt;callbackfunc),</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;                     custom_data);</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;        g_signal_connect(G_OBJECT(widget_gtk_dialog), <span class="stringliteral">&quot;response&quot;</span>,</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;                 G_CALLBACK(gtk_widget_destroy),</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;                 NULL);</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    }</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    gtk_widget_show_all(widget_gtk_dialog);</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    <span class="comment">// Delete ddata object and reference &#39;dialog-data&#39; in gp.</span></div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    g_object_set_data(G_OBJECT(gp), <span class="stringliteral">&quot;dialog-data&quot;</span>, NULL);</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;}</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;</div><div class="line"><a name="l00367"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05">  367</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05">SESSION_CHOOSER_RESPONSE_TYPE</a> {</div><div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a37ecf143423a9ba7f52fd4826cf4226f">  368</a></span>&#160;  <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a37ecf143423a9ba7f52fd4826cf4226f">SESSION_CHOOSER_RESPONSE_NEW</a> = 0,</div><div class="line"><a name="l00369"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc">  369</a></span>&#160;  <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc">SESSION_CHOOSER_RESPONSE_CHOOSE</a>,</div><div class="line"><a name="l00370"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">  370</a></span>&#160;  <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">SESSION_CHOOSER_RESPONSE_TERMINATE</a>,</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;};</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">  382</a></span>&#160;<span class="keyword">static</span> GtkWidget* <a class="code" href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">rmplugin_x2go_find_child</a>(GtkWidget* parent, <span class="keyword">const</span> gchar* name)</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;{</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    <span class="keyword">const</span> gchar* parent_name = gtk_widget_get_name((GtkWidget*) parent);</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    <span class="keywordflow">if</span> (g_ascii_strcasecmp(parent_name, (gchar*) name) == 0) {</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;        <span class="keywordflow">return</span> parent;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    }</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    <span class="keywordflow">if</span> (GTK_IS_BIN(parent)) {</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;        GtkWidget *child = gtk_bin_get_child(GTK_BIN(parent));</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">rmplugin_x2go_find_child</a>(child, name);</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    }</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;    <span class="keywordflow">if</span> (GTK_IS_CONTAINER(parent)) {</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;        GList *children = gtk_container_get_children(GTK_CONTAINER(parent));</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;        <span class="keywordflow">while</span> (children != NULL) {</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;            GtkWidget *widget = <a class="code" href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">rmplugin_x2go_find_child</a>(children-&gt;data, name);</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;            <span class="keywordflow">if</span> (widget != NULL) {</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;                <span class="keywordflow">return</span> widget;</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;            }</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;            children = g_list_next(children);</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;        }</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    }</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;}</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;</div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#afd5caba73120c1dd6bd7bc0108c0a49a">  419</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#afd5caba73120c1dd6bd7bc0108c0a49a">rmplugin_x2go_session_chooser_row_activated</a>(GtkTreeView *treeview,</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;                                GtkTreePath *path,</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;                                GtkTreeViewColumn *column,</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;                                <a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data)</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;{</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;    <span class="keywordflow">if</span> (!custom_data || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a>) {</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;            _(<span class="stringliteral">&quot;Parameter &#39;custom_data&#39; is not initialized!&quot;</span>)</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;        ));</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    }</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>* gp = (<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a>;</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    <span class="comment">// dialog_data (unused)</span></div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;    <span class="comment">// connect_data (unused)</span></div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    GtkWidget* dialog = GTK_WIDGET(custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a>);</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    gchar *session_id;</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    GtkTreeIter iter;</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    GtkTreeModel *model = gtk_tree_view_get_model(treeview);</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;    <span class="keywordflow">if</span> (gtk_tree_model_get_iter(model, &amp;iter, path)) {</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;        gtk_tree_model_get(GTK_TREE_MODEL(model), &amp;iter,</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;                   <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>, &amp;session_id, -1);</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;        <span class="comment">// Silent bail out.</span></div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;        <span class="keywordflow">if</span> (!session_id || strlen(session_id) &lt;= 0) <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;        SET_RESUME_SESSION(gp, session_id);</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;        <span class="comment">// Unstucking main process. Telling it that a session has been selected.</span></div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;        <span class="comment">// We use a trick here. As long as there is something other than 0</span></div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;        <span class="comment">// stored, a session is selected. So we use the gpointer as a gboolean.</span></div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;        SET_SESSION_SELECTED(gp, (gpointer) TRUE);</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;        gtk_widget_hide(GTK_WIDGET(dialog));</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;        gtk_widget_destroy(GTK_WIDGET(dialog));</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;    }</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;}</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;</div><div class="line"><a name="l00471"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#acd692852ebb84bbc2978b44aff7345b6">  471</a></span>&#160;<span class="keyword">static</span> gchar *<a class="code" href="x2go__plugin_8c.html#acd692852ebb84bbc2978b44aff7345b6">rmplugin_x2go_session_property_to_string</a>(guint session_property) {</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    gchar* return_char = NULL;</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;    <span class="keywordflow">switch</span> (session_property) {</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;        <span class="comment">// I think we can close one eye here regarding max line-length.</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165add30b4757006df4bc3c06e54f6bfce3a">SESSION_DISPLAY</a>:       return_char = g_strdup(_(<span class="stringliteral">&quot;X Display&quot;</span>));     <span class="keywordflow">break</span>;</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2c8abd8773006b6629df76a38b2ecd9b">SESSION_STATUS</a>:        return_char = g_strdup(_(<span class="stringliteral">&quot;Status&quot;</span>));        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>:    return_char = g_strdup(_(<span class="stringliteral">&quot;Session ID&quot;</span>));    <span class="keywordflow">break</span>;</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a8b54a36c337ab651bb8e7eb213fe7172">SESSION_CREATE_DATE</a>:   return_char = g_strdup(_(<span class="stringliteral">&quot;Create date&quot;</span>));   <span class="keywordflow">break</span>;</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a081555600c90a11ad962e0b69cb9dfa0">SESSION_SUSPENDED_SINCE</a>:   return_char = g_strdup(_(<span class="stringliteral">&quot;Suspended since&quot;</span>));   <span class="keywordflow">break</span>;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165af379eb48356f9912f3fe1d39ac163e03">SESSION_AGENT_PID</a>:     return_char = g_strdup(_(<span class="stringliteral">&quot;Agent PID&quot;</span>));     <span class="keywordflow">break</span>;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a6e4a495faba4c73cc560b9f388cdc961">SESSION_USERNAME</a>:      return_char = g_strdup(_(<span class="stringliteral">&quot;Username&quot;</span>));      <span class="keywordflow">break</span>;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2b7999cf0576ea2a030696831b30ec7a">SESSION_HOSTNAME</a>:      return_char = g_strdup(_(<span class="stringliteral">&quot;Hostname&quot;</span>));      <span class="keywordflow">break</span>;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a068cdca754cf1240547311a7896f0817">SESSION_COOKIE</a>:        return_char = g_strdup(_(<span class="stringliteral">&quot;Cookie&quot;</span>));        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a695a5bbc86348af93dd91c566ff36f53">SESSION_GRAPHIC_PORT</a>:  return_char = g_strdup(_(<span class="stringliteral">&quot;Graphic port&quot;</span>));  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165aebbdaf08ac05790b9d8c6cc1ed1f4fb7">SESSION_SND_PORT</a>:      return_char = g_strdup(_(<span class="stringliteral">&quot;SND port&quot;</span>));      <span class="keywordflow">break</span>;</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a0161356b9e8d820c86dfc81d4ad2903b">SESSION_SSHFS_PORT</a>:    return_char = g_strdup(_(<span class="stringliteral">&quot;SSHFS port&quot;</span>));    <span class="keywordflow">break</span>;</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>: return_char = g_strdup(_(<span class="stringliteral">&quot;Visible&quot;</span>));       <span class="keywordflow">break</span>;</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;    }</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="keywordflow">return</span> return_char;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;}</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;</div><div class="line"><a name="l00509"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a5b64d199d5f736b98acadcfcd8dffeb1">  509</a></span>&#160;<span class="keyword">static</span> GtkWidget* <a class="code" href="x2go__plugin_8c.html#a5b64d199d5f736b98acadcfcd8dffeb1">rmplugin_x2go_choose_session_dialog_factory</a>(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data,</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;                                  GList *sessions_list)</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;{</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    <span class="keywordflow">if</span> (!custom_data || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> ||</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;        !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a>) {</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;            _(<span class="stringliteral">&quot;Parameter &#39;custom_data&#39; is not initialized!&quot;</span>)</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;        ));</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;    }</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;    <span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a>* ddata = (<span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a>*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a>;</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;    if (!ddata || !sessions_list || !ddata-&gt;<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a>) {</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Could not retrieve valid `DialogData` or &quot;</span></div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;                            <span class="stringliteral">&quot;`sessions_list`! Aborting…&quot;</span>));</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;    }</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;    GtkWidget *widget_gtk_dialog = NULL;</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    widget_gtk_dialog = gtk_dialog_new_with_buttons(ddata-&gt;<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a>, ddata-&gt;<a class="code" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">parent</a>,</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;                            ddata-&gt;<a class="code" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">flags</a>,</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    <span class="comment">// TRANSLATORS: Stick to x2goclient&#39;s translation for terminate.</span></div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;                            _(<span class="stringliteral">&quot;_Terminate&quot;</span>),</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;                            <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">SESSION_CHOOSER_RESPONSE_TERMINATE</a>,</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    <span class="comment">// TRANSLATORS: Stick to x2goclient&#39;s translation for resume.</span></div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;                            _(<span class="stringliteral">&quot;_Resume&quot;</span>),</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;                            <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc">SESSION_CHOOSER_RESPONSE_CHOOSE</a>,</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;                            _(<span class="stringliteral">&quot;_New&quot;</span>),</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;                            <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a37ecf143423a9ba7f52fd4826cf4226f">SESSION_CHOOSER_RESPONSE_NEW</a>,</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;                            NULL);</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;    GtkWidget *button = gtk_dialog_get_widget_for_response(</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;                        GTK_DIALOG(widget_gtk_dialog),</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;                        <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">SESSION_CHOOSER_RESPONSE_TERMINATE</a>);</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;    <span class="comment">// TRANSLATORS: Tooltip for terminating button inside Session-Chooser-Dialog.</span></div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;    <span class="comment">// TRANSLATORS: Please stick to X2GoClient&#39;s way of translating.</span></div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    gtk_widget_set_tooltip_text(button, _(<span class="stringliteral">&quot;Terminating X2Go sessions can take a moment.&quot;</span>));</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;<span class="preprocessor">    #define DEFAULT_DIALOG_WIDTH 720</span></div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;<span class="preprocessor">    #define DEFAULT_DIALOG_HEIGHT (DEFAULT_DIALOG_WIDTH * 9) / 16</span></div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;    gtk_widget_set_size_request(GTK_WIDGET(widget_gtk_dialog),</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;                    DEFAULT_DIALOG_WIDTH, DEFAULT_DIALOG_HEIGHT);</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    gtk_window_set_default_size(GTK_WINDOW(widget_gtk_dialog),</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;                    DEFAULT_DIALOG_WIDTH, DEFAULT_DIALOG_HEIGHT);</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    gtk_window_set_resizable(GTK_WINDOW(widget_gtk_dialog), TRUE);</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;    GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    <span class="comment">//gtk_widget_show(scrolled_window);</span></div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;                GTK_DIALOG(widget_gtk_dialog))</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;               ), GTK_WIDGET(scrolled_window), TRUE, TRUE, 5);</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_window),</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;                       GTK_POLICY_AUTOMATIC,</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;                       GTK_POLICY_AUTOMATIC);</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    GType types[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a>];</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;    <span class="comment">// First to last in SESSION_PROPERTIES.</span></div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;    <span class="keywordflow">for</span> (gint i = 0; i &lt; <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a>; ++i) {</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;        <span class="comment">// Everything is a String. (Except IS_VISIBLE flag)</span></div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;        <span class="comment">// If that changes one day, you could extent the if statement here.</span></div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;        <span class="comment">// But you would propably need a *lot* of refactoring.</span></div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;        <span class="comment">// Especially in the session parser.</span></div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;        <span class="keywordflow">if</span> (i == <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>) {</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;            types[i] = G_TYPE_BOOLEAN;</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;            types[i] = G_TYPE_STRING;</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;        }</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;    }</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;    <span class="comment">// create tree view</span></div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    GtkListStore *store = gtk_list_store_newv(SESSION_NUM_PROPERTIES, types);</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;    GtkTreeModelFilter *filter = GTK_TREE_MODEL_FILTER(</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;                    gtk_tree_model_filter_new(GTK_TREE_MODEL(store),</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;                                  NULL)</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;                     );</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;    gtk_tree_model_filter_set_visible_column(filter, <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>);</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;    GtkWidget *tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(filter));</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;    g_object_unref (G_OBJECT (store));  <span class="comment">// tree now holds reference</span></div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;    gtk_widget_set_size_request(tree_view, -1, 300);</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <span class="comment">// Gets name to be findable by rmplugin_x2go_find_child()</span></div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    gtk_widget_set_name(GTK_WIDGET(tree_view), <span class="stringliteral">&quot;session_chooser_treeview&quot;</span>);</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="comment">// create list view columns</span></div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE);</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(tree_view), FALSE);</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;    gtk_tree_view_set_enable_search(GTK_TREE_VIEW(tree_view), TRUE);</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;    gtk_widget_show (tree_view);</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;    gtk_container_add (GTK_CONTAINER(scrolled_window), tree_view);</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    GtkTreeViewColumn *tree_view_col = NULL;</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    GtkCellRenderer *cell_renderer = NULL;</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    gchar *header_title = NULL;</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;    <span class="comment">// First to last in SESSION_PROPERTIES.</span></div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    <span class="keywordflow">for</span> (guint i = 0; i &lt; <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a>; ++i) {</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        <span class="comment">// Do not display SESSION_DIALOG_IS_VISIBLE.</span></div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        <span class="keywordflow">if</span> (i == <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;        header_title = <a class="code" href="x2go__plugin_8c.html#acd692852ebb84bbc2978b44aff7345b6">rmplugin_x2go_session_property_to_string</a>(i);</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;        <span class="keywordflow">if</span> (!header_title) {</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;            REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;                _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>), g_strdup_printf(</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;                _(<span class="stringliteral">&quot;Unknown property &#39;%i&#39;&quot;</span>), i</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;            )));</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;            header_title = g_strdup_printf(_(<span class="stringliteral">&quot;Unknown property &#39;%i&#39;&quot;</span>), i);</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;        }</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;        tree_view_col = gtk_tree_view_column_new();</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;        gtk_tree_view_column_set_title(tree_view_col, header_title);</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;        gtk_tree_view_column_set_clickable(tree_view_col, FALSE);</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;        gtk_tree_view_column_set_sizing (tree_view_col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;        gtk_tree_view_column_set_resizable(tree_view_col, TRUE);</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;        cell_renderer = gtk_cell_renderer_text_new();</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;        gtk_tree_view_column_pack_start(tree_view_col, cell_renderer, TRUE);</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;        gtk_tree_view_column_add_attribute(tree_view_col, cell_renderer, <span class="stringliteral">&quot;text&quot;</span>, i);</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;        gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), tree_view_col);</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    }</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;    GList *elem = NULL;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    GtkTreeIter iter;</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    <span class="keywordflow">for</span> (elem = sessions_list; elem; elem = elem-&gt;next) {</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;        gchar** session = (gchar**) elem-&gt;data;</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;        g_assert(session != NULL);</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;        gtk_list_store_append(store, &amp;iter);</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;        <span class="keywordflow">for</span> (gint i = 0; i &lt; <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a>; i++) {</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;            gchar* <span class="keyword">property</span> = session[i];</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;            GValue a = G_VALUE_INIT;</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;            <span class="comment">// Everything here is a string (except SESSION_DIALOG_IS_VISIBLE)</span></div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;            <span class="keywordflow">if</span> (i == <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>) {</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;                g_value_init(&amp;a, G_TYPE_BOOLEAN);</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;                g_assert(G_VALUE_HOLDS_BOOLEAN(&amp;a) &amp;&amp; <span class="stringliteral">&quot;GValue does not &quot;</span></div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;                                      <span class="stringliteral">&quot;hold a boolean!&quot;</span>);</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;                <span class="comment">// Default is to show every new session.</span></div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;                g_value_set_boolean(&amp;a, TRUE);</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;            } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;                g_value_init(&amp;a, G_TYPE_STRING);</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;                g_assert(G_VALUE_HOLDS_STRING(&amp;a) &amp;&amp; <span class="stringliteral">&quot;GValue does not &quot;</span></div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;                                      <span class="stringliteral">&quot;hold a string!&quot;</span>);</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;                g_value_set_static_string (&amp;a, property);</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;            }</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;            gtk_list_store_set_value(store, &amp;iter, i, &amp;a);</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;        }</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    }</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    <span class="comment">/* Prepare X2GoCustomUserData *custom_data</span></div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;<span class="comment">     *  gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;<span class="comment">     *  dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;<span class="comment">     *  connect_data -&gt; connection data (struct _ConnectionData*)</span></div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;<span class="comment">     *  opt1 -&gt; dialog widget (GtkWidget*)</span></div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;<span class="comment">     */</span></div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;    <span class="comment">// everything else is already initialized.</span></div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> = widget_gtk_dialog;</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;    g_signal_connect(tree_view, <span class="stringliteral">&quot;row-activated&quot;</span>,</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;             G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#afd5caba73120c1dd6bd7bc0108c0a49a">rmplugin_x2go_session_chooser_row_activated</a>),</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;             custom_data);</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;    <span class="keywordflow">return</span> widget_gtk_dialog;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;}</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;</div><div class="line"><a name="l00702"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ad7958dd5e9c0d344c88ee0885803b358">  702</a></span>&#160;<span class="keyword">static</span> GtkTreeModelFilter* <a class="code" href="x2go__plugin_8c.html#ad7958dd5e9c0d344c88ee0885803b358">rmplugin_x2go_session_chooser_get_filter_model</a>(GtkWidget *dialog,</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;                                              GtkTreeView* treeview)</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;{</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    <span class="comment">//REMMINA_PLUGIN_DEBUG(&quot;Function entry.&quot;);</span></div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;    GtkTreeModel *return_model = NULL;</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;    <span class="keywordflow">if</span> (!treeview &amp;&amp; dialog) {</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;        GtkWidget *treeview_new = <a class="code" href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">rmplugin_x2go_find_child</a>(GTK_WIDGET(dialog),</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;                                      <span class="stringliteral">&quot;session_chooser_treeview&quot;</span>);</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;        <span class="keywordflow">if</span> (!treeview_new) {</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;            REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;                _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;                _(<span class="stringliteral">&quot;Could not find child GtkTreeView of &quot;</span></div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;                  <span class="stringliteral">&quot;session chooser dialog.&quot;</span>)</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;            ));</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;            <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;        }</div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;        return_model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview_new));</div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (treeview) {</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;        return_model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));</div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;            _(<span class="stringliteral">&quot;Neither the &#39;dialog&#39; nor &#39;treeview&#39; parameters are initialized! &quot;</span></div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;              <span class="stringliteral">&quot;At least one of them must be given.&quot;</span>)</div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;        ));</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    }</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;    <span class="keywordflow">if</span> (!return_model || !GTK_TREE_MODEL_FILTER(return_model)) {</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;            _(<span class="stringliteral">&quot;Could not obtain \&quot;GtkTreeModelFilter*\&quot; of the session chooser dialog, &quot;</span></div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;              <span class="stringliteral">&quot;for unknown reason.&quot;</span>)</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;        ));</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;    }</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    <span class="keywordflow">return</span> GTK_TREE_MODEL_FILTER(return_model);</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;}</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;</div><div class="line"><a name="l00753"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a1c60a927c4927871d84b2a86e2f877a3">  753</a></span>&#160;<span class="keyword">static</span> GtkTreePath* <a class="code" href="x2go__plugin_8c.html#a1c60a927c4927871d84b2a86e2f877a3">rmplugin_x2go_session_chooser_get_selected_row</a>(GtkWidget *dialog)</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;{</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;    GtkWidget *treeview = <a class="code" href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">rmplugin_x2go_find_child</a>(GTK_WIDGET(dialog),</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;                               <span class="stringliteral">&quot;session_chooser_treeview&quot;</span>);</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;    <span class="keywordflow">if</span> (!treeview) {</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;            _(<span class="stringliteral">&quot;Could not find child GtkTreeView of session chooser dialog.&quot;</span>)</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;        ));</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    }</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;    GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;    <span class="keywordflow">if</span> (!selection) {</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;            _(<span class="stringliteral">&quot;Could not get currently selected row (session)!&quot;</span>)</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;        ));</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;    }</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    GtkTreeModelFilter *filter = <a class="code" href="x2go__plugin_8c.html#ad7958dd5e9c0d344c88ee0885803b358">rmplugin_x2go_session_chooser_get_filter_model</a>(</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;                               NULL, GTK_TREE_VIEW(treeview));</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    GtkTreeModel *model = gtk_tree_model_filter_get_model(filter);</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    <span class="keywordflow">if</span> (!model) <span class="keywordflow">return</span> NULL; <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    GtkTreeModel *filter_model = GTK_TREE_MODEL(filter);</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;    g_assert(filter_model &amp;&amp; <span class="stringliteral">&quot;Could not cast &#39;filter&#39; to a GtkTreeModel!&quot;</span>);</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    GList *selected_rows = gtk_tree_selection_get_selected_rows(selection, &amp;filter_model);</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    <span class="comment">// We only support single selection.</span></div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;    gint selected_rows_num = gtk_tree_selection_count_selected_rows(selection);</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;    <span class="keywordflow">if</span> (selected_rows_num != 1) {</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>), g_strdup_printf(</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;            _(<span class="stringliteral">&quot;Exactly one session should be selectable but &#39;%i&#39; rows &quot;</span></div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;              <span class="stringliteral">&quot;(sessions) are selected.&quot;</span>),</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;            selected_rows_num</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;        )));</div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;    }</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    <span class="comment">// This would be very dangerous (we didn&#39;t check for NULL) if we hadn&#39;t just</span></div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;    <span class="comment">// checked that only one row is selected.</span></div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    GtkTreePath *path = selected_rows-&gt;data;</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    <span class="comment">// Convert to be path of GtkTreeModelFilter and *not* its child GtkTreeModel.</span></div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    path = gtk_tree_model_filter_convert_child_path_to_path(filter, path);</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    <span class="keywordflow">return</span> path;</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;}</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a3ed48dd41c8b207454aa327a32cd19d7">  817</a></span>&#160;<span class="keyword">static</span> GValue <a class="code" href="x2go__plugin_8c.html#a3ed48dd41c8b207454aa327a32cd19d7">rmplugin_x2go_session_chooser_get_property</a>(GtkWidget *dialog,</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;                             gint property_index,</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;                             GtkTreePath *row)</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;{</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;    <span class="comment">//REMMINA_PLUGIN_DEBUG(&quot;Function entry.&quot;);</span></div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    GValue ret_value = G_VALUE_INIT;</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;    <span class="keywordflow">if</span> (!row) {</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;        GtkTreePath *selected_row = <a class="code" href="x2go__plugin_8c.html#a1c60a927c4927871d84b2a86e2f877a3">rmplugin_x2go_session_chooser_get_selected_row</a>(dialog);</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;        <span class="keywordflow">if</span> (!selected_row) <span class="keywordflow">return</span> ret_value; <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;        row = selected_row;</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;    }</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    GtkTreeModelFilter *filter = <a class="code" href="x2go__plugin_8c.html#ad7958dd5e9c0d344c88ee0885803b358">rmplugin_x2go_session_chooser_get_filter_model</a>(dialog, NULL);</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    GtkTreeModel *model = gtk_tree_model_filter_get_model(filter);</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    <span class="keywordflow">if</span> (!model) <span class="keywordflow">return</span> ret_value; <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    GtkTreeIter iter;</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;    gboolean success = gtk_tree_model_get_iter(model, &amp;iter, row);</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;    <span class="keywordflow">if</span> (!success) {</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;            _(<span class="stringliteral">&quot;Failed to fill &#39;GtkTreeIter&#39;.&quot;</span>)</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;        ));</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;        <span class="keywordflow">return</span> ret_value;</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    }</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;    GValue <span class="keyword">property</span> = G_VALUE_INIT;</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;    gtk_tree_model_get_value(model, &amp;iter, property_index, &amp;property);</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;    <span class="keywordflow">return</span> property;</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;}</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;<span class="comment">/*static void rmplugin_x2go_dump_session_properties(GtkTreeModel *model, GtkTreePath *path,</span></div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;<span class="comment">                          GtkTreeIter *iter, GtkWidget *dialog)</span></div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;<span class="comment">{</span></div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;<span class="comment">    //REMMINA_PLUGIN_DEBUG(&quot;Function entry.&quot;);</span></div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;<span class="comment">    g_debug(_(&quot;Properties for session with path &#39;%s&#39;:&quot;), gtk_tree_path_to_string(path));</span></div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;<span class="comment">    for (guint i = 0; i &lt; SESSION_NUM_PROPERTIES; i++) {</span></div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;<span class="comment">        GValue property = G_VALUE_INIT;</span></div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;<span class="comment">        property = rmplugin_x2go_session_chooser_get_property(dialog, i, path);</span></div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;<span class="comment">        gchar* display_name = rmplugin_x2go_session_property_to_string(i);</span></div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;<span class="comment">        g_assert(display_name &amp;&amp; &quot;Could not get display name for a property!&quot;);</span></div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;<span class="comment">        if (i == SESSION_DIALOG_IS_VISIBLE) {</span></div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;<span class="comment">            g_assert(G_VALUE_HOLDS_BOOLEAN(&amp;property) &amp;&amp; &quot;GValue does not &quot;</span></div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;<span class="comment">                                      &quot;hold a boolean!&quot;);</span></div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;<span class="comment">            g_debug(&quot;\t%s: &#39;%s&#39;&quot;, display_name,</span></div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;<span class="comment">                g_value_get_boolean(&amp;property) ? &quot;TRUE&quot; : &quot;FALSE&quot;);</span></div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;<span class="comment">        } else {</span></div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;<span class="comment">            g_assert(G_VALUE_HOLDS_STRING(&amp;property) &amp;&amp; &quot;GValue does not &quot;</span></div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;<span class="comment">                                      &quot;hold a string!&quot;);</span></div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;<span class="comment">            g_debug(&quot;\t%s: &#39;%s&#39;&quot;, display_name, g_value_get_string(&amp;property));</span></div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;<span class="comment">        }</span></div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;<span class="comment">    }</span></div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;<span class="comment">}*/</span></div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;</div><div class="line"><a name="l00898"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a677f02c8a6a4d23577be167675144f67">  898</a></span>&#160;<span class="keyword">static</span> gchar* <a class="code" href="x2go__plugin_8c.html#a677f02c8a6a4d23577be167675144f67">rmplugin_x2go_spawn_pyhoca_process</a>(guint argc, gchar* argv[],</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;                         GError** error, gchar** env)</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;{</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;    <span class="keywordflow">if</span> (!argv) {</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;        gchar* errmsg = g_strdup_printf(</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;            _(<span class="stringliteral">&quot;parameter &#39;argv&#39; is &#39;NULL&#39;.&quot;</span>)</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;        );</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    }</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    <span class="keywordflow">if</span> (!error) {</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;        <span class="comment">// Can&#39;t report error message back since &#39;error&#39; is NULL.</span></div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;            _(<span class="stringliteral">&quot;parameter &#39;error&#39; is &#39;NULL&#39;.&quot;</span>)</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;        ));</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    }</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <span class="keywordflow">if</span> (!env || !env[0]) {</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;        gchar* errmsg = g_strdup_printf(</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;            _(<span class="stringliteral">&quot;parameter &#39;env&#39; is either invalid or uninitialized.&quot;</span>)</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;        );</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;    }</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    gint exit_code = 0;</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    gchar *standard_out;</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    <span class="comment">// Just supresses pyhoca-cli&#39;s help message when pyhoca-cli&#39;s version is too old.</span></div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    gchar *standard_err;</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;    gboolean success_ret = g_spawn_sync(NULL, argv, env, G_SPAWN_SEARCH_PATH, NULL,</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;                        NULL, &amp;standard_out, &amp;standard_err,</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;                        &amp;exit_code, error);</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;    REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Started PyHoca-CLI with the following arguments:&quot;</span>));</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    <span class="comment">// Print every argument except passwords. Free all arg strings.</span></div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;    <span class="keywordflow">for</span> (gint i = 0; i &lt; argc - 1; i++) {</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;        gchar* curr_arg = argv[i];</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;        <span class="keywordflow">if</span> (g_str_equal(curr_arg, <span class="stringliteral">&quot;--password&quot;</span>) ||</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;            g_str_equal(curr_arg, <span class="stringliteral">&quot;--ssh-passphrase&quot;</span>)) {</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;            g_printf(<span class="stringliteral">&quot;%s &quot;</span>, curr_arg);</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;            g_printf(<span class="stringliteral">&quot;XXXXXX &quot;</span>);</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;            g_free(curr_arg);</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;            g_free(argv[++i]);</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;            g_printf(<span class="stringliteral">&quot;%s &quot;</span>, curr_arg);</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;            g_free(curr_arg);</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;        }</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;    }</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;    g_printf(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    <span class="comment">/* TOO VERBOSE: */</span></div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;<span class="comment">    REMMINA_PLUGIN_DEBUG(&quot;%s&quot;, _(&quot;Started PyHoca-CLI with the &quot;</span></div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;<span class="comment">                    &quot;following environment variables:&quot;));</span></div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;<span class="comment">    REMMINA_PLUGIN_DEBUG(&quot;%s&quot;, g_strjoinv(&quot;\n&quot;, env));</span></div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;    <span class="keywordflow">if</span> (standard_err &amp;&amp; strlen(standard_err) &gt; 0) {</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;        <span class="keywordflow">if</span> (g_str_has_prefix(standard_err, <span class="stringliteral">&quot;pyhoca-cli: error: a socket error &quot;</span></div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;                     <span class="stringliteral">&quot;occured while establishing the connection:&quot;</span>)) {</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;            <span class="comment">// Log error into GUI.</span></div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;            gchar* errmsg = g_strdup_printf(</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;                _(<span class="stringliteral">&quot;The necessary PyHoca-CLI process has encountered a &quot;</span></div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;                  <span class="stringliteral">&quot;internet connection problem.&quot;</span>)</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;            );</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;            <span class="comment">// Log error into debug window and stdout</span></div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;            REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s:\n%s&quot;</span>, errmsg, standard_err);</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;            g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;            <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;            gchar* errmsg = g_strdup_printf(</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;                _(<span class="stringliteral">&quot;Could not start &quot;</span></div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;                  <span class="stringliteral">&quot;PyHoca-CLI:\n%s&quot;</span>),</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;                standard_err</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;            );</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;            REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;            g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;            <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;        }</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!success_ret || (*error) || strlen(standard_out) &lt;= 0 || exit_code) {</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;        <span class="keywordflow">if</span> (!(*error)) {</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;            gchar* errmsg = g_strdup_printf(</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;                _(<span class="stringliteral">&quot;An unknown error occured while trying &quot;</span></div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;                  <span class="stringliteral">&quot;to start PyHoca-CLI. Exit code: %i&quot;</span>),</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;                exit_code);</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;            REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;            g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;            gchar* errmsg = g_strdup_printf(</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;                _(<span class="stringliteral">&quot;An unknown error occured while trying to start &quot;</span></div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;                  <span class="stringliteral">&quot;PyHoca-CLI. Exit code: %i. Error: &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;                exit_code, (*error)-&gt;message);</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;            REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;        }</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;    }</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;    <span class="keywordflow">return</span> standard_out;</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;}</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;</div><div class="line"><a name="l01016"></a><span class="lineno"><a class="line" href="struct___connection_data.html"> 1016</a></span>&#160;<span class="keyword">struct </span><a class="code" href="struct___connection_data.html">_ConnectionData</a> {</div><div class="line"><a name="l01017"></a><span class="lineno"><a class="line" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1"> 1017</a></span>&#160;    gchar* <a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a>;</div><div class="line"><a name="l01018"></a><span class="lineno"><a class="line" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541"> 1018</a></span>&#160;    gchar* <a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a>;</div><div class="line"><a name="l01019"></a><span class="lineno"><a class="line" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8"> 1019</a></span>&#160;    gchar* <a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a>;</div><div class="line"><a name="l01020"></a><span class="lineno"><a class="line" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629"> 1020</a></span>&#160;    gchar* <a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>;</div><div class="line"><a name="l01021"></a><span class="lineno"><a class="line" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236"> 1021</a></span>&#160;    gchar* <a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a>;</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;};</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;</div><div class="line"><a name="l01036"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ab4ebe975e9b8b8ee1f6918d1c15f0ae6"> 1036</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#ab4ebe975e9b8b8ee1f6918d1c15f0ae6">rmplugin_x2go_session_chooser_set_row_visible</a>(GtkTreePath *path,</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;                                  gboolean value,</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;                                  GtkDialog *dialog) {</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;    <span class="keywordflow">if</span> (!path || !dialog) {</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;            _(<span class="stringliteral">&quot;Neither the &#39;path&#39; nor &#39;dialog&#39; parameters are initialized.&quot;</span>)</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;        ));</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;    }</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;    GtkTreeModelFilter *filter = <a class="code" href="x2go__plugin_8c.html#ad7958dd5e9c0d344c88ee0885803b358">rmplugin_x2go_session_chooser_get_filter_model</a>(</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;                                GTK_WIDGET(dialog), NULL);</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;    GtkTreeModel *model = gtk_tree_model_filter_get_model(filter);</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    <span class="keywordflow">if</span> (!model) <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;    GtkTreeIter iter;</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    <span class="keywordflow">if</span> (!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &amp;iter, path)) {</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;            _(<span class="stringliteral">&quot;GtkTreePath &#39;path&#39; describes a non-existing row!&quot;</span>)</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;        ));</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;    }</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;    <span class="comment">// Make session either visible or invisible.</span></div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;    gtk_list_store_set(GTK_LIST_STORE(model), &amp;iter,</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;               <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a>, value, -1);</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;    <span class="comment">// Update row.</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;    gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &amp;iter);</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;    <span class="comment">/* Get IS_VISIBLE flag of a session. */</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;    <span class="comment">// GValue ret_value = G_VALUE_INIT;</span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;    <span class="comment">// ret_value = rmplugin_x2go_session_chooser_get_property(GTK_WIDGET(dialog),</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;    <span class="comment">//                             SESSION_DIALOG_IS_VISIBLE,</span></div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;    <span class="comment">//                             path);</span></div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    <span class="comment">// g_debug(&quot;Is visible: %s&quot;, g_value_get_boolean(&amp;ret_value) ? &quot;TRUE&quot; : &quot;FALSE&quot;);</span></div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;    GtkWidget *term_button = gtk_dialog_get_widget_for_response(</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;                    GTK_DIALOG(dialog),</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;                    <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">SESSION_CHOOSER_RESPONSE_TERMINATE</a>);</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;    GtkWidget *resume_button = gtk_dialog_get_widget_for_response(</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;                    GTK_DIALOG(dialog),</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;                    <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc">SESSION_CHOOSER_RESPONSE_CHOOSE</a>);</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;    <span class="comment">// If no (visible) row is left to terminate disable terminate and resume buttons.</span></div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    gint rows_amount = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(filter), NULL);</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;    <span class="keywordflow">if</span> (rows_amount &lt;= 0) {</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;        gtk_widget_set_sensitive(term_button, FALSE);</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;        gtk_widget_set_sensitive(resume_button, FALSE);</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;        gtk_widget_set_sensitive(term_button, TRUE);</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;        gtk_widget_set_sensitive(resume_button, TRUE);</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;    }</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    <span class="comment">// Success, yay!</span></div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;}</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;</div><div class="line"><a name="l01102"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a9a10942cbe118d3ca8458b667b0c5edb"> 1102</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a9a10942cbe118d3ca8458b667b0c5edb">rmplugin_x2go_verify_connection_data</a>(<span class="keyword">struct</span> <a class="code" href="struct___connection_data.html">_ConnectionData</a> *connect_data) {</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    <span class="comment">/* Check connect_data. */</span></div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    <span class="keywordflow">if</span> (!connect_data ||</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;        !connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a> ||</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;        !connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a> ||</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;        strlen(connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a>) &lt;= 0 ||</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;        strlen(connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a>) &lt;= 0)</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;    {</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;            _(<span class="stringliteral">&quot;&#39;Invalid connection data.&#39;&quot;</span>)</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;        ));</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;    }</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;    <span class="keywordflow">if</span> (!connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a> &amp;&amp; (!connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a> ||</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;        strlen(connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>) &lt;= 0)) {</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;            _(<span class="stringliteral">&quot;&#39;Invalid connection data.&#39;&quot;</span>)</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;        ));</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;        <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;    }</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;    <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;}</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;</div><div class="line"><a name="l01145"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a31af2942017984e0614a1ff7913cacc9"> 1145</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a31af2942017984e0614a1ff7913cacc9">rmplugin_x2go_pyhoca_terminate_session</a>(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data)</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;{</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;    <span class="keywordflow">if</span> (!custom_data || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> ||</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;        !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a> ||</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;        !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">opt2</a>) {</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;            _(<span class="stringliteral">&quot;Parameter &#39;custom_data&#39; is not fully initialized!&quot;</span>)</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;        ));</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;    }</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;    <span class="comment">// Extract data passed by X2GoCustomUserData *custom_data.</span></div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a>);</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;    <span class="comment">//struct _DialogData *ddata = (struct _DialogData*) custom_data-&gt;dialog_data;</span></div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;    <span class="keyword">struct </span><a class="code" href="struct___connection_data.html">_ConnectionData</a> *connect_data = (<span class="keyword">struct </span><a class="code" href="struct___connection_data.html">_ConnectionData</a>*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a>;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;    GtkTreePath* selected_row = (GtkTreePath*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a>;</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;    GtkDialog *dialog = GTK_DIALOG(custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">opt2</a>);</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;    gchar *<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a> = NULL;</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;    gchar *<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a> = NULL;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;    gchar *<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a> = NULL;</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;    gchar *<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a> = NULL;</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;    gchar *<a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a> = NULL;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;    gboolean valid = <a class="code" href="x2go__plugin_8c.html#a9a10942cbe118d3ca8458b667b0c5edb">rmplugin_x2go_verify_connection_data</a>(connect_data);</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;    <span class="keywordflow">if</span> (valid) {</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;        <span class="keywordflow">if</span> (connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a>) password = connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a>;</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;        <span class="keywordflow">if</span> (connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>) {</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;            ssh_privatekey = connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;            <span class="keywordflow">if</span> (connect_data-&gt;<a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a>) {</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;                ssh_passphrase = connect_data-&gt;<a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a>;</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;            }</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;        }</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;        host = connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a>;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;        username = connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a>;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;    }</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;    GValue value = <a class="code" href="x2go__plugin_8c.html#a3ed48dd41c8b207454aa327a32cd19d7">rmplugin_x2go_session_chooser_get_property</a>(GTK_WIDGET(dialog),</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;                                <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>,</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;                                selected_row);</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;    <span class="comment">// error message was handled already.</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;    <span class="keywordflow">if</span> (!G_VALUE_HOLDS_STRING(&amp;value)) <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;    <span class="keyword">const</span> gchar *session_id = g_value_get_string(&amp;value);</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;    <span class="comment">// We will now start pyhoca-cli with only the &#39;--terminate $SESSION_ID&#39; option.</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;    <span class="comment">// (and of course auth related stuff)</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;    gchar *argv[50];</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;    gint argc = 0;</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;pyhoca-cli&quot;</span>);</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--server&quot;</span>); <span class="comment">// Not listed as feature.</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;    argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, host);</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;USERNAME&quot;</span>)) {</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;-u&quot;</span>);</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;        <span class="keywordflow">if</span> (username) {</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, username);</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, g_get_user_name());</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;        }</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;USERNAME&quot;</span>));</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    }</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;    <span class="keywordflow">if</span> (password &amp;&amp; FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;PASSWORD&quot;</span>)) {</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;        <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>)) {</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--auth-attempts&quot;</span>);</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%i&quot;</span>, 0);</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;            REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>));</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;        }</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;        <span class="keywordflow">if</span> (strlen(password) &gt; 0) {</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--force-password&quot;</span>);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--password&quot;</span>);</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, password);</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;        }</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!password) {</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;PASSWORD&quot;</span>));</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;    }</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;TERMINATE&quot;</span>)) {</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--terminate&quot;</span>);</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;        argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, session_id);</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;TERMINATE&quot;</span>));</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;    }</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;NON_INTERACTIVE&quot;</span>)) {</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--non-interactive&quot;</span>);</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;        REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;NON_INTERACTIVE&quot;</span>));</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;    }</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>)) {</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;        <span class="keywordflow">if</span> (ssh_privatekey &amp;&amp; !g_str_equal(ssh_privatekey, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--ssh-privkey&quot;</span>);</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, ssh_privatekey);</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;            <span class="keywordflow">if</span> (ssh_passphrase &amp;&amp; !g_str_equal(ssh_passphrase, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;                <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SSH_PASSPHRASE&quot;</span>)) {</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;                    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--ssh-passphrase&quot;</span>);</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;                    argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, ssh_passphrase);</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;                } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;                    REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SSH_PASSPHRASE&quot;</span>));</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;                }</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;            }</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;        }</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>));</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;    }</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;    argv[argc++] = NULL;</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;    GError* error = NULL;</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;    gchar** envp = g_get_environ();</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a677f02c8a6a4d23577be167675144f67">rmplugin_x2go_spawn_pyhoca_process</a>(argc, argv, &amp;error, envp);</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;    g_strfreev(envp);</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;    <span class="keywordflow">if</span> (error) {</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;        gchar *err_msg = g_strdup_printf(</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;            _(<span class="stringliteral">&quot;Could not terminate X2Go session &#39;%s&#39;:\n%s&quot;</span>),</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;            session_id,</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;            error-&gt;message</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;        );</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, err_msg);</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;        <span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a> *err_ddata = g_new0(<span class="keyword">struct</span> <a class="code" href="struct___dialog_data.html">_DialogData</a>, 1);</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">parent</a> = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dialog)));</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">flags</a> = GTK_DIALOG_MODAL;</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a1c48cea48c8dadf952e6ad684b8f89bb">type</a> = GTK_MESSAGE_ERROR;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a3cee753dca9f060cde0638c54e1466c4">buttons</a> = GTK_BUTTONS_OK;</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a> = _(<span class="stringliteral">&quot;An error occured.&quot;</span>);</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">message</a> = err_msg;</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;        <span class="comment">// We don&#39;t need the response.</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">callbackfunc</a> = NULL;</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;        <span class="comment">// We don&#39;t need a custom dialog either.</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">dialog_factory_func</a> = NULL;</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;        err_ddata-&gt;<a class="code" href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">dialog_factory_data</a> = NULL;</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;        <span class="comment">/* Prepare X2GoCustomUserData *custom_data</span></div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;<span class="comment">        *   gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;<span class="comment">        *   dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> = custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a>;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> = err_ddata;</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a> = NULL;</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> = NULL;</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">opt2</a> = NULL;</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;        IDLE_ADD((GSourceFunc) <a class="code" href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">rmplugin_x2go_open_dialog</a>, custom_data);</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;        <span class="comment">// Too verbose:</span></div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;        <span class="comment">// GtkTreeModel *model = gtk_tree_model_filter_get_model(</span></div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;        <span class="comment">//                  GTK_TREE_MODEL_FILTER(filter));</span></div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;        <span class="comment">// gtk_tree_model_foreach(GTK_TREE_MODEL(model), (GtkTreeModelForeachFunc)</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;        <span class="comment">//            rmplugin_x2go_dump_session_properties, dialog);</span></div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;        <span class="comment">// Set row visible again since we could not terminate the session.</span></div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="x2go__plugin_8c.html#ab4ebe975e9b8b8ee1f6918d1c15f0ae6">rmplugin_x2go_session_chooser_set_row_visible</a>(selected_row, TRUE,</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;                                   dialog)) {</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;            <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;            <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;        }</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;    }</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;}</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;</div><div class="line"><a name="l01339"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a2c9096d0e798638c847fb1ceaf1a3479"> 1339</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a2c9096d0e798638c847fb1ceaf1a3479">rmplugin_x2go_session_chooser_callback</a>(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a>* custom_data,</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;                               gint response_id,</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;                               GtkDialog *<span class="keyword">self</span>)</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;{</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;    <span class="keywordflow">if</span> (!custom_data || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> || !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> ||</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;        !custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a>) {</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;            _(<span class="stringliteral">&quot;Parameter &#39;custom_data&#39; is not initialized!&quot;</span>)</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;        ));</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;    }</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;    <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp = (<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>*) custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a>;</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;    <span class="comment">// Don&#39;t need to run other stuff, if the user just wants a new session.</span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;    <span class="comment">// Also it can happen, that no session is there anymore which can be selected!</span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;    if (response_id == <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a37ecf143423a9ba7f52fd4826cf4226f">SESSION_CHOOSER_RESPONSE_NEW</a>) {</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;The user explicitly requested a new session. &quot;</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;                         <span class="stringliteral">&quot;Creating a new session…&quot;</span>);</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;        SET_RESUME_SESSION(gp, NULL);</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;        <span class="comment">// Unstucking main process. Telling it that a session has been selected.</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;        <span class="comment">// We use a trick here. As long as there is something other</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;        <span class="comment">// than 0 stored, a session is selected. So we use the gpointer as a gboolean.</span></div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;        SET_SESSION_SELECTED(gp, (gpointer) TRUE);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;        gtk_widget_destroy(GTK_WIDGET(<span class="keyword">self</span>));</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;    }</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;    <span class="comment">// This assumes that there are sessions which can be selected!</span></div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;    GValue value = <a class="code" href="x2go__plugin_8c.html#a3ed48dd41c8b207454aa327a32cd19d7">rmplugin_x2go_session_chooser_get_property</a>(</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;                GTK_WIDGET(<span class="keyword">self</span>),</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;                <a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>,</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;                NULL <span class="comment">// Let the function search for the selected row.</span></div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;               );</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;    <span class="comment">// error message was handled already.</span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;    <span class="keywordflow">if</span> (!G_VALUE_HOLDS_STRING(&amp;value)) <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;    gchar *session_id = (gchar*) g_value_get_string(&amp;value);</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;    <span class="keywordflow">if</span> (response_id == <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc">SESSION_CHOOSER_RESPONSE_CHOOSE</a>) {</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;        <span class="keywordflow">if</span> (!session_id || strlen(session_id) &lt;= 0) {</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;            REMMINA_PLUGIN_DEBUG(</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;                <span class="stringliteral">&quot;%s&quot;</span>,</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;                _(<span class="stringliteral">&quot;Could not get session ID from session chooser dialog.&quot;</span>)</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;            );</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;            SET_RESUME_SESSION(gp, NULL);</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;            SET_RESUME_SESSION(gp, session_id);</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;            REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;                _(<span class="stringliteral">&quot;Resuming session: &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;                session_id</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;            ));</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;        }</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (response_id == <a class="code" href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">SESSION_CHOOSER_RESPONSE_TERMINATE</a>) {</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;        <span class="keywordflow">if</span> (!session_id || strlen(session_id) &lt;= 0) {</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;            REMMINA_PLUGIN_DEBUG(</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;                <span class="stringliteral">&quot;%s&quot;</span>,</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;                _(<span class="stringliteral">&quot;Could not get session ID from session chooser dialog.&quot;</span>)</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;            );</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;            SET_RESUME_SESSION(gp, NULL);</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;            SET_RESUME_SESSION(gp, session_id);</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;            REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;                _(<span class="stringliteral">&quot;Terminating session: &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;                session_id</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;            ));</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;        }</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;        GtkTreePath *path = <a class="code" href="x2go__plugin_8c.html#a1c60a927c4927871d84b2a86e2f877a3">rmplugin_x2go_session_chooser_get_selected_row</a>(</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;                                    GTK_WIDGET(<span class="keyword">self</span>));</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;        <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;        <span class="keywordflow">if</span> (!path) <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;        <span class="comment">// Actually set row invisible.</span></div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="x2go__plugin_8c.html#ab4ebe975e9b8b8ee1f6918d1c15f0ae6">rmplugin_x2go_session_chooser_set_row_visible</a>(path, FALSE, <span class="keyword">self</span>)) {</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;            <span class="comment">// error message was already handled.</span></div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;            <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;        }</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;        <span class="comment">/* Prepare X2GoCustomUserData *custom_data</span></div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;<span class="comment">         *  gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="comment">         *  dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;<span class="comment">         *  connect_data -&gt; connection data (struct _ConnectionData*)</span></div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;<span class="comment">         *  opt1 -&gt; selected row (GtkTreePath*)</span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment">         *  opt2 -&gt; session selection dialog (GtkDialog*)</span></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;<span class="comment">         */</span></div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;        <span class="comment">// everything else is already initialized.</span></div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> = path;</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">opt2</a> = <span class="keyword">self</span>;</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;        <span class="comment">// Actually start pyhoca-cli process with --terminate $session_id.</span></div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;        g_thread_new(<span class="stringliteral">&quot;terminate-session-thread&quot;</span>,</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;                 (GThreadFunc) <a class="code" href="x2go__plugin_8c.html#a31af2942017984e0614a1ff7913cacc9">rmplugin_x2go_pyhoca_terminate_session</a>,</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;                 custom_data);</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;        <span class="comment">// Dialog should stay open.</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_CONTINUE;</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;User clicked dialog away. &quot;</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;                     <span class="stringliteral">&quot;Creating a new session then.&quot;</span>);</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;        SET_RESUME_SESSION(gp, NULL);</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;    }</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;    <span class="comment">// Unstucking main process. Telling it that a session has been selected.</span></div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;    <span class="comment">// We use a trick here. As long as there is something other</span></div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;    <span class="comment">// than 0 stored, a session is selected. So we use the gpointer as a gboolean.</span></div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;    SET_SESSION_SELECTED(gp, (gpointer) TRUE);</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;    gtk_widget_destroy(GTK_WIDGET(<span class="keyword">self</span>));</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;}</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;<span class="preprocessor">#define RMPLUGIN_X2GO_FEATURE_GTKSOCKET 1</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;<span class="comment">/* Forward declaration */</span></div><div class="line"><a name="l01464"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a59baf7f963dc3cdbd87224706cd73c68"> 1464</a></span>&#160;<span class="keyword">static</span> <a class="code" href="struct___remmina_protocol_plugin.html">RemminaProtocolPlugin</a> <a class="code" href="x2go__plugin_8c.html#a59baf7f963dc3cdbd87224706cd73c68">rmplugin_x2go</a>;</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;<span class="comment">/* When more than one NX sessions is connecting in progress, we need this mutex and array</span></div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;<span class="comment"> * to prevent them from stealing the same window ID.</span></div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01469"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2"> 1469</a></span>&#160;<span class="keyword">static</span> pthread_mutex_t <a class="code" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a>;</div><div class="line"><a name="l01470"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9"> 1470</a></span>&#160;<span class="keyword">static</span> GArray *<a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>;</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;<span class="comment">/* ------------- Support for execution on main thread of GTK functions ------------- */</span></div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;<span class="keyword">struct </span><a class="code" href="structon_main_thread__cb__data.html">onMainThread_cb_data</a></div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;{</div><div class="line"><a name="l01475"></a><span class="lineno"><a class="line" href="structon_main_thread__cb__data.html#ac7d6253a4d968601704770d8db13050eadb238fcd1e49b305021c338178922fbc"> 1475</a></span>&#160;    <span class="keyword">enum</span> { FUNC_GTK_SOCKET_ADD_ID } func;</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;</div><div class="line"><a name="l01477"></a><span class="lineno"><a class="line" href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4"> 1477</a></span>&#160;    GtkSocket* <a class="code" href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4">sk</a>;</div><div class="line"><a name="l01478"></a><span class="lineno"><a class="line" href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8"> 1478</a></span>&#160;    Window <a class="code" href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8">w</a>;</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;    <span class="comment">/* Mutex for thread synchronization */</span></div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;    pthread_mutex_t mu;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;    <span class="comment">/* Flag to catch cancellations */</span></div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    gboolean cancelled;</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;};</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;</div><div class="line"><a name="l01486"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a9ba8e968998b64b3832e484a2ca7dfc1"> 1486</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a9ba8e968998b64b3832e484a2ca7dfc1">onMainThread_cb</a>(<span class="keyword">struct</span> <a class="code" href="structon_main_thread__cb__data.html">onMainThread_cb_data</a> *d)</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;{</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;    <span class="keywordflow">if</span> (!d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a75eab61445fbabacaa34f95e2437ea75">cancelled</a>) {</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;        <span class="keywordflow">switch</span> (d-&gt;<a class="code" href="structon_main_thread__cb__data.html#ab5a747d3d76631e059d736ef286a6c38">func</a>) {</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;        <span class="keywordflow">case</span> FUNC_GTK_SOCKET_ADD_ID:</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;            gtk_socket_add_id(d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4">sk</a>, d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8">w</a>);</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;        }</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;        pthread_mutex_unlock(&amp;d-&gt;<a class="code" href="structon_main_thread__cb__data.html#acd2e5f24279a00e0d426d67604dc8fbc">mu</a>);</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;        <span class="comment">/* thread has been cancelled, so we must free d memory here */</span></div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;        g_free(d);</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;    }</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;}</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;</div><div class="line"><a name="l01504"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a5dea604d34a804e23a5cd8a6683d9e49"> 1504</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#a5dea604d34a804e23a5cd8a6683d9e49">onMainThread_cleanup_handler</a>(gpointer data)</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;{</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;    <span class="keyword">struct </span><a class="code" href="structon_main_thread__cb__data.html">onMainThread_cb_data</a> *d = data;</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;    d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a75eab61445fbabacaa34f95e2437ea75">cancelled</a> = TRUE;</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;}</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;</div><div class="line"><a name="l01511"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a390e3b371156197feb518b737a31cc53"> 1511</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#a390e3b371156197feb518b737a31cc53">onMainThread_schedule_callback_and_wait</a>(<span class="keyword">struct</span> <a class="code" href="structon_main_thread__cb__data.html">onMainThread_cb_data</a> *d)</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;{</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;    d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a75eab61445fbabacaa34f95e2437ea75">cancelled</a> = FALSE;</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;    pthread_cleanup_push(<a class="code" href="x2go__plugin_8c.html#a5dea604d34a804e23a5cd8a6683d9e49">onMainThread_cleanup_handler</a>, d);</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;    pthread_mutex_init(&amp;d-&gt;<a class="code" href="structon_main_thread__cb__data.html#acd2e5f24279a00e0d426d67604dc8fbc">mu</a>, NULL);</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;    pthread_mutex_lock(&amp;d-&gt;<a class="code" href="structon_main_thread__cb__data.html#acd2e5f24279a00e0d426d67604dc8fbc">mu</a>);</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;    gdk_threads_add_idle((GSourceFunc)<a class="code" href="x2go__plugin_8c.html#a9ba8e968998b64b3832e484a2ca7dfc1">onMainThread_cb</a>, (gpointer) d);</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;    pthread_mutex_lock(&amp;d-&gt;mu);</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;    pthread_cleanup_pop(0);</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;    pthread_mutex_unlock(&amp;d-&gt;mu);</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;    pthread_mutex_destroy(&amp;d-&gt;mu);</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;}</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;</div><div class="line"><a name="l01527"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a31b9185763acddffe0bbdef41380bf43"> 1527</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#a31b9185763acddffe0bbdef41380bf43">onMainThread_gtk_socket_add_id</a>(GtkSocket* <a class="code" href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4">sk</a>, Window <a class="code" href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8">w</a>)</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;{</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    <span class="keyword">struct </span><a class="code" href="structon_main_thread__cb__data.html">onMainThread_cb_data</a> *d;</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;    d = g_new0(<span class="keyword">struct</span> <a class="code" href="structon_main_thread__cb__data.html">onMainThread_cb_data</a>, 1);</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;    d-&gt;<a class="code" href="structon_main_thread__cb__data.html#ab5a747d3d76631e059d736ef286a6c38">func</a> = <a class="code" href="structon_main_thread__cb__data.html#ac7d6253a4d968601704770d8db13050eadb238fcd1e49b305021c338178922fbc">FUNC_GTK_SOCKET_ADD_ID</a>;</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;    d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4">sk</a> = <a class="code" href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4">sk</a>;</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;    d-&gt;<a class="code" href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8">w</a> = <a class="code" href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8">w</a>;</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a390e3b371156197feb518b737a31cc53">onMainThread_schedule_callback_and_wait</a>(d);</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;    g_free(d);</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;}</div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;<span class="comment">/* /-/-/-/-/-/-/ Support for execution on main thread of GTK functions /-/-/-/-/-/-/ */</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;</div><div class="line"><a name="l01543"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a2f3106cb9e16e497bf1aa78a336a729d"> 1543</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#a2f3106cb9e16e497bf1aa78a336a729d">rmplugin_x2go_remove_window_id</a> (Window <a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a>)</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;{</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;    gint i;</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;    gboolean already_seen = FALSE;</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;    pthread_mutex_lock(&amp;<a class="code" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a>);</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>-&gt;len; i++) {</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;        <span class="keywordflow">if</span> (g_array_index(<a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>, Window, i) == window_id) {</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;            already_seen = TRUE;</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Window of X2Go Agent with ID [0x%lx] seen already.&quot;</span>,</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;                         window_id);</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;        }</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;    }</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;    <span class="keywordflow">if</span> (already_seen) {</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;        g_array_remove_index_fast(<a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>, i);</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Forgetting about window of X2Go Agent with ID [0x%lx]…&quot;</span>,</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;                     window_id);</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;    }</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;    pthread_mutex_unlock(&amp;<a class="code" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a>);</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;}</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;</div><div class="line"><a name="l01572"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ac64918df81607ee0b80ba6eb78bb338a"> 1572</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#ac64918df81607ee0b80ba6eb78bb338a">rmplugin_x2go_cleanup</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *<a class="code" href="structon_main_thread__cb__data.html#ad4019cdd5ac560eb1cd47d9f924831bb">gp</a>)</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;{</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;    gchar *server;</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;    gint port;</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;    <a class="code" href="types_8h.html#a112d7cc6c755209cabb68cf2a62ad515">RemminaFile</a> *remminafile = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a1409dcc143ddc35de86b792df095cfc4">protocol_plugin_get_file</a>(gp);</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;    rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a6fdfd3063906f49157225f536537bb0f">get_server_port</a>(rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a673ff4320377c3b440dfd24a796c69fc">file_get_string</a>(remminafile, <span class="stringliteral">&quot;server&quot;</span>),</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;            22,</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;            &amp;server,</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;            &amp;port);</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;    REMMINA_PLUGIN_AUDIT(_(<span class="stringliteral">&quot;Disconnected from %s:%d via X2Go&quot;</span>), server, port);</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;    g_free(server), server = NULL;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;    <span class="keywordflow">if</span> (gpdata == NULL) {</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Exiting since gpdata is already &#39;NULL&#39;…&quot;</span>);</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;    }</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a>) {</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;        pthread_cancel(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a>);</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;        <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a>) pthread_join(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a>, NULL);</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;    }</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a>) {</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;        <a class="code" href="x2go__plugin_8c.html#a2f3106cb9e16e497bf1aa78a336a729d">rmplugin_x2go_remove_window_id</a>(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a>);</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;    }</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a>) {</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;        kill(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a>, SIGTERM);</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;        g_spawn_close_pid(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a>);</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;        gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a> = 0;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;    }</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>) {</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;        XSetErrorHandler(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">orig_handler</a>);</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;        XCloseDisplay(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>);</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;        gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a> = NULL;</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;    }</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;    g_object_steal_data(G_OBJECT(gp), <span class="stringliteral">&quot;plugin-data&quot;</span>);</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;    rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ab58b7bf5f91c5f60349a8242e6322f7f">protocol_plugin_signal_connection_closed</a>(gp);</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;}</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;</div><div class="line"><a name="l01621"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a8bb1f63c7ea5f949fef485fc2cc09321"> 1621</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a8bb1f63c7ea5f949fef485fc2cc09321">rmplugin_x2go_close_connection</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *<a class="code" href="structon_main_thread__cb__data.html#ad4019cdd5ac560eb1cd47d9f924831bb">gp</a>)</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;{</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a3fe6e076459db4ee337d70ef2c1d838a">disconnected</a>) {</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Doing nothing since the plugin is already disconnected.&quot;</span>);</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;    }</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;    <a class="code" href="x2go__plugin_8c.html#ac64918df81607ee0b80ba6eb78bb338a">rmplugin_x2go_cleanup</a>(gp);</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;    <span class="comment">// Try again.</span></div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_CONTINUE;</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;}</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;</div><div class="line"><a name="l01639"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#acec567735d2cdea8eacbd39c088728ee"> 1639</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#acec567735d2cdea8eacbd39c088728ee">rmplugin_x2go_pyhoca_cli_exited</a>(GPid pid,</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;                        gint status,</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;                        <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *<a class="code" href="structon_main_thread__cb__data.html#ad4019cdd5ac560eb1cd47d9f924831bb">gp</a>)</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;{</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;    <span class="keywordflow">if</span> (!gpdata) {</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Doing nothing as the disconnection &quot;</span></div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;                     <span class="stringliteral">&quot;has already been handled.&quot;</span>);</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;    }</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a> &lt;= 0) {</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Doing nothing since pyhoca-cli was expected to stop.&quot;</span>);</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    }</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;    REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;PyHoca-CLI exited unexpectedly. &quot;</span></div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;                    <span class="stringliteral">&quot;This connection will now be closed.&quot;</span>));</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;    <span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a> *ddata = g_new0(<span class="keyword">struct</span> <a class="code" href="struct___dialog_data.html">_DialogData</a>, 1);</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">parent</a> = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(gp)));</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">flags</a> = GTK_DIALOG_MODAL;</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a1c48cea48c8dadf952e6ad684b8f89bb">type</a> = GTK_MESSAGE_ERROR;</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a3cee753dca9f060cde0638c54e1466c4">buttons</a> = GTK_BUTTONS_OK;</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a> = _(<span class="stringliteral">&quot;An error occured.&quot;</span>);</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">message</a> = _(<span class="stringliteral">&quot;The necessary child process &#39;pyhoca-cli&#39; stopped unexpectedly.\n&quot;</span></div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;               <span class="stringliteral">&quot;Please check your profile settings and PyHoca-CLI&#39;s output for &quot;</span></div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;               <span class="stringliteral">&quot;possible errors. Also ensure the remote server is &quot;</span></div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;               <span class="stringliteral">&quot;reachable and you&#39;re using the right credentials.&quot;</span>);</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;    <span class="comment">// We don&#39;t need the response.</span></div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">callbackfunc</a> = NULL;</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;    <span class="comment">// We don&#39;t need a custom dialog either.</span></div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">dialog_factory_func</a> = NULL;</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">dialog_factory_data</a> = NULL;</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;    <span class="comment">/* Prepare X2GoCustomUserData *custom_data</span></div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;<span class="comment">     *  gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;<span class="comment">     *  dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;<span class="comment">     */</span></div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;    <a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data = g_new0(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a>, 1);</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;    g_assert(custom_data &amp;&amp; <span class="stringliteral">&quot;custom_data could not be initialized.&quot;</span>);</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> = gp;</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> = ddata;</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a> = NULL;</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> = NULL;</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;    IDLE_ADD((GSourceFunc) <a class="code" href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">rmplugin_x2go_open_dialog</a>, custom_data);</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;    <span class="comment">// 1 Second. Give `Dialog` chance to open.</span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;    usleep(1000 * 1000);</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a8bb1f63c7ea5f949fef485fc2cc09321">rmplugin_x2go_close_connection</a>(gp);</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;}</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;</div><div class="line"><a name="l01700"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#adf5b78d93d823c4f9f79675b5e418c11"> 1700</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#adf5b78d93d823c4f9f79675b5e418c11">rmplugin_x2go_save_credentials</a>(<a class="code" href="types_8h.html#a112d7cc6c755209cabb68cf2a62ad515">RemminaFile</a>* remminafile,</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;                           gchar* s_username, gchar* s_password,</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;                           gchar* errmsg)</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;{</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;    <span class="comment">// User has requested to save credentials. We put all the new credentials</span></div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;    <span class="comment">// into remminafile-&gt;settings. They will be saved later, on successful</span></div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;    <span class="comment">// connection, by rcw.c</span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;    <span class="keywordflow">if</span> (s_password &amp;&amp; s_username) {</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;        <span class="keywordflow">if</span> (g_strcmp0(s_username, <span class="stringliteral">&quot;&quot;</span>) == 0) {</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;            g_strlcpy(errmsg, _(<span class="stringliteral">&quot;Can&#39;t save empty username!&quot;</span>), 512);</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;            <span class="comment">//REMMINA_PLUGIN_CRITICAL(&quot;%s&quot;, errmsg); // No need.</span></div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;            <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;        }</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;        <span class="comment">// We allow the possibility to set an empty password because a X2Go</span></div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;        <span class="comment">// session can be still made using keyfiles or similar.</span></div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;        rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3">file_set_string</a>(remminafile, <span class="stringliteral">&quot;password&quot;</span>,</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;                           s_password);</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;        rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3">file_set_string</a>(remminafile, <span class="stringliteral">&quot;username&quot;</span>,</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;                           s_username);</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;        g_strlcpy(errmsg, g_strdup_printf(</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;            _(<span class="stringliteral">&quot;Could not save new credentials.&quot;</span>)</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;        ), 512);</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Could not save &quot;</span></div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;                        <span class="stringliteral">&quot;new credentials: &#39;s_password&#39; or &quot;</span></div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;                        <span class="stringliteral">&quot;&#39;s_username&#39; strings were not set.&quot;</span>));</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    }</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;}</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;</div><div class="line"><a name="l01744"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a25b6f161265e60c3275c479fb3eb3cb9"> 1744</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a25b6f161265e60c3275c479fb3eb3cb9">rmplugin_x2go_get_ssh_passphrase</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp, gchar *errmsg,</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;                         gchar **passphrase)</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;{</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;    g_assert(errmsg != NULL);</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;    g_assert(gp != NULL);</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;</div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;    <span class="keywordflow">if</span> ((*passphrase) == NULL) {</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;        <span class="comment">// Just setting NULL password to empty password.</span></div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;        (*passphrase) = g_strdup(<span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;    }</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;    gint ret = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a9b4cfe0a97a34260e58784feef693704">protocol_plugin_init_auth</a>(</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;            gp, 0, _(<span class="stringliteral">&quot;Enter password to unlock the SSH key:&quot;</span>),</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;            NULL, *passphrase, NULL, NULL</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;    );</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;    <span class="keywordflow">if</span> (ret == GTK_RESPONSE_OK) {</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;        gchar *s_passphrase = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ad98eaa3efc0214bc701dc66b5730e174">protocol_plugin_init_get_password</a>(gp);</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;        <span class="keywordflow">if</span> (s_passphrase) {</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;            (*passphrase) = g_strdup(s_passphrase);</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;            g_free(s_passphrase);</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;        }</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    } <span class="keywordflow">else</span>  {</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;        g_strlcpy(errmsg, _(<span class="stringliteral">&quot;Password input cancelled. Aborting…&quot;</span>), 512);</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;    }</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;}</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;</div><div class="line"><a name="l01786"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#acb42f76c9d02750597eb6504f1d400a4"> 1786</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#acb42f76c9d02750597eb6504f1d400a4">rmplugin_x2go_get_auth</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp, gchar* errmsg,</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;                       gchar** default_username, gchar** default_password)</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;{</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    g_assert(errmsg != NULL);</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    g_assert(gp != NULL);</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;    g_assert(default_username != NULL);</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;    g_assert(default_password != NULL);</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;    <span class="comment">// default_username is probably NULL because the user didn&#39;t configure any</span></div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;    <span class="comment">// username in the profile settings.</span></div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;    <span class="keywordflow">if</span> ((*default_username) == NULL) {</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;        gchar* l_errmsg = g_strdup_printf(</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;            _(<span class="stringliteral">&quot;Tip: Check the &#39;Save password&#39; checkbox or manually input your &quot;</span></div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;              <span class="stringliteral">&quot;X2Go username and password in the profile settings to store &quot;</span></div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;              <span class="stringliteral">&quot;them for faster logins.&quot;</span>)</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;        );</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;        REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, l_errmsg);</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;        (*default_username) = g_strdup(<span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;    }</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    <span class="comment">// default_password is probably NULL because something did go wrong at the</span></div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;    <span class="comment">// secret-plugin. For example: The user didn&#39;t input a password for keyring or</span></div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;    <span class="comment">// the user simply didn&#39;t configure a password in the profile settings.</span></div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;    <span class="keywordflow">if</span> ((*default_password) == NULL) {</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;        (*default_password) = g_strdup(<span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;    }</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;    gchar *s_username, *s_password;</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;    gint ret;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;    gboolean save;</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;    gboolean disable_password_storing;</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;    <a class="code" href="types_8h.html#a112d7cc6c755209cabb68cf2a62ad515">RemminaFile</a> *remminafile;</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;    remminafile = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a1409dcc143ddc35de86b792df095cfc4">protocol_plugin_get_file</a>(gp);</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;    disable_password_storing = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a0c7eab256e1b1fdf84be44e28cddc3de">file_get_int</a>(</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;        remminafile, <span class="stringliteral">&quot;disablepasswordstoring&quot;</span>, FALSE</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;    );</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;    ret = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a9b4cfe0a97a34260e58784feef693704">protocol_plugin_init_auth</a>(</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;            gp, (disable_password_storing ? 0 :</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;                 <a class="code" href="types_8h.html#a341a0a8b6509633809d99348cc3ba486a9b734c324722cf2982768feaeeb15c7c">REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD</a> |</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;                 <a class="code" href="types_8h.html#a341a0a8b6509633809d99348cc3ba486a10be0730fc3ea326856019ae139a922a">REMMINA_MESSAGE_PANEL_FLAG_USERNAME</a>),</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;            _(<span class="stringliteral">&quot;Enter X2Go credentials&quot;</span>),</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;            (*default_username), (*default_password), NULL, NULL</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;    );</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;    <span class="keywordflow">if</span> (ret == GTK_RESPONSE_OK) {</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;        s_username = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ac892dd297fae87868752a1f86e07937d">protocol_plugin_init_get_username</a>(gp);</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;        s_password = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ad98eaa3efc0214bc701dc66b5730e174">protocol_plugin_init_get_password</a>(gp);</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;        <span class="keywordflow">if</span> (rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#af2b857b2de1af3621f543b810f68b17b">protocol_plugin_init_get_savepassword</a>(gp))</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;            rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3">file_set_string</a>(</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;                remminafile, <span class="stringliteral">&quot;password&quot;</span>, s_password</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;            );</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;        <span class="comment">// Should be renamed to protocol_plugin_init_get_savecredentials()?!</span></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;        save = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#af2b857b2de1af3621f543b810f68b17b">protocol_plugin_init_get_savepassword</a>(gp);</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;        <span class="keywordflow">if</span> (save) {</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;            <span class="keywordflow">if</span> (!<a class="code" href="x2go__plugin_8c.html#adf5b78d93d823c4f9f79675b5e418c11">rmplugin_x2go_save_credentials</a>(remminafile, s_username,</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;                                s_password, errmsg)) {</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;                <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;            }</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;        }</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;        <span class="keywordflow">if</span> (s_username) {</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;            (*default_username) = g_strdup(s_username);</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;            g_free(s_username);</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;        }</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;        <span class="keywordflow">if</span> (s_password) {</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;            (*default_password) = g_strdup(s_password);</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;            g_free(s_password);</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;        }</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;    } <span class="keywordflow">else</span>  {</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;        g_strlcpy(errmsg, _(<span class="stringliteral">&quot;Authentication cancelled. Aborting…&quot;</span>), 512);</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;    }</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;}</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;</div><div class="line"><a name="l01878"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a164ae7ed206fba9bca6f910209f10850"> 1878</a></span>&#160;<span class="keyword">static</span> gchar* <a class="code" href="x2go__plugin_8c.html#a164ae7ed206fba9bca6f910209f10850">rmplugin_x2go_get_pyhoca_sessions</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>* gp, GError **error,</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;                        <span class="keyword">struct</span> <a class="code" href="struct___connection_data.html">_ConnectionData</a>* connect_data)</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;{</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a>* gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;    gchar *host = NULL;</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;    gchar *username = NULL;</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;    gchar *password = NULL;</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;    gchar *ssh_privatekey = NULL;</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;    gchar *ssh_passphrase = NULL;</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;    gboolean valid = <a class="code" href="x2go__plugin_8c.html#a9a10942cbe118d3ca8458b667b0c5edb">rmplugin_x2go_verify_connection_data</a>(connect_data);</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;    <span class="keywordflow">if</span> (valid) {</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;        <span class="keywordflow">if</span> (connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a>) password = connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a>;</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;        <span class="keywordflow">if</span> (connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>) {</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;            ssh_privatekey = connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>;</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;            <span class="keywordflow">if</span> (connect_data-&gt;<a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a>) {</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;                ssh_passphrase = connect_data-&gt;<a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a>;</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;            }</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;        }</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;        host = connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a>;</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;        username = connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a>;</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;        <span class="keywordflow">return</span> G_SOURCE_REMOVE;</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;    }</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;    <span class="comment">// We will now start pyhoca-cli with only the &#39;--list-sessions&#39; option.</span></div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;    gchar *argv[50];</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;    gint argc = 0;</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;pyhoca-cli&quot;</span>);</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--list-sessions&quot;</span>);</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--server&quot;</span>); <span class="comment">// Not listed as feature.</span></div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;    argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, host);</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;USERNAME&quot;</span>)) {</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;-u&quot;</span>);</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;        <span class="keywordflow">if</span> (username) {</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, username);</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, g_get_user_name());</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;        }</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;USERNAME&quot;</span>));</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;USERNAME&quot;</span>));</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;    }</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;NON_INTERACTIVE&quot;</span>)) {</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--non-interactive&quot;</span>);</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;        REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;NON_INTERACTIVE&quot;</span>));</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;    }</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    <span class="keywordflow">if</span> (password &amp;&amp; FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;PASSWORD&quot;</span>)) {</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;        <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>)) {</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--auth-attempts&quot;</span>);</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%i&quot;</span>, 0);</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;            REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>));</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;        }</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;        <span class="keywordflow">if</span> (strlen(password) &gt; 0) {</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--force-password&quot;</span>);</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--password&quot;</span>);</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, password);</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;        }</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!password) {</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;PASSWORD&quot;</span>));</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;PASSWORD&quot;</span>));</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;    }</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;    <span class="comment">// No need to catch feature-not-available error.</span></div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;    <span class="comment">// `--quiet` is not that important.</span></div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;QUIET&quot;</span>)) {</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--quiet&quot;</span>);</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;    }</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>)) {</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;        <span class="keywordflow">if</span> (ssh_privatekey &amp;&amp; !g_str_equal(ssh_privatekey, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--ssh-privkey&quot;</span>);</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, ssh_privatekey);</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;            <span class="keywordflow">if</span> (ssh_passphrase &amp;&amp; !g_str_equal(ssh_passphrase, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;                <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SSH_PASSPHRASE&quot;</span>)) {</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;                    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--ssh-passphrase&quot;</span>);</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;                    argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, ssh_passphrase);</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;                } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;                    REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SSH_PASSPHRASE&quot;</span>));</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;                }</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;            }</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;        }</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>));</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;    }</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;    argv[argc++] = NULL;</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;    <span class="comment">//#ifndef GLIB_AVAILABLE_IN_2_68</span></div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;        gchar** envp = g_get_environ();</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;        gchar* envp_splitted = g_strjoinv(<span class="stringliteral">&quot;;&quot;</span>, envp);</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;        envp_splitted = g_strconcat(envp_splitted, <span class="stringliteral">&quot;;LANG=C&quot;</span>, (<span class="keywordtype">void</span>*) NULL);</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;        envp = g_strsplit(envp_splitted, <span class="stringliteral">&quot;;&quot;</span>, 0);</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;<span class="comment">    * #else</span></div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;<span class="comment">    *   // Only available after glib version 2.68.</span></div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;<span class="comment">    *   // TODO: FIXME: NOT TESTED!</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;<span class="comment">    *   GStrvBuilder* builder = g_strv_builder_new();</span></div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;<span class="comment">    *   g_strv_builder_add(builder, &quot;LANG=C&quot;);</span></div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;<span class="comment">    *   GStrv envp = g_strv_builder_end(builder);</span></div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;<span class="comment">    * #endif</span></div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;    gchar* std_out = <a class="code" href="x2go__plugin_8c.html#a677f02c8a6a4d23577be167675144f67">rmplugin_x2go_spawn_pyhoca_process</a>(argc, argv, error, envp);</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;    g_strfreev(envp);</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;    <span class="keywordflow">if</span> (!std_out || *error) {</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;        <span class="comment">// If no error is set but std_out is NULL</span></div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;        <span class="comment">// then something is not right at all.</span></div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;        <span class="comment">// Most likely the developer forgot to add an error message. Crash.</span></div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;        g_assert((*error) != NULL);</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;    }</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;    <span class="keywordflow">return</span> std_out;</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;}</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;</div><div class="line"><a name="l02026"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a161d67b872aa0a7988a3a9afd186d604"> 2026</a></span>&#160;<span class="keyword">static</span> GList* <a class="code" href="x2go__plugin_8c.html#a161d67b872aa0a7988a3a9afd186d604">rmplugin_x2go_parse_pyhoca_sessions</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>* gp,</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;                          GError **error,</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;                          <span class="keyword">struct</span> <a class="code" href="struct___connection_data.html">_ConnectionData</a>* connect_data)</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;{</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;    gchar *pyhoca_output = NULL;</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;    pyhoca_output = <a class="code" href="x2go__plugin_8c.html#a164ae7ed206fba9bca6f910209f10850">rmplugin_x2go_get_pyhoca_sessions</a>(gp, error, connect_data);</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;    <span class="keywordflow">if</span> (!pyhoca_output || *error) {</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;        <span class="comment">// If no error is set but pyhoca_output is NULL</span></div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;        <span class="comment">// then something is not right at all.</span></div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;        <span class="comment">// Most likely the developer forgot to add an error message. Crash.</span></div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;        g_assert((*error) != NULL);</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;    }</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;    gchar **lines_list = g_strsplit(pyhoca_output, <span class="stringliteral">&quot;\n&quot;</span>, -1);</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;    <span class="comment">// Assume at least two lines of output.</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;    <span class="keywordflow">if</span> (lines_list == NULL || lines_list[0] == NULL || lines_list[1] == NULL) {</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Could not parse the output of PyHoca-CLI&#39;s &quot;</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;                           <span class="stringliteral">&quot;--list-sessions option. Creating a new &quot;</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;                           <span class="stringliteral">&quot;session now.&quot;</span>));</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;    }</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;    gboolean found_session = FALSE;</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;    GList* sessions = NULL;</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;    gchar** session = NULL;</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;    <span class="keywordflow">for</span> (guint i = 0; lines_list[i] != NULL; i++) {</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;        gchar* current_line = lines_list[i];</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;        <span class="comment">// TOO VERBOSE:</span></div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;        <span class="comment">//REMMINA_PLUGIN_DEBUG(&quot;pyhoca-cli: %s&quot;, current_line);</span></div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;        <span class="comment">// Hardcoded string &quot;Session Name: &quot; comes from python-x2go.</span></div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;        <span class="keywordflow">if</span> (!g_str_has_prefix(current_line, <span class="stringliteral">&quot;Session Name: &quot;</span>) &amp;&amp; !found_session) {</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;            <span class="comment">// Doesn&#39;t begin with &quot;Session Name: &quot; and</span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;            <span class="comment">// the current line doesn&#39;t come after that either. Skipping.</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;        }</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;        <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;Session Name: &quot;</span>)) {</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;            gchar* session_id = NULL;</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;            gchar** line_list = g_strsplit(current_line, <span class="stringliteral">&quot;: &quot;</span>, 0);</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;            <span class="keywordflow">if</span> (line_list == NULL ||</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;                line_list[0] == NULL ||</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;                line_list[1] == NULL ||</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;                strlen(line_list[0]) &lt;= 0 ||</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;                strlen(line_list[1]) &lt;= 0)</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;            {</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;                found_session = FALSE;</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;            }</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;            session = malloc(<span class="keyword">sizeof</span>(gchar*) * (<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a>+1));</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;            <span class="keywordflow">if</span> (!session) {</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;                REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Could not allocate &quot;</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;                                <span class="stringliteral">&quot;enough memory!&quot;</span>));</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;            }</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a>] = NULL;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;            sessions = g_list_append(sessions, session);</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;            session_id = line_list[1];</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>] = session_id;</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;            REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;                _(<span class="stringliteral">&quot;Found already existing X2Go session with ID: &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;                session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a>])</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;            );</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;            found_session = TRUE;</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;        }</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;        <span class="keywordflow">if</span> (!found_session) {</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;        }</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;        <span class="keywordflow">if</span> (g_strcmp0(current_line, <span class="stringliteral">&quot;-------------&quot;</span>) == 0) {</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;        }</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;        gchar* value = NULL;</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;        gchar** line_list = g_strsplit(current_line, <span class="stringliteral">&quot;: &quot;</span>, 0);</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;        <span class="keywordflow">if</span> (line_list == NULL ||</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;            line_list[0] == NULL ||</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;            line_list[1] == NULL ||</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;            strlen(line_list[0]) &lt;= 0 ||</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;            strlen(line_list[1]) &lt;= 0)</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;        {</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;            <span class="comment">// Probably the empty line at the end of every session.</span></div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;            found_session = FALSE;</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;        }</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;        value = line_list[1];</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;        <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;cookie: &quot;</span>)) {</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;cookie:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a068cdca754cf1240547311a7896f0817">SESSION_COOKIE</a>] = value;</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;agent PID: &quot;</span>)) {</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;agent PID:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165af379eb48356f9912f3fe1d39ac163e03">SESSION_AGENT_PID</a>] = value;</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;display: &quot;</span>)) {</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;display:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165add30b4757006df4bc3c06e54f6bfce3a">SESSION_DISPLAY</a>] = value;</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;status: &quot;</span>)) {</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;            <span class="keywordflow">if</span> (g_strcmp0(value, <span class="stringliteral">&quot;S&quot;</span>) == 0) {</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;                <span class="comment">// TRANSLATORS: Please stick to X2GoClient&#39;s translation.</span></div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;                value = _(<span class="stringliteral">&quot;Suspended&quot;</span>);</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;            } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_strcmp0(value, <span class="stringliteral">&quot;R&quot;</span>) == 0) {</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;                <span class="comment">// TRANSLATORS: Please stick to X2GoClient&#39;s translation.</span></div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;                value = _(<span class="stringliteral">&quot;Running&quot;</span>);</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;            } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_strcmp0(value, <span class="stringliteral">&quot;T&quot;</span>) == 0) {</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;                <span class="comment">// TRANSLATORS: Please stick to X2GoClient&#39;s translation.</span></div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;                value = _(<span class="stringliteral">&quot;Terminated&quot;</span>);</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;            }</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;status:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2c8abd8773006b6629df76a38b2ecd9b">SESSION_STATUS</a>] = value;</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;graphic port: &quot;</span>)) {</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;graphic port:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a695a5bbc86348af93dd91c566ff36f53">SESSION_GRAPHIC_PORT</a>] = value;</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;snd port: &quot;</span>)) {</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;snd port:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165aebbdaf08ac05790b9d8c6cc1ed1f4fb7">SESSION_SND_PORT</a>] = value;</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;sshfs port: &quot;</span>)) {</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;sshfs port:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a0161356b9e8d820c86dfc81d4ad2903b">SESSION_SSHFS_PORT</a>] = value;</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;username: &quot;</span>)) {</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;username:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a6e4a495faba4c73cc560b9f388cdc961">SESSION_USERNAME</a>] = value;</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;hostname: &quot;</span>)) {</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;hostname:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2b7999cf0576ea2a030696831b30ec7a">SESSION_HOSTNAME</a>] = value;</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;create date: &quot;</span>)) {</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;create date:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a8b54a36c337ab651bb8e7eb213fe7172">SESSION_CREATE_DATE</a>] = value;</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g_str_has_prefix(current_line, <span class="stringliteral">&quot;suspended since: &quot;</span>)) {</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;suspended since:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;            session[<a class="code" href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a081555600c90a11ad962e0b69cb9dfa0">SESSION_SUSPENDED_SINCE</a>] = value;</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Not supported:\t&#39;%s&#39;&quot;</span>, value);</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;            found_session = FALSE;</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;        }</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;    }</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;    <span class="keywordflow">if</span> (!sessions) {</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;        g_set_error(error, 1, 1,</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;            <span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Could not find any sessions on remote machine. Creating a new &quot;</span></div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;              <span class="stringliteral">&quot;session now.&quot;</span>)</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;        );</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;        <span class="comment">// returning NULL with `error` set.</span></div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;    }</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;    <span class="keywordflow">return</span> sessions;</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;}</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;</div><div class="line"><a name="l02198"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a7e099c196b443f83134b076e292cee63"> 2198</a></span>&#160;<span class="keyword">static</span> gchar* <a class="code" href="x2go__plugin_8c.html#a7e099c196b443f83134b076e292cee63">rmplugin_x2go_ask_session</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp, GError **error,</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;                    <span class="keyword">struct</span> <a class="code" href="struct___connection_data.html">_ConnectionData</a>* connect_data)</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;{</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;    <span class="keywordflow">if</span> (!connect_data ||</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;        !connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a> ||</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;        !connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a> ||</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;        !connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a> ||</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;        strlen(connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a>) &lt;= 0 ||</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;        strlen(connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a>) &lt;= 0)</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;        <span class="comment">// Allow empty passwords. Maybe the user wants to connect via public key?</span></div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;    {</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;            _(<span class="stringliteral">&quot;&#39;Invalid connection data.&#39;&quot;</span>)</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;        ));</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;    }</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;    GList *sessions_list = NULL;</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;    sessions_list = <a class="code" href="x2go__plugin_8c.html#a161d67b872aa0a7988a3a9afd186d604">rmplugin_x2go_parse_pyhoca_sessions</a>(gp, error, connect_data);</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;    <span class="keywordflow">if</span> (!sessions_list || *error) {</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;        <span class="comment">// If no error is set but sessions_list is NULL</span></div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;        <span class="comment">// then something is not right at all.</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;        <span class="comment">// Most likely the developer forgot to add an error message. Crash.</span></div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;        g_assert(*error != NULL);</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;    }</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;    <span class="comment">// Prep new DialogData struct.</span></div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;    <span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a> *ddata = g_new0(<span class="keyword">struct</span> <a class="code" href="struct___dialog_data.html">_DialogData</a>, 1);</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">parent</a> = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(gp)));</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">flags</a> = GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT;</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;    <span class="comment">//ddata-&gt;type = GTK_MESSAGE_QUESTION;</span></div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;    <span class="comment">//ddata-&gt;buttons = GTK_BUTTONS_OK; // Doesn&#39;t get used in our custom factory.</span></div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a> = _(<span class="stringliteral">&quot;Choose a session to resume:&quot;</span>);</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">message</a> = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;    <span class="comment">// gboolean factory(X2GoCustomUserData*, gpointer)</span></div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;    <span class="comment">//  X2GoCustomUserData*:</span></div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;    <span class="comment">//      gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;    <span class="comment">//      dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;    <span class="comment">//      connect_data -&gt; connection data (struct _ConnectionData*)</span></div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;    <span class="comment">//  gpointer: dialog_factory_data</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">callbackfunc</a> = G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#a2c9096d0e798638c847fb1ceaf1a3479">rmplugin_x2go_session_chooser_callback</a>);</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;    <span class="comment">// gboolean factory(X2GoCustomUserData*, gpointer)</span></div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;    <span class="comment">//  X2GoCustomUserData*:</span></div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;    <span class="comment">//      gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;    <span class="comment">//      dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;    <span class="comment">//      connect_data -&gt; connection data (struct _ConnectionData*)</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;    <span class="comment">//  gpointer: dialog_factory_data</span></div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">dialog_factory_data</a> = sessions_list;</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;    ddata-&gt;<a class="code" href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">dialog_factory_func</a> = G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#a5b64d199d5f736b98acadcfcd8dffeb1">rmplugin_x2go_choose_session_dialog_factory</a>);</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;    <span class="comment">/* Prepare X2GoCustomUserData *custom_data</span></div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;<span class="comment">     *  gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;<span class="comment">     *  dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;<span class="comment">     */</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;    <a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data = g_new0(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a>, 1);</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;    g_assert(custom_data &amp;&amp; <span class="stringliteral">&quot;custom_data could not be initialized.&quot;</span>);</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> = gp;</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> = ddata;</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a> = connect_data;</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;    custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> = NULL;</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;    <span class="comment">// Open dialog here. Dialog rmplugin_x2go_session_chooser_callback (callbackfunc)</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;    <span class="comment">// should set SET_RESUME_SESSION.</span></div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;    IDLE_ADD((GSourceFunc)<a class="code" href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">rmplugin_x2go_open_dialog</a>, custom_data);</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;    guint counter = 0;</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;    <span class="keywordflow">while</span> (!IS_SESSION_SELECTED(gp)) {</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;        <span class="comment">// 0.5 Seconds. Give dialog chance to open.</span></div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;        usleep(500 * 1000);</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;        <span class="comment">// Every 5 seconds</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;        <span class="keywordflow">if</span> (counter % 10 == 0 || counter == 0) {</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;            REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Waiting for user to select a session…&quot;</span>));</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;        }</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;        counter++;</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;    }</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;    gchar* chosen_resume_session = GET_RESUME_SESSION(gp);</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;    <span class="keywordflow">if</span> (!chosen_resume_session || strlen(chosen_resume_session) &lt;= 0) {</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;        g_set_error(error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;No session was selected. Creating a new one.&quot;</span>));</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;    }</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;    <span class="keywordflow">return</span> chosen_resume_session;</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;}</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;</div><div class="line"><a name="l02291"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a457f6a1e903198adf24f33d3e1636085"> 2291</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a457f6a1e903198adf24f33d3e1636085">rmplugin_x2go_exec_x2go</a>(gchar *host,</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;                                        gint   sshport,</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;                                        gchar *username,</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;                                        gchar *password,</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;                                        gchar *command,</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;                                        gchar *kbdlayout,</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;                                        gchar *kbdtype,</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;                                        gchar *audio,</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;                                        gchar *clipboard,</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;                                        gint   dpi,</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;                                        gchar *resolution,</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;                                        gchar *ssh_privatekey,</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;                                        <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp,</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;                                        gchar *errmsg)</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;{</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;    gchar *argv[50];</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;    gint argc = 0;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;    <span class="comment">// We don&#39;t want to save any SSH passphrases on hard drive!</span></div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;    <span class="comment">// Thats why we will always ask if needed.</span></div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;    gchar *ssh_passphrase = NULL;</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;    <span class="keywordflow">if</span> (!username || strlen(username) &lt;= 0) {</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;        <span class="comment">// Sets `username` and `password`.</span></div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="x2go__plugin_8c.html#acb42f76c9d02750597eb6504f1d400a4">rmplugin_x2go_get_auth</a>(gp, errmsg, &amp;username, &amp;password)) {</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;            <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;        }</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;    }</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;    <span class="comment">// Password can be *empty* but not NULL.</span></div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;    <span class="keywordflow">if</span> (!password) {</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;        password = g_strdup(<span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160;    }</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;    <span class="keywordflow">if</span> (ssh_privatekey &amp;&amp; strlen(ssh_privatekey) &gt; 0) {</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;        <span class="comment">// FIXME: Check if file exists and is legit private key.</span></div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160;        <span class="comment">// See: https://security.stackexchange.com/a/245767</span></div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160;</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;        <span class="comment">// Get ssh_privatekey now via dialog.</span></div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="x2go__plugin_8c.html#a25b6f161265e60c3275c479fb3eb3cb9">rmplugin_x2go_get_ssh_passphrase</a>(gp, errmsg, &amp;ssh_passphrase)) {</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160;            <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;        }</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;    }</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;    <span class="keyword">struct </span><a class="code" href="struct___connection_data.html">_ConnectionData</a>* connect_data = g_new0(<span class="keyword">struct</span> <a class="code" href="struct___connection_data.html">_ConnectionData</a>, 1);</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;    connect_data-&gt;<a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a> = <a class="code" href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">host</a>;</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;    connect_data-&gt;<a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a> = <a class="code" href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">username</a>;</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;    connect_data-&gt;<a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a> = <a class="code" href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">password</a>;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;    connect_data-&gt;<a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a> = <a class="code" href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">ssh_privatekey</a>;</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;    connect_data-&gt;<a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a> = <a class="code" href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">ssh_passphrase</a>;</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;    GError *session_error = NULL;</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;    gchar* resume_session_id = <a class="code" href="x2go__plugin_8c.html#a7e099c196b443f83134b076e292cee63">rmplugin_x2go_ask_session</a>(gp, &amp;session_error,</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;                                 connect_data);</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;    <span class="keywordflow">if</span> (!resume_session_id || session_error || strlen(resume_session_id) &lt;= 0) {</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;        <span class="comment">// If no error is set but session_id is NULL</span></div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;        <span class="comment">// then something is not right at all.</span></div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;        <span class="comment">// Most likely the developer forgot to add an error message. Crash.</span></div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;        g_assert(session_error != NULL);</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;        REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;            _(<span class="stringliteral">&quot;A non-critical error happened: %s&quot;</span>),</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;            session_error-&gt;message</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;        ));</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;        REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160;            _(<span class="stringliteral">&quot;User chose to resume session with ID: &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;            resume_session_id</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;        ));</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;    }</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;    argc = 0;</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;pyhoca-cli&quot;</span>);</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--server&quot;</span>); <span class="comment">// Not listed as feature.</span></div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;    argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, host);</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;REMOTE_SSH_PORT&quot;</span>)) {</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;-p&quot;</span>);</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;        argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%d&quot;</span>, sshport);</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;REMOTE_SSH_PORT&quot;</span>));</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;    }</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;    <span class="keywordflow">if</span> (resume_session_id &amp;&amp; strlen(resume_session_id) &gt; 0) {</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;        REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;            <span class="comment">// TRANSLATORS: Please stick to X2GoClient&#39;s way of translating.</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;            _(<span class="stringliteral">&quot;Resuming session &#39;%s&#39;…&quot;</span>),</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;            resume_session_id</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;        ));</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;        <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;RESUME&quot;</span>)) {</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--resume&quot;</span>);</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, resume_session_id);</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;RESUME&quot;</span>));</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;        }</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;    }</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;    <span class="comment">// Deprecated. The user either wants to continue a</span></div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;    <span class="comment">// session or just not. No inbetween.</span></div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;    <span class="comment">// if (!resume_session_id) {</span></div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;    <span class="comment">//  if (FEATURE_AVAILABLE(gpdata, &quot;TRY_RESUME&quot;)) {</span></div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;    <span class="comment">//      argv[argc++] = g_strdup(&quot;--try-resume&quot;);</span></div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160;    <span class="comment">//  } else {</span></div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;    <span class="comment">//      REMMINA_PLUGIN_DEBUG(&quot;%s&quot;, FEATURE_NOT_AVAIL_STR(&quot;TRY_RESUME&quot;));</span></div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160;    <span class="comment">//  }</span></div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;    <span class="comment">// }</span></div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;USERNAME&quot;</span>)) {</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;-u&quot;</span>);</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;        <span class="keywordflow">if</span> (username){</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, username);</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, g_get_user_name());</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;        }</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;USERNAME&quot;</span>));</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;    }</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;    <span class="keywordflow">if</span> (password &amp;&amp; FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;PASSWORD&quot;</span>)) {</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;        <span class="keywordflow">if</span> (strlen(password) &gt; 0) {</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--force-password&quot;</span>);</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--password&quot;</span>);</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, password);</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;        }</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;PASSWORD&quot;</span>));</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;    }</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>)) {</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--auth-attempts&quot;</span>);</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;        argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%i&quot;</span>, 0);</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>));</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;    }</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;NON_INTERACTIVE&quot;</span>)) {</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--non-interactive&quot;</span>);</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;        REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;NON_INTERACTIVE&quot;</span>));</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;    }</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;COMMAND&quot;</span>)) {</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;-c&quot;</span>);</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;        <span class="comment">// FIXME: pyhoca-cli is picky about multiple quotes around</span></div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;        <span class="comment">//    the command string...</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;        <span class="comment">// argv[argc++] = g_strdup_printf (&quot;%s&quot;, g_shell_quote(command));</span></div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;        argv[argc++] = g_strdup(command);</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;COMMAND&quot;</span>));</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;    }</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;KBD_LAYOUT&quot;</span>)) {</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160;        <span class="keywordflow">if</span> (kbdlayout) {</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--kbd-layout&quot;</span>);</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, kbdlayout);</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--kbd-layout&quot;</span>);</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;auto&quot;</span>);</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;        }</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;KBD_LAYOUT&quot;</span>));</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;    }</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;KBD_TYPE&quot;</span>)) {</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;        <span class="keywordflow">if</span> (kbdtype) {</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--kbd-type&quot;</span>);</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, kbdtype);</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--kbd-type&quot;</span>);</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;auto&quot;</span>);</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;        }</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;KBD_TYPE&quot;</span>));</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;    }</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;GEOMETRY&quot;</span>)) {</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;        <span class="keywordflow">if</span> (!resolution)</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;            resolution = <span class="stringliteral">&quot;800x600&quot;</span>;</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;-g&quot;</span>);</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;        argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, resolution);</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;GEOMETRY&quot;</span>));</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;    }</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;TERMINATE_ON_CTRL_C&quot;</span>)) {</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--terminate-on-ctrl-c&quot;</span>);</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;TERMINATE_ON_CTRL_C&quot;</span>));</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;    }</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SOUND&quot;</span>)) {</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;        <span class="keywordflow">if</span> (audio) {</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--sound&quot;</span>);</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;            argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%s&quot;</span>, audio);</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--sound&quot;</span>);</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;none&quot;</span>);</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;        }</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SOUND&quot;</span>));</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160;    }</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;CLIPBOARD_MODE&quot;</span>)) {</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;        <span class="keywordflow">if</span> (clipboard) {</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--clipboard-mode&quot;</span>);</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, clipboard);</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160;        }</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;CLIPBOARD_MODE&quot;</span>));</div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;    }</div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160;</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;DPI&quot;</span>)) {</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160;        <span class="comment">// Even though we validate the users input in the Remmina Editor,</span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;        <span class="comment">// manipulating profile files is still very possible…</span></div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;        <span class="comment">// Values are extracted from pyhoca-cli.</span></div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;        <span class="keywordflow">if</span> (dpi &lt; 20 || dpi &gt; 400) {</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;            g_strlcpy(errmsg, _(<span class="stringliteral">&quot;DPI setting is out of bounds. Please adjust &quot;</span></div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;                        <span class="stringliteral">&quot;it in profile settings.&quot;</span>), 512);</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;            <span class="comment">// No need, start_session() will handle output.</span></div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;            <span class="comment">//REMMINA_PLUGIN_CRITICAL(&quot;%s&quot;, errmsg);</span></div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;            <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;        }</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;        argv[argc++] = g_strdup(<span class="stringliteral">&quot;--dpi&quot;</span>);</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;        argv[argc++] = g_strdup_printf (<span class="stringliteral">&quot;%i&quot;</span>, dpi);</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;DPI&quot;</span>));</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;    }</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;    <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>)) {</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;        <span class="keywordflow">if</span> (ssh_privatekey &amp;&amp; !g_str_equal(ssh_privatekey, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;            argv[argc++] = g_strdup(<span class="stringliteral">&quot;--ssh-privkey&quot;</span>);</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;            argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, ssh_privatekey);</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;            <span class="keywordflow">if</span> (ssh_passphrase &amp;&amp; !g_str_equal(ssh_passphrase, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;                <span class="keywordflow">if</span> (FEATURE_AVAILABLE(gpdata, <span class="stringliteral">&quot;SSH_PASSPHRASE&quot;</span>)) {</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;                    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--ssh-passphrase&quot;</span>);</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;                    argv[argc++] = g_strdup_printf(<span class="stringliteral">&quot;%s&quot;</span>, ssh_passphrase);</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;                } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;                    REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SSH_PASSPHRASE&quot;</span>));</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;                }</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;            }</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;        }</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, FEATURE_NOT_AVAIL_STR(<span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>));</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;    }</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;    argv[argc++] = NULL;</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;    GError *error = NULL;</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;    gchar **envp = g_get_environ();</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;    gboolean success = g_spawn_async_with_pipes (NULL, argv, envp,</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;                             (G_SPAWN_DO_NOT_REAP_CHILD |</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;                              G_SPAWN_SEARCH_PATH), NULL,</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;                             NULL, &amp;gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a>,</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;                             NULL, NULL, NULL, &amp;error);</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;    REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Started PyHoca-CLI with the following arguments:&quot;</span>));</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;    <span class="comment">// Print every argument except passwords. Free all arg strings.</span></div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;    <span class="keywordflow">for</span> (gint i = 0; i &lt; argc - 1; i++) {</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;        gchar* curr_arg = argv[i];</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;        <span class="keywordflow">if</span> (g_str_equal(curr_arg, <span class="stringliteral">&quot;--password&quot;</span>) ||</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;            g_str_equal(curr_arg, <span class="stringliteral">&quot;--ssh-passphrase&quot;</span>)) {</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;            g_printf(<span class="stringliteral">&quot;%s &quot;</span>, curr_arg);</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;            g_printf(<span class="stringliteral">&quot;XXXXXX &quot;</span>);</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;            g_free(curr_arg);</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;            g_free(argv[++i]);</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;            g_printf(<span class="stringliteral">&quot;%s &quot;</span>, curr_arg);</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;            g_free(curr_arg);</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;        }</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;    }</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;    g_printf(<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;    <span class="keywordflow">if</span> (!success || error) {</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;        <span class="comment">// TRANSLATORS: Meta-error. Shouldn&#39;t be visible.</span></div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;        <span class="keywordflow">if</span> (!error) error = g_error_new(0, 0, _(<span class="stringliteral">&quot;Internal error.&quot;</span>));</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;        gchar *error_title = _(<span class="stringliteral">&quot;Could not start X2Go session…&quot;</span>);</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;        <span class="keyword">struct </span><a class="code" href="struct___dialog_data.html">_DialogData</a>* ddata = g_new0(<span class="keyword">struct</span> <a class="code" href="struct___dialog_data.html">_DialogData</a>, 1);</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">parent</a> = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(gp)));</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">flags</a> = GTK_DIALOG_MODAL;</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a1c48cea48c8dadf952e6ad684b8f89bb">type</a> = GTK_MESSAGE_ERROR;</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a3cee753dca9f060cde0638c54e1466c4">buttons</a> = GTK_BUTTONS_OK;</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">title</a> = _(<span class="stringliteral">&quot;Could not start X2Go session.&quot;</span>);</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">message</a> = g_strdup_printf(_(<span class="stringliteral">&quot;Could not start PyHoca-CLI (%i): &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;                         error-&gt;code,</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;                         error-&gt;message);</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;        <span class="comment">// We don&#39;t need the response.</span></div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">callbackfunc</a> = NULL;</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;        <span class="comment">// We don&#39;t need a custom dialog either.</span></div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">dialog_factory_func</a> = NULL;</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;        ddata-&gt;<a class="code" href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">dialog_factory_data</a> = NULL;</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;        <span class="comment">/* Prepare X2GoCustomUserData *custom_data</span></div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;<span class="comment">        *   gp -&gt; gp (RemminaProtocolWidget*)</span></div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;<span class="comment">        *   dialog_data -&gt; dialog data (struct _DialogData*)</span></div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;        <a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a> *custom_data = g_new0(<a class="code" href="struct___x2_go_custom_user_data.html">X2GoCustomUserData</a>, 1);</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;        g_assert(custom_data &amp;&amp; <span class="stringliteral">&quot;Could not initialise Custom_data.&quot;</span>);</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">gp</a> = gp;</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">dialog_data</a> = ddata;</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">connect_data</a> = NULL;</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;        custom_data-&gt;<a class="code" href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">opt1</a> = NULL;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;        IDLE_ADD((GSourceFunc) <a class="code" href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">rmplugin_x2go_open_dialog</a>, custom_data);</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;        g_strlcpy(errmsg, error_title, 512);</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;</div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;        <span class="comment">// No need to output here. rmplugin_x2go_start_session will do this.</span></div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;        g_error_free(error);</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;    }</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;    <span class="comment">// Prevent a race condition where pyhoca-cli is not</span></div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;    <span class="comment">// started yet (pidx2go == 0) but a watcher is added.</span></div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;    <span class="keyword">struct </span>timespec ts;</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;    <span class="comment">// 0.001 seconds.</span></div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;    ts.tv_nsec = 1 * 1000 * 1000;</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;    ts.tv_sec = 0;</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;    <span class="keywordflow">while</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a> == 0) {</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;        nanosleep(&amp;ts, NULL);</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Waiting for PyHoca-CLI to start…&quot;</span>);</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;    };</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Watching child &#39;pyhoca-cli&#39; process now…&quot;</span>);</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;    g_child_watch_add(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a>,</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;              (GChildWatchFunc) <a class="code" href="x2go__plugin_8c.html#acec567735d2cdea8eacbd39c088728ee">rmplugin_x2go_pyhoca_cli_exited</a>,</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;              gp);</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;}</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;</div><div class="line"><a name="l02639"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a18c51a44015ce39c2922060f35ecc060"> 2639</a></span>&#160;<span class="keyword">static</span> GList* <a class="code" href="x2go__plugin_8c.html#a18c51a44015ce39c2922060f35ecc060">rmplugin_x2go_old_pyhoca_features</a>()</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;{</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;<span class="preprocessor">    #define AMOUNT_FEATURES 43</span></div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>&#160;    gchar* features[AMOUNT_FEATURES] = {</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>&#160;        <span class="stringliteral">&quot;ADD_TO_KNOWN_HOSTS&quot;</span>, <span class="stringliteral">&quot;AUTH_ATTEMPTS&quot;</span>, <span class="stringliteral">&quot;BROKER_PASSWORD&quot;</span>, <span class="stringliteral">&quot;BROKER_URL&quot;</span>,</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>&#160;        <span class="stringliteral">&quot;CLEAN_SESSIONS&quot;</span>, <span class="stringliteral">&quot;COMMAND&quot;</span>, <span class="stringliteral">&quot;DEBUG&quot;</span>, <span class="stringliteral">&quot;FORCE_PASSWORD&quot;</span>, <span class="stringliteral">&quot;FORWARD_SSHAGENT&quot;</span>,</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>&#160;        <span class="stringliteral">&quot;GEOMETRY&quot;</span>, <span class="stringliteral">&quot;KBD_LAYOUT&quot;</span>, <span class="stringliteral">&quot;KBD_TYPE&quot;</span>, <span class="stringliteral">&quot;LIBDEBUG&quot;</span>, <span class="stringliteral">&quot;LIBDEBUG_SFTPXFER&quot;</span>, <span class="stringliteral">&quot;LINK&quot;</span>,</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;        <span class="stringliteral">&quot;LIST_CLIENT_FEATURES&quot;</span>, <span class="stringliteral">&quot;LIST_DESKTOPS&quot;</span>, <span class="stringliteral">&quot;LIST_SESSIONS&quot;</span>, <span class="stringliteral">&quot;NEW&quot;</span>, <span class="stringliteral">&quot;PACK&quot;</span>,</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;        <span class="stringliteral">&quot;PASSWORD&quot;</span>, <span class="stringliteral">&quot;PDFVIEW_CMD&quot;</span>, <span class="stringliteral">&quot;PRINTER&quot;</span>, <span class="stringliteral">&quot;PRINTING&quot;</span>, <span class="stringliteral">&quot;PRINT_ACTION&quot;</span>, <span class="stringliteral">&quot;PRINT_CMD&quot;</span>,</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;        <span class="stringliteral">&quot;QUIET&quot;</span>, <span class="stringliteral">&quot;REMOTE_SSH_PORT&quot;</span>, <span class="stringliteral">&quot;RESUME&quot;</span>, <span class="stringliteral">&quot;SAVE_TO_FOLDER&quot;</span>, <span class="stringliteral">&quot;SESSION_PROFILE&quot;</span>,</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;        <span class="stringliteral">&quot;SESSION_TYPE&quot;</span>, <span class="stringliteral">&quot;SHARE_DESKTOP&quot;</span>, <span class="stringliteral">&quot;SHARE_LOCAL_FOLDERS&quot;</span>, <span class="stringliteral">&quot;SHARE_MODE&quot;</span>, <span class="stringliteral">&quot;SOUND&quot;</span>,</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;        <span class="stringliteral">&quot;SSH_PRIVKEY&quot;</span>, <span class="stringliteral">&quot;SUSPEND&quot;</span>, <span class="stringliteral">&quot;TERMINATE&quot;</span>, <span class="stringliteral">&quot;TERMINATE_ON_CTRL_C&quot;</span>, <span class="stringliteral">&quot;TRY_RESUME&quot;</span>,</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;        <span class="stringliteral">&quot;USERNAME&quot;</span>, <span class="stringliteral">&quot;XINERAMA&quot;</span></div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160;    };</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;    GList *features_list = NULL;</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; AMOUNT_FEATURES; i++) {</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;        features_list = g_list_append(features_list, features[i]);</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;    }</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;    <span class="keywordflow">return</span> features_list;</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;}</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;</div><div class="line"><a name="l02667"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aefc7e4961380ebb977d6ccbd9d12230d"> 2667</a></span>&#160;<span class="keyword">static</span> GList* <a class="code" href="x2go__plugin_8c.html#aefc7e4961380ebb977d6ccbd9d12230d">rmplugin_x2go_populate_available_features_list</a>()</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;{</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;    GList* returning_glist = NULL;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;    <span class="comment">// We will now start pyhoca-cli with only the &#39;--list-cmdline-features&#39; option</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;    <span class="comment">// and depending on the exit code and standard output we will determine if some</span></div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;    <span class="comment">// features are available or not.</span></div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;    gchar* argv[50];</div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>&#160;    gint argc = 0;</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;pyhoca-cli&quot;</span>);</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;    argv[argc++] = g_strdup(<span class="stringliteral">&quot;--list-cmdline-features&quot;</span>);</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160;    argv[argc++] = NULL;</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>&#160;</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;    GError* error = NULL; <span class="comment">// Won&#39;t be actually used.</span></div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;    <span class="comment">// Querying pyhoca-cli&#39;s command line features.</span></div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;    gchar** envp = g_get_environ();</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;    gchar* features_string = <a class="code" href="x2go__plugin_8c.html#a677f02c8a6a4d23577be167675144f67">rmplugin_x2go_spawn_pyhoca_process</a>(argc, argv,</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;                                    &amp;error, envp);</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;    g_strfreev(envp);</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160;</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160;    <span class="keywordflow">if</span> (!features_string || error) {</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160;        <span class="comment">// We added the &#39;--list-cmdline-features&#39; on commit 17d1be1319ba6 of</span></div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;        <span class="comment">// pyhoca-cli. In order to protect setups which don&#39;t have the newest</span></div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160;        <span class="comment">// version of pyhoca-cli available yet we artificially create a list</span></div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;        <span class="comment">// of an old limited set of features.</span></div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160;        REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>,</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;            _(<span class="stringliteral">&quot;Could not get PyHoca-CLI&#39;s command-line features. This &quot;</span></div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;              <span class="stringliteral">&quot;indicates it is either too old, or not installed. &quot;</span></div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;              <span class="stringliteral">&quot;An old limited set of features will be used for now.&quot;</span>));</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a18c51a44015ce39c2922060f35ecc060">rmplugin_x2go_old_pyhoca_features</a>();</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160;        gchar **features_list = g_strsplit(features_string, <span class="stringliteral">&quot;\n&quot;</span>, 0);</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160;        <span class="keywordflow">if</span> (features_list == NULL) {</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;            gchar *error_msg = _(<span class="stringliteral">&quot;Could not parse PyHoca-CLI&#39;s command-line &quot;</span></div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;                         <span class="stringliteral">&quot;features. Using a limited feature-set for now.&quot;</span>);</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;            REMMINA_PLUGIN_WARNING(<span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="x2go__plugin_8c.html#a18c51a44015ce39c2922060f35ecc060">rmplugin_x2go_old_pyhoca_features</a>();</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160;        }</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160;</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160;        REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Retrieved the following PyHoca-CLI &quot;</span></div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>&#160;                        <span class="stringliteral">&quot;command-line features:&quot;</span>));</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = 0; features_list[k] != NULL; k++) {</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;            <span class="comment">// Filter out empty strings</span></div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;            <span class="keywordflow">if</span> (strlen(features_list[k]) &lt;= 0) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>&#160;            REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>,</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160;                     g_strdup_printf(_(<span class="stringliteral">&quot;Available feature[%i]: &#39;%s&#39;&quot;</span>),</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160;                             k+1, features_list[k]));</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160;            returning_glist = g_list_append(returning_glist, features_list[k]);</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;        }</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;        <span class="keywordflow">return</span> returning_glist;</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;    }</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;}</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;</div><div class="line"><a name="l02730"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ab24eb75755ed23f378cadca3393bd89a"> 2730</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#ab24eb75755ed23f378cadca3393bd89a">rmplugin_x2go_on_plug_added</a>(GtkSocket *<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>, <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp)</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>&#160;{</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;    gchar *server;</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;    gint port;</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Socket %d&quot;</span>, gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">socket_id</a>);</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160;    rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ab212bed4baf8cba148fadb5773148ad6">protocol_plugin_signal_connection_opened</a>(gp);</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;    <a class="code" href="types_8h.html#a112d7cc6c755209cabb68cf2a62ad515">RemminaFile</a> *remminafile = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a1409dcc143ddc35de86b792df095cfc4">protocol_plugin_get_file</a>(gp);</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;    rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a6fdfd3063906f49157225f536537bb0f">get_server_port</a>(rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a673ff4320377c3b440dfd24a796c69fc">file_get_string</a>(remminafile, <span class="stringliteral">&quot;server&quot;</span>),</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;            22,</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>&#160;            &amp;server,</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>&#160;            &amp;port);</div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>&#160;</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>&#160;    REMMINA_PLUGIN_AUDIT(_(<span class="stringliteral">&quot;Connected to %s:%d via X2Go&quot;</span>), server, port);</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>&#160;    g_free(server), server = NULL;</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;    <span class="keywordflow">return</span>;</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>&#160;}</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>&#160;</div><div class="line"><a name="l02753"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a4cec9198fd2b3ccbdd9c9c0216559e7e"> 2753</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a4cec9198fd2b3ccbdd9c9c0216559e7e">rmplugin_x2go_on_plug_removed</a>(GtkSocket *<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>, <a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp)</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;{</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a8bb1f63c7ea5f949fef485fc2cc09321">rmplugin_x2go_close_connection</a>(gp);</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;    <span class="keywordflow">return</span> G_SOURCE_CONTINUE;</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;}</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;</div><div class="line"><a name="l02761"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a874b245f21511f87e417e48e867ccb38"> 2761</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="x2go__plugin_8c.html#a874b245f21511f87e417e48e867ccb38">rmplugin_x2go_init</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp)</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;{</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>, PLUGIN_NAME);</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata;</div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;    gpdata = g_new0(<a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a>, 1);</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;    g_object_set_data_full(G_OBJECT(gp), <span class="stringliteral">&quot;plugin-data&quot;</span>, gpdata, g_free);</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>&#160;</div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>&#160;    <span class="keywordflow">if</span> (!rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ae990775845392eace305018b4cd87662">gtksocket_available</a>()) {</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;        <span class="comment">/* report this in open_connection, not reportable here... */</span></div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;    }</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;    GList* <a class="code" href="struct___remmina_plugin_x2_go_data.html#a642dc28885abcd14f90fd8710b220e2e">available_features</a> = <a class="code" href="x2go__plugin_8c.html#aefc7e4961380ebb977d6ccbd9d12230d">rmplugin_x2go_populate_available_features_list</a>();</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;    <span class="comment">// available_features can&#39;t be NULL cause if it fails, it gets populated with an</span></div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;    <span class="comment">// old standard feature set.</span></div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a642dc28885abcd14f90fd8710b220e2e">available_features</a> = <a class="code" href="struct___remmina_plugin_x2_go_data.html#a642dc28885abcd14f90fd8710b220e2e">available_features</a>;</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">socket_id</a> = 0;</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a> = 0;</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a> = NULL;</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a> = 0;</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a> = 0;</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">orig_handler</a> = NULL;</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a> = gtk_socket_new();</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;    rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ac3fc04c8c7b20c35122e2786d9e8fc34">protocol_plugin_register_hostkey</a>(gp, gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>);</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;    gtk_widget_show(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>);</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;    g_signal_connect(G_OBJECT(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>), <span class="stringliteral">&quot;plug-added&quot;</span>,</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;             G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#ab24eb75755ed23f378cadca3393bd89a">rmplugin_x2go_on_plug_added</a>), gp);</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;    g_signal_connect(G_OBJECT(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>), <span class="stringliteral">&quot;plug-removed&quot;</span>,</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;             G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#a4cec9198fd2b3ccbdd9c9c0216559e7e">rmplugin_x2go_on_plug_removed</a>), gp);</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;    gtk_container_add(GTK_CONTAINER(gp), gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>);</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;}</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160;</div><div class="line"><a name="l02800"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a21257bb4c8022786bc77035dae0bbf0a"> 2800</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a21257bb4c8022786bc77035dae0bbf0a">rmplugin_x2go_try_window_id</a>(Window <a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a>)</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;{</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;    gint i;</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160;    gboolean already_seen = FALSE;</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Check if the window of X2Go Agent with ID [0x%lx] is already known or if &quot;</span></div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;                 <span class="stringliteral">&quot;it needs registration&quot;</span>, window_id);</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160;</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;    pthread_mutex_lock(&amp;<a class="code" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a>);</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;    <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>-&gt;len; i++) {</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;        <span class="keywordflow">if</span> (g_array_index(<a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>, Window, i) == window_id) {</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160;            already_seen = TRUE;</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Window of X2Go Agent with ID [0x%lx] &quot;</span></div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;                         <span class="stringliteral">&quot;already seen.&quot;</span>, window_id);</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;        }</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160;    }</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;    <span class="keywordflow">if</span> (!already_seen) {</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;        g_array_append_val(<a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a>, window_id);</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;        REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Registered new window for X2Go Agent with &quot;</span></div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;                     <span class="stringliteral">&quot;ID [0x%lx].&quot;</span>, window_id);</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;    }</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;    pthread_mutex_unlock(&amp;<a class="code" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a>);</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;    <span class="keywordflow">return</span> (!already_seen);</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;}</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;</div><div class="line"><a name="l02828"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a96d6c94d188748ec1ce6a65a38305c26"> 2828</a></span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="x2go__plugin_8c.html#a96d6c94d188748ec1ce6a65a38305c26">rmplugin_x2go_dummy_handler</a>(Display *dsp, XErrorEvent *err)</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;{</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;}</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;</div><div class="line"><a name="l02834"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a67c8a0919a4117622b85f85037dc7119"> 2834</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a67c8a0919a4117622b85f85037dc7119">rmplugin_x2go_start_create_notify</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp, gchar *errmsg)</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;{</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a> = XOpenDisplay(gdk_display_get_name(gdk_display_get_default()));</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;    <span class="keywordflow">if</span> (gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a> == NULL) {</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;        g_strlcpy(errmsg, _(<span class="stringliteral">&quot;Could not open X11 DISPLAY.&quot;</span>), 512);</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160;    }</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">orig_handler</a> = XSetErrorHandler(<a class="code" href="x2go__plugin_8c.html#a96d6c94d188748ec1ce6a65a38305c26">rmplugin_x2go_dummy_handler</a>);</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;    XSelectInput(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>,</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;             XDefaultRootWindow(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>),</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;             SubstructureNotifyMask);</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;X11 event-watcher created.&quot;</span>);</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;}</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;</div><div class="line"><a name="l02856"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a00fd0c2e4b95f4a93eddccb946d26134"> 2856</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a00fd0c2e4b95f4a93eddccb946d26134">rmplugin_x2go_monitor_create_notify</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp,</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;                            <span class="keyword">const</span> gchar *cmd,</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;                            gchar *errmsg)</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160;{</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata;</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;    gboolean agent_window_found = FALSE;</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160;    Atom atom;</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160;    XEvent xev;</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;    Window w;</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;    Atom type;</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;    <span class="keywordtype">int</span> format;</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nitems, rest;</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data = NULL;</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;    guint16 non_createnotify_count = 0;</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;    <span class="keyword">struct </span>timespec ts;</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;    <span class="comment">// wait_amount * ts.tv_nsec = 20s</span></div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;    <span class="comment">// 100 * 0.2s = 20s</span></div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;    <span class="keywordtype">int</span> wait_amount = 100;</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;    CANCEL_DEFER</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Waiting for window of X2Go Agent to appear…&quot;</span>));</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;    gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;    atom = XInternAtom(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>, <span class="stringliteral">&quot;WM_COMMAND&quot;</span>, True);</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;    <span class="keywordflow">if</span> (atom == None) {</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;        CANCEL_ASYNC</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;    }</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;    ts.tv_sec = 0;</div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;    <span class="comment">// 0.2s = 200000000ns</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;    ts.tv_nsec = 200000000;</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;    <span class="keywordflow">while</span> (wait_amount &gt; 0) {</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;        pthread_testcancel();</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;        <span class="keywordflow">if</span> (!(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">pidx2go</a> &gt; 0)) {</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;            nanosleep(&amp;ts, NULL);</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Waiting for X2Go session to start…&quot;</span>);</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;        }</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;        <span class="keywordflow">while</span> (!XPending(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>)) {</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;            nanosleep(&amp;ts, NULL);</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;            wait_amount--;</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;            <span class="comment">// Don&#39;t spam the console. Print every second though.</span></div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;            <span class="keywordflow">if</span> (wait_amount % 5 == 0) {</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;                REMMINA_PLUGIN_INFO(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Waiting for PyHoca-CLI to &quot;</span></div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160;                                <span class="stringliteral">&quot;show the session&#39;s window…&quot;</span>));</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;            }</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;        }</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;        XNextEvent(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>, &amp;xev);</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;        <span class="comment">// Just ignore non CreatNotify events.</span></div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;        <span class="keywordflow">if</span> (xev.type != CreateNotify) {</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;            non_createnotify_count++;</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;            <span class="keywordflow">if</span> (non_createnotify_count % 5 == 0) {</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;                REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Saw &#39;%i&#39; X11 events, which weren&#39;t &quot;</span></div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;                             <span class="stringliteral">&quot;CreateNotify.&quot;</span>, non_createnotify_count);</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;            }</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;        }</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;        w = xev.xcreatewindow.window;</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;        <span class="keywordflow">if</span> (XGetWindowProperty(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>, w, atom, 0, 255, False,</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;                       AnyPropertyType, &amp;type, &amp;format, &amp;nitems, &amp;rest,</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;                       &amp;data) != Success) {</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Could not get WM_COMMAND property from X11 &quot;</span></div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;                         <span class="stringliteral">&quot;window ID [0x%lx].&quot;</span>, w);</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;        }</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160;        <span class="keywordflow">if</span> (data) {</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Saw &#39;%i&#39; X11 events, which weren&#39;t &quot;</span></div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;                         <span class="stringliteral">&quot;CreateNotify.&quot;</span>, non_createnotify_count);</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;            REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Found X11 window with WM_COMMAND set &quot;</span></div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;                         <span class="stringliteral">&quot;to &#39;%s&#39;, the window ID is [0x%lx].&quot;</span>,</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160;                         (<span class="keywordtype">char</span>*)data, w);</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;        }</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;        <span class="keywordflow">if</span> (data &amp;&amp; g_strrstr((gchar*)data, cmd) &amp;&amp;</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;            <a class="code" href="x2go__plugin_8c.html#a21257bb4c8022786bc77035dae0bbf0a">rmplugin_x2go_try_window_id</a>(w)) {</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;            gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a> = w;</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;            agent_window_found = TRUE;</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;            XFree(data);</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;        }</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;        <span class="keywordflow">if</span> (data)</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;            XFree(data);</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;    }</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;    XSetErrorHandler(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">orig_handler</a>);</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;    XCloseDisplay(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a>);</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">display</a> = NULL;</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;    CANCEL_ASYNC</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;    <span class="keywordflow">if</span> (!agent_window_found) {</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;        g_strlcpy(errmsg, _(<span class="stringliteral">&quot;No X2Go session window appeared. &quot;</span></div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;                    <span class="stringliteral">&quot;Something went wrong…&quot;</span>), 512);</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;    }</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;}</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;</div><div class="line"><a name="l02966"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a52b923fd8a790c815a4afff065c3c08a"> 2966</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#a52b923fd8a790c815a4afff065c3c08a">rmplugin_x2go_start_session</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp)</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;{</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Function entry.&quot;</span>);</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);;</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;    <a class="code" href="types_8h.html#a112d7cc6c755209cabb68cf2a62ad515">RemminaFile</a> *remminafile;</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;    <span class="keyword">const</span> gchar errmsg[512] = {0};</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;    gboolean ret = TRUE;</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;    gchar *servstr, *host, *username, *password, *command, *kbdlayout, *kbdtype,</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;          *audio, *clipboard, *res, *ssh_privatekey;</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;    gint sshport, dpi;</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;    GdkDisplay *default_dsp;</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;    gint width, height;</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;    <span class="comment">// We save the X Display name (:0) as we will need to synchronize the clipboards</span></div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;    default_dsp = gdk_display_get_default();</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;    <span class="keyword">const</span> gchar *default_dsp_name = gdk_display_get_name(default_dsp);</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Default display is &#39;%s&#39;.&quot;</span>, default_dsp_name);</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;    remminafile = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a1409dcc143ddc35de86b792df095cfc4">protocol_plugin_get_file</a>(gp);</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;    servstr = GET_PLUGIN_STRING(<span class="stringliteral">&quot;server&quot;</span>);</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;    <span class="keywordflow">if</span> (servstr) {</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;        rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a6fdfd3063906f49157225f536537bb0f">get_server_port</a>(servstr, 22, &amp;host, &amp;sshport);</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;    }</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;    <span class="keywordflow">if</span> (!sshport) sshport=22;</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160;    username = GET_PLUGIN_STRING(<span class="stringliteral">&quot;username&quot;</span>);</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160;    password = GET_PLUGIN_PASSWORD(<span class="stringliteral">&quot;password&quot;</span>);</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;    command = GET_PLUGIN_STRING(<span class="stringliteral">&quot;command&quot;</span>);</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;    <span class="keywordflow">if</span> (!command) command = <span class="stringliteral">&quot;TERMINAL&quot;</span>;</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;    kbdlayout = GET_PLUGIN_STRING(<span class="stringliteral">&quot;kbdlayout&quot;</span>);</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;    kbdtype = GET_PLUGIN_STRING(<span class="stringliteral">&quot;kbdtype&quot;</span>);</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160;    audio = GET_PLUGIN_STRING(<span class="stringliteral">&quot;audio&quot;</span>);</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160;</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>&#160;    clipboard = GET_PLUGIN_STRING(<span class="stringliteral">&quot;clipboard&quot;</span>);</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;    dpi = GET_PLUGIN_INT(<span class="stringliteral">&quot;dpi&quot;</span>, 80);</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160;</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;    ssh_privatekey = GET_PLUGIN_STRING(<span class="stringliteral">&quot;ssh_privatekey&quot;</span>);</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160;    <span class="comment">// If empty set to NULL</span></div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;    <span class="keywordflow">if</span>(ssh_privatekey &amp;&amp; g_str_equal(ssh_privatekey, <span class="stringliteral">&quot;&quot;</span>)) {</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160;        ssh_privatekey = NULL;</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;    }</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;    width = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#afe3c32a421cd5dcc735b99318ff8844a">get_profile_remote_width</a>(gp);</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160;    height = rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a2b75137f9d7739c0d7881ee16e2aabfa">get_profile_remote_height</a>(gp);</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;    <span class="comment">/* multiple of 4 */</span></div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;    width = (width + 3) &amp; ~0x3;</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;    height = (height + 3) &amp; ~0x3;</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;    <span class="keywordflow">if</span> ((width &gt; 0) &amp;&amp; (height  &gt; 0)) {</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160;        res = g_strdup_printf (<span class="stringliteral">&quot;%dx%d&quot;</span>, width, height);</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;        res = <span class="stringliteral">&quot;800x600&quot;</span>;</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160;    }</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Resolution set by user: &#39;%s&#39;.&quot;</span>, res);</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;    REMMINA_PLUGIN_DEBUG(<span class="stringliteral">&quot;Attached window to socket &#39;%d&#39;.&quot;</span>, gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">socket_id</a>);</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;    <span class="comment">/* register for notifications of window creation events */</span></div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;    <span class="keywordflow">if</span> (ret) ret = <a class="code" href="x2go__plugin_8c.html#a67c8a0919a4117622b85f85037dc7119">rmplugin_x2go_start_create_notify</a>(gp, (gchar*)&amp;errmsg);</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160;</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;    <span class="comment">/* trigger the session start, session window should appear soon after this */</span></div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;    <span class="keywordflow">if</span> (ret) ret = <a class="code" href="x2go__plugin_8c.html#a457f6a1e903198adf24f33d3e1636085">rmplugin_x2go_exec_x2go</a>(host, sshport, username, password, command,</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;                           kbdlayout, kbdtype, audio, clipboard, dpi,</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;                           res, ssh_privatekey, gp,</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;                           (gchar*)&amp;errmsg);</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;    <span class="comment">/* get the window ID of the remote x2goagent */</span></div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;    <span class="keywordflow">if</span> (ret) ret = <a class="code" href="x2go__plugin_8c.html#a00fd0c2e4b95f4a93eddccb946d26134">rmplugin_x2go_monitor_create_notify</a>(gp, <span class="stringliteral">&quot;x2goagent&quot;</span>,</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;                                   (gchar*)&amp;errmsg);</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;    <span class="keywordflow">if</span> (!ret) {</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, errmsg);</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;        rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a7ac875d202f1ccd0ae85bb60ee3222c1">protocol_plugin_set_error</a>(gp, <span class="stringliteral">&quot;%s&quot;</span>, &amp;errmsg);</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160;    }</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;    <span class="comment">/* embed it */</span></div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a31b9185763acddffe0bbdef41380bf43">onMainThread_gtk_socket_add_id</a>(GTK_SOCKET(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>), gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">window_id</a>);</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;}</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;</div><div class="line"><a name="l03059"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#aaf02d627d85ffb57338fda226fb34619"> 3059</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#aaf02d627d85ffb57338fda226fb34619">rmplugin_x2go_main</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp)</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;{</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;    gboolean ret = FALSE;</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;    ret = <a class="code" href="x2go__plugin_8c.html#a52b923fd8a790c815a4afff065c3c08a">rmplugin_x2go_start_session</a>(gp);</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a> = 0;</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;}</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;</div><div class="line"><a name="l03071"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a4fa72bcab8d3e683f6079f1aad2d1422"> 3071</a></span>&#160;<span class="keyword">static</span> gpointer <a class="code" href="x2go__plugin_8c.html#a4fa72bcab8d3e683f6079f1aad2d1422">rmplugin_x2go_main_thread</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>* gp)</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;{</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;    <span class="keywordflow">if</span> (!gp) {</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;            _(<span class="stringliteral">&quot;RemminaProtocolWidget* gp is &#39;NULL&#39;!&quot;</span>)</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;        ));</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;        <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;    }</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;    CANCEL_ASYNC</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;    <span class="keywordflow">if</span> (!<a class="code" href="x2go__plugin_8c.html#aaf02d627d85ffb57338fda226fb34619">rmplugin_x2go_main</a>(gp)) {</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;        IDLE_ADD((GSourceFunc) <a class="code" href="x2go__plugin_8c.html#ac64918df81607ee0b80ba6eb78bb338a">rmplugin_x2go_cleanup</a>, gp);</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;    }</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;    <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;}</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;</div><div class="line"><a name="l03092"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#ae21f0dac3fc86e0809be44ccf97b5637"> 3092</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#ae21f0dac3fc86e0809be44ccf97b5637">rmplugin_x2go_open_connection</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a> *gp)</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;{</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;    <a class="code" href="struct___remmina_plugin_x2_go_data.html">RemminaPluginX2GoData</a> *gpdata = GET_PLUGIN_DATA(gp);</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;    <span class="keywordflow">if</span> (!rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#ae990775845392eace305018b4cd87662">gtksocket_available</a>()) {</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;        rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a7ac875d202f1ccd0ae85bb60ee3222c1">protocol_plugin_set_error</a>(gp, _(<span class="stringliteral">&quot;The %s protocol is &quot;</span></div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;                  <span class="stringliteral">&quot;unavailable because GtkSocket only works under X.org&quot;</span>),</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;                  PLUGIN_NAME);</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;    }</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;    gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">socket_id</a> = gtk_socket_get_id(GTK_SOCKET(gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">socket</a>));</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;    <span class="comment">// casting to void* is allowed since return type &#39;gpointer&#39; is actually void*.</span></div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;    <span class="keywordflow">if</span> (pthread_create(&amp;gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a>, NULL, (<span class="keywordtype">void</span>*) <a class="code" href="x2go__plugin_8c.html#a4fa72bcab8d3e683f6079f1aad2d1422">rmplugin_x2go_main_thread</a>, gp)) {</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;        rm_plugin_service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a7ac875d202f1ccd0ae85bb60ee3222c1">protocol_plugin_set_error</a>(gp, _(<span class="stringliteral">&quot;Could not initialize &quot;</span></div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;                      <span class="stringliteral">&quot;pthread. Falling back to non-threaded mode…&quot;</span>));</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;        gpdata-&gt;<a class="code" href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">thread</a> = 0;</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;    } <span class="keywordflow">else</span>  {</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;        <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;    }</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;}</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;</div><div class="line"><a name="l03116"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#af64a08d96c442369520de356c40d1ada"> 3116</a></span>&#160;<span class="keyword">static</span> gboolean <a class="code" href="x2go__plugin_8c.html#af64a08d96c442369520de356c40d1ada">rmplugin_x2go_query_feature</a>(<a class="code" href="struct___remmina_protocol_widget.html">RemminaProtocolWidget</a>* gp,</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;                        <span class="keyword">const</span> <a class="code" href="struct___remmina_protocol_feature.html">RemminaProtocolFeature</a>* feature)</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;{</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;    TRACE_CALL(__func__);</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;}</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;</div><div class="line"><a name="l03123"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a68c599f47bcfdc7702e0e11410f2939f"> 3123</a></span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="struct___remmina_protocol_feature.html">RemminaProtocolFeature</a> <a class="code" href="x2go__plugin_8c.html#a68c599f47bcfdc7702e0e11410f2939f">rmplugin_x2go_features</a>[] = {</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;    {<a class="code" href="types_8h.html#a77ae46c4fd739dcd8e819fe9cdae27c5a4a9b04df122e3a20c3ae51d90280fea7">REMMINA_PROTOCOL_FEATURE_TYPE_GTKSOCKET</a>, RMPLUGIN_X2GO_FEATURE_GTKSOCKET, NULL, NULL, NULL},</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;    {<a class="code" href="types_8h.html#a77ae46c4fd739dcd8e819fe9cdae27c5a311d2a8dae8d3d7b9045b4b704f94fe4">REMMINA_PROTOCOL_FEATURE_TYPE_END</a>, 0, NULL, NULL, NULL}</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;};</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;</div><div class="line"><a name="l03139"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a6ff1cacdb818634771aa5f324144bb51"> 3139</a></span>&#160;<span class="keyword">static</span> gchar* <a class="code" href="x2go__plugin_8c.html#a6ff1cacdb818634771aa5f324144bb51">rmplugin_x2go_enumeration_prettifier</a>(<span class="keyword">const</span> guint max_elements,</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;                           <span class="keyword">const</span> guint current_element,</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;                           gchar* element_to_add,</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;                           gchar* <span class="keywordtype">string</span>)</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;{</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;    <span class="keywordflow">if</span> (max_elements &gt; 2) {</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;        <span class="keywordflow">if</span> (current_element == max_elements - 1) {</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;            <span class="comment">// TRANSLATORS: Presumably you just want to translate &#39;and&#39; into</span></div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;            <span class="comment">// your language.</span></div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;            <span class="comment">// (Except your listing-grammar differs from english.)</span></div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;            <span class="comment">// &#39;value1&#39;, &#39;value2&#39;, &#39;valueN-1&#39; and &#39;valueN&#39;</span></div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;            <span class="keywordflow">return</span> g_strdup_printf(_(<span class="stringliteral">&quot;%sand &#39;%s&#39;&quot;</span>), <span class="keywordtype">string</span>, element_to_add);</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (current_element == max_elements - 2) {</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;            <span class="comment">// TRANSLATORS: Presumably you just want to leave it english.</span></div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;            <span class="comment">// (Except your listing-grammar differs from english.)</span></div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;            <span class="comment">// &#39;value1&#39;, &#39;value2&#39;, &#39;valueN-1&#39; and &#39;valueN&#39;</span></div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;            <span class="keywordflow">return</span> g_strdup_printf(_(<span class="stringliteral">&quot;%s&#39;%s&#39; &quot;</span>), <span class="keywordtype">string</span>, element_to_add);</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;            <span class="comment">// TRANSLATORS: Presumably you just want to leave it english.</span></div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;            <span class="comment">// (Except your listing-grammar differs from english.)</span></div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;            <span class="comment">// &#39;value1&#39;, &#39;value2&#39;, &#39;valueN-1&#39; and &#39;valueN&#39;</span></div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;            <span class="keywordflow">return</span> g_strdup_printf(_(<span class="stringliteral">&quot;%s&#39;%s&#39;, &quot;</span>), <span class="keywordtype">string</span>, element_to_add);</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;        }</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (max_elements == 2) {</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;        <span class="keywordflow">if</span> (current_element == max_elements - 1) {</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;            <span class="comment">// TRANSLATORS: Presumably you just want to translate &#39;and&#39; into</span></div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;            <span class="comment">// your language.</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;            <span class="comment">// (Except your listing-grammar differs from english.)</span></div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;            <span class="comment">// &#39;value1&#39; and &#39;value2&#39;</span></div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;            <span class="keywordflow">return</span> g_strdup_printf(_(<span class="stringliteral">&quot;%sand &#39;%s&#39;&quot;</span>), <span class="keywordtype">string</span>, element_to_add);</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;        } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;            <span class="comment">// TRANSLATORS: Presumably you just want to leave it english.</span></div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;            <span class="comment">// (Except your listing-grammar differs from english.)</span></div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;            <span class="comment">// &#39;value1&#39; and &#39;value2&#39;</span></div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;            <span class="keywordflow">return</span> g_strdup_printf(_(<span class="stringliteral">&quot;%s&#39;%s&#39; &quot;</span>), <span class="keywordtype">string</span>, element_to_add);</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;        }</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;        <span class="keywordflow">return</span> g_strdup(element_to_add);</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;    }</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;}</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;</div><div class="line"><a name="l03193"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a8be68c2aeb275f99167e5ea0b324f85a"> 3193</a></span>&#160;<span class="keyword">static</span> GError* <a class="code" href="x2go__plugin_8c.html#a8be68c2aeb275f99167e5ea0b324f85a">rmplugin_x2go_string_setting_validator</a>(gchar* key, gchar* value,</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;                              gchar* data)</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;{</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;    GError *error = NULL;</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;    <span class="keywordflow">if</span> (!data) {</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;        gchar *error_msg = _(<span class="stringliteral">&quot;Invalid validation data in ProtocolSettings array!&quot;</span>);</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;    }</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;    gchar **elements_list = g_strsplit(data, <span class="stringliteral">&quot;,&quot;</span>, 0);</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;    guint elements_amount = 0;</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;    elements_amount = g_strv_length(elements_list);</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;    <span class="keywordflow">if</span> (elements_list == NULL ||</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;        elements_list[0] == NULL ||</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;        strlen(elements_list[0]) &lt;= 0)</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;    {</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;        gchar *error_msg = _(<span class="stringliteral">&quot;Validation data in ProtocolSettings array is invalid!&quot;</span>);</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;    }</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160;    gchar *data_str = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;    <span class="keywordflow">if</span> (!key || !value) {</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Parameters &#39;key&#39; or &#39;value&#39; are &#39;NULL&#39;!&quot;</span>));</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Internal error.&quot;</span>));</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;    }</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;    <span class="keywordflow">for</span> (guint i = 0; elements_list[i] != NULL; i++) {</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;        <span class="comment">// Don&#39;t wanna crash if elements_list[i] is NULL.</span></div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;        gchar* element = elements_list[i] ? elements_list[i] : <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;        <span class="keywordflow">if</span> (g_strcmp0(value, element) == 0) {</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;            <span class="comment">// We found value in elements_list. Value passed validation.</span></div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;            <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;        }</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;        data_str = <a class="code" href="x2go__plugin_8c.html#a6ff1cacdb818634771aa5f324144bb51">rmplugin_x2go_enumeration_prettifier</a>(elements_amount, i,</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;                                    element, data_str);</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;    }</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;    <span class="keywordflow">if</span> (elements_amount &gt; 1) {</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;        g_set_error(&amp;error, 1, 1, _(<span class="stringliteral">&quot;Allowed values are %s.&quot;</span>), data_str);</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;        g_set_error(&amp;error, 1, 1, _(<span class="stringliteral">&quot;The only allowed value is &#39;%s&#39;.&quot;</span>), data_str);</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;    }</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;    g_free(data_str);</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;    g_strfreev(elements_list);</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;    <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;}</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;</div><div class="line"><a name="l03266"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a832a7c01899fc4a22975e2aba019e1f5"> 3266</a></span>&#160;<span class="keyword">static</span> GError* <a class="code" href="x2go__plugin_8c.html#a832a7c01899fc4a22975e2aba019e1f5">rmplugin_x2go_int_setting_validator</a>(gchar* key, gpointer value,</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;                           gchar* data)</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;{</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;    GError *error = NULL;</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;    gchar **integer_list = g_strsplit(data, <span class="stringliteral">&quot;;&quot;</span>, 0);</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;    <span class="keywordflow">if</span> (integer_list == NULL ||</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;        integer_list[0] == NULL ||</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;        integer_list[1] == NULL ||</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;        strlen(integer_list[0]) &lt;= 0 ||</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;        strlen(integer_list[1]) &lt;= 0)</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;    {</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;        gchar *error_msg = _(<span class="stringliteral">&quot;Validation data in ProtocolSettings array is invalid!&quot;</span>);</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, error_msg);</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;    }</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;    gint minimum;</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;    <a class="code" href="x2go__plugin_8c.html#aeaf38d9ed0a9dc7abcd71e1cd97fdb7b">str2int_errno</a> err = <a class="code" href="x2go__plugin_8c.html#a303c6e8a94bccf82dd36e4e2f28f6645">str2int</a>(&amp;minimum, integer_list[0], 10);</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;    <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a>) {</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;            _(<span class="stringliteral">&quot;The lower limit is not a valid integer!&quot;</span>)</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;        ));</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">STR2INT_OVERFLOW</a>) {</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;            _(<span class="stringliteral">&quot;The lower limit is too high!&quot;</span>)</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;        ));</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">STR2INT_UNDERFLOW</a>) {</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;            _(<span class="stringliteral">&quot;The lower limit is too low!&quot;</span>)</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;        ));</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">STR2INT_INVALID_DATA</a>) {</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;            _(<span class="stringliteral">&quot;Something unknown went wrong.&quot;</span>)</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;        ));</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;    }</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;    <span class="keywordflow">if</span> (error) {</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Please check the RemminaProtocolSetting &quot;</span></div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;                        <span class="stringliteral">&quot;array for possible errors.&quot;</span>));</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;    }</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>&#160;    gint maximum;</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    err = <a class="code" href="x2go__plugin_8c.html#a303c6e8a94bccf82dd36e4e2f28f6645">str2int</a>(&amp;maximum, integer_list[1], 10);</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;    <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a>) {</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;            _(<span class="stringliteral">&quot;The upper limit is not a valid integer!&quot;</span>)</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;        ));</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">STR2INT_OVERFLOW</a>) {</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;            _(<span class="stringliteral">&quot;The upper limit is too high!&quot;</span>)</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;        ));</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">STR2INT_UNDERFLOW</a>) {</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;            _(<span class="stringliteral">&quot;The upper limit is too low!&quot;</span>)</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;        ));</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">STR2INT_INVALID_DATA</a>) {</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, g_strdup_printf(</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;            _(<span class="stringliteral">&quot;Internal error: %s&quot;</span>),</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;            _(<span class="stringliteral">&quot;Something unknown went wrong.&quot;</span>)</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;        ));</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;    }</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;    <span class="keywordflow">if</span> (error) {</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;        REMMINA_PLUGIN_CRITICAL(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Please check the RemminaProtocolSetting &quot;</span></div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;                        <span class="stringliteral">&quot;array for possible errors.&quot;</span>));</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;    }</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;    gint int_value;</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;    err = <a class="code" href="x2go__plugin_8c.html#a303c6e8a94bccf82dd36e4e2f28f6645">str2int</a>(&amp;int_value, value, 10);</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;    <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a>) {</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;        <span class="comment">// non-numerical characters are can&#39;t be entered but, the user can</span></div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;        <span class="comment">// input an empty string.</span></div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;The input is not a valid integer!&quot;</span>));</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">STR2INT_OVERFLOW</a> || err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">STR2INT_UNDERFLOW</a>) {</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;        g_set_error(&amp;error, 1, 1, _(<span class="stringliteral">&quot;Input must be a number between %i and %i.&quot;</span>),</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;                    minimum, maximum);</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">STR2INT_INVALID_DATA</a>) {</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;        g_set_error(&amp;error, 1, 1, <span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;Something unknown went wrong.&quot;</span>));</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;    }</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;    <span class="keywordflow">if</span> (error) {</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;        <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;    }</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;    <span class="comment">/*REMMINA_PLUGIN_DEBUG(&quot;Key:  \t%s&quot;, (gchar*) key);</span></div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;<span class="comment">    REMMINA_PLUGIN_DEBUG(&quot;Value:\t%s&quot;, (gchar*) value);</span></div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;<span class="comment">    REMMINA_PLUGIN_DEBUG(&quot;Data: \t%s&quot;, data);</span></div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160;<span class="comment">    REMMINA_PLUGIN_DEBUG(&quot;Min: %i, Max: %i&quot;, minimum, maximum);</span></div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;<span class="comment">    REMMINA_PLUGIN_DEBUG(&quot;Value converted:\t%i&quot;, int_value);*/</span></div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;    <span class="keywordflow">if</span> (err == <a class="code" href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a9e40a7e8442f48c6ddf3a291fa0ad1d1">STR2INT_SUCCESS</a> &amp;&amp; (minimum &gt; int_value || int_value &gt; maximum)) {</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;        g_set_error(&amp;error, 1, 1, _(<span class="stringliteral">&quot;Input must be a number between %i and %i.&quot;</span>),</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;                minimum, maximum);</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;    }</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;    <span class="comment">// Should be NULL.</span></div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;    <span class="keywordflow">return</span> error;</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;}</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;<span class="comment">/* Array of RemminaProtocolSetting for basic settings.</span></div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;<span class="comment"> * Each item is composed by:</span></div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;<span class="comment"> * a) RemminaProtocolSettingType for setting type</span></div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;<span class="comment"> * b) Setting name</span></div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;<span class="comment"> * c) Setting description</span></div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;<span class="comment"> * d) Compact disposition</span></div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;<span class="comment"> * e) Values for REMMINA_PROTOCOL_SETTING_TYPE_SELECT or REMMINA_PROTOCOL_SETTING_TYPE_COMBO</span></div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;<span class="comment"> * f) Setting tooltip</span></div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;<span class="comment"> * g) Validation data pointer, will be passed to the validation callback method.</span></div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;<span class="comment"> * h) Validation callback method (Can be NULL. Every entry will be valid then.)</span></div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;<span class="comment"> *      use following prototype:</span></div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;<span class="comment"> *      gboolean mysetting_validator_method(gpointer key, gpointer value,</span></div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;<span class="comment"> *                          gpointer validator_data);</span></div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;<span class="comment"> *      gpointer key is a gchar* containing the setting&#39;s name,</span></div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;<span class="comment"> *      gpointer value contains the value which should be validated,</span></div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;<span class="comment"> *      gpointer validator_data contains your passed data.</span></div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03394"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a71dcd8bd6ea5810a7299fa01b675baf9"> 3394</a></span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="struct___remmina_protocol_setting.html">RemminaProtocolSetting</a> <a class="code" href="x2go__plugin_8c.html#a71dcd8bd6ea5810a7299fa01b675baf9">rmplugin_x2go_basic_settings</a>[] = {</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350a579ed0f0f6624dd55a25665693c92a92">REMMINA_PROTOCOL_SETTING_TYPE_SERVER</a>,  <span class="stringliteral">&quot;server&quot;</span>,   NULL,               FALSE, NULL, NULL, NULL, NULL},</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350a8be3f210c609fde31f68e607c41de296">REMMINA_PROTOCOL_SETTING_TYPE_TEXT</a>,    <span class="stringliteral">&quot;username&quot;</span>, <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Username&quot;</span>),         FALSE, NULL, NULL, NULL, NULL},</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350ae76d06b6e313971e5f420dd6e7f4c5aa">REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD</a>,    <span class="stringliteral">&quot;password&quot;</span>, <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Password&quot;</span>),         FALSE, NULL, NULL, NULL, NULL},</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350ae2237632b23d3c90a842bc5bc8302ec5">REMMINA_PROTOCOL_SETTING_TYPE_COMBO</a>,   <span class="stringliteral">&quot;command&quot;</span>,  <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Startup program&quot;</span>),      FALSE,</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;     <span class="comment">/* SELECT &amp; COMBO Values */</span> <span class="stringliteral">&quot;MATE,KDE,XFCE,LXDE,TERMINAL&quot;</span>,</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;     <span class="comment">/* Tooltip */</span> <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Which command should be executed after creating the X2Go session?&quot;</span>),                NULL, NULL},</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350aa045109309280606ff11a9de1862e2ba">REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION</a>,  <span class="stringliteral">&quot;resolution&quot;</span>,   NULL,               FALSE, NULL, NULL, NULL, NULL},</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350a8be3f210c609fde31f68e607c41de296">REMMINA_PROTOCOL_SETTING_TYPE_TEXT</a>,    <span class="stringliteral">&quot;kbdlayout&quot;</span>,    <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Keyboard Layout (auto)&quot;</span>),   FALSE, NULL, NULL, NULL, NULL},</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350a8be3f210c609fde31f68e607c41de296">REMMINA_PROTOCOL_SETTING_TYPE_TEXT</a>,    <span class="stringliteral">&quot;kbdtype&quot;</span>,  <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Keyboard type (auto)&quot;</span>),     FALSE, NULL, NULL, NULL, NULL},</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350ae2237632b23d3c90a842bc5bc8302ec5">REMMINA_PROTOCOL_SETTING_TYPE_COMBO</a>,   <span class="stringliteral">&quot;audio&quot;</span>,    <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Audio support&quot;</span>),        FALSE,</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;     <span class="comment">/* SELECT &amp; COMBO Values */</span> <span class="stringliteral">&quot;pulse,esd,none&quot;</span>,</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;     <span class="comment">/* Tooltip */</span> <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;The sound system of the X2Go server (default: &#39;pulse&#39;).&quot;</span>),</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;     <span class="comment">/* Validation data */</span> <span class="stringliteral">&quot;pulse,esd,none&quot;</span>,</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;     <span class="comment">/* Validation method */</span> G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#a8be68c2aeb275f99167e5ea0b324f85a">rmplugin_x2go_string_setting_validator</a>)},</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350ae2237632b23d3c90a842bc5bc8302ec5">REMMINA_PROTOCOL_SETTING_TYPE_COMBO</a>,   <span class="stringliteral">&quot;clipboard&quot;</span>,    <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Clipboard direction&quot;</span>),  FALSE,</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;     <span class="comment">/* SELECT &amp; COMBO Values */</span> <span class="stringliteral">&quot;none,server,client,both&quot;</span>,</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;     <span class="comment">/* Tooltip */</span> <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Which direction should clipboard content be copied? &quot;</span></div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;              <span class="stringliteral">&quot;(default: &#39;both&#39;).&quot;</span>),</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;     <span class="comment">/* Validation data */</span> <span class="stringliteral">&quot;none,server,client,both&quot;</span>,</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;     <span class="comment">/* Validation method */</span> G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#a8be68c2aeb275f99167e5ea0b324f85a">rmplugin_x2go_string_setting_validator</a>)},</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350ab4c68b7df42ebd08e953cc72c5b97583">REMMINA_PROTOCOL_SETTING_TYPE_INT</a>,     <span class="stringliteral">&quot;dpi&quot;</span>,      <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;DPI resolution&quot;</span>),       FALSE,  NULL,</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;     <span class="comment">/* Tooltip */</span> <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Launch session with a specific resolution (in dots per inch). &quot;</span></div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160;              <span class="stringliteral">&quot;Must be between 20 and 400.&quot;</span>),</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;     <span class="comment">/* Validation data */</span> <span class="stringliteral">&quot;20;400&quot;</span>, <span class="comment">// &quot;&lt;min&gt;;&lt;max&gt;;&quot;</span></div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;     <span class="comment">/* Validation method */</span> G_CALLBACK(<a class="code" href="x2go__plugin_8c.html#a832a7c01899fc4a22975e2aba019e1f5">rmplugin_x2go_int_setting_validator</a>)},</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350a31ee66fffaa245ae411aba0c296ad9da">REMMINA_PROTOCOL_SETTING_TYPE_FILE</a>,    <span class="stringliteral">&quot;ssh_privatekey&quot;</span>,   <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;SSH identity file&quot;</span>),        FALSE, NULL, <a class="code" href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a>(<span class="stringliteral">&quot;Your private key&quot;</span>), NULL, NULL },</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;    {<a class="code" href="types_8h.html#aee1a3e130e6991978acd907b52204350ad898beb6ae625dee1ae27de75f1ab4e3">REMMINA_PROTOCOL_SETTING_TYPE_END</a>, NULL, NULL, FALSE, NULL, NULL, NULL, NULL}};</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;<span class="comment">/* Protocol plugin definition and features */</span></div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;<span class="keyword">static</span> <a class="code" href="struct___remmina_protocol_plugin.html">RemminaProtocolPlugin</a> rmplugin_x2go = {</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;    <a class="code" href="plugin_8h.html#aaf53c620d115a4642130227cff4a624aa45e094c248384c12cdafd9d088e4aa24">REMMINA_PLUGIN_TYPE_PROTOCOL</a>,       <span class="comment">// Type</span></div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;    PLUGIN_NAME,                <span class="comment">// Name</span></div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;    PLUGIN_DESCRIPTION,         <span class="comment">// Description</span></div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;    GETTEXT_PACKAGE,            <span class="comment">// Translation domain</span></div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;    PLUGIN_VERSION,             <span class="comment">// Version number</span></div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;    PLUGIN_APPICON,             <span class="comment">// Icon for normal connection</span></div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;    PLUGIN_SSH_APPICON,         <span class="comment">// Icon for SSH connection</span></div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a71dcd8bd6ea5810a7299fa01b675baf9">rmplugin_x2go_basic_settings</a>,       <span class="comment">// Array for basic settings</span></div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;    NULL,                   <span class="comment">// Array for advanced settings</span></div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;    <a class="code" href="types_8h.html#a64c62354cc2b7baa50e1d73dcd3df9c7a8f910597287a73453a5f09ca0037d093">REMMINA_PROTOCOL_SSH_SETTING_NONE</a>,  <span class="comment">// SSH settings type</span></div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a68c599f47bcfdc7702e0e11410f2939f">rmplugin_x2go_features</a>,         <span class="comment">// Array for available features</span></div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a874b245f21511f87e417e48e867ccb38">rmplugin_x2go_init</a>,         <span class="comment">// Plugin initialization method</span></div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;    <a class="code" href="x2go__plugin_8c.html#ae21f0dac3fc86e0809be44ccf97b5637">rmplugin_x2go_open_connection</a>,      <span class="comment">// Plugin open connection method</span></div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;    <a class="code" href="x2go__plugin_8c.html#a8bb1f63c7ea5f949fef485fc2cc09321">rmplugin_x2go_close_connection</a>,     <span class="comment">// Plugin connection-method closure</span></div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;    <a class="code" href="x2go__plugin_8c.html#af64a08d96c442369520de356c40d1ada">rmplugin_x2go_query_feature</a>,        <span class="comment">// Query for available features</span></div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;    NULL,                   <span class="comment">// Call a feature</span></div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;    NULL,                   <span class="comment">// Send a keystroke</span></div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;    NULL,                   <span class="comment">// Screenshot</span></div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;};</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;</div><div class="line"><a name="l03445"></a><span class="lineno"><a class="line" href="x2go__plugin_8c.html#a56e5020de11446dbc23f3480e313f208"> 3445</a></span>&#160;G_MODULE_EXPORT gboolean <a class="code" href="x2go__plugin_8c.html#a56e5020de11446dbc23f3480e313f208">remmina_plugin_entry</a>(<a class="code" href="struct___remmina_plugin_service.html">RemminaPluginService</a> *service)</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;{</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;    TRACE_CALL(<span class="stringliteral">&quot;remmina_plugin_entry&quot;</span>);</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;    rm_plugin_service = service;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;    bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;    bind_textdomain_codeset(GETTEXT_PACKAGE, <span class="stringliteral">&quot;UTF-8&quot;</span>);</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;    <span class="keywordflow">if</span> (!service-&gt;<a class="code" href="struct___remmina_plugin_service.html#a529cc64f67b16f13f0445add690a8df2">register_plugin</a>((<a class="code" href="struct___remmina_plugin.html">RemminaPlugin</a> *) &amp;rmplugin_x2go)) {</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;        <span class="keywordflow">return</span> FALSE;</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;    }</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;    pthread_mutex_init(&amp;<a class="code" href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a>, NULL);</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;    <a class="code" href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a> = g_array_new(FALSE, TRUE, <span class="keyword">sizeof</span>(Window));</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;    REMMINA_PLUGIN_MESSAGE(<span class="stringliteral">&quot;%s&quot;</span>, _(<span class="stringliteral">&quot;X2Go plugin loaded.&quot;</span>));</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;    <span class="keywordflow">return</span> TRUE;</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;}</div><div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350a579ed0f0f6624dd55a25665693c92a92"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350a579ed0f0f6624dd55a25665693c92a92">REMMINA_PROTOCOL_SETTING_TYPE_SERVER</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00100">types.h:100</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a67c8a0919a4117622b85f85037dc7119"><div class="ttname"><a href="x2go__plugin_8c.html#a67c8a0919a4117622b85f85037dc7119">rmplugin_x2go_start_create_notify</a></div><div class="ttdeci">static gboolean rmplugin_x2go_start_create_notify(RemminaProtocolWidget *gp, gchar *errmsg)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02834">x2go_plugin.c:2834</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aeaf38d9ed0a9dc7abcd71e1cd97fdb7b"><div class="ttname"><a href="x2go__plugin_8c.html#aeaf38d9ed0a9dc7abcd71e1cd97fdb7b">str2int_errno</a></div><div class="ttdeci">enum _str2int_errno str2int_errno</div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html">_RemminaPluginX2GoData</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00138">x2go_plugin.c:138</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a68c599f47bcfdc7702e0e11410f2939f"><div class="ttname"><a href="x2go__plugin_8c.html#a68c599f47bcfdc7702e0e11410f2939f">rmplugin_x2go_features</a></div><div class="ttdeci">static const RemminaProtocolFeature rmplugin_x2go_features[]</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03123">x2go_plugin.c:3123</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a00fd0c2e4b95f4a93eddccb946d26134"><div class="ttname"><a href="x2go__plugin_8c.html#a00fd0c2e4b95f4a93eddccb946d26134">rmplugin_x2go_monitor_create_notify</a></div><div class="ttdeci">static gboolean rmplugin_x2go_monitor_create_notify(RemminaProtocolWidget *gp, const gchar *cmd, gchar *errmsg)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02856">x2go_plugin.c:2856</a></div></div>
<div class="ttc" id="struct___remmina_plugin_html"><div class="ttname"><a href="struct___remmina_plugin.html">_RemminaPlugin</a></div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00056">plugin.h:56</a></div></div>
<div class="ttc" id="struct___connection_data_html"><div class="ttname"><a href="struct___connection_data.html">_ConnectionData</a></div><div class="ttdoc">Stores all necessary information needed for retrieving sessions from a X2Go server. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01016">x2go_plugin.c:1016</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a161d67b872aa0a7988a3a9afd186d604"><div class="ttname"><a href="x2go__plugin_8c.html#a161d67b872aa0a7988a3a9afd186d604">rmplugin_x2go_parse_pyhoca_sessions</a></div><div class="ttdeci">static GList * rmplugin_x2go_parse_pyhoca_sessions(RemminaProtocolWidget *gp, GError **error, struct _ConnectionData *connect_data)</div><div class="ttdoc">This function is used to parse the output of rmplugin_x2go_get_pyhoca_sessions(). ...</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02026">x2go_plugin.c:2026</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350ab4c68b7df42ebd08e953cc72c5b97583"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350ab4c68b7df42ebd08e953cc72c5b97583">REMMINA_PROTOCOL_SETTING_TYPE_INT</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00113">types.h:113</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a874b245f21511f87e417e48e867ccb38"><div class="ttname"><a href="x2go__plugin_8c.html#a874b245f21511f87e417e48e867ccb38">rmplugin_x2go_init</a></div><div class="ttdeci">static void rmplugin_x2go_init(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02761">x2go_plugin.c:2761</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_a2819729ddf9ffa92927a4ef7d3a6e0f8"><div class="ttname"><a href="structon_main_thread__cb__data.html#a2819729ddf9ffa92927a4ef7d3a6e0f8">onMainThread_cb_data::w</a></div><div class="ttdeci">Window w</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01478">x2go_plugin.c:1478</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a7ac875d202f1ccd0ae85bb60ee3222c1"><div class="ttname"><a href="struct___remmina_plugin_service.html#a7ac875d202f1ccd0ae85bb60ee3222c1">_RemminaPluginService::protocol_plugin_set_error</a></div><div class="ttdeci">void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00176">plugin.h:176</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee"><div class="ttname"><a href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11ab707e862e6b3b1de59dc8af626c3adee">STR2INT_INCONVERTIBLE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00197">x2go_plugin.c:197</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a2b7999cf0576ea2a030696831b30ec7a"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2b7999cf0576ea2a030696831b30ec7a">SESSION_HOSTNAME</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00182">x2go_plugin.c:182</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a59baf7f963dc3cdbd87224706cd73c68"><div class="ttname"><a href="x2go__plugin_8c.html#a59baf7f963dc3cdbd87224706cd73c68">rmplugin_x2go</a></div><div class="ttdeci">static RemminaProtocolPlugin rmplugin_x2go</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01464">x2go_plugin.c:1464</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350a8be3f210c609fde31f68e607c41de296"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350a8be3f210c609fde31f68e607c41de296">REMMINA_PROTOCOL_SETTING_TYPE_TEXT</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00106">types.h:106</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a9a10942cbe118d3ca8458b667b0c5edb"><div class="ttname"><a href="x2go__plugin_8c.html#a9a10942cbe118d3ca8458b667b0c5edb">rmplugin_x2go_verify_connection_data</a></div><div class="ttdeci">static gboolean rmplugin_x2go_verify_connection_data(struct _ConnectionData *connect_data)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01102">x2go_plugin.c:1102</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a388a655fcee2c18abb79234a8a4eef94">SESSION_SESSION_ID</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00177">x2go_plugin.c:177</a></div></div>
<div class="ttc" id="types_8h_html_a112d7cc6c755209cabb68cf2a62ad515"><div class="ttname"><a href="types_8h.html#a112d7cc6c755209cabb68cf2a62ad515">RemminaFile</a></div><div class="ttdeci">typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile</div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00044">types.h:44</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_a096eb53491e1297c8119badfb75df393"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#a096eb53491e1297c8119badfb75df393">_RemminaPluginX2GoData::pidx2go</a></div><div class="ttdeci">GPid pidx2go</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00148">x2go_plugin.c:148</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a832a7c01899fc4a22975e2aba019e1f5"><div class="ttname"><a href="x2go__plugin_8c.html#a832a7c01899fc4a22975e2aba019e1f5">rmplugin_x2go_int_setting_validator</a></div><div class="ttdeci">static GError * rmplugin_x2go_int_setting_validator(gchar *key, gpointer value, gchar *data)</div><div class="ttdoc">Validator-functions are getting executed when the user wants to save profile settings. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03266">x2go_plugin.c:3266</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a3ed48dd41c8b207454aa327a32cd19d7"><div class="ttname"><a href="x2go__plugin_8c.html#a3ed48dd41c8b207454aa327a32cd19d7">rmplugin_x2go_session_chooser_get_property</a></div><div class="ttdeci">static GValue rmplugin_x2go_session_chooser_get_property(GtkWidget *dialog, gint property_index, GtkTreePath *row)</div><div class="ttdoc">Finds the GtkTreeView inside of the session chooser dialog, determines the selected row and extracts ...</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00817">x2go_plugin.c:817</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a27aede73b66f5c9d7da7eccbc585f85f"><div class="ttname"><a href="struct___dialog_data.html#a27aede73b66f5c9d7da7eccbc585f85f">_DialogData::dialog_factory_func</a></div><div class="ttdeci">GCallback dialog_factory_func</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00278">x2go_plugin.c:278</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a4c460e643be7fef5693898e95f6e43e0">SESSION_DIALOG_IS_VISIBLE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00187">x2go_plugin.c:187</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a677f02c8a6a4d23577be167675144f67"><div class="ttname"><a href="x2go__plugin_8c.html#a677f02c8a6a4d23577be167675144f67">rmplugin_x2go_spawn_pyhoca_process</a></div><div class="ttdeci">static gchar * rmplugin_x2go_spawn_pyhoca_process(guint argc, gchar *argv[], GError **error, gchar **env)</div><div class="ttdoc">This function dumps all properties of a session to the console. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00898">x2go_plugin.c:898</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a18c51a44015ce39c2922060f35ecc060"><div class="ttname"><a href="x2go__plugin_8c.html#a18c51a44015ce39c2922060f35ecc060">rmplugin_x2go_old_pyhoca_features</a></div><div class="ttdeci">static GList * rmplugin_x2go_old_pyhoca_features()</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02639">x2go_plugin.c:2639</a></div></div>
<div class="ttc" id="remmina__plugin_8h_html"><div class="ttname"><a href="remmina__plugin_8h.html">remmina_plugin.h</a></div></div>
<div class="ttc" id="struct___x2_go_custom_user_data_html_a9efce2e3dd3b0b510cca2b8f40a7dff5"><div class="ttname"><a href="struct___x2_go_custom_user_data.html#a9efce2e3dd3b0b510cca2b8f40a7dff5">_X2GoCustomUserData::gp</a></div><div class="ttdeci">RemminaProtocolWidget * gp</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00160">x2go_plugin.c:160</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350ae76d06b6e313971e5f420dd6e7f4c5aa"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350ae76d06b6e313971e5f420dd6e7f4c5aa">REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00101">types.h:101</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a71dcd8bd6ea5810a7299fa01b675baf9"><div class="ttname"><a href="x2go__plugin_8c.html#a71dcd8bd6ea5810a7299fa01b675baf9">rmplugin_x2go_basic_settings</a></div><div class="ttdeci">static const RemminaProtocolSetting rmplugin_x2go_basic_settings[]</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03394">x2go_plugin.c:3394</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a5f054e33e1f9086ade1868e09396c2c2"><div class="ttname"><a href="x2go__plugin_8c.html#a5f054e33e1f9086ade1868e09396c2c2">remmina_x2go_init_mutex</a></div><div class="ttdeci">static pthread_mutex_t remmina_x2go_init_mutex</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01469">x2go_plugin.c:1469</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a8bb1f63c7ea5f949fef485fc2cc09321"><div class="ttname"><a href="x2go__plugin_8c.html#a8bb1f63c7ea5f949fef485fc2cc09321">rmplugin_x2go_close_connection</a></div><div class="ttdeci">static gboolean rmplugin_x2go_close_connection(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01621">x2go_plugin.c:1621</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a164ae7ed206fba9bca6f910209f10850"><div class="ttname"><a href="x2go__plugin_8c.html#a164ae7ed206fba9bca6f910209f10850">rmplugin_x2go_get_pyhoca_sessions</a></div><div class="ttdeci">static gchar * rmplugin_x2go_get_pyhoca_sessions(RemminaProtocolWidget *gp, GError **error, struct _ConnectionData *connect_data)</div><div class="ttdoc">Executes &amp;#39;pyhoca-cli –list-sessions&amp;#39; for username. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01878">x2go_plugin.c:1878</a></div></div>
<div class="ttc" id="plugin_8h_html_aaf53c620d115a4642130227cff4a624aa45e094c248384c12cdafd9d088e4aa24"><div class="ttname"><a href="plugin_8h.html#aaf53c620d115a4642130227cff4a624aa45e094c248384c12cdafd9d088e4aa24">REMMINA_PLUGIN_TYPE_PROTOCOL</a></div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00047">plugin.h:47</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_ac7d6253a4d968601704770d8db13050eadb238fcd1e49b305021c338178922fbc"><div class="ttname"><a href="structon_main_thread__cb__data.html#ac7d6253a4d968601704770d8db13050eadb238fcd1e49b305021c338178922fbc">onMainThread_cb_data::FUNC_GTK_SOCKET_ADD_ID</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01475">x2go_plugin.c:1475</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_ab0d88dfa878a99bfd6bc2b79f20bdcfe"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#ab0d88dfa878a99bfd6bc2b79f20bdcfe">_RemminaPluginX2GoData::socket_id</a></div><div class="ttdeci">gint socket_id</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00140">x2go_plugin.c:140</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a20aaba191919fe9c83f5170ba6a394bd"><div class="ttname"><a href="struct___dialog_data.html#a20aaba191919fe9c83f5170ba6a394bd">_DialogData::callbackfunc</a></div><div class="ttdeci">GCallback callbackfunc</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00275">x2go_plugin.c:275</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a0161356b9e8d820c86dfc81d4ad2903b"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a0161356b9e8d820c86dfc81d4ad2903b">SESSION_SSHFS_PORT</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00186">x2go_plugin.c:186</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165">SESSION_PROPERTIES</a></div><div class="ttdeci">SESSION_PROPERTIES</div><div class="ttdoc">Used for the session chooser dialog (GtkListStore) See the example at: https://docs.gtk.org/gtk3/class.ListStore.html The order is the exact same as the user sees in the dialog. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00174">x2go_plugin.c:174</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165add30b4757006df4bc3c06e54f6bfce3a"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165add30b4757006df4bc3c06e54f6bfce3a">SESSION_DISPLAY</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00175">x2go_plugin.c:175</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ab4ebe975e9b8b8ee1f6918d1c15f0ae6"><div class="ttname"><a href="x2go__plugin_8c.html#ab4ebe975e9b8b8ee1f6918d1c15f0ae6">rmplugin_x2go_session_chooser_set_row_visible</a></div><div class="ttdeci">static gboolean rmplugin_x2go_session_chooser_set_row_visible(GtkTreePath *path, gboolean value, GtkDialog *dialog)</div><div class="ttdoc">Either sets a specific row visible or invisible. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01036">x2go_plugin.c:1036</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a756badc8d3d2f11f40236b4f6eb3ad11"><div class="ttname"><a href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11">_str2int_errno</a></div><div class="ttdeci">_str2int_errno</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00193">x2go_plugin.c:193</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a093903efc52764f5593b546ce8ba5105"><div class="ttname"><a href="struct___dialog_data.html#a093903efc52764f5593b546ce8ba5105">_DialogData::message</a></div><div class="ttdeci">gchar * message</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00274">x2go_plugin.c:274</a></div></div>
<div class="ttc" id="types_8h_html_a77ae46c4fd739dcd8e819fe9cdae27c5a4a9b04df122e3a20c3ae51d90280fea7"><div class="ttname"><a href="types_8h.html#a77ae46c4fd739dcd8e819fe9cdae27c5a4a9b04df122e3a20c3ae51d90280fea7">REMMINA_PROTOCOL_FEATURE_TYPE_GTKSOCKET</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00054">types.h:54</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a2f3106cb9e16e497bf1aa78a336a729d"><div class="ttname"><a href="x2go__plugin_8c.html#a2f3106cb9e16e497bf1aa78a336a729d">rmplugin_x2go_remove_window_id</a></div><div class="ttdeci">static void rmplugin_x2go_remove_window_id(Window window_id)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01543">x2go_plugin.c:1543</a></div></div>
<div class="ttc" id="struct___connection_data_html_a9bf0eafee9efa826d4dd89ba1f358236"><div class="ttname"><a href="struct___connection_data.html#a9bf0eafee9efa826d4dd89ba1f358236">_ConnectionData::ssh_passphrase</a></div><div class="ttdeci">gchar * ssh_passphrase</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01021">x2go_plugin.c:1021</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350ae2237632b23d3c90a842bc5bc8302ec5"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350ae2237632b23d3c90a842bc5bc8302ec5">REMMINA_PROTOCOL_SETTING_TYPE_COMBO</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00109">types.h:109</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a25b6f161265e60c3275c479fb3eb3cb9"><div class="ttname"><a href="x2go__plugin_8c.html#a25b6f161265e60c3275c479fb3eb3cb9">rmplugin_x2go_get_ssh_passphrase</a></div><div class="ttdeci">static gboolean rmplugin_x2go_get_ssh_passphrase(RemminaProtocolWidget *gp, gchar *errmsg, gchar **passphrase)</div><div class="ttdoc">Asks the user for a username and password. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01744">x2go_plugin.c:1744</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a7e099c196b443f83134b076e292cee63"><div class="ttname"><a href="x2go__plugin_8c.html#a7e099c196b443f83134b076e292cee63">rmplugin_x2go_ask_session</a></div><div class="ttdeci">static gchar * rmplugin_x2go_ask_session(RemminaProtocolWidget *gp, GError **error, struct _ConnectionData *connect_data)</div><div class="ttdoc">Asks the user, with the help of a dialog, to continue an already existing session, terminate or create a new one. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02198">x2go_plugin.c:2198</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a21257bb4c8022786bc77035dae0bbf0a"><div class="ttname"><a href="x2go__plugin_8c.html#a21257bb4c8022786bc77035dae0bbf0a">rmplugin_x2go_try_window_id</a></div><div class="ttdeci">static gboolean rmplugin_x2go_try_window_id(Window window_id)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02800">x2go_plugin.c:2800</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_a81c09c0a216e8f6fab0eb03dc5140361"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#a81c09c0a216e8f6fab0eb03dc5140361">_RemminaPluginX2GoData::orig_handler</a></div><div class="ttdeci">int(* orig_handler)(Display *, XErrorEvent *)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00146">x2go_plugin.c:146</a></div></div>
<div class="ttc" id="types_8h_html_a77ae46c4fd739dcd8e819fe9cdae27c5a311d2a8dae8d3d7b9045b4b704f94fe4"><div class="ttname"><a href="types_8h.html#a77ae46c4fd739dcd8e819fe9cdae27c5a311d2a8dae8d3d7b9045b4b704f94fe4">REMMINA_PROTOCOL_FEATURE_TYPE_END</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00047">types.h:47</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a9ba8e968998b64b3832e484a2ca7dfc1"><div class="ttname"><a href="x2go__plugin_8c.html#a9ba8e968998b64b3832e484a2ca7dfc1">onMainThread_cb</a></div><div class="ttdeci">static gboolean onMainThread_cb(struct onMainThread_cb_data *d)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01486">x2go_plugin.c:1486</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_ab58b7bf5f91c5f60349a8242e6322f7f"><div class="ttname"><a href="struct___remmina_plugin_service.html#ab58b7bf5f91c5f60349a8242e6322f7f">_RemminaPluginService::protocol_plugin_signal_connection_closed</a></div><div class="ttdeci">void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00185">plugin.h:185</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d"><div class="ttname"><a href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11aa2e4616cd6e0962ab2c49d08c0f46b8d">STR2INT_INVALID_DATA</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00198">x2go_plugin.c:198</a></div></div>
<div class="ttc" id="struct___remmina_protocol_plugin_html"><div class="ttname"><a href="struct___remmina_protocol_plugin.html">_RemminaProtocolPlugin</a></div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00065">plugin.h:65</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a52b923fd8a790c815a4afff065c3c08a"><div class="ttname"><a href="x2go__plugin_8c.html#a52b923fd8a790c815a4afff065c3c08a">rmplugin_x2go_start_session</a></div><div class="ttdeci">static gboolean rmplugin_x2go_start_session(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02966">x2go_plugin.c:2966</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a6fdfd3063906f49157225f536537bb0f"><div class="ttname"><a href="struct___remmina_plugin_service.html#a6fdfd3063906f49157225f536537bb0f">_RemminaPluginService::get_server_port</a></div><div class="ttdeci">void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00249">plugin.h:249</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a8b54a36c337ab651bb8e7eb213fe7172"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a8b54a36c337ab651bb8e7eb213fe7172">SESSION_CREATE_DATE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00179">x2go_plugin.c:179</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a1c60a927c4927871d84b2a86e2f877a3"><div class="ttname"><a href="x2go__plugin_8c.html#a1c60a927c4927871d84b2a86e2f877a3">rmplugin_x2go_session_chooser_get_selected_row</a></div><div class="ttdeci">static GtkTreePath * rmplugin_x2go_session_chooser_get_selected_row(GtkWidget *dialog)</div><div class="ttdoc">Gets the selected row of the Session-Chooser-Dialog. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00753">x2go_plugin.c:753</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4"><div class="ttname"><a href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a65199e35b4769a2c6bd8590de08b05f4">SESSION_CHOOSER_RESPONSE_TERMINATE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00370">x2go_plugin.c:370</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a0c7eab256e1b1fdf84be44e28cddc3de"><div class="ttname"><a href="struct___remmina_plugin_service.html#a0c7eab256e1b1fdf84be44e28cddc3de">_RemminaPluginService::file_get_int</a></div><div class="ttdeci">gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00222">plugin.h:222</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a8be68c2aeb275f99167e5ea0b324f85a"><div class="ttname"><a href="x2go__plugin_8c.html#a8be68c2aeb275f99167e5ea0b324f85a">rmplugin_x2go_string_setting_validator</a></div><div class="ttdeci">static GError * rmplugin_x2go_string_setting_validator(gchar *key, gchar *value, gchar *data)</div><div class="ttdoc">Validator-functions are getting executed when the user wants to save profile settings. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03193">x2go_plugin.c:3193</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc"><div class="ttname"><a href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a87bd4f0914a57967d1e0a1534961cdcc">SESSION_CHOOSER_RESPONSE_CHOOSE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00369">x2go_plugin.c:369</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_a6b2f9914552d4323f98a60e6bdcc99c4"><div class="ttname"><a href="structon_main_thread__cb__data.html#a6b2f9914552d4323f98a60e6bdcc99c4">onMainThread_cb_data::sk</a></div><div class="ttdeci">GtkSocket * sk</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01477">x2go_plugin.c:1477</a></div></div>
<div class="ttc" id="struct___connection_data_html_a6c5715c8a4da2ccdf272f6e23de4a629"><div class="ttname"><a href="struct___connection_data.html#a6c5715c8a4da2ccdf272f6e23de4a629">_ConnectionData::ssh_privatekey</a></div><div class="ttdeci">gchar * ssh_privatekey</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01020">x2go_plugin.c:1020</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_ab212bed4baf8cba148fadb5773148ad6"><div class="ttname"><a href="struct___remmina_plugin_service.html#ab212bed4baf8cba148fadb5773148ad6">_RemminaPluginService::protocol_plugin_signal_connection_opened</a></div><div class="ttdeci">void(* protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00186">plugin.h:186</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a3354e4dfc0e1702842362187a1c856a7"><div class="ttname"><a href="struct___dialog_data.html#a3354e4dfc0e1702842362187a1c856a7">_DialogData::dialog_factory_data</a></div><div class="ttdeci">gpointer dialog_factory_data</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00279">x2go_plugin.c:279</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a6ff1cacdb818634771aa5f324144bb51"><div class="ttname"><a href="x2go__plugin_8c.html#a6ff1cacdb818634771aa5f324144bb51">rmplugin_x2go_enumeration_prettifier</a></div><div class="ttdeci">static gchar * rmplugin_x2go_enumeration_prettifier(const guint max_elements, const guint current_element, gchar *element_to_add, gchar *string)</div><div class="ttdoc">This function builds a string like: &quot;&amp;#39;value1&amp;#39;, &amp;#39;value2&amp;#39; and &amp;#39;value3&amp;#39;&quot;   To be used in a loop...</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03139">x2go_plugin.c:3139</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a4cec9198fd2b3ccbdd9c9c0216559e7e"><div class="ttname"><a href="x2go__plugin_8c.html#a4cec9198fd2b3ccbdd9c9c0216559e7e">rmplugin_x2go_on_plug_removed</a></div><div class="ttdeci">static gboolean rmplugin_x2go_on_plug_removed(GtkSocket *socket, RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02753">x2go_plugin.c:2753</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_a3fe6e076459db4ee337d70ef2c1d838a"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#a3fe6e076459db4ee337d70ef2c1d838a">_RemminaPluginX2GoData::disconnected</a></div><div class="ttdeci">gboolean disconnected</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00150">x2go_plugin.c:150</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165acb18386ae4c6d87646ff0b63973ff0a2">SESSION_NUM_PROPERTIES</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00188">x2go_plugin.c:188</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165af379eb48356f9912f3fe1d39ac163e03"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165af379eb48356f9912f3fe1d39ac163e03">SESSION_AGENT_PID</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00180">x2go_plugin.c:180</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_af2b857b2de1af3621f543b810f68b17b"><div class="ttname"><a href="struct___remmina_plugin_service.html#af2b857b2de1af3621f543b810f68b17b">_RemminaPluginService::protocol_plugin_init_get_savepassword</a></div><div class="ttdeci">gboolean(* protocol_plugin_init_get_savepassword)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00197">plugin.h:197</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_a556145e479d666ec055ed1f907bd6022"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#a556145e479d666ec055ed1f907bd6022">_RemminaPluginX2GoData::window_id</a></div><div class="ttdeci">Window window_id</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00145">x2go_plugin.c:145</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a529cc64f67b16f13f0445add690a8df2"><div class="ttname"><a href="struct___remmina_plugin_service.html#a529cc64f67b16f13f0445add690a8df2">_RemminaPluginService::register_plugin</a></div><div class="ttdeci">gboolean(* register_plugin)(RemminaPlugin *plugin)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00166">plugin.h:166</a></div></div>
<div class="ttc" id="struct___x2_go_custom_user_data_html_a7091e9cd5dd55bd4f245721ee5bc1c83"><div class="ttname"><a href="struct___x2_go_custom_user_data.html#a7091e9cd5dd55bd4f245721ee5bc1c83">_X2GoCustomUserData::connect_data</a></div><div class="ttdeci">gpointer connect_data</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00162">x2go_plugin.c:162</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_ae990775845392eace305018b4cd87662"><div class="ttname"><a href="struct___remmina_plugin_service.html#ae990775845392eace305018b4cd87662">_RemminaPluginService::gtksocket_available</a></div><div class="ttdeci">gboolean(* gtksocket_available)(void)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00251">plugin.h:251</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a4fa72bcab8d3e683f6079f1aad2d1422"><div class="ttname"><a href="x2go__plugin_8c.html#a4fa72bcab8d3e683f6079f1aad2d1422">rmplugin_x2go_main_thread</a></div><div class="ttdeci">static gpointer rmplugin_x2go_main_thread(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03071">x2go_plugin.c:3071</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a50f386c341d457e0084b036781941a05"><div class="ttname"><a href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05">SESSION_CHOOSER_RESPONSE_TYPE</a></div><div class="ttdeci">SESSION_CHOOSER_RESPONSE_TYPE</div><div class="ttdoc">These define the responses of session-chooser-dialog&amp;#39;s buttons. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00367">x2go_plugin.c:367</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ad7958dd5e9c0d344c88ee0885803b358"><div class="ttname"><a href="x2go__plugin_8c.html#ad7958dd5e9c0d344c88ee0885803b358">rmplugin_x2go_session_chooser_get_filter_model</a></div><div class="ttdeci">static GtkTreeModelFilter * rmplugin_x2go_session_chooser_get_filter_model(GtkWidget *dialog, GtkTreeView *treeview)</div><div class="ttdoc">Uses either &amp;#39;dialog&amp;#39; or &amp;#39;treeview&amp;#39; to return the GtkTreeModel of the Session-Chooser-Dialog. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00702">x2go_plugin.c:702</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165aebbdaf08ac05790b9d8c6cc1ed1f4fb7"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165aebbdaf08ac05790b9d8c6cc1ed1f4fb7">SESSION_SND_PORT</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00185">x2go_plugin.c:185</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_a642dc28885abcd14f90fd8710b220e2e"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#a642dc28885abcd14f90fd8710b220e2e">_RemminaPluginX2GoData::available_features</a></div><div class="ttdeci">GList * available_features</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00152">x2go_plugin.c:152</a></div></div>
<div class="ttc" id="struct___connection_data_html_a0b7548b539c507772e709e8867f6b1a8"><div class="ttname"><a href="struct___connection_data.html#a0b7548b539c507772e709e8867f6b1a8">_ConnectionData::password</a></div><div class="ttdeci">gchar * password</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01019">x2go_plugin.c:1019</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a31af2942017984e0614a1ff7913cacc9"><div class="ttname"><a href="x2go__plugin_8c.html#a31af2942017984e0614a1ff7913cacc9">rmplugin_x2go_pyhoca_terminate_session</a></div><div class="ttdeci">static gboolean rmplugin_x2go_pyhoca_terminate_session(X2GoCustomUserData *custom_data)</div><div class="ttdoc">Terminates a specific X2Go session using pyhoca-cli. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01145">x2go_plugin.c:1145</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_ab5a747d3d76631e059d736ef286a6c38"><div class="ttname"><a href="structon_main_thread__cb__data.html#ab5a747d3d76631e059d736ef286a6c38">onMainThread_cb_data::func</a></div><div class="ttdeci">enum onMainThread_cb_data::@61 func</div></div>
<div class="ttc" id="x2go__plugin_8c_html_a5b64d199d5f736b98acadcfcd8dffeb1"><div class="ttname"><a href="x2go__plugin_8c.html#a5b64d199d5f736b98acadcfcd8dffeb1">rmplugin_x2go_choose_session_dialog_factory</a></div><div class="ttdeci">static GtkWidget * rmplugin_x2go_choose_session_dialog_factory(X2GoCustomUserData *custom_data, GList *sessions_list)</div><div class="ttdoc">Builds a dialog which contains all found X2Go-Sessions of the remote server. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00509">x2go_plugin.c:509</a></div></div>
<div class="ttc" id="struct___remmina_protocol_widget_html"><div class="ttname"><a href="struct___remmina_protocol_widget.html">_RemminaProtocolWidget</a></div><div class="ttdef"><b>Definition:</b> <a href="remmina__protocol__widget_8h_source.html#l00058">remmina_protocol_widget.h:58</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a4110c1f36565f5926035c9ed1f060893"><div class="ttname"><a href="struct___dialog_data.html#a4110c1f36565f5926035c9ed1f060893">_DialogData::flags</a></div><div class="ttdeci">GtkDialogFlags flags</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00270">x2go_plugin.c:270</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a50f386c341d457e0084b036781941a05a37ecf143423a9ba7f52fd4826cf4226f"><div class="ttname"><a href="x2go__plugin_8c.html#a50f386c341d457e0084b036781941a05a37ecf143423a9ba7f52fd4826cf4226f">SESSION_CHOOSER_RESPONSE_NEW</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00368">x2go_plugin.c:368</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_a10588addf4b97f37b01fa84f06ed9cb2"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#a10588addf4b97f37b01fa84f06ed9cb2">_RemminaPluginX2GoData::socket</a></div><div class="ttdeci">GtkWidget * socket</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00139">x2go_plugin.c:139</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a118178a7ce36692fd0fa90c7c0dcbe0e"><div class="ttname"><a href="x2go__plugin_8c.html#a118178a7ce36692fd0fa90c7c0dcbe0e">rmplugin_x2go_find_child</a></div><div class="ttdeci">static GtkWidget * rmplugin_x2go_find_child(GtkWidget *parent, const gchar *name)</div><div class="ttdoc">Finds a child GtkWidget of a parent GtkWidget. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00382">x2go_plugin.c:382</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_abca43c87558a7cd7cba5f380e321cba5"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#abca43c87558a7cd7cba5f380e321cba5">_RemminaPluginX2GoData::display</a></div><div class="ttdeci">Display * display</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00144">x2go_plugin.c:144</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a457f6a1e903198adf24f33d3e1636085"><div class="ttname"><a href="x2go__plugin_8c.html#a457f6a1e903198adf24f33d3e1636085">rmplugin_x2go_exec_x2go</a></div><div class="ttdeci">static gboolean rmplugin_x2go_exec_x2go(gchar *host, gint sshport, gchar *username, gchar *password, gchar *command, gchar *kbdlayout, gchar *kbdtype, gchar *audio, gchar *clipboard, gint dpi, gchar *resolution, gchar *ssh_privatekey, RemminaProtocolWidget *gp, gchar *errmsg)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02291">x2go_plugin.c:2291</a></div></div>
<div class="ttc" id="struct___remmina_protocol_feature_html"><div class="ttname"><a href="struct___remmina_protocol_feature.html">_RemminaProtocolFeature</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00072">types.h:72</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a2c8abd8773006b6629df76a38b2ecd9b"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a2c8abd8773006b6629df76a38b2ecd9b">SESSION_STATUS</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00176">x2go_plugin.c:176</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_adf5b78d93d823c4f9f79675b5e418c11"><div class="ttname"><a href="x2go__plugin_8c.html#adf5b78d93d823c4f9f79675b5e418c11">rmplugin_x2go_save_credentials</a></div><div class="ttdeci">static gboolean rmplugin_x2go_save_credentials(RemminaFile *remminafile, gchar *s_username, gchar *s_password, gchar *errmsg)</div><div class="ttdoc">Saves s_password and s_username if set. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01700">x2go_plugin.c:1700</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ae7c011949e82fd1076bd6d1ad53115aa"><div class="ttname"><a href="x2go__plugin_8c.html#ae7c011949e82fd1076bd6d1ad53115aa">rmplugin_x2go_open_dialog</a></div><div class="ttdeci">static gboolean rmplugin_x2go_open_dialog(X2GoCustomUserData *custom_data)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00290">x2go_plugin.c:290</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_afd5caba73120c1dd6bd7bc0108c0a49a"><div class="ttname"><a href="x2go__plugin_8c.html#afd5caba73120c1dd6bd7bc0108c0a49a">rmplugin_x2go_session_chooser_row_activated</a></div><div class="ttdeci">static gboolean rmplugin_x2go_session_chooser_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, X2GoCustomUserData *custom_data)</div><div class="ttdoc">Gets executed on &quot;row-activated&quot; signal. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00419">x2go_plugin.c:419</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_acb42f76c9d02750597eb6504f1d400a4"><div class="ttname"><a href="x2go__plugin_8c.html#acb42f76c9d02750597eb6504f1d400a4">rmplugin_x2go_get_auth</a></div><div class="ttdeci">static gboolean rmplugin_x2go_get_auth(RemminaProtocolWidget *gp, gchar *errmsg, gchar **default_username, gchar **default_password)</div><div class="ttdoc">Asks the user for a username and password. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01786">x2go_plugin.c:1786</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a9b4cfe0a97a34260e58784feef693704"><div class="ttname"><a href="struct___remmina_plugin_service.html#a9b4cfe0a97a34260e58784feef693704">_RemminaPluginService::protocol_plugin_init_auth</a></div><div class="ttdeci">gint(* protocol_plugin_init_auth)(RemminaProtocolWidget *gp, RemminaMessagePanelFlags pflags, const gchar *title, const gchar *default_username, const gchar *default_password, const gchar *default_domain, const gchar *password_prompt)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00191">plugin.h:191</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8"><div class="ttname"><a href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a2fdd99b1c9b4d38bc51f6974820190b8">STR2INT_UNDERFLOW</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00196">x2go_plugin.c:196</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_acd2e5f24279a00e0d426d67604dc8fbc"><div class="ttname"><a href="structon_main_thread__cb__data.html#acd2e5f24279a00e0d426d67604dc8fbc">onMainThread_cb_data::mu</a></div><div class="ttdeci">pthread_mutex_t mu</div><div class="ttdef"><b>Definition:</b> <a href="vnc__plugin_8c_source.html#l00076">vnc_plugin.c:76</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a695a5bbc86348af93dd91c566ff36f53"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a695a5bbc86348af93dd91c566ff36f53">SESSION_GRAPHIC_PORT</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00184">x2go_plugin.c:184</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_af64a08d96c442369520de356c40d1ada"><div class="ttname"><a href="x2go__plugin_8c.html#af64a08d96c442369520de356c40d1ada">rmplugin_x2go_query_feature</a></div><div class="ttdeci">static gboolean rmplugin_x2go_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03116">x2go_plugin.c:3116</a></div></div>
<div class="ttc" id="types_8h_html_a64c62354cc2b7baa50e1d73dcd3df9c7a8f910597287a73453a5f09ca0037d093"><div class="ttname"><a href="types_8h.html#a64c62354cc2b7baa50e1d73dcd3df9c7a8f910597287a73453a5f09ca0037d093">REMMINA_PROTOCOL_SSH_SETTING_NONE</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00129">types.h:129</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a2b75137f9d7739c0d7881ee16e2aabfa"><div class="ttname"><a href="struct___remmina_plugin_service.html#a2b75137f9d7739c0d7881ee16e2aabfa">_RemminaPluginService::get_profile_remote_height</a></div><div class="ttdeci">gint(* get_profile_remote_height)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00253">plugin.h:253</a></div></div>
<div class="ttc" id="struct___remmina_plugin_x2_go_data_html_aca25367be14cc65a5313151814f44916"><div class="ttname"><a href="struct___remmina_plugin_x2_go_data.html#aca25367be14cc65a5313151814f44916">_RemminaPluginX2GoData::thread</a></div><div class="ttdeci">pthread_t thread</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00142">x2go_plugin.c:142</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_acec567735d2cdea8eacbd39c088728ee"><div class="ttname"><a href="x2go__plugin_8c.html#acec567735d2cdea8eacbd39c088728ee">rmplugin_x2go_pyhoca_cli_exited</a></div><div class="ttdeci">static void rmplugin_x2go_pyhoca_cli_exited(GPid pid, gint status, RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01639">x2go_plugin.c:1639</a></div></div>
<div class="ttc" id="struct___connection_data_html_af15752c3cf9e16fff53be579bf747541"><div class="ttname"><a href="struct___connection_data.html#af15752c3cf9e16fff53be579bf747541">_ConnectionData::username</a></div><div class="ttdeci">gchar * username</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01018">x2go_plugin.c:1018</a></div></div>
<div class="ttc" id="struct___remmina_protocol_setting_html"><div class="ttname"><a href="struct___remmina_protocol_setting.html">_RemminaProtocolSetting</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00117">types.h:117</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ae21f0dac3fc86e0809be44ccf97b5637"><div class="ttname"><a href="x2go__plugin_8c.html#ae21f0dac3fc86e0809be44ccf97b5637">rmplugin_x2go_open_connection</a></div><div class="ttdeci">static gboolean rmplugin_x2go_open_connection(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03092">x2go_plugin.c:3092</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350aa045109309280606ff11a9de1862e2ba"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350aa045109309280606ff11a9de1862e2ba">REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00102">types.h:102</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a1409dcc143ddc35de86b792df095cfc4"><div class="ttname"><a href="struct___remmina_plugin_service.html#a1409dcc143ddc35de86b792df095cfc4">_RemminaPluginService::protocol_plugin_get_file</a></div><div class="ttdeci">RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00178">plugin.h:178</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a068cdca754cf1240547311a7896f0817"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a068cdca754cf1240547311a7896f0817">SESSION_COOKIE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00183">x2go_plugin.c:183</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ab24eb75755ed23f378cadca3393bd89a"><div class="ttname"><a href="x2go__plugin_8c.html#ab24eb75755ed23f378cadca3393bd89a">rmplugin_x2go_on_plug_added</a></div><div class="ttdeci">static void rmplugin_x2go_on_plug_added(GtkSocket *socket, RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02730">x2go_plugin.c:2730</a></div></div>
<div class="ttc" id="types_8h_html_a341a0a8b6509633809d99348cc3ba486a10be0730fc3ea326856019ae139a922a"><div class="ttname"><a href="types_8h.html#a341a0a8b6509633809d99348cc3ba486a10be0730fc3ea326856019ae139a922a">REMMINA_MESSAGE_PANEL_FLAG_USERNAME</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00157">types.h:157</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a081555600c90a11ad962e0b69cb9dfa0"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a081555600c90a11ad962e0b69cb9dfa0">SESSION_SUSPENDED_SINCE</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00178">x2go_plugin.c:178</a></div></div>
<div class="ttc" id="struct___connection_data_html_a5366b4138e2ff42c85f81a83a23cb2c1"><div class="ttname"><a href="struct___connection_data.html#a5366b4138e2ff42c85f81a83a23cb2c1">_ConnectionData::host</a></div><div class="ttdeci">gchar * host</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01017">x2go_plugin.c:1017</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a390e3b371156197feb518b737a31cc53"><div class="ttname"><a href="x2go__plugin_8c.html#a390e3b371156197feb518b737a31cc53">onMainThread_schedule_callback_and_wait</a></div><div class="ttdeci">static void onMainThread_schedule_callback_and_wait(struct onMainThread_cb_data *d)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01511">x2go_plugin.c:1511</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_ac892dd297fae87868752a1f86e07937d"><div class="ttname"><a href="struct___remmina_plugin_service.html#ac892dd297fae87868752a1f86e07937d">_RemminaPluginService::protocol_plugin_init_get_username</a></div><div class="ttdeci">gchar *(* protocol_plugin_init_get_username)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00194">plugin.h:194</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a3cee753dca9f060cde0638c54e1466c4"><div class="ttname"><a href="struct___dialog_data.html#a3cee753dca9f060cde0638c54e1466c4">_DialogData::buttons</a></div><div class="ttdeci">GtkButtonsType buttons</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00272">x2go_plugin.c:272</a></div></div>
<div class="ttc" id="types_8h_html_a341a0a8b6509633809d99348cc3ba486a9b734c324722cf2982768feaeeb15c7c"><div class="ttname"><a href="types_8h.html#a341a0a8b6509633809d99348cc3ba486a9b734c324722cf2982768feaeeb15c7c">REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00160">types.h:160</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_acd692852ebb84bbc2978b44aff7345b6"><div class="ttname"><a href="x2go__plugin_8c.html#acd692852ebb84bbc2978b44aff7345b6">rmplugin_x2go_session_property_to_string</a></div><div class="ttdeci">static gchar * rmplugin_x2go_session_property_to_string(guint session_property)</div><div class="ttdoc">Translates a session property (described by SESSION_PROPERTIES enum) to a string containing it&amp;#39;s disp...</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00471">x2go_plugin.c:471</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_afe3c32a421cd5dcc735b99318ff8844a"><div class="ttname"><a href="struct___remmina_plugin_service.html#afe3c32a421cd5dcc735b99318ff8844a">_RemminaPluginService::get_profile_remote_width</a></div><div class="ttdeci">gint(* get_profile_remote_width)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00252">plugin.h:252</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_ad98eaa3efc0214bc701dc66b5730e174"><div class="ttname"><a href="struct___remmina_plugin_service.html#ad98eaa3efc0214bc701dc66b5730e174">_RemminaPluginService::protocol_plugin_init_get_password</a></div><div class="ttdeci">gchar *(* protocol_plugin_init_get_password)(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00195">plugin.h:195</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ab0e7b0c28fbb5ac24d7ed481250494b4"><div class="ttname"><a href="x2go__plugin_8c.html#ab0e7b0c28fbb5ac24d7ed481250494b4">X2GoCustomUserData</a></div><div class="ttdeci">struct _X2GoCustomUserData X2GoCustomUserData</div><div class="ttdoc">Can be used to pass custom user data between functions and threads. </div></div>
<div class="ttc" id="x2go__plugin_8c_html_ac64918df81607ee0b80ba6eb78bb338a"><div class="ttname"><a href="x2go__plugin_8c.html#ac64918df81607ee0b80ba6eb78bb338a">rmplugin_x2go_cleanup</a></div><div class="ttdeci">static gboolean rmplugin_x2go_cleanup(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01572">x2go_plugin.c:1572</a></div></div>
<div class="ttc" id="struct___x2_go_custom_user_data_html"><div class="ttname"><a href="struct___x2_go_custom_user_data.html">_X2GoCustomUserData</a></div><div class="ttdoc">Can be used to pass custom user data between functions and threads. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00159">x2go_plugin.c:159</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_ac3fc04c8c7b20c35122e2786d9e8fc34"><div class="ttname"><a href="struct___remmina_plugin_service.html#ac3fc04c8c7b20c35122e2786d9e8fc34">_RemminaPluginService::protocol_plugin_register_hostkey</a></div><div class="ttdeci">void(* protocol_plugin_register_hostkey)(RemminaProtocolWidget *gp, GtkWidget *widget)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00180">plugin.h:180</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_acb28505c6a55be236da68c16efda30f9"><div class="ttname"><a href="x2go__plugin_8c.html#acb28505c6a55be236da68c16efda30f9">remmina_x2go_window_id_array</a></div><div class="ttdeci">static GArray * remmina_x2go_window_id_array</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01470">x2go_plugin.c:1470</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a56e5020de11446dbc23f3480e313f208"><div class="ttname"><a href="x2go__plugin_8c.html#a56e5020de11446dbc23f3480e313f208">remmina_plugin_entry</a></div><div class="ttdeci">G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03445">x2go_plugin.c:3445</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_ad4019cdd5ac560eb1cd47d9f924831bb"><div class="ttname"><a href="structon_main_thread__cb__data.html#ad4019cdd5ac560eb1cd47d9f924831bb">onMainThread_cb_data::gp</a></div><div class="ttdeci">RemminaProtocolWidget * gp</div><div class="ttdef"><b>Definition:</b> <a href="vnc__plugin_8c_source.html#l00072">vnc_plugin.c:72</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a4880fb57479708bc1cb47bf6b4dcabc3"><div class="ttname"><a href="struct___remmina_plugin_service.html#a4880fb57479708bc1cb47bf6b4dcabc3">_RemminaPluginService::file_set_string</a></div><div class="ttdeci">void(* file_set_string)(RemminaFile *remminafile, const gchar *setting, const gchar *value)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00218">plugin.h:218</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350a31ee66fffaa245ae411aba0c296ad9da"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350a31ee66fffaa245ae411aba0c296ad9da">REMMINA_PROTOCOL_SETTING_TYPE_FILE</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00111">types.h:111</a></div></div>
<div class="ttc" id="struct___x2_go_custom_user_data_html_aa4469f7020bd9968688ee87b3b4d0c24"><div class="ttname"><a href="struct___x2_go_custom_user_data.html#aa4469f7020bd9968688ee87b3b4d0c24">_X2GoCustomUserData::opt2</a></div><div class="ttdeci">gpointer opt2</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00164">x2go_plugin.c:164</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_ab54b79eb5b8f9560d3e785cf16c45a9b"><div class="ttname"><a href="x2go__plugin_8c.html#ab54b79eb5b8f9560d3e785cf16c45a9b">rm_plugin_service</a></div><div class="ttdeci">static RemminaPluginService * rm_plugin_service</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00136">x2go_plugin.c:136</a></div></div>
<div class="ttc" id="struct___x2_go_custom_user_data_html_ac46ce5ff0709268c5a667190cd10917b"><div class="ttname"><a href="struct___x2_go_custom_user_data.html#ac46ce5ff0709268c5a667190cd10917b">_X2GoCustomUserData::opt1</a></div><div class="ttdeci">gpointer opt1</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00163">x2go_plugin.c:163</a></div></div>
<div class="ttc" id="x2go__plugin_8h_html"><div class="ttname"><a href="x2go__plugin_8h.html">x2go_plugin.h</a></div></div>
<div class="ttc" id="struct___x2_go_custom_user_data_html_a493352f3e39d06a80010d5c0364fed64"><div class="ttname"><a href="struct___x2_go_custom_user_data.html#a493352f3e39d06a80010d5c0364fed64">_X2GoCustomUserData::dialog_data</a></div><div class="ttdeci">gpointer dialog_data</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00161">x2go_plugin.c:161</a></div></div>
<div class="ttc" id="struct___dialog_data_html_ae5593c8e0d23accabe87f06449f5aa5a"><div class="ttname"><a href="struct___dialog_data.html#ae5593c8e0d23accabe87f06449f5aa5a">_DialogData::parent</a></div><div class="ttdeci">GtkWindow * parent</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00269">x2go_plugin.c:269</a></div></div>
<div class="ttc" id="struct___dialog_data_html_af9c5056ae12d845e8c8c30b5e57997d8"><div class="ttname"><a href="struct___dialog_data.html#af9c5056ae12d845e8c8c30b5e57997d8">_DialogData::title</a></div><div class="ttdeci">gchar * title</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00273">x2go_plugin.c:273</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a2c9096d0e798638c847fb1ceaf1a3479"><div class="ttname"><a href="x2go__plugin_8c.html#a2c9096d0e798638c847fb1ceaf1a3479">rmplugin_x2go_session_chooser_callback</a></div><div class="ttdeci">static gboolean rmplugin_x2go_session_chooser_callback(X2GoCustomUserData *custom_data, gint response_id, GtkDialog *self)</div><div class="ttdoc">Gets executed on dialog&amp;#39;s &amp;#39;response&amp;#39; signal. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01339">x2go_plugin.c:1339</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a756badc8d3d2f11f40236b4f6eb3ad11a9e40a7e8442f48c6ddf3a291fa0ad1d1"><div class="ttname"><a href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11a9e40a7e8442f48c6ddf3a291fa0ad1d1">STR2INT_SUCCESS</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00194">x2go_plugin.c:194</a></div></div>
<div class="ttc" id="types_8h_html_aee1a3e130e6991978acd907b52204350ad898beb6ae625dee1ae27de75f1ab4e3"><div class="ttname"><a href="types_8h.html#aee1a3e130e6991978acd907b52204350ad898beb6ae625dee1ae27de75f1ab4e3">REMMINA_PROTOCOL_SETTING_TYPE_END</a></div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00098">types.h:98</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a5dea604d34a804e23a5cd8a6683d9e49"><div class="ttname"><a href="x2go__plugin_8c.html#a5dea604d34a804e23a5cd8a6683d9e49">onMainThread_cleanup_handler</a></div><div class="ttdeci">static void onMainThread_cleanup_handler(gpointer data)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01504">x2go_plugin.c:1504</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a37d3729bb8c4dbd3be32eeea7d04c7d5"><div class="ttname"><a href="x2go__plugin_8c.html#a37d3729bb8c4dbd3be32eeea7d04c7d5">RemminaPluginX2GoData</a></div><div class="ttdeci">struct _RemminaPluginX2GoData RemminaPluginX2GoData</div></div>
<div class="ttc" id="x2go__plugin_8c_html_aa1e2d6e65389dd8fc61e38cffca98165a6e4a495faba4c73cc560b9f388cdc961"><div class="ttname"><a href="x2go__plugin_8c.html#aa1e2d6e65389dd8fc61e38cffca98165a6e4a495faba4c73cc560b9f388cdc961">SESSION_USERNAME</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00181">x2go_plugin.c:181</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aaf02d627d85ffb57338fda226fb34619"><div class="ttname"><a href="x2go__plugin_8c.html#aaf02d627d85ffb57338fda226fb34619">rmplugin_x2go_main</a></div><div class="ttdeci">static gboolean rmplugin_x2go_main(RemminaProtocolWidget *gp)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l03059">x2go_plugin.c:3059</a></div></div>
<div class="ttc" id="struct___dialog_data_html"><div class="ttname"><a href="struct___dialog_data.html">_DialogData</a></div><div class="ttdoc">DialogData: </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00267">x2go_plugin.c:267</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html_a673ff4320377c3b440dfd24a796c69fc"><div class="ttname"><a href="struct___remmina_plugin_service.html#a673ff4320377c3b440dfd24a796c69fc">_RemminaPluginService::file_get_string</a></div><div class="ttdeci">const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)</div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00219">plugin.h:219</a></div></div>
<div class="ttc" id="struct___dialog_data_html_a1c48cea48c8dadf952e6ad684b8f89bb"><div class="ttname"><a href="struct___dialog_data.html#a1c48cea48c8dadf952e6ad684b8f89bb">_DialogData::type</a></div><div class="ttdeci">GtkMessageType type</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00271">x2go_plugin.c:271</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a31b9185763acddffe0bbdef41380bf43"><div class="ttname"><a href="x2go__plugin_8c.html#a31b9185763acddffe0bbdef41380bf43">onMainThread_gtk_socket_add_id</a></div><div class="ttdeci">static void onMainThread_gtk_socket_add_id(GtkSocket *sk, Window w)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l01527">x2go_plugin.c:1527</a></div></div>
<div class="ttc" id="vnc__plugin_8c_html_ab96ef9227ecef94018f2729f72e7651e"><div class="ttname"><a href="vnc__plugin_8c.html#ab96ef9227ecef94018f2729f72e7651e">N_</a></div><div class="ttdeci">N_(&quot;Unable to connect to VNC server&quot;)</div><div class="ttdef"><b>Definition:</b> <a href="vnc__plugin_8c_source.html#l00953">vnc_plugin.c:953</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850"><div class="ttname"><a href="x2go__plugin_8c.html#a756badc8d3d2f11f40236b4f6eb3ad11af01a7feda17ea0ad82489cfb205a9850">STR2INT_OVERFLOW</a></div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00195">x2go_plugin.c:195</a></div></div>
<div class="ttc" id="struct___remmina_plugin_service_html"><div class="ttname"><a href="struct___remmina_plugin_service.html">_RemminaPluginService</a></div><div class="ttdef"><b>Definition:</b> <a href="plugin_8h_source.html#l00165">plugin.h:165</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html"><div class="ttname"><a href="structon_main_thread__cb__data.html">onMainThread_cb_data</a></div><div class="ttdef"><b>Definition:</b> <a href="vnc__plugin_8c_source.html#l00068">vnc_plugin.c:68</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a303c6e8a94bccf82dd36e4e2f28f6645"><div class="ttname"><a href="x2go__plugin_8c.html#a303c6e8a94bccf82dd36e4e2f28f6645">str2int</a></div><div class="ttdeci">str2int_errno str2int(gint *out, gchar *s, gint base)</div><div class="ttdoc">Convert string s to int out. </div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l00217">x2go_plugin.c:217</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_aefc7e4961380ebb977d6ccbd9d12230d"><div class="ttname"><a href="x2go__plugin_8c.html#aefc7e4961380ebb977d6ccbd9d12230d">rmplugin_x2go_populate_available_features_list</a></div><div class="ttdeci">static GList * rmplugin_x2go_populate_available_features_list()</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02667">x2go_plugin.c:2667</a></div></div>
<div class="ttc" id="structon_main_thread__cb__data_html_a75eab61445fbabacaa34f95e2437ea75"><div class="ttname"><a href="structon_main_thread__cb__data.html#a75eab61445fbabacaa34f95e2437ea75">onMainThread_cb_data::cancelled</a></div><div class="ttdeci">gboolean cancelled</div><div class="ttdef"><b>Definition:</b> <a href="vnc__plugin_8c_source.html#l00078">vnc_plugin.c:78</a></div></div>
<div class="ttc" id="x2go__plugin_8c_html_a96d6c94d188748ec1ce6a65a38305c26"><div class="ttname"><a href="x2go__plugin_8c.html#a96d6c94d188748ec1ce6a65a38305c26">rmplugin_x2go_dummy_handler</a></div><div class="ttdeci">static int rmplugin_x2go_dummy_handler(Display *dsp, XErrorEvent *err)</div><div class="ttdef"><b>Definition:</b> <a href="x2go__plugin_8c_source.html#l02828">x2go_plugin.c:2828</a></div></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="dir_38c8d24aef3972a7f87b834274e76e31.html">plugins</a></li><li class="navelem"><a class="el" href="dir_73842f1f779844b36cf27e3f444ecce7.html">x2go</a></li><li class="navelem"><a class="el" href="x2go__plugin_8c.html">x2go_plugin.c</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>