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