GTK+ 动态数组

GTK+ dynamic array

正如另一个 post 所建议的,我将提出新问题,更具体的问题。

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 上开发)。

首先使用gtk_file_chooser_get_filename()获取所选文件的文件名。

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

获取文件的文件名后,可以参考this answer,使用fork()execv()执行文件

至于你的动态数组,你需要使用自定义结构的数组。例如:

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

然后就可以创建struct my_button的动态数组了。你可以自己实现这个,我相信你可以在网上找到很多教程。或者,您可以使用 GLib(GTK+ 使用),它提供了许多您可以使用的动态数据结构,例如G阵列。示例:

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 的更多详细信息,请参阅 documentation

我找到了我的解决方案!

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

exit(1);

完成任务。