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