| 105 (gtk_adjustment_get_upper(adj) - |
105 (gtk_adjustment_get_upper(adj) - |
| 106 gtk_adjustment_get_page_size(adj) * 1.5)); |
106 gtk_adjustment_get_page_size(adj) * 1.5)); |
| 107 } |
107 } |
| 108 |
108 |
| 109 static void |
109 static void |
| 110 save_response_cb(GtkNativeDialog *self, gint response_id, gpointer data) |
110 save_response_cb(GObject *obj, GAsyncResult *result, gpointer data) |
| 111 { |
111 { |
| 112 PidginDebugWindow *win = (PidginDebugWindow *)data; |
112 PidginDebugWindow *win = (PidginDebugWindow *)data; |
| 113 |
113 GFile *file = NULL; |
| 114 if(response_id == GTK_RESPONSE_ACCEPT) { |
114 GFileOutputStream *output = NULL; |
| 115 GFile *file = NULL; |
115 GtkTextIter start, end; |
| 116 GFileOutputStream *output = NULL; |
116 GDateTime *date = NULL; |
| 117 GtkTextIter start, end; |
117 char *date_str = NULL; |
| 118 GDateTime *date = NULL; |
118 char *tmp = NULL; |
| 119 gchar *date_str = NULL; |
119 GError *error = NULL; |
| 120 gchar *tmp = NULL; |
120 |
| 121 GError *error = NULL; |
121 file = gtk_file_dialog_save_finish(GTK_FILE_DIALOG(obj), result, NULL); |
| 122 |
122 if(file == NULL) { |
| 123 file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(self)); |
123 return; |
| 124 output = g_file_replace(file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, |
124 } |
| 125 &error); |
125 |
| 126 g_object_unref(file); |
126 output = g_file_replace(file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, |
| 127 |
127 &error); |
| 128 if(output == NULL) { |
128 g_clear_object(&file); |
| 129 purple_debug_error("debug", |
129 |
| 130 "Unable to open file to save debug log: %s", |
130 if(output == NULL) { |
| 131 error->message); |
131 purple_debug_error("debug", |
| 132 g_error_free(error); |
132 "Unable to open file to save debug log: %s", |
| 133 g_object_unref(self); |
133 error->message); |
| 134 return; |
134 g_error_free(error); |
| 135 } |
135 return; |
| 136 |
136 } |
| 137 date = g_date_time_new_now_local(); |
137 |
| 138 date_str = g_date_time_format(date, "%c"); |
138 date = g_date_time_new_now_local(); |
| 139 g_date_time_unref(date); |
139 date_str = g_date_time_format(date, "%c"); |
| 140 |
140 g_date_time_unref(date); |
| 141 tmp = g_strdup_printf("Pidgin Debug Log : %s\n", date_str); |
141 |
| 142 g_output_stream_write_all(G_OUTPUT_STREAM(output), tmp, strlen(tmp), |
142 tmp = g_strdup_printf("Pidgin Debug Log : %s\n", date_str); |
| 143 NULL, NULL, &error); |
143 g_output_stream_write_all(G_OUTPUT_STREAM(output), tmp, strlen(tmp), |
| 144 g_free(tmp); |
144 NULL, NULL, &error); |
| 145 g_free(date_str); |
145 g_free(tmp); |
| 146 |
146 g_free(date_str); |
| 147 if(error != NULL) { |
147 |
| 148 purple_debug_error("debug", "Unable to save debug log: %s", |
148 if(error != NULL) { |
| 149 error->message); |
149 purple_debug_error("debug", "Unable to save debug log: %s", |
| 150 g_error_free(error); |
150 error->message); |
| 151 g_object_unref(output); |
151 g_error_free(error); |
| 152 g_object_unref(self); |
|
| 153 return; |
|
| 154 } |
|
| 155 |
|
| 156 gtk_text_buffer_get_bounds(win->buffer, &start, &end); |
|
| 157 tmp = gtk_text_buffer_get_text(win->buffer, &start, &end, TRUE); |
|
| 158 g_output_stream_write_all(G_OUTPUT_STREAM(output), tmp, strlen(tmp), |
|
| 159 NULL, NULL, &error); |
|
| 160 g_free(tmp); |
|
| 161 |
|
| 162 if(error != NULL) { |
|
| 163 purple_debug_error("debug", "Unable to save debug log: %s", |
|
| 164 error->message); |
|
| 165 g_error_free(error); |
|
| 166 g_object_unref(output); |
|
| 167 g_object_unref(self); |
|
| 168 return; |
|
| 169 } |
|
| 170 |
|
| 171 g_object_unref(output); |
152 g_object_unref(output); |
| 172 } |
153 return; |
| 173 |
154 } |
| 174 g_object_unref(self); |
155 |
| |
156 gtk_text_buffer_get_bounds(win->buffer, &start, &end); |
| |
157 tmp = gtk_text_buffer_get_text(win->buffer, &start, &end, TRUE); |
| |
158 g_output_stream_write_all(G_OUTPUT_STREAM(output), tmp, strlen(tmp), |
| |
159 NULL, NULL, &error); |
| |
160 g_free(tmp); |
| |
161 |
| |
162 if(error != NULL) { |
| |
163 purple_debug_error("debug", "Unable to save debug log: %s", |
| |
164 error->message); |
| |
165 g_error_free(error); |
| |
166 g_object_unref(output); |
| |
167 return; |
| |
168 } |
| |
169 |
| |
170 g_object_unref(output); |
| 175 } |
171 } |
| 176 |
172 |
| 177 static void |
173 static void |
| 178 save_cb(G_GNUC_UNUSED GtkWidget *w, PidginDebugWindow *win) |
174 save_cb(G_GNUC_UNUSED GtkWidget *w, PidginDebugWindow *win) |
| 179 { |
175 { |
| 180 GtkFileChooserNative *filesel; |
176 GtkFileDialog *dialog; |
| 181 |
177 |
| 182 filesel = gtk_file_chooser_native_new(_("Save Debug Log"), GTK_WINDOW(win), |
178 dialog = gtk_file_dialog_new(); |
| 183 GTK_FILE_CHOOSER_ACTION_SAVE, |
179 gtk_file_dialog_set_title(dialog, _("Save Debug Log")); |
| 184 _("_Save"), _("_Cancel")); |
180 gtk_file_dialog_set_modal(dialog, TRUE); |
| 185 |
181 gtk_file_dialog_set_initial_name(dialog, "purple-debug.log"); |
| 186 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), |
182 gtk_file_dialog_save(dialog, GTK_WINDOW(win), NULL, |
| 187 "purple-debug.log"); |
183 save_response_cb, win); |
| 188 |
184 g_clear_object(&dialog); |
| 189 g_signal_connect(filesel, "response", G_CALLBACK(save_response_cb), win); |
|
| 190 |
|
| 191 gtk_native_dialog_set_modal(GTK_NATIVE_DIALOG(filesel), TRUE); |
|
| 192 gtk_native_dialog_show(GTK_NATIVE_DIALOG(filesel)); |
|
| 193 } |
185 } |
| 194 |
186 |
| 195 static void |
187 static void |
| 196 clear_cb(G_GNUC_UNUSED GtkWidget *w, PidginDebugWindow *win) |
188 clear_cb(G_GNUC_UNUSED GtkWidget *w, PidginDebugWindow *win) |
| 197 { |
189 { |