Commit 2ebec4334665269e1f43360dd7d61ae389b3ca36

Authored by Perry Werneck
1 parent c49d2497

Adjustments in linux save shortcut.

src/include/v3270/keyfile.h
@@ -43,12 +43,12 @@ @@ -43,12 +43,12 @@
43 typedef struct _V3270KeyFile V3270KeyFile; 43 typedef struct _V3270KeyFile V3270KeyFile;
44 44
45 gchar * v3270_keyfile_get_default_filename(void); 45 gchar * v3270_keyfile_get_default_filename(void);
46 - gchar * v3270_key_file_get_default_path(GtkWidget *terminal, gboolean create); 46 + gchar * v3270_key_file_get_default_path(GtkWidget *terminal);
47 47
48 V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error); 48 V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error);
49 void v3270_key_file_close(GtkWidget *terminal); 49 void v3270_key_file_close(GtkWidget *terminal);
50 - void v3270_key_file_save(GtkWidget *terminal);  
51 - void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename); 50 + void v3270_key_file_save(GtkWidget *terminal, GError **error);
  51 + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename, GError **error);
52 52
53 /// @brief Get current key filename 53 /// @brief Get current key filename
54 const gchar * v3270_key_file_get_filename(GtkWidget *terminal); 54 const gchar * v3270_key_file_get_filename(GtkWidget *terminal);
src/objects/os/linux/savedesktopicon.c
@@ -67,20 +67,36 @@ X-Desktop-File-Install-Version=0.23 @@ -67,20 +67,36 @@ X-Desktop-File-Install-Version=0.23
67 const gchar * tooltip; 67 const gchar * tooltip;
68 const gchar * default_value; 68 const gchar * default_value;
69 gint width; 69 gint width;
70 -// gint n_chars;  
71 70
72 } entries[] = { 71 } entries[] = {
73 72
  73 + // 0 = Shortcut name
74 { 74 {
75 - .label = N_("File name"), 75 + .key = "Name",
  76 + .label = N_("Shortcut name"),
  77 + .default_value = G_STRINGIFY(PRODUCT_NAME),
  78 + .width = 20,
  79 + },
  80 +
  81 + // 1 = Shortcut file
  82 + {
  83 + .label = N_("Shortcut file"),
  84 + .tooltip = N_("Path for the new shortcut"),
76 .width = 40, 85 .width = 40,
77 }, 86 },
78 87
  88 + // 2 = Session name
79 { 89 {
80 - .key = "Name",  
81 - .label = N_("Launcher name"),  
82 - .default_value = G_STRINGIFY(PRODUCT_NAME),  
83 - .width = 20, 90 + .label = N_("Session name"),
  91 + .tooltip = N_("The session name used in the window/tab title (empty for default)"),
  92 + .width = 15,
  93 + },
  94 +
  95 + // 3 = Session file
  96 + {
  97 + .label = N_("Session file"),
  98 + .tooltip = N_("The file with the session preferences for this shortcut"),
  99 + .width = 40,
84 }, 100 },
85 101
86 { 102 {
@@ -111,6 +127,38 @@ X-Desktop-File-Install-Version=0.23 @@ -111,6 +127,38 @@ X-Desktop-File-Install-Version=0.23
111 127
112 } 128 }
113 129
  130 + static gchar * get_filename(GtkWidget *terminal) {
  131 +
  132 + g_autofree gchar * defname = v3270_keyfile_get_default_filename();
  133 + const gchar * current = v3270_key_file_get_filename(terminal);
  134 +
  135 + // If is not the default name, return it.
  136 + if(strcmp(defname,current)) {
  137 + return g_strdup(current);
  138 + }
  139 +
  140 + // It's the default one, create a new one on the user_config dir
  141 + g_autofree gchar * config_path = v3270_key_file_get_default_path(terminal);
  142 +
  143 + // Use the hostname
  144 + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal));
  145 + if(!hostname) {
  146 + hostname = G_STRINGIFY(PRODUCT_NAME);
  147 + }
  148 +
  149 + // Build the filename
  150 + gchar *filename = g_strconcat(config_path,G_DIR_SEPARATOR_S,hostname,".3270",NULL);
  151 +
  152 + unsigned int index = 0;
  153 + while(g_file_test(filename,G_FILE_TEST_EXISTS)) {
  154 + g_free(filename);
  155 + filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",config_path,hostname,++index);
  156 + }
  157 +
  158 + return filename;
  159 +
  160 + }
  161 +
