A single click on zoom indicator on status bar opens a zoom selector.
It seems quite natural to click on the indicator to change the corresponding
value. As zoom level is displayed on statusbar, a click on statusbar should
open a zoom selector.

This patch is inspired by ac4478f4c84881436cf9b25a0fa9dc30f889db63
"Add a zoom combo box into the toolbar".

Signed-off-by: Guilhem Bonnefille <guilhem.bonnefi...@gmail.com>

---
 help/C/figures/zoom_status_popup.png |  Bin 0 -> 11947 bytes
 help/C/viking.xml                    |    7 ++
 src/vikstatus.c                      |  141 +++++++++++++++++++++++++++-------
 src/vikstatus.h                      |    3 +
 src/vikwindow.c                      |   13 ++++
 5 files changed, 135 insertions(+), 29 deletions(-)

diff --git a/help/C/figures/zoom_status_popup.png 
b/help/C/figures/zoom_status_popup.png
new file mode 100644
index 0000000..1ccc9a3
--- /dev/null
+++ b/help/C/figures/zoom_status_popup.png
@@ -0,0 +1,41 @@
+�PNG
+
+
IHDR!�pz^[        pHYs��tIME�
��ztEXtCommentCreated with GIMPW� 
IDATx���w\G��gw�qwp�"�HۣQv�X���/�$*�(��ŠO��5���1     
*�<l(�"b"R��;�n���\�;0yL�aޯ�7�3������|g����-T?�2J)(,�4:���Ç��c�
�ڵk'�ɰ5�:$6�5��`�a0�1k
���`0�%"l�VBȲ,�0B333�|��q�0<ϓ$)�)�2,Ų,�G�(J"�aX�����y�:1xk[<x�`��՝:uR*��o�6��y�ԩSC�

���1bDRR�q(K�V�Z�*,,���=((h�̙����e���{��iZ'k�͑��|�…�+W�f����=z̘1�O����x��7SRR��M�ׯZ�*;;{׮]�.]���4�ڵk����y_R|�G+��!Ds<�
 rss������}������Ġ��f����HOO7���ɓ#G����Csrr�
������fT�s���DZ����"J�eٴ����zKH?~|FFF}}}�Gv��}�izƌ˖-suu���>L�����,���&����A+++
+���0̮]�bcc���Ш�m�6�����1LsV��=���0��1�q��={�$''���
+
+
+bbb�?����1���


r��k����r�<//O�rss�r������X�fM\\\jj���Jܽ{�N��ӧ�PO�^�\\\�ܹ�M��cm!r#      
�bqDDDRR�c&11qРAb�����~����D{{{��…���!�����xk�444TUU 
k0�B�R�T*`ٲe��ᎎ�C�III���=y�� ����#F�$Y\\����
+��j
`iiiee���DZ�Krrr`````�B�1bD``��;PVppprr��3g^{��'N$''���K�.%$$`Z�B��7y����1��1x
�c����`��0�1�5��`�a0Xck���`���$-=��m���`��0�1lk
�y���A�&B�a���"��0�6�q4M�X��D��-������\.7|E8E��R�i)
��j�z�����ឞ�;v4���q�ɓ'#""���G����(��Fh��W^y����(���3g������ѻw���dld��6
�V�Zu����;wfee �ϝ;7f��{�С�Ǐbqx�_�n�i�m��ǎ���9jԨ�'�4���r�c
�JKK!��#րaTm�X�.\�p��������ap����������>D����?W�8p� '''k�c/4
�Q���ŝ���bq���3fDGG��vss�իWTT����-Z����>��F`;w�ܳgObb"xf,n�\�}���n�<�y��>}���Ջ$ɤ�$�eQ�a

��.4Moܸq�֭G�E�>!�p���^�n]cc�V�EY»&~���I�&�_���ݻK�.3f��?��-�DZ���X�f́~��7!�6�ŝ��+
e7o�D���o߮�����'���₼��f�Z�lٸq�,���X�x�ĉ���8�v9w�܆
�9bU[�ō���IJJB��.\Xd 555##�VVV�P(І�q�`#�q�킢j>� 
����X�lY�>}����r�ĉ={��r��{XnO�:u���
������'~�!�3�Xۥ��&+++++��_~5
 88��ѣ�������ˠ���G�
+��
Q*��7y�]������/��������6m��K�{��c/)x��0�1�5��`�a0Xck���`��0
��5��`�a0�1k��`�a0XcS���0�~F��P__���B�h)��D"1/%d!�%�am�0
�q\mm���-~��cm�V۫W/è�ǥ��:�}���F�JJJbq�<���#Fx{{w��uݺuz�^(��h�������{{{�;w[k�M���ڵk��������Ǝ��o�:u*""b���'N�@Y׮]3f�СC322bbb6o޼e��E���i�bcc,X���SSSӿld<Wl�\�zuǎ����2L_�|�G}4s�L���_QQ����LDll��a��̙��𨩩ٱc����qqq999gΜ���Ap��ۂDZ6�^��9sftt����a�i,�q��eff�H����vvvB�7ww���|tXlllϞ=�N����׽{�+V466b;�q��!ܶm�H$2���bq��bq+�1c�DFFv��qРA����/�����������w�>u�T��b
+�Xۢ��`Ŋ���ht���k�Z�R)��V((K��
5j�V�ݼy�…�t�*L���v�څ�4(&&&::k
��(���4M0�]�v�ڵ���u��`kk�P(rss���X�� 
&O����UZZ�����ѣ:�Ü��<==�R��������Xcm�������ƌbq�4���4x�`�X,�3Q���W�;vlҤI��N�8��j,˞9s����m�gGՎ���ӧ�����!CRRR���s��I�Ȣ��������
6DFF
+����ԩnnn8���M�~��Glj�1������bq��g۶mC��CBBP��]�tqpp�ꫯ
$�9r�V�ݰa�������ӷo_lۗ���6����1k��`�a0Xc����`��0�1
�5��`�a0Xck���`0Xc���~F���8N�ӡ��2�L�
!�i�a���J����F�$���bY��y�X,�J�A`;�q��r�ԩ�}�zyy�������Bzqq���ޥK�Je�����3gF����ӭ[��k�
+���j���޷o����w��9**���k��B���q����322F�=i�$��Q����/^��r�J�R׮]{��7^{�5�{˖-�7o�7�aV�Z����s��˗/O�>����h�X�������u떧�gII���WII���=���9A������B�ٳg����޽}���oQ4o��O�<9r�Ⱥ���jk�c/.������QQQW�^]�hQDD�VK�*++mmm�A����܄X܆0
s��Y�
�<�4<�oذ���aaaA9r�a!�bK��XXX�dɒfg�;w�����9���5�vIII�7o�����
�w�ޱc�nذAH�����F�ٲeˢE�:w�l����QdŤ�$___lg���ˬY��/_>n�8������͗,Y��C��'O��F�I�&
     ����c͚5���'N�ppp�F�kӔ����r�eI��y��ݝeY!Wp/A���"
�pw�ƍcǎ8p@(����iӦ��l{{{�R��6Ǵi�.\�0L@@��{��.]����������
+�wII�L&������D)������/^ܰa���ӅX�����aÆAQ
}��[&0/>�wߚ�{��_~��-�I�&}��h؉���2e���˗/�={6���١X�ӧO7��]]]m��������{q5���X����0�1
k��`�a0Xc����`��0�1
�5������{�0�6����G�/�aPd��%IR$�G2�`ڢ���h�.y��֭��ֻ��$I�R������!�J��1mWc�=|���՜���\�܍t��0
S|��̩SBo���U-��i����7�������ՊU��b/o���/g����
+ln!�MhBXW[����<PYZBr�F�C�4M�<ϛ���Fsr��9�������333�,���9�P%��
�|��y�'I�0���V��8���0/M�
+���;��8�f�'04���A��o#�Kp�[�n���F�uuu����A����:v�x��y�~�…        
&�������=�…��N�:տ�����G�թ�hBCC�m�b�<���3;��w;����$Ev
���w/�mǚǏ�t�Ҋ+�|�M�,�^Y\\�`���={���      
5�X<p���˗s;jԨ���Q�׏7nʔ)?��Ӿ}�&O�\YY)�q����k�z{{�������k��A
�����;�6r��J�� �V�ML:���I����`�6��R<�W��:u��̌ 
�e���ѣG�B��---�o�^UU���(//W��ӧO���x��w>��3�Z-����ٹsgFFFBB��/��H��8�hB_}/�0�k��
+B��|u]��:���EQ��j�U�U���H(5���a�ۯ-[�n�={����#222;;[�R�=zѢEr�\8�����ݻ+W�1b���#JD��?�裕+W�_�~�С��t:]TTTtt�����/�\�tRw��'W?����Z�r��{��y�����<Zeq
W�np3+%U��A�6�q�=����{���ر�{�����ӦM�y~Ŋ�&L8��L&KMM��q
+�N��ÇQpo���m�&��M��m�r�<��)�eJ��ʼ/^�r y��w�-�,U*��w�yWծ�     
7u��-l\���     �H��
6tUU�ʕ+���gnn>hР���={��o߾#G�xyy�?^p&��������ׯ�}��ҥKǍ���?
+
+
+V�\�z�j�V�B�i4�F�����<��8@H��R���ؖ�s�@l�͈�'''�'F��3ző��]�~�v��ѩS����v��fϞ�lp��{��,;x�`�x�~���������_&��������t��J%$�?����חn�����'N��֭�H$bY�����[��"<�[XX��bsss�RQQaff&�vssC��,X%4jkk{��
    ???ܡ_\��D"�O�c,�<�B!�o��     
+�~�C���'�
à^��Q��|�����^�PXXX�D��j�B��H�Rkkkp���ߟ:u���[�����ӷlٲo�>t�Z�����y���4&&��7�46u��E�����~���3r���_��������e�+���#�D��^lg�1��

T�Ys:-B�T�����/�����SSS_.k����S�N�T*xxٲe(���#6o޼q��E��޽�O�>�T\\܎;���mll��t�R��5kָ��}���(�wdd����oڮJ��s��{�hH=a50l���
 Mǒ$y�P��
+�ڈ5nj3f̘�r�z뭷�z�4����oV9hF0s�̙3g>�]�Z���K�1��H e��0*�f��
Z��y��x��9�c9��8� ��[{��׃�`�����c��4
�Ӻ�RR!�y��O���p�C{��;_�dF3���(�B�t:�7i�$I��σ�&s��ӿҫz�B���y� 
����ݷ!��/�O�K�3ژ�GcE!o��z��zO�i�u��Y4<@a`�0�Oҡ��uϸ%_Hk�c0���ь��9��4���ޡ��
 I@O7韧�0��Uch 2^���I�I;G$A�$A�$      Я?�q�I0�6�1`���y
>�(��ӧERE�$%�H��:�Hc�gniil�t!���F�
+�b�y����<�s<�q,$�&�"�DcI�=u�$I�")�2xIQA@�7�y���b}}}}}�a��qP����VI///���:�G�ڇ{�a�w^��vh}�g��
 ��


R�v%7�}�0��|$A�Џ�D"��( � 
�t(H��jL�P�?�(111��(�O�����<����⍑Cqo@�t�06B�k� 
I���z}Ee���[׮�����t��}�N��PZ>5���$D�aY���7�����lJ7��s�,//?pY�}3��?W4��H$���cu݆sOG>w!m�ڕ������M��<!�{yx
   
UQ�����M���X��j�c�a�����\*�J$ӫ��Qcy��^���ZED�c��@�E�y��!$Le:�{�'�{]�ex,1���X�Z�<@�8�c���1�
 dRi�V�R����������2kkk� _x��΀yn#I����Jv6IPV66$IBb�n�0����X!
���4�"���}9(8X�¿��U�1��.S��{:>2E$���<�OO%�f.@
�eI��H@�XD�h^(H@D(�%�C<�}q5F�Dή.�7oި�U�ߖ$���O�����D$�T!!?)l�� 
����8栒��[+�"�x�a����M��H�d����V����/U���jhN&&��v0��$        � 2*j�
R��������LD� 
�j����熜���}TJ3�A�^��)��������b�����S;�e�qE��7��DҒ�^���I�4���.>y���.+�� 
���|`G�}g�M[��$��;u�z�\.���
+
P�z呎�~J+3�B�/��Z��%BT
+��ja]y-��9�4)��l}��>�A���Yx���J�V�����
+i�    
�HeR)h�I�Q���P��K���746B���U:g��FA=��*�b�A�tz�❦`oZ�q�vp�-�B�����I����S7���x:ȭ���K
 � ɤ�TD��kt쭇
]�Ub��[��sG{gg'��VH+h���;s��������f��tee��U��f�B!��iQX�X�c�%GKiem�h�����)�hl�U;�
+�>,���BL����1�^�A���)���
+Peީ��a^\�بo�}����hZ����_�u���on��V
���m~kh��>�p��};�8ZJ8$^�0��"      g���ٱ+UF�
+)��L��$�R.6��Nߨ��e,��l �Ԣ�2��zX7�����fWD���wrss3
+/���C=����j�TcZM@ϴ� 
p,���B��ߺG�N�����]��Nq�b���y�Wz�����wJ�B�TB�\��W^Ж�R���2��#���Yh����ꂲ�We��6i�չ�������Z5���}Z���iŹb��m�dSt���ȥ���t�
 @WoKGyBzi���Ii&
+r�8z���Lt\m�/T�V/��cx�u�m��-��]5����Y�,�!���^\��fm�,��P�<q���Ⱥx���~P�7@7ˊ:}���⑆v�5+S�y��lmV�n�}�LB�,OBH���%
   
��c����c21%��R���u��z=�DN=���*y�م��J!��j~$���4���l_��ܯjt���x�����kE���$�~�eT
+Q/�+���0���*�����V霾���f�F��/mȸ]#T+�Pv;���G—G��<T�5���F�
+��6���n>���6�Z�������gn<�4���TVJq]{���JA��h�?�˲���333�;%�ƚ�)z�;��������(�㸺�:[[[�?�i���F�Q�T�;�k:��x��Ja����f�iv��{-<y�������ͯ�.�S_���\GDK��8N�ӡ���R)��B��=5�3�J��M�
��<O�H$��d�Z2m�;���+ �˗-:4�0��퉓���J峻˲4M�,�(J&��t���  
��H$R�;����k������OH�{������۷7̭����OؿaQ�^�۽kwXث�ڂ�����G�c�h4u���L-�q���g6oٜ��������CD"Q�Zݵk7��z=Dz�N�
+��W���}�#巔�Je�^�/^��� 
#>>����EEz�~��]aa�V��t��ݴ“�N.Y�dݺ��E�j��y/o�BA>Ipp��ÿ<(���%ܻWp�\�a7�x��W۾�y�f�N4o����W�KKKۼyKn^���՘1�gΘ�����Bc��'srr�,Y<e�T�,�^?{�����v�bkk���qww�ʺ�����iz��E�妖OOO�:m�ҥ������������5`�K�����M7]�t����CȲ�'K>��m_PP�i��9s���a/@��͙3���4**�[��666�-+K˖*�J��1,#3�ל
 
����^��M���Pٓ'O^�vm��ő�Ӎ�H$��}�.Z��eٸ���'�}��U���7nܘ9}��9��ؔ���x��X5Bx������͝3�(�E�ؤI'O��l֡_~�y���ÿ�yk��h���^}&�є�$I�$�5��FeH��`��u(���!)������x䰩�׬]����S�L����/^�n]���I��6�3�IDATx����2n���۾BBk�%K�,''�eˢ'O~}����f��*$Ir��5�|��
 
�5k֘jL�RY?�$$A���<i�e�v�ҵk���ݱ�����+(<n�������{7WW�Z���?!��?p`РA�Y��?��3�qq��t�2{���WÆDDlܸ���������FG��ۯW��9s�����{y��]�ֹK���+h`�2e��_}%�s����N�
+Do������cǎ��t2�<�0���cƌ�����_���<�s��_���ݿ�f�.���4�ݸ�]�v�5{N��aC�6�+Uدo����ΟK3���wd#P�B�ng��ѥKYK>Y1��޾������r�ܮ]aa��f566��>�;w�m���ΝC.^�4��Y<�����t:]�޽c>����x�����/��ݷBnHH��}4g��#���Oh��>��#��j��۷o���O]�C����o������b���F����`Y���Y8���BXU���퉿���b������ƴg���}�~L�O�ᇽ¯|���/6mڂ
+���Vh���_��cA��|6��w���z��23/�d�C   �Ͷ2��as��
+�����c��6��y���fq�{�n�QU�������<�9�lݺe�覫��?ǭZ��jΕg�~����C�
+
+{��};�e���������C�����%�������O�����܄�*��%����s'��ڸq��=J)X���<�CPΕl�UZZ�1��
����|t��˗/=�d�Y�z����>t��������F����m��ͣ��?����k��\�6�Z��t��wp<~,YX�)�rC���NF>a,�q��g11���gϜ6�o�<���o�����"8(���-��������Y��n�QV~~~���^�q�����������h~�ա�뫪��ڠ�.�����QQ3�
++++?�pƤ�o���E��ջN�e���-���zgc��XE�����V(�o�4v��-�Ba      
���d�?���=a��<���-ǒ�8`ggg�+�>�Wn�–����?����^ݴic�~�+**� 
Irܸ7Ǎ{}�>����o�5nܸq�Yƒ��y!4!V�ȿG�q~~~�O�                        �D
ä���ڵ�QYT��y!�����6�����j�Zp
544|��WLH84��)��9�m�L�3`Ȑ!)))���]�tQ&�N���"&�ٹA�,�N��z�*''G���☘���N�.�y��93j���<�ӥ����5]�
 ,)y�it�7_o���i/�)����^dҡ�}���ު�+������bV�   
�OHX�r���|��*��.f^LNN^�r�q۷��T�7�Q
�����i�fΘ)�'�(����Wڟ;�G�"�����gӺw��~���HI�ݻ�X,��tǎ8p�`j�a6o�ҩS�~}�
iii;w�L9q���V��Y����=s�,��i�NK;׭[W�`K6�Q/2Z��-2�nfx0�qf2�\.G[j�vT����ׯ���}�����""*jf���^c�����(:HII�X"���D/�<i✹��]\^
흙��s׮��ok��_�tI�P�<,]�j��iӌv���˲�޽{?�x֒O>����%�B�xm��O?�~��aw��5jԑ#G�RiII���uMM�����o{�a�n��B���J��}|�"Q��SAxzz��������?���;�x{y���lmlvv�b����A�n]�r�B!o^Z���?1
C���'���<?w���+   
����pssC&���C�o߼���4q�___ጙ3g͚���ս{�KY�.ggo�����}��ffr�H$�I�����^���ݽw�^����cc�o�
+@QԬٳƎ}���.<,���3G�/���        
�b6n0`˱�EE�{��S5q„�8;;���+###v��ֳ+|���æ�AH%'''��!�sI�C���ݹ�:
DZ>ܲe��#��x��j��GBXXTTS]��u���;'M��[8�f��r�\.���c�#���g�1����O�>�<��������|}g͚e�GbY����\�$)���y̘�~��X,�s�ΰ�#n�����O�8q\���{UU�ȑ�ϙ3y�jjj֮[��7ߠK׿�����o����q�^ye��-,�v�����_<==ѥn��M��%q߾}ϟO���o<<<U?Z�v]zz:��aa1�}F��pㆍq��[[[������N�b,�v����/�<<<�!b��y��'�r���B>n���;wUUVJe2�I�&����YY��l�r��m��?��K�������C"�}}ۓEDB¡o��������o��Y��?����K7n���
�;wn��]�s[�lyޭ[�7�DyE�+��2ڕ�˽�����������������m=�–���
G������x�?|��ܹ��,��̟�q\l����+--�������G)�Ja~~~�����~~��C�)�������ߤI��Þt�gd^
 �ǟ�s��]ΟK����ŵZ����X,V*���毼���ݻ<(�D���mdm�q܆
�/�JH�kQ�_mܸ�BFFB���Xv�5�a��/_�<c�
WW7���j�m����;��L��{��M�ܽ3eʻ�*<�i��=���������J��_�~�֭����P�
+�iĴ�q
�j�z�2�a�P�0̹s��-[�����h𭌘6�1���ܾ����׫BC��={vݺu>��רՍ��Xf�kh�NMMݺu������j�N�e��s�^���=����7���1�Ç������X,�x��uk++��0��������tz�
 
���Ł@��H$�T°�^����fhZ�P����x�L��tEI�R�t�������dR@�m���Yi5�6�F#��RA�fX��+��m��F�t�&g��������9�o߾3f.��rKKK���b�B��JeJs%ER@����d�'�crz-���9�8�!���V���k�R�H$���iF*�5�H,�IQCz�"QC


R����iZ�q<�C���'��^���i�ŧN����z=y�t��j�O���#����,���        
�|}C�R��y<]g�M?�
�
R��") 
m`�^!/m*��8N)���I�zZO�&A�744(J��1jԨ�7oR���`RR������oii��k�<<<��aaa���\�FӱcG@NN�J�Bwp������
     �Çܽ{���:88X$5�(�S�������Æ
3<��G�6����s@@�X,.,,,++

}F
Ͷ�0LBBA�����閖��۷���999&L��D"�W���
P�T<�߹s��鐐�|�N��4�q�q�F�q�����b�B���ҡCGGG�^����*tttD
]�zU�R���Aϟ?�� 
߾}���6((H,��磳�{�nMM��qP�AAA���4M߻w�C����������ׇ�t�P���ҡC��c����gϞ8p 
��|L�l�i�&�a������F���^�ZQQ����ݻj�:((�����\�H��axz�Z��à(Rj  F�IEND�B`�
\ No newline at end of file
diff --git a/help/C/viking.xml b/help/C/viking.xml
index 2b3adbe..b32ac38 100644
--- a/help/C/viking.xml
+++ b/help/C/viking.xml
@@ -221,6 +221,13 @@ The main &appname; area where the layer data is drawn, is 
called the <emphasis r
 <listitem><para>The zoom factor</para></listitem>
 <listitem><para>The location of the mouse pointer (and potentially height 
information if DEM data is available)</para></listitem>
 </itemizedlist>
+<para>For convenience, a zoom selector can be opened from the status bar. 
Simply left-click on the zoom factor.</para>
+<figure>
+  <title>The zoom selector available from status bar</title>
+  <screenshot>
+    <graphic format="PNG" fileref="figures/zoom_status_popup.png"/>
+  </screenshot>
+</figure>
 </section>
 
 <section><title>Projections</title>
diff --git a/src/vikstatus.c b/src/vikstatus.c
index 4d0763b..0cc7529 100644
--- a/src/vikstatus.c
+++ b/src/vikstatus.c
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2003-2005, Evan Battaglia <gtoe...@gmx.net>
  * Copyright (C) 2011, Rob Norris <rw_nor...@hotmail.com>
+ * Copyright (C) 2012, Guilhem Bonnefille <guilhem.bonnefi...@gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,52 +25,112 @@
    NB as of gtk 2.18 there are 'info bars' that could be useful... */
 #include <gtk/gtk.h>
 
+#include <math.h>
+
 #include "vikstatus.h"
 
+enum
+{
+  ZOOM_CHANGED,
+  LAST_SIGNAL
+};
+
 struct _VikStatusbar {
   GtkHBox hbox;
   GtkWidget *status[VIK_STATUSBAR_NUM_TYPES];
   gboolean empty[VIK_STATUSBAR_NUM_TYPES];
 };
 
-GType vik_statusbar_get_type (void)
+G_DEFINE_TYPE (VikStatusbar, vik_statusbar, GTK_TYPE_HBOX)
+
+static guint vik_statusbar_signals[LAST_SIGNAL] = { 0 };
+
+static void
+selection_done (GtkMenuShell *menushell,
+                gpointer      user_data)
 {
-  static GType vs_type = 0;
+  VikStatusbar *vs = VIK_STATUSBAR (user_data);
 
-  if (!vs_type)
-  {
-    static const GTypeInfo vs_info = 
+  GtkWidget *aw = gtk_menu_get_active ( GTK_MENU (menushell) );
+  gint active = (gint)gtk_object_get_data ( GTK_OBJECT (aw), "position" );
+
+  gdouble zoom_request = pow (2, active-2 );
+
+  g_signal_emit (G_OBJECT (vs),
+                         vik_statusbar_signals[ZOOM_CHANGED], 0,
+                         zoom_request);
+}
+
+static gint
+zoom_popup_handler (GtkWidget *widget, GdkEvent *event)
+{
+  GtkMenu *menu;
+  GdkEventButton *event_button;
+
+  g_return_val_if_fail (widget != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);
+  g_return_val_if_fail (event != NULL, FALSE);
+
+  /* The "widget" is the menu that was supplied when 
+   * g_signal_connect_swapped() was called.
+   */
+  menu = GTK_MENU (widget);
+
+  if (event->type == GDK_BUTTON_PRESS)
     {
-      sizeof (VikStatusbarClass),
-      NULL, /* base_init */
-      NULL, /* base_finalize */
-      NULL, /* class init */
-      NULL, /* class_finalize */
-      NULL, /* class_data */
-      sizeof (VikStatusbar),
-      0,
-      NULL /* instance init */
-    };
-    vs_type = g_type_register_static ( GTK_TYPE_HBOX, "VikStatusbar", 
&vs_info, 0 );
-  }
+      event_button = (GdkEventButton *) event;
+      if (event_button->button == 1)
+       {
+         gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 
+                         event_button->button, event_button->time);
+         return TRUE;
+       }
+    }
+
+  return FALSE;
+}
 
-  return vs_type;
+static GtkWidget *
+create_zoom_menu_all_levels ()
+{
+  GtkWidget *menu = gtk_menu_new ();
+  char *itemLabels[] = { "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", 
"128", "256", "512", "1024", "2048", "4096", "8192", "16384", "32768", NULL };
+
+  int i;
+  for (i = 0 ; itemLabels[i] != NULL ; i++)
+    {
+      GtkWidget *item = gtk_menu_item_new_with_label (itemLabels[i]);
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+      gtk_widget_show (item);
+      gtk_object_set_data (GTK_OBJECT (item), "position", (gpointer)i);
+    }
+  return menu;
 }
 
-/**
- * vik_statusbar_new:
- *
- * Creates a new #VikStatusbar widget.
- *
- * Return value: the new #VikStatusbar widget.
- **/
-VikStatusbar *vik_statusbar_new ()
+static void
+vik_statusbar_class_init (VikStatusbarClass *klass)
+{
+  vik_statusbar_signals[ZOOM_CHANGED] =
+    g_signal_new ("zoom-changed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (VikStatusbarClass, zoom_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__DOUBLE,
+                  G_TYPE_NONE, 1,
+                  G_TYPE_DOUBLE);
+
+  klass->zoom_changed = NULL;
+}
+
+static void
+vik_statusbar_init (VikStatusbar *vs)
 {
-  VikStatusbar *vs = VIK_STATUSBAR ( g_object_new ( VIK_STATUSBAR_TYPE, NULL ) 
);
   gint i;
 
   for ( i = 0; i < VIK_STATUSBAR_NUM_TYPES; i++ ) {
     vs->empty[i] = TRUE;
+    
     vs->status[i] = gtk_statusbar_new();
     gtk_statusbar_set_has_resize_grip ( GTK_STATUSBAR(vs->status[i]), FALSE );
   }
@@ -80,9 +141,17 @@ VikStatusbar *vik_statusbar_new ()
   gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_ITEMS], FALSE, 
FALSE, 1);
   gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_ITEMS], 100, -1 );
 
-  gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_ZOOM], FALSE, 
FALSE, 1);
+  GtkWidget *eventbox;
+  eventbox = gtk_event_box_new ();
+  GtkWidget *menu = create_zoom_menu_all_levels ();
+  g_signal_connect ( G_OBJECT(menu), "selection-done", 
G_CALLBACK(selection_done), vs);
+  g_signal_connect_swapped ( G_OBJECT(eventbox), "button_press_event", 
G_CALLBACK (zoom_popup_handler), menu);
+  gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK);
+  gtk_container_add ( GTK_CONTAINER(eventbox), vs->status[VIK_STATUSBAR_ZOOM]);
+  gtk_box_pack_start ( GTK_BOX(vs), eventbox, FALSE, FALSE, 1);
   gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_ZOOM], 100, -1 );
 
+
   gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_POSITION], FALSE, 
FALSE, 1);
   gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_POSITION], 250, -1 );
 
@@ -92,6 +161,19 @@ VikStatusbar *vik_statusbar_new ()
   //  otherwise the individual size_requests above create an implicit overall 
size,
   //  and so one can't downsize horizontally as much as may be desired when 
the statusbar is on
   gtk_widget_set_size_request ( GTK_WIDGET(vs), 50, -1 );
+}
+
+/**
+ * vik_statusbar_new:
+ *
+ * Creates a new #VikStatusbar widget.
+ *
+ * Return value: the new #VikStatusbar widget.
+ **/
+VikStatusbar *
+vik_statusbar_new ()
+{
+  VikStatusbar *vs = VIK_STATUSBAR ( g_object_new ( VIK_STATUSBAR_TYPE, NULL ) 
);
 
   return vs;
 }
@@ -104,7 +186,8 @@ VikStatusbar *vik_statusbar_new ()
  *
  * Update the message of the given field.
  **/
-void vik_statusbar_set_message ( VikStatusbar *vs, vik_statusbar_type_t field, 
const gchar *message )
+void
+vik_statusbar_set_message ( VikStatusbar *vs, vik_statusbar_type_t field, 
const gchar *message )
 {
   if ( field >= 0 && field < VIK_STATUSBAR_NUM_TYPES )
   {
diff --git a/src/vikstatus.h b/src/vikstatus.h
index a50e706..a1ad8d7 100644
--- a/src/vikstatus.h
+++ b/src/vikstatus.h
@@ -40,6 +40,9 @@ typedef struct _VikStatusbarClass VikStatusbarClass;
 struct _VikStatusbarClass
 {
   GtkStatusbarClass statusbar_class;
+
+  void (* zoom_changed)  (VikStatusbar *vs,
+                          gint          zoom);
 };
 
 GType vik_statusbar_get_type ();
diff --git a/src/vikwindow.c b/src/vikwindow.c
index 55f58ea..3a0c6ff 100644
--- a/src/vikwindow.c
+++ b/src/vikwindow.c
@@ -389,6 +389,18 @@ static void set_toolbar_zoom ( VikWindow *vw, gdouble mpp )
   gtk_combo_box_set_active ( vw->tb_zoom_combo, active );
 }
 
+static void zoom_changed_cb ( VikStatusbar *vs, gdouble zoom_request, 
VikWindow *vw )
+{
+  // But has it really changed?
+  gdouble current_zoom = vik_viewport_get_zoom ( vw->viking_vvp );
+  if ( current_zoom != 0.0 && zoom_request != current_zoom ) {
+    vik_viewport_set_zoom ( vw->viking_vvp, zoom_request );
+    // Force drawing update
+    draw_update ( vw );
+  }
+
+}
+
 static void zoom_changed ( GtkComboBox *combo, VikWindow *vw )
 {
   gint active = gtk_combo_box_get_active ( combo );
@@ -476,6 +488,7 @@ static void vik_window_init ( VikWindow *vw )
   vw->tb_zoom_combo = GTK_COMBO_BOX(create_zoom_combo_all_levels());
 
   g_signal_connect ( G_OBJECT(vw->tb_zoom_combo), "changed", 
G_CALLBACK(zoom_changed), vw );
+  g_signal_connect ( G_OBJECT(vw->viking_vs), "zoom-changed", 
G_CALLBACK(zoom_changed_cb), vw );
 
   // Add the zoom combo to the toolbar at the end
   GtkToolItem *tooli = gtk_tool_item_new ();
-- 
tg: (a0c6589..) t/gui/rework-zoom-combo (depends on: master)

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Viking-devel mailing list
Viking-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/viking-devel
Viking home page: http://viking.sf.net/

Reply via email to