Пользовательское действие или команда в C с использованием libfm Linux? - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю в настраиваемом действии для pcmanfm, я редактирую файл "main-win.c", здесь код:

static void on_open(GtkAction* act, FmMainWin* win) {
    FmFileInfoList *files = fm_folder_view_dup_selected_files(win->folder_view);
    if (files) {
        GList* l = fm_file_info_list_peek_head_link(files);
        if (g_list_length(l) > 0)
            fm_launch_files_simple(GTK_WINDOW(win), NULL, l, pcmanfm_open_folder, NULL);
        fm_file_info_list_unref(files);
    }
}

"FmFileInfoList * files" Является лисписок ВЫБРАННЫХ ФАЙЛОВ в окне файлового менеджера.

"GList * l" Преобразование списка в двусвязные списки.

функция fm_launch_files_simple () запускает все файлы в связанном списке с программой по умолчанию, например, "gedit /home/someuser/some.txt" или "totem /home/someuser/video.mp4".

Кто мне нужен ?, Мне нужно выполнить пользовательскую команду или функцию во всех ВЫБРАННЫХ ФАЙЛАХ, используя цикл, который запятый?это команда:

fm_launch_command_simple(GTK_WINDOW(win), NULL, 0, "somecommand", NULL);

fm_launch_command_simple () , это функция libfm, которая запускает команду bash в консоли, где исполняется pcmanfm ...

Здесьпример того, кого я хочу сделать, используя функцию " printf ":

static void on_open(GtkAction* act, FmMainWin* win) {
    FmFileInfoList *files = fm_folder_view_dup_selected_files(win->folder_view);
    if (files) {
        //GList* l = fm_file_info_list_peek_head_link(files);
        //if (g_list_length(l) > 0)
            //fm_launch_files_simple(GTK_WINDOW(win), NULL, l, pcmanfm_open_folder, NULL);
        for (file in files) {
            printf("echo File selected: " + file[i]);
        }
        fm_file_info_list_unref(files);
    }
}

Вот другой пример использования функции " fm_launch_command_simple ":

static void on_open(GtkAction* act, FmMainWin* win) {
    FmFileInfoList *files = fm_folder_view_dup_selected_files(win->folder_view);
    if (files) {
        //GList* l = fm_file_info_list_peek_head_link(files);
        //if (g_list_length(l) > 0)
            //fm_launch_files_simple(GTK_WINDOW(win), NULL, l, pcmanfm_open_folder, NULL);
        for (file in files) {
            fm_launch_command_simple(GTK_WINDOW(win), NULL, 0, "echo File selected: " + file[i], NULL);
        }
        fm_file_info_list_unref(files);
    }
}

Я новичок в этом языке программирования.

1 Ответ

0 голосов
/ 05 апреля 2019

Использовать g_list_foreach https://developer.gnome.org/glib/stable/glib-Doubly-Linked-Lists.html#g-list-foreach

Затем вы создаете функцию void (* GFunc) (gpointer listItem, gpointer otherStuffEnteredInGListForeach), которая оборачивает fm_launch_command_simple.

...