CSSU's portrait mode support - WIP
[drlaunch] / drlaunch / src / win_config.py
1 #!/usr/bin/env python
2 # coding=UTF-8
3
4 # Copyright (C) 2010 Stefanos Harhalakis
5 #
6 # This file is part of wifieye.
7 #
8 # wifieye is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # wifieye is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with wifieye.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 # $Id: 0.py 2265 2010-02-21 19:16:26Z v13 $
22
23 __version__ = "$Id: 0.py 2265 2010-02-21 19:16:26Z v13 $"
24
25 import gtk
26 import gobject
27 import hildon
28 import time
29 import copy
30
31 from hildon import StackableWindow
32 #from portrait import FremantleRotation
33 #from xdg.IconTheme import getIconPath
34
35 import config
36 import apps
37 from icon import Icon, getIcon
38 from iconw import IconWidget
39 from icongrid import IconGridWidget
40 from about import DlgAbout
41 from portrait import FremantleRotation
42 from sig import Disconnector
43
44
45 class DialogIconSize(gtk.Dialog):
46     def __init__(self, config):
47         gtk.Dialog.__init__(self, "Adjust icon size")
48
49         # Operate on copy of config
50         self.config=copy.copy(config)
51         # And keep another copy to be able to undo
52         self.config0=copy.copy(config)
53
54         vbox=self.vbox
55
56         self.pa=hildon.PannableArea()
57         vbox.add(self.pa)
58         self.pa.set_property('mov-mode', hildon.MOVEMENT_MODE_VERT)
59
60         vbox=gtk.VBox()
61         self.pa.add_with_viewport(vbox)
62         self.pa.set_size_request(-1, 1000)
63
64         self.labelDim=gtk.Label("koko")
65         vbox.add(self.labelDim)
66
67         vbox.add(gtk.Label("Icon size:"))
68         scale=gtk.HScale()
69         scale.set_digits(0)
70         scale.set_value_pos(gtk.POS_RIGHT)
71         scale.set_range(*self.config.getIconSizeRange())
72         scale.set_increments(8, 16)
73         self.scaleIconSize=scale
74         vbox.add(scale)
75
76         hbox=gtk.HBox()
77         vbox.add(hbox)
78
79         vbox2=gtk.VBox()
80         vbox2.add(gtk.Label("Padding:"))
81         scale=gtk.HScale()
82         scale.set_digits(0)
83         scale.set_value_pos(gtk.POS_RIGHT)
84         scale.set_range(*self.config.getIconPaddingRange())
85         scale.set_increments(2,2)
86         self.scaleIconPadding=scale
87         vbox2.add(scale)
88         hbox.add(vbox2)
89
90         vbox2=gtk.VBox()
91         vbox2.add(gtk.Label("Margin:"))
92         scale=gtk.HScale()
93         scale.set_digits(0)
94         scale.set_value_pos(gtk.POS_RIGHT)
95         scale.set_range(*self.config.getIconMarginRange())
96         scale.set_increments(2,2)
97         self.scaleIconMargin=scale
98         vbox2.add(scale)
99         hbox.add(vbox2)
100
101         self.icon=IconWidget(False, self.config)
102         self.icon.setApp('osso-addressbook')
103         vbox.add(self.icon)
104
105         self.scaleIconSize.set_value(self.config.getIconSize())
106         self.scaleIconPadding.set_value(self.config.getIconPadding())
107         self.scaleIconMargin.set_value(self.config.getIconMargin())
108
109         # Set thos after settings initial values to avoid unwanted effects
110         self.scaleIconSize.connect('value-changed', self.slotSzChangeSize)
111         self.scaleIconPadding.connect('value-changed', self.slotSzChangePadding)
112         self.scaleIconMargin.connect('value-changed', self.slotSzChangeMargin)
113
114         hbox=gtk.HBox()
115         vbox.add(hbox)
116
117         but=hildon.Button(
118                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
119                 hildon.BUTTON_ARRANGEMENT_VERTICAL)
120         but.set_title("OK")
121         but.connect("clicked", self.slotButtonOK)
122         #hbox.add(but)
123         self.action_area.pack_start(but)
124         self.buttonOK=but
125
126         but=hildon.Button(
127                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
128                 hildon.BUTTON_ARRANGEMENT_VERTICAL)
129         but.set_title("Undo")
130         but.connect("clicked", self.slotButtonUndo)
131         #hbox.add(but)
132         self.action_area.pack_start(but)
133         self.buttonUndo=but
134
135         but=hildon.Button(
136                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
137                 hildon.BUTTON_ARRANGEMENT_VERTICAL)
138         but.set_title("Restore defaults")
139         but.connect("clicked", self.slotButtonDefaults)
140         #hbox.add(but)
141         self.action_area.pack_start(but)
142         self.buttonDefaults=but
143
144         self.show_all()
145
146         self.recalc()
147
148     def setWH(self, w, h):
149         self.labelDim.set_text("Grid size: %d x %d icons" % (w, h))
150         #self.labelWidth.set_text("Width: %d icons" % w)
151         #self.labelHeight.set_text("Height: %d icons" % h)
152
153     def recalc(self):
154         maxsz=self.config.getMaxSize()
155         self.setWH(maxsz[0], maxsz[1])
156         self.icon.refresh()
157
158     def getIconSize(self):
159         return(self.scaleIconSize.get_value())
160
161     def setIconSize(self, iconsize):
162         self.scaleIconSize.set_value(iconsize)
163
164     def getIconPadding(self):
165         return(self.scaleIconPadding.get_value())
166
167     def setIconPadding(self, pad):
168         self.scaleIconPadding.set_value(pad)
169
170     def getIconMargin(self):
171         return(self.scaleIconMargin.get_value())
172
173     def setIconMargin(self, margin):
174         self.scaleIconMargin.set_value(margin)
175
176     def slotSzChangeSize(self, sender):
177         self.config.setIconSize(int(self.getIconSize()))
178         self.recalc()
179
180     def slotSzChangeMargin(self, sender):
181         self.config.setIconMargin(int(self.getIconMargin()))
182         self.recalc()
183
184     def slotSzChangePadding(self, sender):
185         self.config.setIconPadding(int(self.getIconPadding()))
186         self.recalc()
187
188     def slotButtonUndo(self, sender):
189         self.config=copy.copy(self.config0)
190         self.recalc()
191         self.resetSliders()
192
193     def slotButtonDefaults(self, sender):
194         self.config.setDefaultSizes()
195         self.recalc()
196         self.resetSliders()
197
198     def slotButtonOK(self, sender):
199         self.response(gtk.RESPONSE_OK)
200
201     def resetSliders(self):
202         self.scaleIconSize.set_value(self.config.getIconSize())
203         self.scaleIconPadding.set_value(self.config.getIconPadding())
204         self.scaleIconMargin.set_value(self.config.getIconMargin())
205
206     def getData(self):
207         ret={
208             'size':     self.config.getIconSize(),
209             'padding':  self.config.getIconPadding(),
210             'margin':   self.config.getIconMargin()
211             }
212
213         return(ret)
214
215
216 class WinConfig(StackableWindow, Disconnector): #, FremantleRotation):
217     def __init__(self, config, *args):
218         StackableWindow.__init__(self)
219         Disconnector.__init__(self)
220 #       FremantleRotation.__init__(self, "DrlaunchPlugin",
221 #           mode=FremantleRotation.AUTOMATIC)
222
223         self.config=copy.copy(config)
224
225         self.setupUi()
226
227 #       h=self.c(self, 'delete-event', self.slotDeleteEvent)
228
229 # This is a nice test. If it is displayed then the window is actually
230 # destroyed and there is no memory leak
231 #    def __del__(self):
232 #       print "wc-del"
233
234     def setupUi(self):
235         """
236         self.pa         Main Pannable Area
237         self.col1       A VBox for the first column
238         self.col2       A VBox for the second column
239         self.w_igw      The IGW in an alignment
240         """
241         self.set_title("DrLaunch v" + config.version)
242
243         self.pa=hildon.PannableArea()
244 #       self.add(self.pa)
245         self.pa.set_property('mov-mode', hildon.MOVEMENT_MODE_HORIZ)
246
247         self.add(self.pa)
248
249 #1      hbox=gtk.HBox()
250 #1      self.pa.add_with_viewport(hbox)
251
252         # Add the first column of options
253         al=gtk.Alignment(yscale=1)
254 #1      hbox.add(al)
255
256         vbox=gtk.VBox()
257         al.add(vbox)
258         self.col1=al
259
260         maxsz=self.config.getMaxSize()
261
262         self.maxmaxsz=(16,16)
263
264         # ----------------------------------------------
265         vbox.add(gtk.Label('Width:'))
266
267         hbox2=gtk.HBox()
268         vbox.add(hbox2)
269
270         self.butsSizeX=[]
271         for i in xrange(self.maxmaxsz[0]):
272             but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
273             but.set_label("%s" % (i+1,))
274             self.c(but, 'toggled', self.slotButtonSizeX, i)
275
276             self.butsSizeX.append(but)
277
278             hbox2.add(but)
279
280         # ----------------------------------------------
281         vbox.add(gtk.Label('Height:'))
282
283         hbox2=gtk.HBox()
284         vbox.add(hbox2)
285
286         self.butsSizeY=[]
287         for i in xrange(self.maxmaxsz[1]):
288             but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
289             but.set_label("%s" % (i+1,))
290             self.c(but, 'toggled', self.slotButtonSizeY, i)
291
292             self.butsSizeY.append(but)
293
294             hbox2.add(but)
295
296         vbox2=gtk.VBox()
297
298         al=gtk.Alignment(xalign=0, yalign=1, xscale=1)
299         al.add(vbox2)
300         self.col11=al
301
302         vbox.add(al)
303         vbox=vbox2
304
305         but=hildon.CheckButton(
306                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
307         but.set_label("Rotate icons individually")
308         self.c(but, 'toggled', self.slotButtonRotateIndividually)
309         self.buttonRotateIndividually=but
310         vbox.add(but)
311
312         but=hildon.CheckButton(
313                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
314         but.set_label("Require long press")
315 #       but.connect('toggled', self.slotButtonLongpress)
316         self.buttonRequireLongpress=but
317         vbox.add(but)
318
319         but=hildon.CheckButton(
320                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
321         but.set_label("Animate rotation")
322         self.buttonAnimateRotation=but
323         vbox.add(but)
324
325         # -----------------------------------------------
326         # Second column of options
327         vbox=gtk.VBox()
328
329         al=gtk.Alignment(xalign=0, yalign=1, xscale=1)
330         al.add(vbox)
331         self.col2=al
332
333         but=hildon.CheckButton(
334                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
335         but.set_label("Theme background")
336         but.connect('toggled', self.slotButtonThemeBackground)
337         self.buttonThemeBackground=but
338         vbox.add(but)
339
340         but=hildon.CheckButton(
341                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
342         but.set_label("No background")
343         self.c(but, 'toggled', self.slotButtonNoBackground)
344         self.buttonNoBackground=but
345         vbox.add(but)
346
347         but=hildon.Button(
348                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
349                 hildon.BUTTON_ARRANGEMENT_VERTICAL)
350         but.set_label("Adjust icon size")
351         self.c(but, 'clicked', self.slotButtonIconSize)
352         self.buttonIconSize=but
353         vbox.add(but)
354
355 #1      hbox.add(al)
356         but=hildon.Button(
357                 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
358                 hildon.BUTTON_ARRANGEMENT_VERTICAL)
359         but.set_title("About")
360         self.c(but, "clicked", self.slotButtonAbout)
361         vbox.add(but)
362         self.buttonAbout=but
363
364         # -----------------------------------------------
365         # Add the icongrid
366         self.igw=IconGridWidget(True, self.config, False)
367 #       self.igw.do_realize()
368 #       self.igw.setSize(config.getSize())
369         al=gtk.Alignment(xalign=0, xscale=0)
370         al.add(self.igw)
371         al.set_padding(0, 0, 20, 0)
372         self.w_igw=al
373 #1      hbox.add(al)
374
375         self.igw.connect('long-press', self.slotLongpress)
376         self.igw.connect('click', self.slotLongpress)
377
378         self.ignore_toggle=False
379
380         self.setSize(self.config.getSize())
381         self.setIndiv(self.config.getIndiv())
382         self.setLongpress(self.config.getLongpress())
383         self.setAnimate(self.config.getAnimate())
384         self.setNoBg(self.config.getNoBg())
385         self.setThemeBg(self.config.getThemeBg())
386 #       self.setIconSize(self.config.getIconSize())
387 #       self.setIconPadding(self.config.getIconPadding())
388 #       self.setIconMargin(self.config.getIconMargin())
389
390         hbox=gtk.HBox()
391         hbox.add(self.col1)
392         hbox.add(self.col2)
393         hbox.add(self.w_igw)
394         self.pa.add_with_viewport(hbox)
395
396         self.adjustMaxSize()
397
398 #    def setupUi(self, orientation):
399 #
400 #       self.setupUi0()
401 #
402 #       hbox=gtk.HBox()
403 #
404 #       if orientation=='l':
405 #           hbox.add(self.col1)
406 #           hbox.add(self.col2)
407 #           hbox.add(self.w_igw)
408 #       else:
409 #           vbox=gtk.VBox()
410 #           hbox.add(vbox)
411 #           vbox.add(self.col1)
412 #           vbox.add(self.col2)
413 #           hbox.add(self.w_igw)
414 #
415 #       self.pa.add_with_viewport(hbox)
416 #
417 #       if self.get_child()!=None:
418 #           self.remove(self.get_child())
419 #       self.add(self.pa)
420 #       self.pa.show_all()
421
422     def adjustMaxSize(self):
423         sz=self.config.getMaxSize()
424         maxsz=self.maxmaxsz
425
426         for x in xrange(maxsz[0]):
427             if x<sz[0]:
428                 self.butsSizeX[x].show()
429             else:
430                 self.butsSizeX[x].hide()
431
432         for y in xrange(maxsz[1]):
433             if y<sz[1]:
434                 self.butsSizeY[y].show()
435             else:
436                 self.butsSizeY[y].hide()
437
438         osz=self.getSize()
439         nsz=[osz[0], osz[1]]
440
441         if osz[0]>sz[0]:
442             nsz[0]=sz[0]
443         if osz[1]>sz[1]:
444             nsz[1]=sz[1]
445         self.setSize(nsz)
446
447         self.setIndiv(self.getIndiv())
448
449     def setLayoutPortrait(self):
450         print "lo: p"
451         hbox=gtk.HBox()
452         
453         vbox=gtk.VBox()
454         hbox.add(vbox)
455         self.col1.reparent(vbox)
456         self.col2.reparent(vbox)
457         self.w_igw.reparent(hbox)
458
459         r=self.pa.get_children()[0]
460         self.pa.remove(r)
461         r.destroy()
462         self.pa.add_with_viewport(hbox)
463
464         self.pa.show_all()
465
466     def setLayoutLandscape(self):
467         print "lo: l"
468         hbox=gtk.HBox()
469         
470         self.col1.reparent(hbox)
471         self.col2.reparent(hbox)
472         self.w_igw.reparent(hbox)
473
474         r=self.pa.get_children()[0]
475         self.pa.remove(r)
476         r.destroy()
477         self.pa.add_with_viewport(hbox)
478
479         self.pa.show_all()
480
481     def on_orientation_changed(self, orientation):
482         # This is disabled for now since I've not found any reliable
483         # way for supporting orientation changes (#$#%$#*&% GTK)
484         return
485
486         print "orch:", orientation
487         if orientation=='portrait':
488             self.setLayoutPortrait()
489         else:
490             self.setLayoutLandscape()
491
492 #    def slotDeleteEvent(self, sender, event):
493 #       print "wc-del-event"
494 #       return(False)
495
496     def slotLongpress(self, sender, icon):
497         self.doConfig(icon)
498
499     def slotButtonSizeX(self, sender, id):
500         if self.getIndiv():
501             old=self.getSize()
502             sz=(id+1, old[1])
503         else:
504             sz=(id+1, id+1)
505
506         self.setSize(sz)
507         
508     def slotButtonSizeY(self, sender, id):
509         old=self.getSize()
510         sz=(old[0], id+1)
511         self.setSize(sz)
512         
513     def slotButtonRotateIndividually(self, sender):
514         but=self.buttonRotateIndividually
515         self.setIndiv(but.get_active())
516
517     def slotButtonNoBackground(self, sender):
518         nobg=self.getNoBg()
519         self.setNoBg(nobg)
520
521     def slotButtonThemeBackground(self, sender):
522         themebg=self.getThemeBg()
523         self.setThemeBg(themebg)
524
525     def slotButtonAbout(self, sender):
526         DlgAbout.present2(self)
527
528     def slotButtonIconSize(self, sender):
529         dlg=DialogIconSize(self.config)
530         ret=dlg.run()
531         dt=dlg.getData()
532         dlg.destroy()
533
534         if ret!=gtk.RESPONSE_OK:
535             return
536
537         self.config.setIconSize(dt['size'])
538         self.config.setIconMargin(dt['margin'])
539         self.config.setIconPadding(dt['padding'])
540         self.igw.reconfig()
541         self.adjustMaxSize()
542         self.queue_draw()
543
544     def show_all(self):
545         StackableWindow.show_all(self)
546 #       return
547         self.adjustMaxSize()
548         self.queue_draw()
549
550 #    def slotScaleIconSzChange(self, sender):
551 #       return
552 #       self.config.setIconSize(self.getIconSize())
553 #       self.config.setIconMargin(self.getIconMargin())
554 #       self.config.setIconPadding(self.getIconPadding())
555 #       self.igw.reconfig()
556 #       self.adjustMaxSize()
557 #       self.queue_draw()
558
559 #    def slotButtonLongpress(self, sender):
560 #       but=self.buttonRequireLongpress
561 #       self.set
562
563     def setSize(self, sz):
564         if self.ignore_toggle:
565             return
566
567         self.ignore_toggle=True
568
569         maxsz=self.config.getMaxSize()
570
571         id=sz[0]-1
572
573         for i in xrange(maxsz[0]):
574             but=self.butsSizeX[i]
575             but.set_active(i==id)
576
577         id=sz[1]-1
578
579         for i in xrange(maxsz[1]):
580             but=self.butsSizeY[i]
581             but.set_active(i==id)
582
583         self.ignore_toggle=False
584
585         self.igw.setSize(sz)
586
587         self.igw.queue_draw()
588         self.queue_draw()
589
590     def getSize(self):
591         return(self.igw.getSize())
592
593     def getIndiv(self):
594         ret=self.buttonRotateIndividually.get_active()
595
596         return(ret)
597
598     def setIndiv(self, indiv):
599         if indiv:
600             for i in self.butsSizeY:
601                 i.set_sensitive(True)
602             for i in self.butsSizeX:
603                 i.set_sensitive(True)
604
605         else:
606             sz=self.config.getMaxSize()
607
608             for i in self.butsSizeY:
609                 i.set_sensitive(False)
610
611             cnt=0
612             for i in self.butsSizeX:
613                 cnt+=1
614                 # Height is always the narrower, so use that as a limit
615                 if cnt>sz[1]:
616                     i.set_sensitive(False)
617                 else:
618                     i.set_sensitive(True)
619
620             sz=self.getSize()
621             szx=sz[0]
622             if szx>sz[1]:
623                 szx=sz[1]
624             self.setSize((szx, szx))
625
626         self.buttonRotateIndividually.set_active(indiv)
627
628     def setLongpress(self, lp):
629         self.buttonRequireLongpress.set_active(lp)
630
631     def setAnimate(self, ar):
632         self.buttonAnimateRotation.set_active(ar)
633
634     def getNoBg(self):
635         ret=self.buttonNoBackground.get_active()
636         return(ret)
637
638     def setNoBg(self, nobg):
639         self.buttonNoBackground.set_active(nobg)
640
641         self.buttonThemeBackground.set_sensitive(not nobg)
642         self.config.setNoBg(nobg)
643         self.igw.reconfig()
644
645     def getThemeBg(self):
646         ret=self.buttonThemeBackground.get_active()
647         return(ret)
648
649     def setThemeBg(self, themebg):
650         self.buttonThemeBackground.set_active(themebg)
651         self.config.setThemeBg(themebg)
652         self.igw.reconfig()
653
654     def doConfig(self, icon):
655         aps=apps.scan()
656
657         lst=[aps[x]['name'] for x in aps]
658         lst.sort()
659
660         dialog=gtk.Dialog('App select', None,
661             gtk.DIALOG_DESTROY_WITH_PARENT, buttons=())
662
663         selector=hildon.TouchSelectorEntry(text=True)
664         selector.set_column_selection_mode(
665             hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
666
667         dialog.vbox.pack_start(selector, True, True, 0)
668         dialog.set_size_request(0,900)
669         dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
670         dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
671
672         selector.append_text('None')
673
674         idx=0
675         cnt=1
676         for app in lst:
677             if app==None:
678                 continue
679             selector.append_text(app)
680             if icon.appname!=None and aps[icon.appname]['name']==app:
681                 idx=cnt
682             cnt+=1
683
684         selector.set_active(0, idx)
685
686         dialog.show_all()
687
688         app=None
689
690         r=dialog.run()
691
692         if r==gtk.RESPONSE_OK:
693             idx2=selector.get_active(0)
694             if idx2<1:
695                 app=None
696             else:
697                 cur=lst[idx2-1]
698                 for i in aps:
699                     if aps[i]['name']==cur:
700                         app=aps[i]
701                         break
702             if app!=None:
703                 app['icon2']=getIcon(app['icon'], self.config.getIconSize())
704             else:
705                 app={
706                     'id':       None,
707                     'icon2':    None,
708                     }
709             icon.setApp(app)
710
711         dialog.destroy()
712
713 #    def finish(self):
714 #       print "wc-finish"
715 #       self.igw=None
716 #
717 #       self.dis_finish()
718
719     def getData(self):
720         szx=0
721         szy=0
722         for but in self.butsSizeX:
723             szx+=1
724             if but.get_active()==True:
725                 break
726
727         for but in self.butsSizeY:
728             szy+=1
729             if but.get_active()==True:
730                 break
731
732         if self.getIndiv():
733             sz=(szx, szy)
734         else:
735             sz=(szx, szx)
736
737         wapps={}
738
739         for x in xrange(sz[0]):
740             for y in xrange(sz[1]):
741                 ico=self.igw.get(x,y)
742                 k=(x,y)
743                 wapps[k]=ico.appname
744
745         indiv=self.buttonRotateIndividually.get_active()
746         lp=self.buttonRequireLongpress.get_active()
747         ar=self.buttonAnimateRotation.get_active()
748         nobg=self.buttonNoBackground.get_active()
749         themebg=self.buttonThemeBackground.get_active()
750
751         ret={
752             'size':         sz,
753             'apps':         wapps,
754             'indiv':        indiv,
755             'longpress':    lp,
756             'animate':      ar,
757             'nobg':         nobg,
758             'themebg':      themebg,
759             'iconsize':     self.config.getIconSize(),
760             'iconpadding':  self.config.getIconPadding(),
761             'iconmargin':   self.config.getIconMargin(),
762             }
763
764         return(ret)
765
766 if __name__=="__main__":
767     win=WinConfig()
768     win.connect('delete-event', gtk.main_quit)
769
770     win.show_all()
771     gtk.main()
772
773
774
775 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent:
776