114 GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { 162 GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {
115 163
116 size_t ix; 164 size_t ix;
@@ -168,8 +216,11 @@ X-Desktop-File-Install-Version=0.23 @@ -168,8 +216,11 @@ X-Desktop-File-Install-Version=0.23
168 gtk_entry_set_text(GTK_ENTRY(inputs[ix]),gettext(entries[ix].default_value)); 216 gtk_entry_set_text(GTK_ENTRY(inputs[ix]),gettext(entries[ix].default_value));
169 } 217 }
170 218
  219 + if(entries[ix].tooltip) {
  220 + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip));
  221 + }
  222 +
171 gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); 223 gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);
172 -// gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars);  
173 gtk_widget_set_hexpand(inputs[ix],FALSE); 224 gtk_widget_set_hexpand(inputs[ix],FALSE);
174 gtk_widget_set_vexpand(inputs[ix],FALSE); 225 gtk_widget_set_vexpand(inputs[ix],FALSE);
175 226
@@ -179,70 +230,30 @@ X-Desktop-File-Install-Version=0.23 @@ -179,70 +230,30 @@ X-Desktop-File-Install-Version=0.23
179 230
180 g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); 231 g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP));
181 232
182 - gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename); 233 + // 1 = Shortcut filename
  234 + gtk_entry_set_text(GTK_ENTRY(inputs[1]),filename);
183 235
184 - /*  
185 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME));  
186 - gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME));  
187 -  
188 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME));  
189 - gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME));  
190 - */ 236 + // 3 = Session filename
  237 + {
  238 + g_autofree gchar * session_filename = get_filename(terminal);
  239 + gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename);
  240 + }
191 241
192 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal));  
193 - gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal));  
194 - gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK); 242 + // 4 = Generic name
  243 + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal));
  244 + gtk_entry_set_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal));
  245 + gtk_entry_set_input_hints(GTK_ENTRY(inputs[4]),GTK_INPUT_HINT_SPELLCHECK);
195 246
196 gtk_widget_show_all(GTK_WIDGET(grid)); 247 gtk_widget_show_all(GTK_WIDGET(grid));
197 return dialog; 248 return dialog;
198 } 249 }
199 250
200 - static gchar * get_filename(GtkWidget *terminal, const gchar *session_name) {  
201 -  
202 - if(!(session_name && *session_name))  
203 - session_name = G_STRINGIFY(PRODUCT_NAME);  
204 -  
205 - g_autofree gchar * defname = v3270_keyfile_get_default_filename();  
206 - const gchar * current = v3270_key_file_get_filename(terminal);  
207 -  
208 - // If is not the default name, return it.  
209 - if(strcmp(defname,current)) {  
210 - return g_strdup(current);  
211 - }  
212 -  
213 - // It's the default one, create a new one on the user_config dir  
214 - g_autofree gchar * config_path = v3270_key_file_get_default_path(terminal,TRUE);  
215 -  
216 - // Use the hostname  
217 - const char * hostname = lib3270_host_get_name(v3270_get_session(terminal));  
218 - if(!hostname) {  
219 - hostname = "session";  
220 - }  
221 -  
222 - // Build the filename  
223 - gchar *filename = g_strconcat(config_path,G_DIR_SEPARATOR_S,hostname,".",session_name,".3270",NULL);  
224 -  
225 - unsigned int index = 0;  
226 - while(g_file_test(filename,G_FILE_TEST_EXISTS)) {  
227 - g_free(filename);  
228 - filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%s.%u.3270",config_path,hostname,session_name,++index);  
229 - }  
230 -  
231 - v3270_key_file_save_to_file(terminal,filename);  
232 -  
233 - g_message("New session file create at \"%s\"",filename);  
234 -  
235 - return filename;  
236 -  
237 - }  
238 -  
239 - void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { 251 + static void apply(GtkWidget *dialog, GtkWidget *terminal) {
240 252
241 - debug("%s(%d)",__FUNCTION__,response_id);  
242 -  
243 - if(response_id == GTK_RESPONSE_APPLY) { 253 + GError * error = NULL;
  254 + size_t ix;
244 255
245 - static const char * key_file_data = 256 + static const char * key_file_data =
246 "[Desktop Entry]\n" \ 257 "[Desktop Entry]\n" \
247 "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \ 258 "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \
248 "Terminal=false\n" \ 259 "Terminal=false\n" \
@@ -251,68 +262,82 @@ X-Desktop-File-Install-Version=0.23 @@ -251,68 +262,82 @@ X-Desktop-File-Install-Version=0.23
251 "Categories=GTK;GNOME;TerminalEmulator\n" \ 262 "Categories=GTK;GNOME;TerminalEmulator\n" \
252 "OnlyShowIn=GNOME;Unity\n"; 263 "OnlyShowIn=GNOME;Unity\n";
253 264
254 - GError * error = NULL;  
255 - size_t ix;  
256 -  
257 - GKeyFile * keyfile = g_key_file_new();  
258 - g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL); 265 + GKeyFile * keyfile = g_key_file_new();
  266 + g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL);
259 267
260 #ifdef DEBUG 268 #ifdef DEBUG
261 - {  
262 - g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL);  
263 - debug("\n%s\n",dbg_data);  
264 - } 269 + {
  270 + g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL);
  271 + debug("\n%s\n",dbg_data);
  272 + }
