Commit 20eecdbe123c68d4fe1ebd65cc66764095417fed
1 parent
627823e2
Exists in
master
and in
4 other branches
Implementing linux "create desktop icon" action.
Showing
1 changed file
with
120 additions
and
7 deletions
Show diff stats
src/objects/linux/savedesktopicon.c
@@ -56,11 +56,11 @@ StartupNotify=true | @@ -56,11 +56,11 @@ StartupNotify=true | ||
56 | Categories=GTK;GNOME;TerminalEmulator | 56 | Categories=GTK;GNOME;TerminalEmulator |
57 | OnlyShowIn=GNOME;Unity | 57 | OnlyShowIn=GNOME;Unity |
58 | X-Desktop-File-Install-Version=0.23 | 58 | X-Desktop-File-Install-Version=0.23 |
59 | - | ||
60 | */ | 59 | */ |
61 | 60 | ||
62 | static const struct _entry { | 61 | static const struct _entry { |
63 | 62 | ||
63 | + const gchar * key; | ||
64 | const gchar * label; | 64 | const gchar * label; |
65 | const gchar * tooltip; | 65 | const gchar * tooltip; |
66 | gint width; | 66 | gint width; |
@@ -75,12 +75,21 @@ X-Desktop-File-Install-Version=0.23 | @@ -75,12 +75,21 @@ X-Desktop-File-Install-Version=0.23 | ||
75 | }, | 75 | }, |
76 | 76 | ||
77 | { | 77 | { |
78 | + .key = "Name", | ||
78 | .label = N_("Launcher name"), | 79 | .label = N_("Launcher name"), |
79 | .width = 20, | 80 | .width = 20, |
80 | // .n_chars = 128 | 81 | // .n_chars = 128 |
81 | }, | 82 | }, |
82 | 83 | ||
83 | { | 84 | { |
85 | + .key = "GenericName", | ||
86 | + .label = N_("Generic name"), | ||
87 | + .width = 20, | ||
88 | +// .n_chars = 128 | ||
89 | + }, | ||
90 | + | ||
91 | + { | ||
92 | + .key = "Comment", | ||
84 | .label = N_("Comment"), | 93 | .label = N_("Comment"), |
85 | .width = 30, | 94 | .width = 30, |
86 | // .n_chars = 128 | 95 | // .n_chars = 128 |
@@ -130,6 +139,7 @@ X-Desktop-File-Install-Version=0.23 | @@ -130,6 +139,7 @@ X-Desktop-File-Install-Version=0.23 | ||
130 | // Create entry fields | 139 | // Create entry fields |
131 | GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); | 140 | GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); |
132 | g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); | 141 | g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); |
142 | + debug("Dialog=%p inputs=%p",dialog,inputs); | ||
133 | 143 | ||
134 | GtkGrid * grid = GTK_GRID(gtk_grid_new()); | 144 | GtkGrid * grid = GTK_GRID(gtk_grid_new()); |
135 | 145 | ||
@@ -150,6 +160,8 @@ X-Desktop-File-Install-Version=0.23 | @@ -150,6 +160,8 @@ X-Desktop-File-Install-Version=0.23 | ||
150 | gtk_grid_attach(grid,label,0,ix,1,1); | 160 | gtk_grid_attach(grid,label,0,ix,1,1); |
151 | 161 | ||
152 | inputs[ix] = gtk_entry_new(); | 162 | inputs[ix] = gtk_entry_new(); |
163 | + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
164 | + | ||
153 | gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); | 165 | gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); |
154 | // gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars); | 166 | // gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars); |
155 | gtk_widget_set_hexpand(inputs[ix],FALSE); | 167 | gtk_widget_set_hexpand(inputs[ix],FALSE); |
@@ -166,9 +178,12 @@ X-Desktop-File-Install-Version=0.23 | @@ -166,9 +178,12 @@ X-Desktop-File-Install-Version=0.23 | ||
166 | gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); | 178 | gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); |
167 | gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); | 179 | gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); |
168 | 180 | ||
169 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),v3270_get_url(terminal)); | ||
170 | - gtk_entry_set_text(GTK_ENTRY(inputs[2]),v3270_get_url(terminal)); | ||
171 | - gtk_entry_set_input_hints(GTK_ENTRY(inputs[2]),GTK_INPUT_HINT_SPELLCHECK); | 181 | + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); |
182 | + gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); | ||
183 | + | ||
184 | + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); | ||
185 | + gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); | ||
186 | + gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK); | ||
172 | 187 | ||
173 | gtk_widget_show_all(GTK_WIDGET(grid)); | 188 | gtk_widget_show_all(GTK_WIDGET(grid)); |
174 | return dialog; | 189 | return dialog; |
@@ -178,11 +193,109 @@ X-Desktop-File-Install-Version=0.23 | @@ -178,11 +193,109 @@ X-Desktop-File-Install-Version=0.23 | ||
178 | 193 | ||
179 | debug("%s(%d)",__FUNCTION__,response_id); | 194 | debug("%s(%d)",__FUNCTION__,response_id); |
180 | 195 | ||
196 | + if(response_id == GTK_RESPONSE_APPLY) { | ||
197 | + | ||
198 | + static const char * key_file_data = | ||
199 | + "[Desktop Entry]\n" \ | ||
200 | + "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \ | ||
201 | + "Terminal=false\n" \ | ||
202 | + "Type=Application\n" \ | ||
203 | + "StartupNotify=true\n" \ | ||
204 | + "Categories=GTK;GNOME;TerminalEmulator\n" \ | ||
205 | + "OnlyShowIn=GNOME;Unity\n"; | ||
206 | + | ||
207 | + GError * error = NULL; | ||
208 | + size_t ix; | ||
209 | + | ||
210 | + GKeyFile * keyfile = g_key_file_new(); | ||
211 | + g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL); | ||
212 | + | ||
213 | +#ifdef DEBUG | ||
214 | + { | ||
215 | + g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL); | ||
216 | + debug("\n%s\n",dbg_data); | ||
217 | + } | ||
218 | +#endif // DEBUG | ||
219 | + | ||
220 | + | ||
221 | + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs"); | ||
222 | + debug("dialog=%p inputs=%p",dialog,inputs); | ||
223 | + | ||
224 | + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
225 | + if(entries[ix].key) { | ||
226 | + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
227 | + g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix]))); | ||
228 | + } | ||
229 | + } | ||
230 | + | ||
231 | + // Get session filename | ||
232 | + const gchar * session_file = v3270_get_session_filename(terminal); | ||
233 | + | ||
234 | + /* | ||
235 | + if(!session_file) { | ||
236 | + | ||
237 | + // No session file, create one. | ||
238 | + | ||
239 | + // Check for configdir | ||
240 | + g_autofree gchar * configdir = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME),"sessions",NULL); | ||
241 | + g_mkdir_with_parents(configdir,0755); | ||
181 | 242 | ||
182 | - gtk_widget_destroy(dialog); | 243 | + // Create a base name |
244 | + g_autofree gchar * basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(inputs[0]))); | ||
183 | 245 | ||
184 | - if(response_id == GTK_RESPONSE_OK) { | 246 | + gchar *ptr = strrchr(basename,'.'); |
247 | + if(ptr) | ||
248 | + *ptr = 0; | ||
185 | 249 | ||
250 | + ix = time(NULL); | ||
251 | + gchar * new_session_file = g_strdup_printf("%s/%s.3270",configdir,basename); | ||
252 | + while(!g_file_test(new_session_file,G_FILE_TEST_EXISTS)) { | ||
253 | + g_free(new_session_file); | ||
254 | + new_session_file = g_strdup_printf("%s/%s_%08lx.3270",configdir,basename,(unsigned long) ix++); | ||
255 | + } | ||
256 | + | ||
257 | + g_message("Saving session to %s",new_session_file); | ||
258 | + v3270_set_session_filename(terminal,new_session_file); | ||
259 | + g_free(new_session_file); | ||
260 | + | ||
261 | + } | ||
262 | + */ | ||
263 | + | ||
264 | + // Get program file name | ||
265 | + // https://stackoverflow.com/questions/4517425/how-to-get-program-path | ||
266 | + { | ||
267 | + char buffer[4096]; | ||
268 | + g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid()); | ||
269 | + | ||
270 | + int bytes = readlink(pidfile,buffer,4095); | ||
271 | + | ||
272 | + if(bytes >= 0) | ||
273 | + buffer[bytes] = '\0'; | ||
274 | + | ||
275 | + g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_get_session_filename(terminal)); | ||
276 | + g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); | ||
277 | + | ||
278 | + } | ||
279 | + | ||
280 | + g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[0])),&error); | ||
281 | + | ||
282 | + if(error) { | ||
283 | + | ||
284 | + g_message("%s",error->message); | ||
285 | + | ||
286 | + | ||
287 | + g_error_free(error); | ||
288 | + | ||
289 | + } else { | ||
290 | + | ||
291 | + g_message("File \"%s\" was saved",gtk_entry_get_text(GTK_ENTRY(inputs[0]))); | ||
292 | + | ||
293 | + } | ||
294 | + | ||
295 | + | ||
296 | + g_key_file_free(keyfile); | ||
186 | } | 297 | } |
187 | 298 | ||
188 | - } | 299 | + gtk_widget_destroy(dialog); |
300 | + | ||
301 | +} |