Commit ab86d8b03fc4f2a49eaaaafeeae2ab238b68d05b
1 parent
a3c2d375
Exists in
master
and in
2 other branches
Adding file chooser to save desktop shortcut action.
Showing
1 changed file
with
89 additions
and
19 deletions
Show diff stats
src/objects/os/linux/savedesktopicon.c
| ... | ... | @@ -45,21 +45,11 @@ |
| 45 | 45 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); |
| 46 | 46 | static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); |
| 47 | 47 | |
| 48 | -/* | |
| 49 | - | |
| 50 | -[Desktop Entry] | |
| 51 | -GenericName=pw3270 | |
| 52 | -Name=pw3270 | |
| 53 | -Comment=Comment | |
| 54 | -Exec=/usr/bin/sisbb | |
| 55 | -Icon=pw3270 | |
| 56 | -Terminal=false | |
| 57 | -Type=Application | |
| 58 | -StartupNotify=true | |
| 59 | -Categories=GTK;GNOME;TerminalEmulator | |
| 60 | -OnlyShowIn=GNOME;Unity | |
| 61 | -X-Desktop-File-Install-Version=0.23 | |
| 62 | -*/ | |
| 48 | + struct FileEntry { | |
| 49 | + const gchar * title; | |
| 50 | + const gchar * pattern; | |
| 51 | + const gchar * name; | |
| 52 | + }; | |
| 63 | 53 | |
| 64 | 54 | static const struct _entry { |
| 65 | 55 | |
| ... | ... | @@ -67,6 +57,7 @@ X-Desktop-File-Install-Version=0.23 |
| 67 | 57 | const gchar * label; |
| 68 | 58 | const gchar * tooltip; |
| 69 | 59 | const gchar * default_value; |
| 60 | + gint margin_top; | |
| 70 | 61 | gint width; |
| 71 | 62 | |
| 72 | 63 | } entries[] = { |
| ... | ... | @@ -89,6 +80,7 @@ X-Desktop-File-Install-Version=0.23 |
| 89 | 80 | // 2 = Session name |
| 90 | 81 | { |
| 91 | 82 | .label = N_("Session name"), |
| 83 | + .margin_top = 12, | |
| 92 | 84 | .tooltip = N_("The session name used in the window/tab title (empty for default)"), |
| 93 | 85 | .width = 15, |
| 94 | 86 | }, |
| ... | ... | @@ -100,8 +92,10 @@ X-Desktop-File-Install-Version=0.23 |
| 100 | 92 | .width = 40, |
| 101 | 93 | }, |
| 102 | 94 | |
| 95 | + // 4 = Generic name. | |
| 103 | 96 | { |
| 104 | 97 | .key = "GenericName", |
| 98 | + .margin_top = 12, | |
| 105 | 99 | .label = N_("Generic name"), |
| 106 | 100 | .default_value = G_STRINGIFY(PRODUCT_NAME), |
| 107 | 101 | .width = 20, |
| ... | ... | @@ -160,6 +154,62 @@ X-Desktop-File-Install-Version=0.23 |
| 160 | 154 | |
| 161 | 155 | } |
| 162 | 156 | |
| 157 | + static void icon_response(GtkDialog *dialog, int response_id, GtkEntry *entry) { | |
| 158 | + | |
| 159 | + if(response_id == GTK_RESPONSE_ACCEPT) { | |
| 160 | + g_autofree gchar * filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | |
| 161 | + gtk_entry_set_text(entry,filename ? filename : ""); | |
| 162 | + } | |
| 163 | + | |
| 164 | + gtk_widget_destroy(GTK_WIDGET(dialog)); | |
| 165 | + | |
| 166 | + } | |
| 167 | + | |
| 168 | + static void icon_press(GtkWidget *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, const struct FileEntry *descr) { | |
| 169 | + | |
| 170 | + GtkWidget * dialog = | |
| 171 | + gtk_file_chooser_dialog_new( | |
| 172 | + gettext(descr->title), | |
| 173 | + GTK_WINDOW(gtk_widget_get_toplevel(entry)), | |
| 174 | + GTK_FILE_CHOOSER_ACTION_SAVE, | |
| 175 | + _("Cancel"), GTK_RESPONSE_CANCEL, | |
| 176 | + _("Select"), GTK_RESPONSE_ACCEPT, | |
| 177 | + NULL | |
| 178 | + ); | |
| 179 | + | |
| 180 | + { | |
| 181 | + GtkFileFilter *filter; | |
| 182 | + | |
| 183 | + // Standard filter | |
| 184 | + filter = gtk_file_filter_new(); | |
| 185 | + gtk_file_filter_add_pattern (filter, gettext(descr->pattern)); | |
| 186 | + gtk_file_filter_set_name(filter, gettext(descr->name)); | |
| 187 | + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); | |
| 188 | + | |
| 189 | + // All files | |
| 190 | + filter = gtk_file_filter_new(); | |
| 191 | + gtk_file_filter_add_pattern (filter, _("*.*")); | |
| 192 | + gtk_file_filter_set_name(filter, _("All files")); | |
| 193 | + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); | |
| 194 | + | |
| 195 | + } | |
| 196 | + | |
| 197 | + gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
| 198 | + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
| 199 | + | |
| 200 | + const gchar *filename = gtk_entry_get_text(GTK_ENTRY(entry)); | |
| 201 | + | |
| 202 | + if(filename && *filename) | |
| 203 | + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),filename); | |
| 204 | + | |
| 205 | + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); | |
| 206 | + g_signal_connect(dialog,"response",G_CALLBACK(icon_response),entry); | |
| 207 | + | |
| 208 | + gtk_widget_show_all(dialog); | |
| 209 | + | |
| 210 | + | |
| 211 | + } | |
| 212 | + | |
| 163 | 213 | GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { |
| 164 | 214 | |
| 165 | 215 | size_t ix; |
| ... | ... | @@ -213,6 +263,11 @@ X-Desktop-File-Install-Version=0.23 |
| 213 | 263 | inputs[ix] = gtk_entry_new(); |
| 214 | 264 | debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); |
| 215 | 265 | |
| 266 | + if(entries[ix].margin_top) { | |
| 267 | + gtk_widget_set_margin_top(label,entries[ix].margin_top); | |
| 268 | + gtk_widget_set_margin_top(inputs[ix],entries[ix].margin_top); | |
| 269 | + } | |
| 270 | + | |
| 216 | 271 | if(entries[ix].default_value) { |
| 217 | 272 | gtk_entry_set_text(GTK_ENTRY(inputs[ix]),gettext(entries[ix].default_value)); |
| 218 | 273 | } |
| ... | ... | @@ -232,12 +287,20 @@ X-Desktop-File-Install-Version=0.23 |
| 232 | 287 | g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); |
| 233 | 288 | |
| 234 | 289 | // 1 = Shortcut filename |
| 235 | - gtk_entry_set_text(GTK_ENTRY(inputs[1]),filename); | |
| 290 | + { | |
| 291 | + static const struct FileEntry entry = { | |
| 292 | + .title = N_("Save to shortcut file"), | |
| 293 | + .name = N_("Standard desktop files"), | |
| 294 | + .pattern = N_("*.desktop") | |
| 295 | + }; | |
| 296 | + | |
| 297 | + gtk_entry_set_text(GTK_ENTRY(inputs[1]),filename); | |
| 298 | + gtk_entry_set_icon_from_icon_name(GTK_ENTRY(inputs[1]),GTK_ENTRY_ICON_SECONDARY,"document-save"); | |
| 299 | + g_signal_connect(inputs[1],"icon_press",G_CALLBACK(icon_press),(gpointer) &entry); | |
| 300 | + } | |
| 236 | 301 | |
| 237 | 302 | // 2 = Session name |
| 238 | 303 | { |
| 239 | - gtk_widget_set_margin_top(GTK_WIDGET(inputs[2]),12); | |
| 240 | - | |
| 241 | 304 | const gchar * session_name = v3270_get_session_name(terminal); |
| 242 | 305 | |
| 243 | 306 | if(strcmp(session_name,G_STRINGIFY(PRODUCT_NAME))) |
| ... | ... | @@ -247,12 +310,19 @@ X-Desktop-File-Install-Version=0.23 |
| 247 | 310 | |
| 248 | 311 | // 3 = Session filename |
| 249 | 312 | { |
| 313 | + static const struct FileEntry entry = { | |
| 314 | + .title = N_("Save to session filename"), | |
| 315 | + .name = N_("3270 session files"), | |
| 316 | + .pattern = N_("*.3270") | |
| 317 | + }; | |
| 318 | + | |
| 250 | 319 | g_autofree gchar * session_filename = get_filename(terminal); |
| 251 | 320 | gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename); |
| 321 | + gtk_entry_set_icon_from_icon_name(GTK_ENTRY(inputs[3]),GTK_ENTRY_ICON_SECONDARY,"document-save"); | |
| 322 | + g_signal_connect(inputs[3],"icon_press",G_CALLBACK(icon_press),(gpointer) &entry); | |
| 252 | 323 | } |
| 253 | 324 | |
| 254 | 325 | // 4 = Generic name |
| 255 | - gtk_widget_set_margin_top(GTK_WIDGET(inputs[4]),12); | |
| 256 | 326 | gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); |
| 257 | 327 | gtk_entry_set_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); |
| 258 | 328 | gtk_entry_set_input_hints(GTK_ENTRY(inputs[4]),GTK_INPUT_HINT_SPELLCHECK); | ... | ... |