265 #endif // DEBUG 273 #endif // DEBUG
266 274
267 275
268 - GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");  
269 - debug("dialog=%p inputs=%p",dialog,inputs); 276 + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");
  277 + debug("dialog=%p inputs=%p",dialog,inputs);
270 278
271 - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {  
272 - if(entries[ix].key) {  
273 - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);  
274 - g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix])));  
275 - } 279 + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {
  280 + if(entries[ix].key) {
  281 + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);
  282 + g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix])));
276 } 283 }
  284 + }
277 285
278 - // Get session filename  
279 - g_autofree gchar * filename = get_filename(terminal,NULL); 286 + // Save keyfile
  287 + v3270_key_file_save_to_file(
  288 + terminal,
  289 + gtk_entry_get_text(GTK_ENTRY(inputs[3])),
  290 + &error
  291 + );
280 292
281 - // Get program file name  
282 - // https://stackoverflow.com/questions/4517425/how-to-get-program-path  
283 - {  
284 - char buffer[4096];  
285 - g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid()); 293 + // Get program file name
  294 + // https://stackoverflow.com/questions/4517425/how-to-get-program-path
  295 + if(!error) {
  296 + char buffer[4096];
  297 + g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid());
286 298
287 - int bytes = readlink(pidfile,buffer,4095); 299 + int bytes = readlink(pidfile,buffer,4095);
288 300
289 - if(bytes >= 0)  
290 - buffer[bytes] = '\0'; 301 + if(bytes >= 0)
  302 + buffer[bytes] = '\0';
291 303
292 - g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,filename);  
293 - g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); 304 + g_autofree gchar * exec_line =
  305 + g_strconcat(
  306 + buffer,
  307 + " \"",gtk_entry_get_text(GTK_ENTRY(inputs[3])),"\"",
  308 + NULL
  309 + );
294 310
295 - } 311 + g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line);
296 312
297 - g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[0])),&error); 313 + }
298 314
299 - if(error) { 315 + // Save shortcude
  316 + g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[1])),&error);
300 317
301 - g_message("%s",error->message); 318 + g_key_file_free(keyfile);
302 319
  320 + if(error) {
303 321
304 - g_error_free(error); 322 + g_message("%s",error->message);
  323 + g_error_free(error);
305 324
306 - } else { 325 + }
307 326
308 - g_message("File \"%s\" was saved",gtk_entry_get_text(GTK_ENTRY(inputs[0])));  
309 327
310 - } 328 +}
  329 +
  330 +void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
311 331
  332 + debug("%s(%d)",__FUNCTION__,response_id);
312 333
313 - g_key_file_free(keyfile); 334 + gtk_widget_hide(dialog);
  335 + if(response_id == GTK_RESPONSE_APPLY) {
  336 + apply(dialog,terminal);
314 } 337 }
315 338
316 - gtk_widget_destroy(dialog); 339 + gtk_widget_destroy(dialog);
317 340
318 } 341 }
  342 +
  343 +
