динамический массив GTK+

как было предложено другим постом, я задам новый вопрос, более конкретный.

GtkWidget *button[] /*to be a dynamic array */

void file_folder(GtkWidget *widget,  gpointer data)
{
  GtkWidget* dialog;

  dialog = gtk_file_chooser_dialog_new("Choose a file", GTK_WINDOW(data),
          GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK,
          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);

  gtk_widget_show_all(dialog);
  gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "/home/demo/Downloads");
  gint resp = gtk_dialog_run(GTK_DIALOG(dialog));


  if(resp == GTK_RESPONSE_OK)
  {
      /*select file to execute*/
      g_print("Success\n");
      gtk_widget_destroy(dialog);
  }
  else
  {
      gtk_widget_destroy(dialog);
  }

}

Как я могу выполнить выбранный файл

и как я могу создать этот динамический массив, который будет содержать:

имя приложения, значок приложения и исполняемый файл (при условии, что я разрабатываю Ubuntu).


person Barr J    schedule 06.05.2015    source источник
comment
Я бы сказал, что следующим шагом будет напечатать фактическое выбранное имя файла, а не простое "Success", и убедиться, что у вас есть действительная копия перед закрытием диалогового окна.   -  person Weather Vane    schedule 06.05.2015
comment
успех для тестовых проблем, вместо печати файл должен выполняться.   -  person Barr J    schedule 06.05.2015


Ответы (2)


Сначала получите имя выбранного файла, используя gtk_file_chooser_get_filename().

gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));

После получения имени файла вы можете обратиться к этому ответу и использовать fork() и execv() для выполнения файла.

Что касается вашего динамического массива, вам нужно использовать массив пользовательской структуры. Например:

struct my_button {
    const char *app_name;
    GtkWidget *app_icon;
    const char *exec_path;
}

Затем вы можете создать динамический массив struct my_button. Вы можете реализовать это самостоятельно, и я уверен, что вы можете найти множество руководств в Интернете. В качестве альтернативы вы можете использовать GLib (который использует GTK+), и он предоставляет множество динамических структур данных, которые вы можете использовать, например. GArray. Пример:

struct my_button *b = malloc(sizeof *b);
b->app_name = "whatever"; // etc
GArray *arr = g_array_new(TRUE, TRUE, sizeof *b);
g_array_append_vals(arr, b, 1);

Не забудьте освободить используемую память после использования.

Дополнительные сведения о GArray см. в документации.

person user12205    schedule 06.05.2015
comment
Спасибо за быстрый ответ! когда я использую систему, она получает путь и файл, но возвращает отказ в разрешении. - person Barr J; 07.05.2015
comment
@user4702146 user4702146 В терминале введите ls -l /path/to/file, проверьте первый столбец, это должна быть комбинация -, r, w и x. Посмотрите, есть ли x. Если нет, запустите chmod +x /path/to/file в терминале, затем снова запустите вашу программу. - person user12205; 07.05.2015
comment
Я имею в виду, когда я выбираю файл, который хочу запустить, из диалогового окна (пример jpg, png image fop), он выдает отказ в доступе. - person Barr J; 07.05.2015
comment
@user4702146 user4702146 Это потому, что файлы изображений не являются исполняемыми файлами. - person user12205; 07.05.2015

Я нашел свое решение!

execl("/usr/bin/xdg-open", "xdg-open", filename, (char *)0);

exit(1);

сделал работу.

person Barr J    schedule 07.05.2015