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