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); |