src/objects/window/keyfile.c
@@ -126,7 +126,7 @@ @@ -126,7 +126,7 @@
126 126
127 g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile); 127 g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile);
128 if(new_session->changed) { 128 if(new_session->changed) {
129 - v3270_key_file_save(terminal); 129 + v3270_key_file_save(terminal,error);
130 } 130 }
131 131
132 if(!*error) { 132 if(!*error) {
@@ -189,7 +189,10 @@ void v3270_key_file_close(GtkWidget *terminal) { @@ -189,7 +189,10 @@ void v3270_key_file_close(GtkWidget *terminal) {
189 return v3270_get_session_descriptor(terminal)->key_file; 189 return v3270_get_session_descriptor(terminal)->key_file;
190 } 190 }
191 191
192 - void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename) { 192 + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename, GError **error) {
  193 +
  194 + if(*error)
  195 + return;
193 196
194 V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename)); 197 V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename));
195 V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor"); 198 V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor");
@@ -202,11 +205,11 @@ void v3270_key_file_close(GtkWidget *terminal) { @@ -202,11 +205,11 @@ void v3270_key_file_close(GtkWidget *terminal) {
202 new_session->key_file = g_key_file_new(); 205 new_session->key_file = g_key_file_new();
203 206
204 g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile); 207 g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile);
205 - v3270_key_file_save(terminal); 208 + v3270_key_file_save(terminal,error);
206 209
207 } 210 }
208 211
209 - void v3270_key_file_save(GtkWidget *terminal) { 212 + void v3270_key_file_save(GtkWidget *terminal, GError **error) {
210 213
211 V3270KeyFile *session = v3270_get_session_descriptor(terminal); 214 V3270KeyFile *session = v3270_get_session_descriptor(terminal);
212 215
@@ -222,7 +225,7 @@ void v3270_key_file_close(GtkWidget *terminal) { @@ -222,7 +225,7 @@ void v3270_key_file_close(GtkWidget *terminal) {
222 } 225 }
223 226
224 /// @brief Search standard paths. 227 /// @brief Search standard paths.
225 - gchar * v3270_key_file_get_default_path(GtkWidget *terminal, gboolean create) { 228 + gchar * v3270_key_file_get_default_path(GtkWidget *terminal) {
226 229
227 size_t folder; 230 size_t folder;
228 const gchar *folders[] = { 231 const gchar *folders[] = {
@@ -233,7 +236,6 @@ void v3270_key_file_close(GtkWidget *terminal) { @@ -233,7 +236,6 @@ void v3270_key_file_close(GtkWidget *terminal) {
233 236
234 size_t application; 237 size_t application;
235 const gchar *applications[] = { 238 const gchar *applications[] = {
236 - v3270_get_session_name(terminal),  
237 G_STRINGIFY(PRODUCT_NAME), 239 G_STRINGIFY(PRODUCT_NAME),
238 PACKAGE_NAME, 240 PACKAGE_NAME,
239 "3270", 241 "3270",
@@ -270,16 +272,8 @@ void v3270_key_file_close(GtkWidget *terminal) { @@ -270,16 +272,8 @@ void v3270_key_file_close(GtkWidget *terminal) {
270 return g_path_get_dirname(filename); 272 return g_path_get_dirname(filename);
271 } 273 }
272 274
273 - if(!create) {  
274 - return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS));  
275 - } 275 + return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS));
276 276
277 - // Create folder.  
278 - {  
279 - gchar * default_dir = g_build_filename(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),G_STRINGIFY(PRODUCT_NAME),NULL);  
280 - g_mkdir_with_parents(default_dir,0775);  
281 - return default_dir;  
282 - }  
283 } 277 }
284 278
285 gchar * v3270_keyfile_get_default_filename(void) { 279 gchar * v3270_keyfile_get_default_filename(void) {
@@ -300,8 +294,7 @@ void v3270_key_file_close(GtkWidget *terminal) { @@ -300,8 +294,7 @@ void v3270_key_file_close(GtkWidget *terminal) {
300 return g_strdup(filename); 294 return g_strdup(filename);
301 } 295 }
302 296
303 - debug("\n\n\n%s",__FUNCTION__);  
304 - g_autofree gchar * folder = v3270_key_file_get_default_path(terminal,FALSE); 297 + g_autofree gchar * folder = v3270_key_file_get_default_path(terminal);
305 298
306 const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); 299 const char * hostname = lib3270_host_get_name(v3270_get_session(terminal));
307 debug("Hostname=\"%s\"",hostname); 300 debug("Hostname=\"%s\"",hostname);