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,21 +45,11 @@ | ||
| 45 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | 45 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); |
| 46 | static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); | 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 | static const struct _entry { | 54 | static const struct _entry { |
| 65 | 55 | ||
| @@ -67,6 +57,7 @@ X-Desktop-File-Install-Version=0.23 | @@ -67,6 +57,7 @@ X-Desktop-File-Install-Version=0.23 | ||
| 67 | const gchar * label; | 57 | const gchar * label; |
| 68 | const gchar * tooltip; | 58 | const gchar * tooltip; |
| 69 | const gchar * default_value; | 59 | const gchar * default_value; |
| 60 | + gint margin_top; | ||
| 70 | gint width; | 61 | gint width; |
| 71 | 62 | ||
| 72 | } entries[] = { | 63 | } entries[] = { |
| @@ -89,6 +80,7 @@ X-Desktop-File-Install-Version=0.23 | @@ -89,6 +80,7 @@ X-Desktop-File-Install-Version=0.23 | ||
| 89 | // 2 = Session name | 80 | // 2 = Session name |
| 90 | { | 81 | { |
| 91 | .label = N_("Session name"), | 82 | .label = N_("Session name"), |
| 83 | + .margin_top = 12, | ||
| 92 | .tooltip = N_("The session name used in the window/tab title (empty for default)"), | 84 | .tooltip = N_("The session name used in the window/tab title (empty for default)"), |
| 93 | .width = 15, | 85 | .width = 15, |
| 94 | }, | 86 | }, |
| @@ -100,8 +92,10 @@ X-Desktop-File-Install-Version=0.23 | @@ -100,8 +92,10 @@ X-Desktop-File-Install-Version=0.23 | ||
| 100 | .width = 40, | 92 | .width = 40, |
| 101 | }, | 93 | }, |
| 102 | 94 | ||
| 95 | + // 4 = Generic name. | ||
| 103 | { | 96 | { |
| 104 | .key = "GenericName", | 97 | .key = "GenericName", |
| 98 | + .margin_top = 12, | ||
| 105 | .label = N_("Generic name"), | 99 | .label = N_("Generic name"), |
| 106 | .default_value = G_STRINGIFY(PRODUCT_NAME), | 100 | .default_value = G_STRINGIFY(PRODUCT_NAME), |
| 107 | .width = 20, | 101 | .width = 20, |
| @@ -160,6 +154,62 @@ X-Desktop-File-Install-Version=0.23 | @@ -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 | GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { | 213 | GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { |
| 164 | 214 | ||
| 165 | size_t ix; | 215 | size_t ix; |
| @@ -213,6 +263,11 @@ X-Desktop-File-Install-Version=0.23 | @@ -213,6 +263,11 @@ X-Desktop-File-Install-Version=0.23 | ||
| 213 | inputs[ix] = gtk_entry_new(); | 263 | inputs[ix] = gtk_entry_new(); |
| 214 | debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | 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 | if(entries[ix].default_value) { | 271 | if(entries[ix].default_value) { |
| 217 | gtk_entry_set_text(GTK_ENTRY(inputs[ix]),gettext(entries[ix].default_value)); | 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,12 +287,20 @@ X-Desktop-File-Install-Version=0.23 | ||
| 232 | g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); | 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 | // 1 = Shortcut filename | 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 | // 2 = Session name | 302 | // 2 = Session name |
| 238 | { | 303 | { |
| 239 | - gtk_widget_set_margin_top(GTK_WIDGET(inputs[2]),12); | ||
| 240 | - | ||
| 241 | const gchar * session_name = v3270_get_session_name(terminal); | 304 | const gchar * session_name = v3270_get_session_name(terminal); |
| 242 | 305 | ||
| 243 | if(strcmp(session_name,G_STRINGIFY(PRODUCT_NAME))) | 306 | if(strcmp(session_name,G_STRINGIFY(PRODUCT_NAME))) |
| @@ -247,12 +310,19 @@ X-Desktop-File-Install-Version=0.23 | @@ -247,12 +310,19 @@ X-Desktop-File-Install-Version=0.23 | ||
| 247 | 310 | ||
| 248 | // 3 = Session filename | 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 | g_autofree gchar * session_filename = get_filename(terminal); | 319 | g_autofree gchar * session_filename = get_filename(terminal); |
| 251 | gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename); | 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 | // 4 = Generic name | 325 | // 4 = Generic name |
| 255 | - gtk_widget_set_margin_top(GTK_WIDGET(inputs[4]),12); | ||
| 256 | gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); | 326 | gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); |
| 257 | gtk_entry_set_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); | 327 | gtk_entry_set_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); |
| 258 | gtk_entry_set_input_hints(GTK_ENTRY(inputs[4]),GTK_INPUT_HINT_SPELLCHECK); | 328 | gtk_entry_set_input_hints(GTK_ENTRY(inputs[4]),GTK_INPUT_HINT_SPELLCHECK); |