2013-08-11 4 views
2

Я не нашел никакой функции * _to_string() для GtkWidgetPath, так как я могу легко изучить ее содержимое, чтобы отладить проблему, которую у меня есть? Печать его текстового представления на консоли будет велика.Есть ли простой способ получить текстовое представление GtkWidgetPath?

ответ

1

Если я вас понимаю правильно, вы хотите поставить что-то вроде

<Widget>#<Name>: <NameOfObject>#<Name> 
    The widget belongs to the following style classes: <listOfClasses> 
    Complete Path: <Path> 

для конкретного виджета на экране.


Я написал следующие две функции, которые выполняют эту работу. Код должен быть легко переводим на другие языки и является самоочевидным, если у вас есть ссылка.

gchar * 
widget_path_get_style_classes (GtkWidgetPath * path) 
{ 
    GSList *list; 
    gchar *str = NULL, *ptr; 

    list = gtk_widget_path_iter_list_classes (path, -1); 

    if (list == NULL) 
     return NULL; 

    do { 

     ptr = str; 
     str = g_strdup_printf (".%s", (gchar *) list->data); 
     str = g_strjoin (", ", str, ptr, NULL); 
     g_free (ptr); 

    } while (list = g_slist_next (list)); 

    g_slist_free(list); 

    return str; 
} 

void 
widget_path_dumper (GtkWidget * widget) 
{ 

    GtkWidgetPath *path; 
    guint i, length; 
    gchar *str; 
    GType type; 

    path = gtk_widget_get_path (widget); 
    length = gtk_widget_path_length (path) - 1; 

    type = gtk_widget_path_iter_get_object_type (path, length); 
    str = (gchar *) gtk_widget_path_iter_get_name (path, length); 

    if (str != NULL) 
     g_print ("<Widget>#<Name>: %s#%s\n", g_type_name (type), str); 
    else 
     g_print("<Widget>: %s\n", g_type_name(type)); 

    str = widget_path_get_style_classes (path); 

    if (str != NULL) { 
     g_print 
      ("\tThe widget belongs to the following style classes: %s\n", str); 
     g_free (str); 
    } 

    g_print ("\tComplete Path: "); 

    for (i = 0; i <= length; i++) { 

     type = gtk_widget_path_iter_get_object_type (path, i); 
     g_print ("/%s", g_type_name (type)); 

    } 

    g_print ("\n"); 
} 

Пример:

Если вы звоните widget_path_dumper на реализованным button1 виджете прикрепленного файла Ui он помещает

<Widget>#<Name>: GtkButton#myspecialbutton 
    The widget belongs to the following style classes: .button 
    Complete Path: /GtkWindow/GtkGrid/GtkFrame/GtkAlignment/GtkButton 

на экране.

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <property name="border_width">10</property> 
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/> 
    <child> 
     <object class="GtkGrid" id="grid1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkFrame" id="frame1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label_xalign">0</property> 
      <property name="shadow_type">out</property> 
      <child> 
       <object class="GtkAlignment" id="alignment1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="margin_right">10</property> 
       <property name="margin_top">10</property> 
       <property name="margin_bottom">10</property> 
       <property name="left_padding">12</property> 
       <child> 
        <object class="GtkButton" id="button1"> 
        <property name="label" translatable="yes">button</property> 
        <property name="name">myspecialbutton</property> 
        <property name="use_action_appearance">False</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="halign">center</property> 
        <property name="valign">center</property> 
        <property name="use_action_appearance">False</property> 
        </object> 
       </child> 
       </object> 
      </child> 
      <child type="label"> 
       <object class="GtkLabel" id="label1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">&lt;b&gt;frame1&lt;/b&gt;</property> 
       <property name="use_markup">True</property> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">1</property> 
      <property name="width">1</property> 
      <property name="height">1</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 
+0

отлично работает спасибо, только nitpick это предупреждение, которое я получаю при компиляции 'helloworld.c: In function 'widget_path_get_style_classes': helloworld.c: 18: 9: warning: format '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'gpointer' [-Wform at] ' – knocte

+0

Я забыл использовать' gpointer' для 'gchar *'. Я обновлю код соответствующим образом. – user1146332

0

Поскольку Gtk v3.2 есть gtk_widget_path_to_string, который может быть использован простой так:

printf("%s\n",gtk_widget_path_to_string (path)); 

.. однако выход не так приятно смотреть по сравнению с предложением user1146332 в

Смежные вопросы