0

I have a statusbar, and I want to have its text being selectable (e.g. copy and pastable), on Linux/Debian, with GTK3 (3.21.5 on Debian/Sid). The label of the statusbar is the label field of its private data, and there is no direct API to access it.

I was able to code (in C99) the following, which is working:

mom_cmdstatusbar = // some global variable
   gtk_statusbar_new (); 
{
  GtkWidget *statmsgarea =
    gtk_statusbar_get_message_area (GTK_STATUSBAR (mom_cmdstatusbar));
  MOM_ASSERTPRINTF (GTK_IS_CONTAINER (statmsgarea), "bad statmsgarea@%p",
                    statmsgarea);
  GList *lischs = gtk_container_get_children (GTK_CONTAINER (statmsgarea));
  for (GList * l = lischs; l != NULL; l = l->next)
    {
      GtkWidget *chwidg = l->data;
      MOM_ASSERTPRINTF (GTK_IS_WIDGET (chwidg), "bad chwidg@%p", chwidg);
      if (GTK_IS_LABEL (chwidg))
        gtk_label_set_selectable (GTK_LABEL(chwidg), true);
    }
  g_list_free (lischs), lischs = NULL;
}

This does work, but is there a better or simpler way to do that? Getting the list of children inside the message area of the GtkStatusbar and testing each of them smells bad. It looks like some GtkWidget* gtk_statusbar_get_label (GtkStatusbar*); function is missing in in the GTK3 API.

PS. FWIW, the code is GPLv3+, on github in file gui.c on commit 58feb1d9473c34aca.. of the expjs branch. More details & motivation about that software project on this & that questions.

Community
  • 1
  • 1
Basile Starynkevitch
  • 223,805
  • 18
  • 296
  • 547

1 Answers1

0

If there's no direct API to access the internal child, then that is probably on purpose, so that the GTK developers can keep their options open to reorganize the internal layout of the widget in future versions.

ptomato
  • 56,175
  • 13
  • 112
  • 165