Как я могу установить один элемент Gearmenu нечувствительным? - PullRequest
2 голосов
/ 14 июня 2019

Я хотел установить один элемент редуктора нечувствительным, если испускается сигнал «сбой нагрузки».

struct GActionEntry {
  const gchar *name;

  void (* activate) (GSimpleAction *action,
                     GVariant      *parameter,
                     gpointer       user_data);

  const gchar *parameter_type;

  const gchar *state;

  void (* change_state) (GSimpleAction *action,
                         GVariant      *value,
                         gpointer       user_data);
};

это то, что я нашел (https://developer.gnome.org/gio/stable/GActionMap.html#GActionEntry), и я тоже использовал это так:

const GActionEntry app_actions[] = {
    { "setAsHome", set_clicked , NULL, NULL, NULL, {0, 0, 0} },
  { "about", about_clicked, NULL, NULL, NULL, {0, 0, 0} }
};

Теперь я хотел бы установить set_clicked неактивным, но я не знаю, как это сделать. Я имею в виду, что знаю, как сделать функцию обратного вызова для сигнала «load-fail», но не знаю, как установить его в нем неактивным.

int main (int argc, char **argv)
{
    int status;
      struct widget *w = g_malloc (sizeof (struct widget));
    w->app = gtk_application_new ("org.gtk.dialog", G_APPLICATION_HANDLES_COMMAND_LINE);
    g_signal_connect (w->app, "command-line", G_CALLBACK (activate), (gpointer) w);
    g_action_map_add_action_entries (G_ACTION_MAP (w->app), app_actions,
                     G_N_ELEMENTS (app_actions), (gpointer) w);
    status = g_application_run (G_APPLICATION (w->app), argc, argv);
    g_object_unref (w->app);

    // free the memory for the widgets struct
    g_free (w);
    w = NULL;
    return status;
}
struct widget
{
  GtkApplication *app;
    GtkWidget *window;
  GtkWidget *box;
  GMenu *appmenu;
  GMenu *editmenu;
  GtkWidget *find;
    GtkWidget *back;
    GtkWidget *forward;
    GtkWidget *home;
  GtkWidget *entry;
    GtkWidget *header;
  GMenu *gearmenu;
    GtkWidget *gearmenubutton;
    GtkWidget *gearicon;
    GtkWidget *status;
  WebKitWebView *wv;
  guint id;
  const gchar *url;
  const gchar *homedir;
  gboolean success;
};
// create the gear menu button
      w->gearmenubutton = gtk_menu_button_new();
      w->gearicon = gtk_image_new_from_icon_name ("emblem-system-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
      gtk_button_set_image (GTK_BUTTON (w->gearmenubutton), w->gearicon);
  // create a menu for the gear button
      w->gearmenu = g_menu_new();
      g_menu_append (w->gearmenu, "_Set as Homepage", "app.setAsHome");
      w->editmenu = g_menu_new();
      g_menu_append (w->editmenu, "_About", "app.about");
      g_menu_append_section (w->gearmenu, NULL, G_MENU_MODEL (w->editmenu));
      gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (w->gearmenubutton),
                      G_MENU_MODEL (w->gearmenu));
      g_object_unref (w->editmenu);
      g_object_unref (w->gearmenu);

1 Ответ

0 голосов
/ 15 июня 2019

в обратном вызове при неудачной загрузке необходимо удалить «setAsHome»:

g_action_map_remove_action(G_ACTION_MAP (w->app), "setAsHome"

сигнал сбоя загрузки также подается при сбое, и вы будете перенаправлены на страницу сообщения об ошибке. Имейте в виду, что ваш сигнал изменения нагрузки будет передаваться 2 раза один раз, потому что URL не может быть загружен, а затем загрузить страницу ошибки.

Чтобы снова сделать его «чувствительным», вам нужно снова добавить его в меню.

...