aboutsummaryrefslogtreecommitdiffstats
path: root/sniff
diff options
context:
space:
mode:
Diffstat (limited to 'sniff')
-rw-r--r--sniff/icons/button.xpm29
-rw-r--r--sniff/icons/checkbutton.xpm33
-rw-r--r--sniff/icons/checkmenuitem.xpm28
-rw-r--r--sniff/icons/colorselection.xpm35
-rw-r--r--sniff/icons/combo.xpm34
-rw-r--r--sniff/icons/dialog.xpm38
-rw-r--r--sniff/icons/image.xpm39
-rw-r--r--sniff/icons/label.xpm30
-rw-r--r--sniff/icons/menubar.xpm34
-rw-r--r--sniff/icons/menuitem.xpm26
-rw-r--r--sniff/icons/notebook.xpm33
-rw-r--r--sniff/icons/scrolledwindow.xpm28
-rw-r--r--sniff/icons/spinbutton.xpm33
-rw-r--r--sniff/icons/statusbar.xpm34
-rw-r--r--sniff/icons/table.xpm31
-rw-r--r--sniff/icons/text.xpm32
-rw-r--r--sniff/icons/toolbar.xpm33
-rw-r--r--sniff/icons/tree.xpm34
-rw-r--r--sniff/icons/treeitem.xpm35
-rw-r--r--sniff/icons/unknown.xpm33
-rw-r--r--sniff/icons/viewport.xpm34
-rw-r--r--sniff/icons/vscrollbar.xpm33
-rw-r--r--sniff/icons/vseparator.xpm31
-rw-r--r--sniff/icons/window.xpm38
-rwxr-xr-xsniff/sniff798
-rw-r--r--sniff/sniff.desktop14
-rw-r--r--sniff/sniff.glade676
-rw-r--r--sniff/sniff.ui494
28 files changed, 2770 insertions, 0 deletions
diff --git a/sniff/icons/button.xpm b/sniff/icons/button.xpm
new file mode 100644
index 00000000000..eca4d627957
--- /dev/null
+++ b/sniff/icons/button.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * button_xpm[] = {
+"21 21 5 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+"@ c #D6D6D6",
+"# c #7B7B7B",
+" ",
+" ",
+" ",
+" ..................+ ",
+" .@@@@@@@@@@@@@@@@#+ ",
+" .@@@@@@@@@@@@@@@@#+ ",
+" .@@@@@@@@@@@@@@@@#+ ",
+" .@@@@++@@+@@+@@@@#+ ",
+" .@@@+@@+@+@+@@@@@#+ ",
+" .@@@+@@+@++@@@@@@#+ ",
+" .@@@+@@+@+@+@@@@@#+ ",
+" .@@@+@@+@+@@+@@@@#+ ",
+" .@@@@++@@+@@+@@@@#+ ",
+" .@@@@@@@@@@@@@@@@#+ ",
+" .@@@@@@@@@@@@@@@@#+ ",
+" .@@@@@@@@@@@@@@@@#+ ",
+" .#################+ ",
+" +++++++++++++++++++ ",
+" ",
+" ",
+" "};
diff --git a/sniff/icons/checkbutton.xpm b/sniff/icons/checkbutton.xpm
new file mode 100644
index 00000000000..314ba97ce9c
--- /dev/null
+++ b/sniff/icons/checkbutton.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *checkbutton_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 6 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray100",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++OOOOOOOOOOO+++++",
+"+++++OXXXXXXXXX +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OXXXXXXXX. +++++",
+"+++++OX........ +++++",
+"+++++O +++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++"
+};
diff --git a/sniff/icons/checkmenuitem.xpm b/sniff/icons/checkmenuitem.xpm
new file mode 100644
index 00000000000..197eee36440
--- /dev/null
+++ b/sniff/icons/checkmenuitem.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * checkmenuitem_xpm[] = {
+"21 21 4 1",
+" c None",
+". c #FFFFFF",
+"+ c #7B7B7B",
+"@ c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ........ ",
+" . +@ ",
+" . +@ ",
+" . +@ ",
+" . +@ @ ",
+" . +++++@ @@ ",
+" .@@@@@@@ @@@@ ",
+" @@@@@ ",
+" @@@@ ",
+" @@@ ",
+" @ @ ",
+" @ ",
+" @ ",
+" "};
diff --git a/sniff/icons/colorselection.xpm b/sniff/icons/colorselection.xpm
new file mode 100644
index 00000000000..0bb0914d0c8
--- /dev/null
+++ b/sniff/icons/colorselection.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *colorselection_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 8 1",
+" c Gray0",
+". c #7b7b7b",
+"X c Blue",
+"o c Green",
+"O c Red",
+"+ c #b3cece",
+"@ c Gray100",
+"# c None",
+/* pixels */
+"#####################",
+"#####################",
+"#####################",
+"#####################",
+"#####################",
+"##................###",
+"##.@@@@@@@@@@@@@@. ##",
+"##.@@@@@@@@@@@@@@. ##",
+"##.@@@@@@@@@@@@@@. ##",
+"##.@@OOOoooXXX@@@. ##",
+"##.@@OOOoooXXX@@@. ##",
+"##.@@OOOoooXXX@@@. ##",
+"##.@@OOOoooXXX@@@. ##",
+"##.@@@@@@@@@@@@@@. ##",
+"##.@@@@@@@@@@@@@@. ##",
+"##.@@@@@@@@@@@@@@. ##",
+"##................ ##",
+"### ##",
+"#####################",
+"#####################",
+"#####################"
+};
diff --git a/sniff/icons/combo.xpm b/sniff/icons/combo.xpm
new file mode 100644
index 00000000000..3b4055b6dff
--- /dev/null
+++ b/sniff/icons/combo.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *combo_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 7 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray87",
+"+ c Gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@",
+" ",
+" +++++++++++++ OOOOO ",
+" +++++++++++++ OOO ",
+" +++++++++++++ O ",
+" ",
+" +++++++++++++ ++++++",
+" +++++++++++++ XXXXX ",
+" +.........+++ XX XX ",
+" +++++++++++++ X X ",
+" +++++++++++++ XXXXX ",
+" +...........+ ",
+" +++++++++++++ +++++ ",
+" +++++++++++++ +XXXX ",
+" +..........++ ..... ",
+" +++++++++++++ +++++ ",
+" +++++++++++++ XXXXX ",
+" +...........+ X X ",
+" +++++++++++++ XX XX ",
+" +++++++++++++ XXXXX ",
+" "
+};
diff --git a/sniff/icons/dialog.xpm b/sniff/icons/dialog.xpm
new file mode 100644
index 00000000000..00473b653ee
--- /dev/null
+++ b/sniff/icons/dialog.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *dialog_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 11 1",
+" c Gray0",
+". c #00007b",
+"X c #7b7b7b",
+"o c Green",
+"O c Cyan",
+"+ c Red",
+"@ c Yellow",
+"# c #d6d6d6",
+"$ c #b3cece",
+"% c Gray100",
+"& c None",
+/* pixels */
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&XXXXXXXXXXXXXXXX&&&",
+"&&X.+@............ &&",
+"&&X.Oo.%%%....# # &&",
+"&&XXXXXXXXXXXXXXXX &&",
+"&&X%%%%%%%%%%%%%%X &&",
+"&&X%%%%%%%%%%%%%%X &&",
+"&&X%%X%XX%XX%XX%%X &&",
+"&&X%%%%%%%%%%%%%%X &&",
+"&&X%%%%%%%%%%%%%%X &&",
+"&&X%%%XXX%%XXX%%%X &&",
+"&&X%%%X %%X %%%X &&",
+"&&X%%%%%%%%%%%%%%X &&",
+"&&XXXXXXXXXXXXXXXX &&",
+"&&& &&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&"
+};
diff --git a/sniff/icons/image.xpm b/sniff/icons/image.xpm
new file mode 100644
index 00000000000..9f353cc4c79
--- /dev/null
+++ b/sniff/icons/image.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *image_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 12 1",
+" c Gray0",
+". c #007b00",
+"X c #7b7b7b",
+"o c Blue",
+"O c Green",
+"+ c Cyan",
+"@ c Yellow",
+"# c #d6d6d6",
+"$ c #b3cece",
+"% c Gray87",
+"& c Gray100",
+"* c None",
+/* pixels */
+"*********************",
+"*********************",
+"*********************",
+"* ",
+"* +++++%%%&+++++++++ ",
+"* +&&&++%%++&+++XX++ ",
+"* +++++++%+++++X@@X+ ",
+"* ++&&++++XX+++X@@X+ ",
+"* +++++++ XXX&++XX++ ",
+"* &+++++XXXXXX++++&+ ",
+"* +++++ +++++ ",
+"* +++++ ###### +++++ ",
+"* +++++ #o##o# +++++ ",
+"* ..... ###### ..... ",
+"* OOOOO ##oo## OOOOO ",
+"* OOOOO ##oo## OOOOO ",
+"* OOOOO OOOOO ",
+"* OOOOOOOOOOOOOOOOOO ",
+"* ",
+"*********************",
+"*********************"
+};
diff --git a/sniff/icons/label.xpm b/sniff/icons/label.xpm
new file mode 100644
index 00000000000..013e13a9632
--- /dev/null
+++ b/sniff/icons/label.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *label_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 3 1",
+" c Gray0",
+". c #b3cece",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXX XXXXXXXXX",
+"XXXXXXXXX XXXXXXXXX",
+"XXXXXXXXX XXXXXXXXX",
+"XXXXXXXX XXXXXXXX",
+"XXXXXXXX XXXXXXXX",
+"XXXXXXXX XXXXXXX",
+"XXXXXXX X XXXXXXX",
+"XXXXXXX X XXXXXX",
+"XXXXXX XX XXXXXX",
+"XXXXXX XXXXX",
+"XXXXX XXXXX",
+"XXXXX XXXXX XXXXX",
+"XXXX XXXXX XXXX",
+"XXX XXXXX XXX",
+"XXX XXX XXX",
+"XXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/sniff/icons/menubar.xpm b/sniff/icons/menubar.xpm
new file mode 100644
index 00000000000..85454839915
--- /dev/null
+++ b/sniff/icons/menubar.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *menubar_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 7 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray87",
+"+ c Gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@",
+"@+++++++++++++++++++ ",
+"@+XXXXXXXXXXXXXXXXX. ",
+"@+XOOOO.OOOO.OOOO.X. ",
+"@+XOXXX.OXXX.OXXX.X. ",
+"@+XOXXX.OXXX.OXXX.X. ",
+"@+X+++++++...O....X. ",
+"@+X+OOOOOO.XXXXXXXX. ",
+"@+.+O....O.......... ",
+"@ +OOOOOO. ",
+"@@@+O....O. @@@@@@@@@",
+"@@@+OOOOOO. @@@@@@@@@",
+"@@@+O....O. @@@@@@@@@",
+"@@@+OOOOOO. @@@@@@@@@",
+"@@@+O....O. @@@@@@@@@",
+"@@@+OOOOOO. @@@@@@@@@",
+"@@@+....... @@@@@@@@@",
+"@@@@ @@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/sniff/icons/menuitem.xpm b/sniff/icons/menuitem.xpm
new file mode 100644
index 00000000000..a1da3fa388e
--- /dev/null
+++ b/sniff/icons/menuitem.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * menuitem_xpm[] = {
+"21 21 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . ",
+" .. ",
+" .... ",
+" ..... ",
+" .... ",
+" ... ",
+" . . ",
+" . ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/sniff/icons/notebook.xpm b/sniff/icons/notebook.xpm
new file mode 100644
index 00000000000..77ac20d6cb0
--- /dev/null
+++ b/sniff/icons/notebook.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *notebook_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 6 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray100",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+OOOOOO.OOOO.OOOO.+++",
+"+OXXXXX.X.X..X.X..+++",
+"+OXXXXX..X.X..X.X.+++",
+"+OXXXXX.X.X..X.X..+++",
+"+OXXXXX.OOOOOOOOOOO +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+OXXXXXXXXXXXXXXXX. +",
+"+O................. +",
+"+ +",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++"
+};
diff --git a/sniff/icons/scrolledwindow.xpm b/sniff/icons/scrolledwindow.xpm
new file mode 100644
index 00000000000..da9951a0ae9
--- /dev/null
+++ b/sniff/icons/scrolledwindow.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * scrolledwindow_xpm[] = {
+"21 21 4 1",
+" c None",
+". c #FFFFFF",
+"+ c #D6D6D6",
+"@ c #000000",
+".....................",
+".+++++++++++++.+++++@",
+".+++++++++++++.++@++@",
+".+++++++++++++.+@@@+@",
+".+++++++++++++.+++++@",
+".+++++++++++++.@@@@@@",
+".+++++++++++++......@",
+".+++++++++++++..++++@",
+".+++++++++++++..++++@",
+".+++++++++++++......@",
+".+++++++++++++.+++++@",
+".+++++++++++++.+@@@+@",
+".+++++++++++++.++@++@",
+".+++++++++++++.+++++@",
+"...............@@@@@@",
+".++++@...@++++@++++++",
+".++@+@.++@+@++@++++++",
+".+@@+@.++@+@@+@++++++",
+".++@+@.++@+@++@++++++",
+".++++@.++@++++@++++++",
+".@@@@@@@@@@@@@@++++++"};
diff --git a/sniff/icons/spinbutton.xpm b/sniff/icons/spinbutton.xpm
new file mode 100644
index 00000000000..f3a313b19dc
--- /dev/null
+++ b/sniff/icons/spinbutton.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *spinbutton_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 6 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray100",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+ +",
+"+ OOOOOOOOOOO OOOOO +",
+"+ OOOOOOOOOOO OX X. +",
+"+ OOOOOOOOOOO O . +",
+"+ OOOOOOOOOOO OOOOO +",
+"+ OOOOOOOOOOO O . +",
+"+ OOOOOOOOOOO OX X. +",
+"+ OOOOOOOOOOO ..... +",
+"+ +",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++"
+};
diff --git a/sniff/icons/statusbar.xpm b/sniff/icons/statusbar.xpm
new file mode 100644
index 00000000000..8576d88c6ad
--- /dev/null
+++ b/sniff/icons/statusbar.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *statusbar_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 7 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray87",
+"+ c Gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@+XX.@@@@@@@@@@@@@@",
+"@@@+XX.@@@@@@@@@@@@@@",
+"@@@+XX.@@@@@@@@@@@@@@",
+"@@@+XX.@@@@@@@@@@@@@@",
+"@@@+XX++++++++++++@@@",
+"@@@+XXXXXXXXXXXXXX@@@",
+"@@@+XXXXXXXXXXXXXX@@@",
+"@@@+XX............@@@",
+"@@@+XX.OOOOOOOOOOO@@@",
+"@@@+XX.OOOOOOOOOOO@@@",
+"@@@+XX.OOOOOOOOOOO@@@",
+"@@@+XX++++++++++++@@@",
+"@@@+XXXXXXXXXXXXXX@@@",
+"@@@+XXXXXXXXXXXXXX@@@",
+"@@@ @@@",
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/sniff/icons/table.xpm b/sniff/icons/table.xpm
new file mode 100644
index 00000000000..c04dce03d01
--- /dev/null
+++ b/sniff/icons/table.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *table_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 4 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c Gray100",
+/* pixels */
+"oooooooooo ooooooooo ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"o......... o........ ",
+" ",
+"oooooooooo ooooooooo ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"o......... o........ ",
+" ",
+"oooooooooo ooooooooo ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"oXXXXXXXX. oXXXXXXX. ",
+"o......... o........ ",
+" "
+};
diff --git a/sniff/icons/text.xpm b/sniff/icons/text.xpm
new file mode 100644
index 00000000000..bd143ef9ef9
--- /dev/null
+++ b/sniff/icons/text.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *text_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 5 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c Gray87",
+"O c Gray100",
+/* pixels */
+"....................O",
+". XO",
+". OOOOOOOOOOOOOOOOOXO",
+". OOOOOOO OOOOOOOOOXO",
+". OOOOOOO OOOOOOOOOXO",
+". OO OO o OOo OXO",
+". O.OOO O Oo O Oo XO",
+". OO O OOO O OOOXO",
+". O OOO O OOO O OOOXO",
+". O OOO O OOo O Oo XO",
+". OO O OOo OXO",
+". OOOOOOOOOOOOOOOOOXO",
+". OOOOO OOOOOOOOO XO",
+". OOOOO OO OOO oOXO",
+". OO O oOo OO OOXO",
+". O oOo O oOO O OXO",
+". O OOO O OOO OOXO",
+". O oOo O OOO.OO OOXO",
+". OO OO OOO OOXO",
+".XXXXXXXXXXXXXXXXXXXO",
+"OOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/sniff/icons/toolbar.xpm b/sniff/icons/toolbar.xpm
new file mode 100644
index 00000000000..d9a5217161e
--- /dev/null
+++ b/sniff/icons/toolbar.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *toolbar_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 6 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray100",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+OOOOOOOOOOOOOOOOOOO ",
+"+OXXXXXXXXXXXXXXXXX. ",
+"+OXOOOO OOOO OOOO X. ",
+"+OXOXXX OXXX OXXX X. ",
+"+OXOXXX OXXX OXXX X. ",
+"+OXO O O X. ",
+"+OXXXXXXXXXXXXXXXXX. ",
+"+O.................. ",
+"+ ",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++"
+};
diff --git a/sniff/icons/tree.xpm b/sniff/icons/tree.xpm
new file mode 100644
index 00000000000..0a15524b870
--- /dev/null
+++ b/sniff/icons/tree.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *tree_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 7 1",
+" c Gray0",
+". c #7b7b7b",
+"X c Green",
+"o c Cyan",
+"O c Yellow",
+"+ c #b3cece",
+"@ c None",
+/* pixels */
+"@ @@@@@@@@@@@@@@@@@",
+"@ o @......@@@@@@@@@@",
+"@ @@@@@@@@@@@@@@@@@",
+"@@ @@@@@@@@@@@@@@@@@@",
+"@@ @@ @@@@@@@@@@@@@",
+"@@ O @......@@@@@@",
+"@@ @@ @@@@@@@@@@@@@",
+"@@ @@@ @@@@@@@@@@@@@@",
+"@@ @@@ @@ @@@@@@@@@",
+"@@ @@@ X @......@@",
+"@@ @@@ @@ @@@@@@@@@",
+"@@ @@@ @@@@@@@@@@@@@@",
+"@@ @@@ @@ @@@@@@@@@",
+"@@ @@@ X @......@@",
+"@@ @@@@@@ @@@@@@@@@",
+"@@ @@@@@@@@@@@@@@@@@@",
+"@@ @@ @@@@@@@@@@@@@",
+"@@ O @......@@@@@@",
+"@@@@@ @@@@@@@@@@@@@",
+"@@@@@@ @@@@@@@@@@@@@@",
+"@@@@@@ @@@@@@@@@@@@@@"
+};
diff --git a/sniff/icons/treeitem.xpm b/sniff/icons/treeitem.xpm
new file mode 100644
index 00000000000..2c0bf836970
--- /dev/null
+++ b/sniff/icons/treeitem.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *treeitem_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 8 1",
+" c Gray0",
+". c #7b7b7b",
+"X c Red",
+"o c Yellow",
+"O c #b3cece",
+"+ c Gray87",
+"@ c Gray100",
+"# c None",
+/* pixels */
+"#####################",
+"#####################",
+"#####################",
+"###...###############",
+"## .@ #+++++#########",
+"### ###############",
+"#### ################",
+"#### #...############",
+"#### .o #XXXXXXX####",
+"#### # #XXXXXXX####",
+"#### ################",
+"#### #...############",
+"#### .@ #+++++######",
+"#### # ############",
+"#### ## #############",
+"#### ## #...#########",
+"#### ## .o #+++++###",
+"#### #### #########",
+"#####################",
+"#####################",
+"#####################"
+};
diff --git a/sniff/icons/unknown.xpm b/sniff/icons/unknown.xpm
new file mode 100644
index 00000000000..7ce9bce5738
--- /dev/null
+++ b/sniff/icons/unknown.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *unknown_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 6 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray100",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++",
+"+++++++++++++++++++++",
+"++OOOOOOOOOOOOOOOO ++",
+"++OXXXXXXXXXXXXXX. ++",
+"++OXXXXX XXXXXX. ++",
+"++OXXXX XXXXX. ++",
+"++OXXX X XXXX. ++",
+"++OXXX XXX XXXX. ++",
+"++OXXXXXXX XXXX. ++",
+"++OXXXXXX XXXXX. ++",
+"++OXXXXXX XXXXXX. ++",
+"++OXXXXXX XXXXXX. ++",
+"++OXXXXXX XXXXXX. ++",
+"++OXXXXXXXXXXXXXX. ++",
+"++OXXXXXX XXXXXX. ++",
+"++OXXXXXX XXXXXX. ++",
+"++OXXXXXXXXXXXXXX. ++",
+"++O............... ++",
+"++ ++",
+"+++++++++++++++++++++",
+"+++++++++++++++++++++"
+};
diff --git a/sniff/icons/viewport.xpm b/sniff/icons/viewport.xpm
new file mode 100644
index 00000000000..71e5e80cf58
--- /dev/null
+++ b/sniff/icons/viewport.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *viewport_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 7 1",
+" c Gray0",
+". c #7b7b7b",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray87",
+"+ c Gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@",
+"@...................@",
+"@. +O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@. XXXXXXXXXXXXXXX+O@",
+"@.+++++++++++++++++O@",
+"@.OOOOOOOOOOOOOOOOOO@",
+"@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/sniff/icons/vscrollbar.xpm b/sniff/icons/vscrollbar.xpm
new file mode 100644
index 00000000000..0e902b1e7da
--- /dev/null
+++ b/sniff/icons/vscrollbar.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *vscrollbar_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"20 21 6 1",
+" c Gray0",
+". c Gray61",
+"X c #d6d6d6",
+"o c #b3cece",
+"O c Gray100",
+"+ c None",
+/* pixels */
+"++++++ +++++",
+"++++++ ...O...O+++++",
+"++++++ ..OX ..O+++++",
+"++++++ .OXXX .O+++++",
+"++++++ OXXXXX O+++++",
+"++++++ O+++++",
+"++++++ .......O+++++",
+"++++++ OOOOOO O+++++",
+"++++++ OXXXXX O+++++",
+"++++++ OXXXXX O+++++",
+"++++++ OXXXXX O+++++",
+"++++++ OXXXXX O+++++",
+"++++++ OXXXXX O+++++",
+"++++++ O O+++++",
+"++++++ .......O+++++",
+"++++++ OOOOOOOO+++++",
+"++++++ OXXXXX O+++++",
+"++++++ .OXXX .O+++++",
+"++++++ ..OX ..O+++++",
+"++++++ ... ...O+++++",
+"++++++OOOOOOOOO+++++"
+};
diff --git a/sniff/icons/vseparator.xpm b/sniff/icons/vseparator.xpm
new file mode 100644
index 00000000000..3455f74d93b
--- /dev/null
+++ b/sniff/icons/vseparator.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *vseparator_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 4 1",
+" c #7b7b7b",
+". c #b3cece",
+"X c Gray100",
+"o c None",
+/* pixels */
+"ooooooooooooooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"oooooooooo Xooooooooo",
+"ooooooooooooooooooooo"
+};
diff --git a/sniff/icons/window.xpm b/sniff/icons/window.xpm
new file mode 100644
index 00000000000..8407e2836a5
--- /dev/null
+++ b/sniff/icons/window.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *window_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"21 21 11 1",
+" c Gray0",
+". c #00007b",
+"X c #7b7b7b",
+"o c Green",
+"O c Cyan",
+"+ c Red",
+"@ c Yellow",
+"# c #d6d6d6",
+"$ c #b3cece",
+"% c Gray100",
+"& c None",
+/* pixels */
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&",
+"XXXXXXXXXXXXXXXXXXXX&",
+"X.+@...............X ",
+"X.Oo.%%%.%%.....# #X ",
+"XXXXXXXXXXXXXXXXXXXX ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"X#%%%%%%%%%%%%%%%%%X ",
+"XXXXXXXXXXXXXXXXXXXX ",
+"& ",
+"&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&&&&&&"
+};
diff --git a/sniff/sniff b/sniff/sniff
new file mode 100755
index 00000000000..48949003aec
--- /dev/null
+++ b/sniff/sniff
@@ -0,0 +1,798 @@
+#!/usr/bin/env python
+# -*- coding: UTF8 -*-
+"""
+http://en.wikipedia.org/wiki/Model-view-controller
+
+The SniffApp class sets up all of sniff's widgets.
+
+Data storage is handled by the SniffModel class.
+There is no SniffView class; we just use a GtkTreeView.
+Data display is handled by the SniffController class.
+"""
+import gi
+gi.require_version('Gtk', '3.0')
+gi.require_version('Gdk', '3.0')
+import sys
+from dogtail.config import config
+
+if config.checkForA11y:
+ from dogtail.utils import checkForA11yInteractively
+ checkForA11yInteractively()
+
+config.logDebugToFile = False
+config.childrenLimit = 100000
+
+import pyatspi
+import Accessibility
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import Gio
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
+from gi.repository import GLib
+
+builder = Gtk.Builder()
+
+
+class SniffApp(object):
+ appName = 'Sniff'
+ appAuthors = ['Zack Cerza <zcerza@redhat.com>',
+ 'David Malcolm <dmalcolm@redhat.com']
+
+ def __init__(self):
+ self.builder = builder
+ import os
+ if os.path.exists('sniff.ui'):
+ self.builder.add_from_file('sniff.ui')
+ else:
+ import os
+ path = os.path.abspath(
+ os.path.join(__file__, os.path.pardir, os.path.pardir))
+ if path is '/': # in case the path is /bin/sniff
+ path = '/usr'
+ self.builder.add_from_file(path +
+ '/share/dogtail/glade/sniff.ui')
+ self.app = self.builder.get_object(self.appName)
+ try:
+ self.app.set_icon_from_file('../icons/dogtail-head.svg')
+ except Exception:
+ import os
+ path = os.path.abspath(
+ os.path.join(__file__, os.path.pardir, os.path.pardir))
+ if path is '/':
+ path = '/usr'
+ self.app.set_icon_from_file(os.path.join(path,
+ 'share/icons/hicolor/scalable/apps/dogtail-head.svg'))
+ self.setUpWidgets()
+ self.connectSignals()
+ self.app.show_all()
+ Gtk.main()
+
+ def setUpWidgets(self):
+ self.quit1 = self.builder.get_object('quit1')
+ self.expand_all1 = self.builder.get_object('expand_all1')
+ self.collapse_all1 = self.builder.get_object('collapse_all1')
+ self.about1 = self.builder.get_object('about1')
+ self.refreshMenuItem = self.builder.get_object('refresh1')
+ self.autoRefreshMenuItem = self.builder.get_object('autorefresh')
+ self.setRootMenuItem = self.builder.get_object('setRootMenuItem')
+ self.unsetRootMenuItem = self.builder.get_object('unsetRootMenuItem')
+ self.about = None
+
+ self.tree = SniffController()
+
+ def connectSignals(self):
+ self.app.connect('delete_event', self.quit, self)
+ self.quit1.connect('activate', self.quit, self)
+ self.expand_all1.connect('activate', self.tree.expandAll, True)
+ self.collapse_all1.connect('activate', self.tree.expandAll, False)
+ self.about1.connect('activate', self.showAbout, self)
+ self.refreshMenuItem.connect('activate', self.tree.refresh)
+ self.autoRefreshMenuItem.connect(
+ 'toggled', self.tree.toggleAutoRefresh)
+ self.setRootMenuItem.connect('activate', self.tree.changeRoot, True)
+ self.unsetRootMenuItem.connect('activate', self.tree.changeRoot, False)
+
+ self.setStartupAutoRefresh()
+
+ def setStartupAutoRefresh(self):
+ import os
+ if not os.path.exists('/tmp/sniff_refresh.lock'):
+ self.autoRefreshMenuItem.set_active(True)
+
+ def showAbout(self, *args):
+ if not self.about:
+ self.about = Gtk.AboutDialog()
+ self.about.set_name(self.appName)
+ self.about.set_authors(self.appAuthors)
+ self.about.set_comments('Explore your desktop with Dogtail')
+ self.about.set_website('http://people.redhat.com/zcerza/dogtail/')
+ self.about.connect("response", self.hideAbout)
+ self.about.show_all()
+
+ def hideAbout(self, window, response):
+ if response == Gtk.ResponseType.CANCEL:
+ window.hide()
+
+ def quit(self, *args):
+ Gtk.main_quit()
+
+
+class SniffController(object):
+ invalidBufferCallbackID = None
+
+ def __init__(self):
+ self.builder = builder
+ self.nameTextLabel = self.builder.get_object('nameTextLabel')
+ self.nameTextLabel.set_text('')
+ self.roleNameTextLabel = self.builder.get_object('roleNameTextLabel')
+ self.roleNameTextLabel.set_text('')
+ self.descTextLabel = self.builder.get_object('descTextLabel')
+ self.descTextLabel.set_text('')
+ self.actionsTextLabel = self.builder.get_object('actionsTextLabel')
+ self.actionsTextLabel.set_text('')
+ self.textTextView = self.builder.get_object('textTextView')
+ self.textTextViewBufferCallbackID = self.invalidBufferCallbackID
+ self.textTextView.set_sensitive(False)
+ self.textTextView.get_buffer().set_text('')
+ self.labelerButton = self.builder.get_object('labelerButton')
+ self.labelerButton.set_sensitive(False)
+ self.labeleeButton = self.builder.get_object('labeleeButton')
+ self.labeleeButton.set_sensitive(False)
+ self.stateView = self.builder.get_object('stateTreeView')
+ self.highlight1 = self.builder.get_object('highlight1')
+ self.autorefresh = self.builder.get_object('autorefresh')
+ self.stateModel = StateModel()
+ self.setUpStateView()
+ self.treeView = self.builder.get_object('treeTreeView')
+ self.treeSelection = self.treeView.get_selection()
+ self.treeModel = SniffModel()
+ self.setUpTreeView()
+ self.connectSignals()
+ self.refresh()
+
+ def setUpStateView(self):
+ self.stateView.set_model(self.stateModel)
+ cellRenderer = Gtk.CellRendererText()
+ col = Gtk.TreeViewColumn('Present States', cellRenderer,
+ text=self.stateModel.stateColumn)
+ col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
+ self.stateView.insert_column(col, -1)
+
+ def setUpTreeView(self):
+ self.treeView.set_enable_tree_lines(True)
+
+ self.treeView.set_model(self.treeModel)
+
+ col = Gtk.TreeViewColumn()
+ cellRenderer = Gtk.CellRendererPixbuf()
+ col.pack_start(cellRenderer, expand=False)
+ col.add_attribute(cellRenderer, 'pixbuf', self.treeModel.pixbufColumn)
+
+ cellRenderer = Gtk.CellRendererText()
+ col.pack_end(cellRenderer, expand=False)
+ col.add_attribute(cellRenderer, 'text', self.treeModel.nameColumn)
+
+ col.set_title('Name')
+
+ self.treeView.insert_column(col, -1)
+
+ for column in self.treeView.get_columns():
+ column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
+ column.set_resizable(True)
+ self.treeView.show()
+ path = 0
+ self.treeView.expand_all()
+ #self.rowExpanded(self.treeView, self.treeModel.get_iter(path), path)
+
+ def changeRoot(self, menuItem, toSelected=True, *args):
+ if toSelected:
+ node = self.getSelectedNode()
+ if toSelected and node:
+ self.treeModel.changeRoot(node)
+ elif not toSelected:
+ self.treeModel.reset()
+ else:
+ return
+ self.refresh(refreshModel=False)
+
+ def refresh(self, menuItem=None, refreshModel=True, *args):
+ if refreshModel:
+ self.treeModel.refresh()
+ rootPath = self.treeModel.get_path(self.treeModel.get_iter_first())
+ self.treeView.expand_all()
+ self.treeView.expand_row(rootPath, False)
+
+ def toggleAutoRefresh(self, *args):
+ if self.autorefresh.get_active() is True:
+ pyatspi.Registry.registerEventListener(self.treeModel.nodeChanged,
+ 'object:children-changed')
+ pyatspi.Registry.registerEventListener(self.treeModel.nodeChanged,
+ 'object:property-change:accessible-name')
+ pyatspi.Registry.registerEventListener(self.treeModel.nodeChanged,
+ 'object:property-change:accessible-state')
+ pyatspi.Registry.registerEventListener(self.treeModel.nodeChanged,
+ 'object:state-changed')
+ self.refresh()
+ else:
+ pyatspi.Registry.deregisterEventListener(
+ self.treeModel.nodeChanged,
+ 'object:children-changed')
+ pyatspi.Registry.deregisterEventListener(
+ self.treeModel.nodeChanged,
+ 'object:property-change:accessible-name')
+ pyatspi.Registry.deregisterEventListener(
+ self.treeModel.nodeChanged,
+ 'object:property-change:accessible-state')
+ pyatspi.Registry.deregisterEventListener(
+ self.treeModel.nodeChanged,
+ 'object:state-changed')
+
+ def connectSignals(self):
+ self.labelerButton.connect('clicked', self.showRelationTarget,
+ 'labeler')
+ self.labeleeButton.connect('clicked', self.showRelationTarget,
+ 'labelee')
+ self.treeView.connect('button-press-event', self.buttonPress)
+ self.treeView.connect('key-press-event', self.keyPress)
+ self.treeView.connect('row-expanded', self.rowExpanded, self.treeModel)
+ self.treeView.connect('row-collapsed', self.rowCollapsed)
+ self.treeSelection.connect('changed', self.selectionChanged)
+ self.refresh()
+
+ def selectionChanged(self, treeSelection):
+ node = self.getSelectedNode()
+ if node:
+ self.setUpBottomPane(node)
+ if self.highlight1.get_active() is True:
+ node.blink()
+
+ def getSelectedNode(self):
+ (store, iter) = self.treeView.get_selection().get_selected()
+ if not iter:
+ node = None
+ else:
+ node = self.treeModel.getNode(iter)
+ return node
+
+ def expandAll(self, widget, *args):
+ if args[0] == True:
+ self.treeView.expand_all()
+ elif args[0] == False:
+ self.treeView.collapse_all()
+
+ def rowExpanded(self, treeview, iter, path, *userParams):
+ row = self.treeModel[path]
+ childRows = row.iterchildren()
+ while True:
+ try:
+ childRow = childRows.next()
+ self.treeModel.populateChildren(childRow.iter)
+ except StopIteration:
+ break
+
+ def rowCollapsed(self, treeview, iter, path, *userParams):
+ row = self.treeModel[path]
+ childRows = row.iterchildren()
+ try:
+ while True:
+ childRow = childRows.next()
+ grandChildRows = childRow.iterchildren()
+ try:
+ while True:
+ grandChildRow = grandChildRows.next()
+ self.treeModel.remove(grandChildRow.iter)
+ except StopIteration:
+ pass
+ except StopIteration:
+ pass
+
+ def menuItemActivate(self, menuItem, *userParams):
+ if len(userParams) < 2:
+ return
+ method = userParams[0]
+ arg = userParams[1]
+ method(arg)
+
+ def keyPress(self, widget, event, *userParams):
+ if event.keyval == Gdk.KEY_Return:
+ path = self.treeSelection.get_selected_rows()[1][0]
+ if self.treeView.row_expanded(path):
+ self.treeView.collapse_row(path)
+ else:
+ self.treeView.expand_row(path, False)
+ return False
+
+ def buttonPress(self, widget, event, *userParams):
+ try:
+ path, treeViewCol, relX, relY = \
+ self.treeView.get_path_at_pos(int(event.x),
+ int(event.y))
+ except TypeError:
+ return
+ node = self.treeModel.getNode(self.treeModel.get_iter(path))
+ if node == None:
+ return
+
+ if event.button == 3:
+ self.menu = Gtk.Menu()
+ menuItem = None
+ if node.actions:
+ for action in node.actions.keys():
+ menuItem = Gtk.MenuItem(action.capitalize())
+ menuItem.connect(
+ 'activate', self.menuItemActivate, node.doActionNamed, action)
+ menuItem.show()
+ self.menu.append(menuItem)
+ if not menuItem:
+ return
+ self.menu.show_all()
+ self.menu.popup(None, None, None, None, event.button, event.time)
+
+ def showRelationTarget(self, button, relation, *args):
+ target = getattr(self.getSelectedNode(), relation)
+ if not target:
+ return
+ try:
+ target.blink()
+ except:
+ import traceback
+ traceback.print_exc()
+
+ def setUpBottomPane(self, node):
+ """Generic code for setting up the table under the TreeView"""
+ if node == None:
+ return
+ self.nameTextLabel.set_text(node.name)
+ self.roleNameTextLabel.set_text(node.roleName)
+ self.descTextLabel.set_text(node.description)
+ str = ''
+ if node.actions:
+ str = ' '.join(node.actions.keys())
+ self.actionsTextLabel.set_text(str)
+
+ # Have we connected this signal yet?
+ # If so, disconnect it before proceeding.
+ if self.textTextViewBufferCallbackID != self.invalidBufferCallbackID:
+ self.textTextView.get_buffer().disconnect(
+ self.textTextViewBufferCallbackID)
+ self.textTextViewBufferCallbackID = self.invalidBufferCallbackID
+
+ if node.text is not None:
+ buffer = self.textTextView.get_buffer()
+ buffer.set_text(node.text)
+ try:
+ node.queryEditableText()
+ # Remember the handler ID of this connection.
+ self.textTextView.set_sensitive(True)
+ self.textTextViewBufferCallbackID = \
+ buffer.connect('changed', self.changeText, node)
+ except NotImplementedError:
+ self.textTextView.set_sensitive(False)
+ else:
+ self.textTextView.get_buffer().set_text('')
+ self.textTextView.set_sensitive(False)
+
+ if node.labeler and not node.labeler.dead:
+ self.labelerButton.set_sensitive(True)
+ self.labelerButton.show()
+ # elif node.labeler and node.labeler.dead:
+ # print "labeler is dead", node.labeler
+ else:
+ self.labelerButton.set_sensitive(False)
+ self.labelerButton.hide()
+ if node.labelee and not node.labelee.dead:
+ self.labeleeButton.set_sensitive(True)
+ self.labeleeButton.show()
+ # elif node.labelee and node.labelee.dead:
+ # print "labelee is dead", node.labelee
+ else:
+ self.labeleeButton.set_sensitive(False)
+ self.labeleeButton.hide()
+
+ self.stateModel.setNode(node)
+
+ def changeText(self, textBuffer, node):
+ if node == None:
+ return
+ node.text = textBuffer.get_text(textBuffer.get_start_iter(),
+ textBuffer.get_end_iter())
+
+
+class SniffModel(Gtk.TreeStore):
+ nodeColumn = 0
+ nameColumn = 1
+ pixbufColumn = 2
+ eventQueue = []
+ cache = {}
+
+ def __init__(self):
+ self.builder = builder
+ #self.autorefresh = self.builder.get_object('autorefresh')
+ Gtk.TreeStore.__init__(self, GObject.TYPE_PYOBJECT,
+ GObject.TYPE_STRING, GdkPixbuf.Pixbuf)
+ root = pyatspi.Registry.getDesktop(0)
+ self.rootNode = self.initialRootNode = root
+ self.appendAndPopulate(None, self.rootNode)
+
+ def __contains__(self, item):
+ from dogtail.tree import Node
+ if isinstance(item, Node):
+ if item in self.cache:
+ row = self.cache[item]
+ # If row is None, we need to call getPath() to be sure
+ if not row:
+ path = self.getPath(item)
+ return path is not None
+ elif row in self:
+ return True
+ return False
+ elif isinstance(item, Gtk.TreeIter):
+ return self.iter_is_valid(item)
+ elif isinstance(item, list) or isinstance(item, tuple):
+ try:
+ iter = self.get_iter(item)
+ except ValueError:
+ return False
+ return iter in self
+ elif isinstance(item, Gtk.TreeRowReference):
+ return item.valid() and item.get_path() in self
+ else:
+ raise TypeError
+
+ def changeRoot(self, node):
+ self.rootNode = node
+ self.refresh()
+
+ def reset(self):
+ self.rootNode = self.initialRootNode
+ self.refresh()
+
+ def refresh(self):
+ self.cache.clear()
+ self.clear()
+ self.appendAndPopulate(None, self.rootNode)
+
+ def append(self, parentIter, node):
+ if node:
+ self.cache[node] = None
+ pb = self.getPixbufForNode(node)
+ return Gtk.TreeStore.append(self, parentIter, (node, node.name, pb))
+
+ def remove(self, iter):
+ node = self.getNode(iter)
+ try:
+ del self.cache[node]
+ finally:
+ return Gtk.TreeStore.remove(self, iter)
+
+ def populateChildren(self, iter):
+ if not iter in self:
+ return False
+ result = True
+ node = self.getNode(iter)
+ try:
+ for child in node.children:
+ if child in self:
+ continue
+ result = result and self.append(iter, child)
+ except GLib.GError as e:
+ if 'name :1.0 was not provided' in e.message:
+ print("Dogtail: warning: omiting possibly broken at-spi application record")
+ return result
+
+ def appendAndPopulate(self, iter, node):
+ childIter = self.append(iter, node)
+ return self.populateChildren(childIter)
+
+ def getNode(self, iter):
+ if not iter in self:
+ return None
+ return self.get_value(iter, self.nodeColumn)
+
+ def getPath(self, node):
+ if not node:
+ raise ValueError
+ try:
+ indexInParent = node.indexInParent
+ except LookupError:
+ return None
+ root = pyatspi.Registry.getDesktop(0)
+ row = self.cache.get(node, None)
+ path = []
+ needParent = True
+ if row:
+ if row in self:
+ path = row.get_path()
+ else:
+ del self.cache[node]
+ elif node == self.rootNode:
+ indexInParent = 0
+ needParent = False
+ elif node.role == pyatspi.ROLE_APPLICATION or node.roleName == \
+ 'application':
+ path = [0]
+ indexInParent = list(root.children).index(node)
+ needParent = False
+ elif not node.parent:
+ return None
+ elif (0 <= indexInParent <= (len(node.parent) - 1)) and \
+ node.parent[indexInParent] != node:
+ return None
+ siblings = node.parent.children
+ sibIndex = siblings.index(node)
+ try:
+ if siblings[sibIndex] != node:
+ return None
+ else:
+ indexInParent = sibIndex
+ except ValueError:
+ return None
+ if type(path) == list:
+ if needParent:
+ parentPath = self.getPath(node.parent)
+ if parentPath is None:
+ return None
+ else:
+ path = list(parentPath)
+ path.append(indexInParent)
+
+ path = tuple(path)
+ try:
+ nodeByPath = self.getNode(self.get_iter(path))
+ if node != nodeByPath:
+ # print "%s is not %s!" % (node, nodeByPath)
+ return None
+ except ValueError:
+ # print "I smell a bug in %s..." % node.getApplication()
+ return None
+
+ #self.cache[node] = Gtk.TreeRowReference(self, path)
+ return path
+
+ def processEvents(self):
+ if not len(self.eventQueue):
+ return
+ queueCopy = self.eventQueue[:]
+ for event in queueCopy:
+ self.processChangedNode(event)
+ self.eventQueue.remove(event)
+ return False
+
+ def nodeChanged(self, event):
+ # if self.autorefresh.get_active() is False: return
+ node = event.source
+ if not node or not node in self:
+ return
+ app = event.host_application
+ if app and app.name == 'sniff':
+ return
+ self.eventQueue.append(event)
+ GObject.idle_add(self.processEvents)
+
+ def processChangedNode(self, event):
+ node = event.source
+ if not node or not node in self:
+ return
+ path = self.getPath(node)
+ try:
+ iter = self.get_iter(path)
+ except (ValueError, TypeError):
+ return
+ if event.type.major == "property-change":
+ if event.type.minor == "accessible-name":
+ node = self.getNode(iter)
+ self.set_value(iter, self.nameColumn, node.name)
+ elif event.type.minor == "accessible-state":
+ print str(event)
+ elif event.type.major == "state-changed":
+ print str(event)
+ elif event.type.major == "children-changed":
+ if event.type.minor == 'add':
+ for child in node.children:
+ if not child in self:
+ if len(child) > 0:
+ self.appendAndPopulate(iter, child)
+ else:
+ # If it has no children now, give it a sec
+ # to come up with some.
+ GObject.timeout_add(1000,
+ self.__addNodeCB, iter, child)
+ elif event.type.minor == 'remove':
+ self.__removeNodeCB(iter, node, path)
+
+ def __addNodeCB(self, iter, parent):
+ self.appendAndPopulate(iter, parent)
+ return False
+
+ def __removeNodeCB(self, iter, parent, path):
+ childRow = self.iter_children(iter)
+ while childRow is not None:
+ node = self.getNode(childRow)
+ if node is None:
+ break
+ if node and self.getNode(childRow) not in parent:
+ self.remove(childRow)
+ else:
+ childRow = self.iter_next(childRow)
+
+ def __populateCB(self, iter):
+ self.populateChildren(iter)
+ return False
+
+ def getPixbufForNode(self, node):
+ theme = Gtk.IconTheme().get_default()
+ try:
+ if node.role == pyatspi.ROLE_APPLICATION:
+ # FIXME: Use the pixbuf from libwcnk (if available):
+ # wnckApp = Application(node).getWnckApplication()
+ # if wnckApp
+ try:
+ return theme.load_icon(node.name, 24,
+ Gtk.IconLookupFlags.USE_BUILTIN)
+ except GObject.GError:
+ try:
+ return theme.load_icon(node.name.lower(), 24,
+ Gtk.IconLookupFlags.USE_BUILTIN)
+ except GObject.GError:
+ return None
+ elif node.parent:
+ return iconForRole[node.role]
+ else:
+ return theme.load_icon("user-desktop", 24,
+ Gtk.IconLookupFlags.USE_BUILTIN)
+ except Exception:
+ return theme.load_icon("dialog-error", 24,
+ Gtk.IconLookupFlags.USE_BUILTIN)
+
+
+class StateModel(Gtk.ListStore):
+ stateColumn = 0
+ statesSupported = ['checked', 'focusable', 'focused', 'sensitive',
+ 'showing']
+
+ def __init__(self):
+ Gtk.ListStore.__init__(self, GObject.TYPE_STRING)
+
+ def setNode(self, node):
+ self.clear()
+ for stateName in self.statesSupported:
+ if getattr(node, stateName) is True:
+ self.append((stateName.capitalize(),))
+
+
+def loadIcon(iconName):
+ try:
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file('icons/' + iconName)
+ except GObject.GError:
+ import os
+ path = os.path.abspath(
+ os.path.join(__file__, os.path.pardir, os.path.pardir))
+ if path is '/':
+ path = '/usr'
+ iconName = os.path.join(path, 'share/dogtail/icons/', iconName)
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file(iconName)
+ return pixbuf
+
+button_xpm = loadIcon("button.xpm")
+checkbutton_xpm = loadIcon("checkbutton.xpm")
+checkmenuitem_xpm = loadIcon("checkmenuitem.xpm")
+colorselection_xpm = loadIcon("colorselection.xpm")
+combo_xpm = loadIcon("combo.xpm")
+dialog_xpm = loadIcon("dialog.xpm")
+image_xpm = loadIcon("image.xpm")
+label_xpm = loadIcon("label.xpm")
+menubar_xpm = loadIcon("menubar.xpm")
+menuitem_xpm = loadIcon("menuitem.xpm")
+notebook_xpm = loadIcon("notebook.xpm")
+scrolledwindow_xpm = loadIcon("scrolledwindow.xpm")
+spinbutton_xpm = loadIcon("spinbutton.xpm")
+statusbar_xpm = loadIcon("statusbar.xpm")
+table_xpm = loadIcon("table.xpm")
+text_xpm = loadIcon("text.xpm")
+toolbar_xpm = loadIcon("toolbar.xpm")
+tree_xpm = loadIcon("tree.xpm")
+treeitem_xpm = loadIcon("treeitem.xpm")
+unknown_xpm = loadIcon("unknown.xpm")
+viewport_xpm = loadIcon("viewport.xpm")
+vscrollbar_xpm = loadIcon("vscrollbar.xpm")
+vseparator_xpm = loadIcon("vseparator.xpm")
+window_xpm = loadIcon("window.xpm")
+
+iconForRole = {
+ pyatspi.ROLE_INVALID: None,
+ # pyatspi doesn't have the following... not even sure if it exists
+ # anywhere.
+ # atspi.SPI_ROLE_ACCEL_LABEL : label_xpm,
+ pyatspi.ROLE_ALERT: None,
+ pyatspi.ROLE_ANIMATION: None,
+ pyatspi.ROLE_ARROW: None,
+ pyatspi.ROLE_CALENDAR: None,
+ pyatspi.ROLE_CANVAS: None,
+ pyatspi.ROLE_CHECK_BOX: checkbutton_xpm,
+ pyatspi.ROLE_CHECK_MENU_ITEM: checkmenuitem_xpm,
+ pyatspi.ROLE_COLOR_CHOOSER: colorselection_xpm,
+ pyatspi.ROLE_COLUMN_HEADER: None,
+ pyatspi.ROLE_COMBO_BOX: combo_xpm,
+ pyatspi.ROLE_DATE_EDITOR: None,
+ pyatspi.ROLE_DESKTOP_ICON: None,
+ pyatspi.ROLE_DESKTOP_FRAME: None,
+ pyatspi.ROLE_DIAL: None,
+ pyatspi.ROLE_DIALOG: dialog_xpm,
+ pyatspi.ROLE_DIRECTORY_PANE: None,
+ pyatspi.ROLE_DRAWING_AREA: None,
+ pyatspi.ROLE_FILE_CHOOSER: None,
+ pyatspi.ROLE_FILLER: None,
+ pyatspi.ROLE_FONT_CHOOSER: None,
+ pyatspi.ROLE_FRAME: window_xpm,
+ pyatspi.ROLE_GLASS_PANE: None,
+ pyatspi.ROLE_HTML_CONTAINER: None,
+ pyatspi.ROLE_ICON: image_xpm,
+ pyatspi.ROLE_IMAGE: image_xpm,
+ pyatspi.ROLE_INTERNAL_FRAME: None,
+ pyatspi.ROLE_LABEL: label_xpm,
+ pyatspi.ROLE_LAYERED_PANE: viewport_xpm,
+ pyatspi.ROLE_LIST: None,
+ pyatspi.ROLE_LIST_ITEM: None,
+ pyatspi.ROLE_MENU: menuitem_xpm,
+ pyatspi.ROLE_MENU_BAR: menubar_xpm,
+ pyatspi.ROLE_MENU_ITEM: menuitem_xpm,
+ pyatspi.ROLE_OPTION_PANE: None,
+ pyatspi.ROLE_PAGE_TAB: notebook_xpm,
+ pyatspi.ROLE_PAGE_TAB_LIST: notebook_xpm,
+ pyatspi.ROLE_PANEL: viewport_xpm,
+ pyatspi.ROLE_PASSWORD_TEXT: None,
+ pyatspi.ROLE_POPUP_MENU: None,
+ pyatspi.ROLE_PROGRESS_BAR: None,
+ pyatspi.ROLE_PUSH_BUTTON: button_xpm,
+ pyatspi.ROLE_RADIO_BUTTON: None,
+ pyatspi.ROLE_RADIO_MENU_ITEM: None,
+ pyatspi.ROLE_ROOT_PANE: viewport_xpm,
+ pyatspi.ROLE_ROW_HEADER: None,
+ pyatspi.ROLE_SCROLL_BAR: vscrollbar_xpm,
+ pyatspi.ROLE_SCROLL_PANE: scrolledwindow_xpm,
+ pyatspi.ROLE_SEPARATOR: vseparator_xpm,
+ pyatspi.ROLE_SLIDER: None,
+ pyatspi.ROLE_SPIN_BUTTON: spinbutton_xpm,
+ pyatspi.ROLE_SPLIT_PANE: None,
+ pyatspi.ROLE_STATUS_BAR: statusbar_xpm,
+ pyatspi.ROLE_TABLE: table_xpm,
+ pyatspi.ROLE_TABLE_CELL: treeitem_xpm,
+ pyatspi.ROLE_TABLE_COLUMN_HEADER: None,
+ pyatspi.ROLE_TABLE_ROW_HEADER: None,
+ pyatspi.ROLE_TEAROFF_MENU_ITEM: None,
+ pyatspi.ROLE_TERMINAL: None,
+ pyatspi.ROLE_TEXT: text_xpm,
+ pyatspi.ROLE_TOGGLE_BUTTON: None,
+ pyatspi.ROLE_TOOL_BAR: toolbar_xpm,
+ pyatspi.ROLE_TOOL_TIP: None,
+ pyatspi.ROLE_TREE: tree_xpm,
+ pyatspi.ROLE_TREE_TABLE: tree_xpm,
+ pyatspi.ROLE_UNKNOWN: unknown_xpm,
+ pyatspi.ROLE_VIEWPORT: viewport_xpm,
+ pyatspi.ROLE_WINDOW: window_xpm,
+ pyatspi.ROLE_EXTENDED: None,
+ pyatspi.ROLE_HEADER: None,
+ pyatspi.ROLE_FOOTER: None,
+ pyatspi.ROLE_PARAGRAPH: None,
+ pyatspi.ROLE_RULER: None,
+ pyatspi.ROLE_APPLICATION: None,
+ pyatspi.ROLE_AUTOCOMPLETE: None,
+ pyatspi.ROLE_EDITBAR: None,
+ pyatspi.ROLE_EMBEDDED: None,
+ pyatspi.ROLE_LAST_DEFINED: None}
+
+
+def main():
+ from dogtail.utils import Lock
+ # We need this to prohibit sniff making(and removing on exit)
+ # sniff_refresh lock when importing Node
+ sniff_running = Lock(lockname='sniff_running.lock', randomize=False)
+ try:
+ sniff_running.lock()
+ except OSError:
+ pass
+ sniff = SniffApp()
+
+if __name__ == '__main__':
+ main()
diff --git a/sniff/sniff.desktop b/sniff/sniff.desktop
new file mode 100644
index 00000000000..0835fb69e89
--- /dev/null
+++ b/sniff/sniff.desktop
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=AT-SPI Browser
+Name[en_CA]=AT-SPI Browser
+Name[en_GB]=AT-SPI Browser
+Comment=Browse your Assistive Technology-enabled desktop
+Comment[en_CA]=Browse your Assistive Technology-enabled desktop
+Comment[en_GB]=Browse your Assistive Technology-enabled desktop
+Exec=sniff
+Terminal=false
+Type=Application
+Icon=dogtail-head
+StartupNotify=true
+Categories=Application;Development;
diff --git a/sniff/sniff.glade b/sniff/sniff.glade
new file mode 100644
index 00000000000..22dd1b0f9f0
--- /dev/null
+++ b/sniff/sniff.glade
@@ -0,0 +1,676 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+<requires lib="gnome"/>
+
+<widget class="GtkWindow" id="Sniff">
+ <property name="width_request">325</property>
+ <property name="height_request">475</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">AT-SPI Browser</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkMenuBar" id="menubar1">
+ <property name="visible">True</property>
+ <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+ <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+ <child>
+ <widget class="GtkMenuItem" id="sniff1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Sniff</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="sniff1_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="quit1">
+ <property name="visible">True</property>
+ <property name="stock_item">GNOMEUIINFO_MENU_EXIT_ITEM</property>
+ <signal name="activate" handler="on_quit1_activate" last_modification_time="Tue, 26 Jul 2005 14:21:44 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="view1">
+ <property name="visible">True</property>
+ <property name="stock_item">GNOMEUIINFO_MENU_VIEW_TREE</property>
+
+ <child>
+ <widget class="GtkMenu" id="view1_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="refresh1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Refresh</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_refresh1_activate" last_modification_time="Wed, 27 Jul 2005 16:21:27 GMT"/>
+ <accelerator key="R" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-refresh</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="setRootMenuItem">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Set Root</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_setRootMenuItem_activate" last_modification_time="Tue, 11 Dec 2007 20:54:23 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="unsetRootMenuItem">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Unset Root</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_unsetRootMenuItem_activate" last_modification_time="Tue, 11 Dec 2007 21:18:55 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator3">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="expand_all1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Expand All</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_expand_all1_activate" last_modification_time="Wed, 27 Jul 2005 18:41:34 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="collapse_all1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Collapse All</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_collapse_all1_activate" last_modification_time="Wed, 27 Jul 2005 18:40:57 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="help1">
+ <property name="visible">True</property>
+ <property name="stock_item">GNOMEUIINFO_MENU_HELP_TREE</property>
+
+ <child>
+ <widget class="GtkMenu" id="help1_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="about1">
+ <property name="visible">True</property>
+ <property name="stock_item">GNOMEUIINFO_MENU_ABOUT_ITEM</property>
+ <signal name="activate" handler="on_about1_activate" last_modification_time="Tue, 26 Jul 2005 14:21:44 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVPaned" id="vpaned1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="position">350</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="treeTreeView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="headers_visible">True</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="shrink">True</property>
+ <property name="resize">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+
+ <child>
+ <widget class="GtkLabel" id="nameLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Name:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="roleNameLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Role Name:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="descLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Description:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nameTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">name</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="roleNameTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">roleName</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="descTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">description</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="actionsLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Actions:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="actionsTextLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">actions</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="tab1Label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Basics</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="n_rows">1</property>
+ <property name="n_columns">1</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTextView" id="textTextView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="overwrite">False</property>
+ <property name="accepts_tab">True</property>
+ <property name="justification">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap_mode">GTK_WRAP_NONE</property>
+ <property name="cursor_visible">True</property>
+ <property name="pixels_above_lines">0</property>
+ <property name="pixels_below_lines">0</property>
+ <property name="pixels_inside_wrap">0</property>
+ <property name="left_margin">0</property>
+ <property name="right_margin">0</property>
+ <property name="indent">0</property>
+ <property name="text" translatable="yes"></property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">expand|shrink|fill</property>
+ <property name="y_options">expand|shrink|fill</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="tab2Label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Text</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="labelerButton">
+ <property name="sensitive">False</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Labeler</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="labeleeButton">
+ <property name="sensitive">False</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Labelee</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="tab3Label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Relations</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="stateTreeView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="tab4Label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">States</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="shrink">False</property>
+ <property name="resize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/sniff/sniff.ui b/sniff/sniff.ui
new file mode 100644
index 00000000000..1594dc3a3ef
--- /dev/null
+++ b/sniff/sniff.ui
@@ -0,0 +1,494 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkWindow" id="Sniff">
+ <property name="width_request">325</property>
+ <property name="height_request">475</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">AT-SPI Browser</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuBar" id="menubar1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Sniff</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="quit1">
+ <property name="label">gtk-quit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Actions</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="expand_all1">
+ <property name="label" translatable="yes">Expand All</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image1</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="collapse_all1">
+ <property name="label" translatable="yes">Collapse All</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image2</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="refresh1">
+ <property name="label">Refresh</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image7</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="setRootMenuItem">
+ <property name="label" translatable="yes">Set As Root</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image5</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="unsetRootMenuItem">
+ <property name="label" translatable="yes">Unset As Root Item</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="image">image6</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="highlight1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Highlight Items</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="autorefresh">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Auto Refresh</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Help</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="about1">
+ <property name="label">gtk-about</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVPaned" id="vpaned1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="position">350</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeTreeView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="nameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Name:</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="roleNameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Role Name:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="descLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Description:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="nameTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">name</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="roleNameTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">roleName</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="descTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">description</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="actionsLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Actions:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="actionsTextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">actions</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="tab1Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Basics</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkTextView" id="textTextView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="x_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
+ <property name="y_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="tab2Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Text</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="labelerButton">
+ <property name="label" translatable="yes">Labeler</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="labeleeButton">
+ <property name="label" translatable="yes">Labelee</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="tab3Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Relations</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="stateTreeView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="tab4Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">States</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-indent</property>
+ </object>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-unindent</property>
+ </object>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-unindent</property>
+ </object>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-unindent</property>
+ </object>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-goto-top</property>
+ </object>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-goto-bottom</property>
+ </object>
+ <object class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-refresh</property>
+ </object>
+</interface>