gboolean got_hwnd;
HWND dialog_hwnd;
gboolean do_close; /* Set if hide was called before dialog_hwnd was set */
+ FilechooserWin32ThreadData *data;
} FileDialogEvents;
ifiledialogevents_OnTypeChange (IFileDialogEvents * self,
IFileDialog *pfd)
{
+ FileDialogEvents *events = (FileDialogEvents *) self;
+ UINT fileType;
+ HRESULT hr = IFileDialog_GetFileTypeIndex (pfd, &fileType);
+ if (FAILED (hr))
+ {
+ g_warning_hr ("Can't get current file type", hr);
+ return S_OK;
+ }
+ fileType--; // fileTypeIndex starts at 1
+ GSList *filters = gtk_file_chooser_list_filters (GTK_FILE_CHOOSER (events->data->self));
+ events->data->self->current_filter = g_slist_nth_data (filters, fileType);
+ g_slist_free (filters);
+ g_object_notify (G_OBJECT (events->data->self), "filter");
return S_OK;
}
}
static IFileDialogEvents *
-file_dialog_events_new (gboolean enable_owner)
+file_dialog_events_new (gboolean enable_owner, FilechooserWin32ThreadData *data)
{
FileDialogEvents *events;
events->iFileDialogEvents.lpVtbl = &ifde_vtbl;
events->ref_count = 1;
events->enable_owner = enable_owner;
+ events->data = data;
return &events->iFileDialogEvents;
}
hr = IFileDialog_SetFileTypes (pfd, n, data->filters);
if (FAILED (hr))
g_warning_hr ("Can't set file types", hr);
+
+ if (data->self->current_filter)
+ {
+ GSList *filters = gtk_file_chooser_list_filters (GTK_FILE_CHOOSER (data->self));
+ gint current_filter_index = g_slist_index (filters, data->self->current_filter);
+ g_slist_free (filters);
+
+ if (current_filter_index >= 0)
+ hr = IFileDialog_SetFileTypeIndex (pfd, current_filter_index + 1);
+ else
+ hr = IFileDialog_SetFileTypeIndex (pfd, 1);
+ }
+ else
+ {
+ hr = IFileDialog_SetFileTypeIndex (pfd, 1);
+ }
+ if (FAILED (hr))
+ g_warning_hr ("Can't set current file type", hr);
}
data->response = GTK_RESPONSE_CANCEL;
return FALSE;
}
}
+ self->current_filter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (self));
+ }
+ else
+ {
+ self->current_filter = NULL;
}
self->mode_data = data;
data->current_name = g_strdup (self->current_name);
}
- data->events = file_dialog_events_new (!data->modal);
+ data->events = file_dialog_events_new (!data->modal, data);
thread = g_thread_new ("win32 filechooser", filechooser_win32_thread, data);
if (thread == NULL)