| 208 |
212 |
| 209 XtManageChild(dialog); |
213 XtManageChild(dialog); |
| 210 } |
214 } |
| 211 |
215 |
| 212 void ui_savefiledialog(UiObject *obj, const char *name, ui_callback file_selected_callback, void *cbdata) { |
216 void ui_savefiledialog(UiObject *obj, const char *name, ui_callback file_selected_callback, void *cbdata) { |
| 213 |
217 Arg args[16]; |
| 214 } |
218 int n = 0; |
| |
219 |
| |
220 // Save File Dialog needs this parameter |
| |
221 XtSetArg(args[n], XnNfsbType, FILEDIALOG_SAVE); n++; |
| |
222 char *selectedpath = (char*)name; |
| |
223 if(name) { |
| |
224 if(name[0] != '/') { |
| |
225 char cwd[PATH_MAX]; |
| |
226 if(getcwd(cwd, PATH_MAX)) { |
| |
227 pathbar_concat_path(cwd, name); |
| |
228 } else { |
| |
229 fprintf(stderr, "Error: getcwd failed: %s\n", strerror(errno)); |
| |
230 selectedpath = NULL; |
| |
231 } |
| |
232 } |
| |
233 if(selectedpath) { |
| |
234 XtSetArg(args[n], XnNselectedPath, selectedpath); n++; |
| |
235 } |
| |
236 } |
| |
237 Widget dialog = XnCreateFileSelectionDialog(obj->widget, "dialog", args, n); |
| |
238 |
| |
239 UiEventData *data = malloc(sizeof(UiEventData)); |
| |
240 memset(data, 0, sizeof(UiEventData)); |
| |
241 data->obj = obj; |
| |
242 data->callback = file_selected_callback; |
| |
243 data->userdata = cbdata; |
| |
244 |
| |
245 XtAddCallback(dialog, XmNokCallback, (XtCallbackProc)filedialog_select, data); |
| |
246 XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)filedialog_cancel, data); |
| |
247 //XtAddCallback(dialog, XmNhelpCallback, (XtCallbackProc)filedialog_help, wd); |
| |
248 |
| |
249 XtManageChild(dialog); |
| |
250 |
| |
251 if(selectedpath != name) { |
| |
252 free(selectedpath); |
| |
253 } |
| |
254 } |