Commit 2ebec4334665269e1f43360dd7d61ae389b3ca36
1 parent
c49d2497
Exists in
master
and in
2 other branches
Adjustments in linux save shortcut.
Showing
3 changed files
with
138 additions
and
120 deletions
Show diff stats
src/include/v3270/keyfile.h
| ... | ... | @@ -43,12 +43,12 @@ |
| 43 | 43 | typedef struct _V3270KeyFile V3270KeyFile; |
| 44 | 44 | |
| 45 | 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 | 48 | V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error); |
| 49 | 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 | 53 | /// @brief Get current key filename |
| 54 | 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 | 67 | const gchar * tooltip; |
| 68 | 68 | const gchar * default_value; |
| 69 | 69 | gint width; |
| 70 | -// gint n_chars; | |
| 71 | 70 | |
| 72 | 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 | 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 | 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 | 162 | GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { |
| 115 | 163 | |
| 116 | 164 | size_t ix; |
| ... | ... | @@ -168,8 +216,11 @@ X-Desktop-File-Install-Version=0.23 |
| 168 | 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 | 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 | 224 | gtk_widget_set_hexpand(inputs[ix],FALSE); |
| 174 | 225 | gtk_widget_set_vexpand(inputs[ix],FALSE); |
| 175 | 226 | |
| ... | ... | @@ -179,70 +230,30 @@ X-Desktop-File-Install-Version=0.23 |
| 179 | 230 | |
| 180 | 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 | 247 | gtk_widget_show_all(GTK_WIDGET(grid)); |
| 197 | 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 | 257 | "[Desktop Entry]\n" \ |
| 247 | 258 | "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \ |
| 248 | 259 | "Terminal=false\n" \ |
| ... | ... | @@ -251,68 +262,82 @@ X-Desktop-File-Install-Version=0.23 |
| 251 | 262 | "Categories=GTK;GNOME;TerminalEmulator\n" \ |
| 252 | 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 | 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 | 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 | 126 | |
| 127 | 127 | g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile); |
| 128 | 128 | if(new_session->changed) { |
| 129 | - v3270_key_file_save(terminal); | |
| 129 | + v3270_key_file_save(terminal,error); | |
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | if(!*error) { |
| ... | ... | @@ -189,7 +189,10 @@ void v3270_key_file_close(GtkWidget *terminal) { |
| 189 | 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 | 197 | V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename)); |
| 195 | 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 | 205 | new_session->key_file = g_key_file_new(); |
| 203 | 206 | |
| 204 | 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 | 214 | V3270KeyFile *session = v3270_get_session_descriptor(terminal); |
| 212 | 215 | |
| ... | ... | @@ -222,7 +225,7 @@ void v3270_key_file_close(GtkWidget *terminal) { |
| 222 | 225 | } |
| 223 | 226 | |
| 224 | 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 | 230 | size_t folder; |
| 228 | 231 | const gchar *folders[] = { |
| ... | ... | @@ -233,7 +236,6 @@ void v3270_key_file_close(GtkWidget *terminal) { |
| 233 | 236 | |
| 234 | 237 | size_t application; |
| 235 | 238 | const gchar *applications[] = { |
| 236 | - v3270_get_session_name(terminal), | |
| 237 | 239 | G_STRINGIFY(PRODUCT_NAME), |
| 238 | 240 | PACKAGE_NAME, |
| 239 | 241 | "3270", |
| ... | ... | @@ -270,16 +272,8 @@ void v3270_key_file_close(GtkWidget *terminal) { |
| 270 | 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 | 279 | gchar * v3270_keyfile_get_default_filename(void) { |
| ... | ... | @@ -300,8 +294,7 @@ void v3270_key_file_close(GtkWidget *terminal) { |
| 300 | 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 | 299 | const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); |
| 307 | 300 | debug("Hostname=\"%s\"",hostname); | ... | ... |