Commit ab86d8b03fc4f2a49eaaaafeeae2ab238b68d05b

Authored by Perry Werneck
1 parent a3c2d375

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