diff options
Diffstat (limited to 'sniff')
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> |