PRIVATE JSObjectRef _init_category_table() { JSObjectRef items = json_array_create(); GList* app_infos = g_app_info_get_all(); GList* iter = app_infos; for (gsize i=0, skip=0; iter != NULL; i++, iter = g_list_next(iter)) { GAppInfo* info = iter->data; if (!g_app_info_should_show(info)) { skip++; continue; } record_category_info(G_DESKTOP_APP_INFO(info)); json_array_insert_nobject(items, i - skip, info, g_object_ref, g_object_unref); g_object_unref(info); } g_list_free(app_infos); //the element of GAppInfo should free by JSRunTime not here! return items; }
//TODO: multiple copy, single cut. // or single copy, single cut. void fileops_paste (GFile* dest_dir) { if (copied_files_atom == GDK_NONE) copied_files_atom = gdk_atom_intern ("x-special/gnome-copied-files", FALSE); //TODO: we may not own the clipboard now //cut : move files //use clipboard_info or clipboard_info_tmp FileOpsClipboardInfo* real_info = NULL; //cleanup tmp clipboard info g_debug ("free tmp clipboard info"); __clear_clipboard_info (&clipboard_info_tmp); if (__request_clipboard_contents (&clipboard_info_tmp)) real_info = &clipboard_info_tmp; if (real_info == NULL || real_info->num == 0) return; if (real_info->cut) { fileops_move (real_info->file_list, real_info->num, dest_dir, true); //post messages event paste cancelled or failed. JSObjectRef json = json_array_create(); for (int i = 0; i < real_info->num; i++) { json_array_insert_nobject (json, i, real_info->file_list[i], g_object_ref, g_object_unref); g_debug ("send file: %d : %s", i, g_file_get_uri (real_info->file_list[i])); } js_post_message ("cut_completed", json); gtk_clipboard_clear (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)); g_debug ("free tmp clipboard info"); __clear_clipboard_info (&clipboard_info_tmp); //though maybe we're not the clipboard owner, we still //free clipboard_info here to avoid possible memory leak g_debug ("free clipboard info"); __clear_clipboard_info (&clipboard_info); } else { //copy can be done multiple times. so we should not free real_info; fileops_copy (real_info->file_list, real_info->num, dest_dir); } }
JS_EXPORT_API JSObjectRef desktop_get_desktop_entries() { JSObjectRef array = json_array_create(); GDir* dir = g_dir_open(DESKTOP_DIR(), 0, NULL); const char* file_name = NULL; for (int i=0; NULL != (file_name = g_dir_read_name(dir));) { if(desktop_file_filter(file_name)) continue; char* path = g_build_filename(DESKTOP_DIR(), file_name, NULL); Entry* e = dentry_create_by_path(path); g_free(path); json_array_insert_nobject(array, i++, e, g_object_ref, g_object_unref); g_object_unref(e); } g_dir_close(dir); return array; }
/* * clear clipboard_info_prev, * keep clipboard_info */ static void _clear_clipboard_callback (GtkClipboard *clipboard, gpointer user_data) { g_debug ("_clear_clipboard_callback: begin"); GList* file_list = NULL; g_debug ("prev: num = %d; operation = %s", clipboard_info_prev.num, clipboard_info_prev.cut?"cut":"copy"); if (clipboard_info_prev.cut == FALSE) { if (clipboard_info.cut == TRUE) { for (int i = 0; i < clipboard_info.num; i++) { file_list = g_list_append (file_list, g_object_ref (clipboard_info.file_list[i])); } } } //clipboard_info_prev.cut == TRUE) else if (clipboard_info_prev.num != 0) { file_list = __set_diff_clipboard_info (&clipboard_info, &clipboard_info_prev); } // send message. int i = 0; GList* l = NULL; JSObjectRef json = json_array_create(); for (l = file_list; l != NULL; l = l->next) { json_array_insert_nobject (json, i, l->data, g_object_ref, g_object_unref); g_debug ("send file: %d : %s", i, g_file_get_uri (l->data)); i++; } js_post_message ("cut_completed", json); // g_list_free_full (file_list, g_object_unref); __clear_clipboard_info (&clipboard_info_prev); g_debug ("_clear_clipboard_callback: end"); }