source: zero-center/trunk/fuentes/install-files/usr/share/zero-center/zero-center.py @ 8294

Last change on this file since 8294 was 8294, checked in by hectorgh, 9 months ago

removing old friend

  • Property svn:executable set to *
File size: 34.3 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*
3 
4
5import os
6import multiprocessing
7import time
8import random
9import xmlrpclib
10import cairo
11import grp
12import sys
13import subprocess
14import json
15
16try:
17        import gi
18        gi.require_version('Gtk', '3.0')
19        gi.require_version('PangoCairo', '1.0')
20        from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
21       
22except Exception as e:
23        print e
24        #zero-server-wizard initialization forces me to do this
25
26import signal
27signal.signal(signal.SIGINT, signal.SIG_DFL)
28
29import gettext
30gettext.textdomain('zero-center')
31_ = gettext.gettext
32
33
34BAR_HEIGHT=90
35CONF_X=5
36
37if os.path.exists("/home/lliurex/banners/"):
38        BANNER_PATH="/home/lliurex/banners/"
39else:
40        BANNER_PATH="/usr/share/banners/lliurex-neu/"
41       
42
43class CategoriesParser:
44       
45        CATEGORIES_PATH="/usr/share/zero-center/categories/"
46       
47        def __init__(self):
48               
49                self.parse_categories()
50               
51        #def init
52       
53        def parse_categories(self,path=None):
54               
55                self.categories=[]
56               
57                if path==None:
58                        path=self.CATEGORIES_PATH
59                       
60                for item in os.listdir(path):
61                        file_path=path+item
62                       
63                        f=open(file_path)
64                        lines=f.readlines()
65                        f.close()
66                       
67                        cat={}
68                       
69                        for line in lines:
70                                key,value=line.split("=")
71                                cat[key]=value.strip("\n")
72                                if key=="level":
73                                        cat[key]=int(cat[key])
74                       
75                        self.categories.append(cat)
76                       
77                tmp=[]
78               
79                while len(self.categories)>0:
80                        selected_index=0
81                        index=0
82                        level=0
83                        for item in self.categories:
84                                if item["level"]>level:
85                                        level=item["level"]
86                                        selected_index=index
87                                       
88                               
89                                index+=1
90                       
91                        tmp.append(self.categories[selected_index])
92                        self.categories.pop(selected_index)
93                       
94                self.categories=tmp
95               
96        #def parse_categories
97               
98               
99#class CategoriesParser
100
101
102class AppParser:
103       
104        BASE_DIR="/usr/share/zero-center/"
105        APP_PATH=BASE_DIR+"applications/"
106        ZMD_PATH=BASE_DIR+"zmds/"
107       
108       
109        def __init__(self):
110               
111                self.categories=["ID","Name","Comment","Icon","Category","Icon","ScriptPath","Groups","Service","Locks"]
112                self.apps={}
113                self.app_list=[]
114                self.configured=[]
115                #print("[ZeroCenter] Parsing apps...")
116                self.parse_all()
117               
118        #def init
119
120       
121        def add_app(self,app):
122               
123                try:
124                        if app["Category"].lower() not in self.apps:
125                                self.apps[app["Category"].lower()]=[]
126                       
127                        self.apps[app["Category"].lower()].append(app)
128                        self.app_list.append(app["ID"])
129                except:
130                        pass
131                       
132        #def add_app
133       
134        def parse_all(self,dir=None):
135               
136                if dir==None:
137                        dir=self.APP_PATH
138       
139                for item in os.listdir(dir):
140                        file_path=self.APP_PATH+item
141                        app=self.parse_file(file_path)
142                        self.add_app(app)
143                       
144        #def parse_all
145
146       
147        def parse_file(self,file_path):
148               
149                f=open(file_path)
150                lines=f.readlines()
151                f.close()
152                id=file_path.split("/")[-1].split(".")[0]
153                app={}
154                for item in lines:
155                        try:
156                                key,value=item.split("=")
157                                app[key]=value.strip("\n")
158                        except:
159                                pass
160               
161                app["ID"]=id
162                app["configured"]=-1
163                app["custom_msg"]=""
164               
165                app["bar_height"]=BAR_HEIGHT
166                app["conf_alpha"]=1.0
167
168               
169                app["expanding"]=False
170                app["restoring"]=False
171
172                return app
173               
174        #def parse_file
175
176       
177#class AppParser
178
179
180class ZeroCenter:
181       
182        def __init__(self):
183               
184                self.client=xmlrpclib.ServerProxy("https://localhost:9779")
185                self.create_user_env()
186                self.categories_parser=CategoriesParser()
187                self.app_parser=AppParser()
188                self.configured_apps=[]
189                self.get_states()
190               
191                self.mprocess=multiprocessing.Process()
192                self.commands=["set-configured","set-non-configured","set-failed","set-custom-text","add-zero-center-notification","remove-zero-center-notification","help","add-pulsating-color","remove-pulsating-color","non-animated","animated"]
193                self.drawing_mode=True
194                self.msg_text=""
195                self.msg_x=0
196                self.scrolling=False
197               
198                try:
199                        self.msg_text=self.client.get_zc_messages("","ZCenterVariables",self.lang)
200                        if self.msg_text=="":
201                                txt=self.client.lliurex_version("","LliurexVersion")
202                                if type(txt)==type([]):
203                                        self.msg_text=str(txt[1])
204                                else:
205                                        f=open("/etc/lsb-release")
206                                        lines=f.readlines()
207                                        f.close()
208                                        for line in lines:
209                                                if "DISTRIB_DESCRIPTION" in line:
210                                                        self.msg_text=line.split("=")[1]
211                        #Load slave_blacklist
212                        self.blacklist=self.client.get_variable("","VariablesManager","SLAVE_BLACKLIST")
213
214                except:
215                        self.msg_text=""
216               
217                #self.msg_text="hi, i'm a long enough text so that it won't show in just one line. I wonder how many lines I can get inside the box. In my restless dreams I see that town, Silent Hill. I don't know what to type, but I have to keep typing"
218                #57
219               
220        #def init
221
222       
223        def get_states(self):
224               
225                try:
226                        var=self.client.get_all_states("","ZCenterVariables")
227                except:
228                        local_path="/var/lib/n4d/variables-dir/ZEROCENTER"
229                        if os.path.exists(local_path):
230                                f=open(local_path)
231                                var=json.load(f)["ZEROCENTER"]["value"]
232                                f.close()
233                        else:
234                                var={}
235                               
236                try:
237                        for cat in self.app_parser.apps:
238                       
239                                for app in self.app_parser.apps[cat]:
240                                        app["configured"]=0
241                                       
242                                        if app["ID"] in var:
243                                                for key in ["state","pulsating","time","custom_text"]:
244                                                        if key in var[app["ID"]]:
245                                                                app[key]=var[app["ID"]][key]
246               
247                                                       
248                                        if "state" in app:
249                                                app["configured"]=app["state"]
250                               
251                                        if app["configured"]==1:
252                                                self.configured_apps.append(app["ID"])
253                               
254                               
255                except Exception as e:
256                        print e
257                        pass
258                       
259        #def get_states
260
261       
262        def get_translation(self,text):
263               
264                for category in self.categories_parser.categories:
265                       
266                        if text.lower()==category["name"].lower():
267                                for lang in self.language:
268                                        try:
269                                                return category["name["+lang+"]"]
270                                        except Exception as e:
271                                                pass
272                                return category["name"]
273               
274                return text
275               
276        #def get_translation
277
278       
279        def get_name(self,app):
280               
281                for lang in self.language:
282                        try:
283                                return app["Name["+lang+"]"]
284                        except:
285                                pass
286                               
287                return app["Name"]
288               
289        #def get_name
290
291       
292        def get_comment(self,app):
293               
294                for lang in self.language:
295                        try:
296                                return app["Comment["+lang+"]"]
297                        except:
298                                pass
299                               
300                return app["Comment"]
301               
302        #def get_name
303
304       
305        def create_user_env(self):
306               
307                try:
308                        self.lang=os.environ["LANGUAGE"].replace(".UTF-8","").split(":")[0]
309                        self.language=os.environ["LANGUAGE"].replace(".UTF-8","").split(":")
310                        if "es_ES" in self.language and "es" not in self.language:
311                                self.language.insert(self.language.index("es_ES")+1,"es")
312                        self.lang=self.lang.split("_")[0]
313                       
314                        if "ca_ES@valencia" in self.language:
315                                self.language.insert(self.language.index("ca_ES@valencia"),"qcv")
316                except:
317                        try:
318                                self.lang=os.environ["LANG"].replace(".UTF-8","")
319                                self.language=[]
320                                self.language.append(self.lang)
321                                self.lang=self.lang.split("_")[0]
322                               
323                        except:
324                                self.lang="en"
325
326                       
327                groups={}
328               
329                for item in grp.getgrall():
330                        if len(item.gr_mem)>0:
331                                if item.gr_name not in groups:
332                                        groups[item.gr_name]=item.gr_mem
333                                else:
334                                        groups[item.gr_name]=list(groups[item.gr_name]+item.gr_mem)
335                       
336               
337                self.user_groups=[]
338                try:
339                        for item in groups:
340                                if os.environ["USER"] in groups[item]:
341                                        self.user_groups.append(item)
342                                       
343                        self.user_groups.append("*")
344                except:
345                        pass
346               
347        #def create_user_area
348
349       
350        def start_gui(self):
351               
352               
353                self.icon_theme=Gtk.IconTheme()
354                self.icon_theme.set_custom_theme("lliurex-neu")
355               
356                builder=Gtk.Builder()
357                if os.path.exists("/srv/svn/pandora/zero-center2/install-files/usr/share/zero-center/rsrc/zero-center.glade"):
358                        builder.add_from_file("/srv/svn/pandora/zero-center2/install-files/usr/share/zero-center/rsrc/zero-center.glade")
359                else:
360                        builder.add_from_file("/usr/share/zero-center/rsrc/zero-center.glade")
361                self.window=builder.get_object("window1")
362                self.window.connect("delete_event",self.close_window)
363                self.window.set_name("BLACK")
364                self.buttons_vbox=builder.get_object("buttons_vbox")
365                self.content_hbox=builder.get_object("main_box")
366                self.content_hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0.2,0.2,0.2,1))
367                self.window_box=builder.get_object("window_box")
368                self.viewport=builder.get_object("viewport1")
369                self.viewport.set_name("ORANGE")
370                self.category_combobox=builder.get_object("category_combobox")
371                self.msg_label=builder.get_object("llx_label")
372                self.msg_label.connect("draw",self.drawing_label_event)
373                self.msg_label.set_tooltip_text(self.msg_text)
374               
375                self.hidden_button=builder.get_object("button1")
376                self.hidden_button.grab_focus()
377               
378                self.search_entry=builder.get_object("entry")
379                self.search_entry.connect("changed",self.entry_changed)
380               
381                self.progress_bar=builder.get_object("progressbar")
382                self.progress_label=builder.get_object("progress_label")
383                self.progress_label.set_name("WHITE")
384               
385                self.add_categories_to_window("All")
386                self.set_css_info()
387               
388                self.window.show()
389                GObject.threads_init()
390                Gtk.main()
391               
392        #def start_gui
393       
394       
395        def entry_changed(self,widget):
396                self.add_categories_to_window("",False)
397       
398        def scroll_me(self,img):
399               
400                if self.msg_x > (self.scroll_width)*-1:
401                        self.msg_x-=1
402                else:
403                        self.msg_x=401
404                img.queue_draw()
405                return self.scrolling
406               
407        #def scroll_me
408
409
410        def set_msg_label_text(self,txt):
411       
412                self.msg_text=txt
413                self.msg_label.queue_draw()
414               
415        #def set_msg_label_text()
416
417       
418        def drawing_label_event(self,widget,ctx):
419               
420                lg1 = cairo.LinearGradient(0.0,18.0, 400.0, 18.0)
421                lg1.add_color_stop_rgba(0, 0.38, 0.38, 0.38, 1)
422                lg1.add_color_stop_rgba(0.1, 0.2, 0.2, 0.2, 1)
423                lg1.add_color_stop_rgba(0.9, 0.2, 0.2, 0.2, 1)
424                lg1.add_color_stop_rgba(1, 0.38, 0.38, 0.38, 1)
425                ctx.rectangle(0, 0, 400, 18)
426                ctx.set_source(lg1)
427                ctx.fill()
428
429                tmp_text=self.msg_text
430
431                if len(tmp_text)>66:
432                        if self.drawing_mode:
433                                if not self.scrolling:
434                                        self.scrolling=True
435                                        self.msg_x=200
436                                        GLib.timeout_add(12,self.scroll_me,widget)
437                        else:
438                                tmp_text=tmp_text[:63]
439                                tmp_text="      " + tmp_text+u" …"
440                else:
441                        self.scrolling=False
442                        spaces=90-len(tmp_text)
443                        space="".join([" "]*(spaces/2))
444                        tmp_text=space+tmp_text+space
445                       
446               
447               
448                tmp_text=tmp_text.replace("[","<b>[")
449                tmp_text=tmp_text.replace("]","] </b>")
450               
451                x=self.msg_x
452                pctx = PangoCairo.create_layout(ctx)
453                desc = Pango.font_description_from_string ("Ubuntu 9")
454                pctx.set_font_description(desc)
455                ctx.set_source_rgb(0.9,0.9,0.9)
456                pctx.set_markup(tmp_text)
457                self.scroll_width=pctx.get_pixel_size()[0]
458                ctx.move_to(x,0)
459                PangoCairo.show_layout(ctx, pctx)
460               
461        #def set_msg_label
462       
463       
464        def set_css_info(self):
465               
466                css = """
467               
468                #BLACK {
469                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#1a1a1a),  to (#616161));
470                       
471                }
472
473                #ORANGE {
474                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#575757),  to (#373737));
475                       
476                }
477               
478                #BLACKEXPANDER {
479                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#1a1a1a),  to (#1a1a1a));
480                        color: white;
481                        box-shadow: 50px 50px;
482                       
483                }
484               
485                #WHITE {
486                        color: white;
487                        text-shadow: 0px 1px black;
488                }               
489               
490                #WHITE-15 {
491                        color: white;
492                        font-size: 15px;
493                        text-shadow: 1px 2px black;
494                }
495
496               
497                #BLACKBUTTON{
498                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#2a2a2a),  to (#616161));
499                        color: #e0e0e0;
500                        border-color: #000;
501                        border-style: none;
502                        border-radius: 10px;
503                       
504                }
505               
506               
507               
508                #APPBUTTON{
509
510                        padding: 0px 0px;
511                        border:none;
512                        background-image: none;
513                        box-shadow: none;
514                        background-color: transparent;
515                        box-shadow: 0px 2px 5px rgba(0,0,0,0.8);
516
517                }
518
519                #APPBUTTON:hover{
520
521                       
522                        border-width: 0;
523                        border-radius: 0px;
524                        border-color: transparent;
525                        border: none;   
526                        box-shadow: 0px 1px 8px rgba(0,0,0,1);
527                }
528               
529                GtkSeparator {
530                        color: rgba(255,255,255,0.8);
531                }
532               
533               
534                """
535               
536                self.style_provider=Gtk.CssProvider()
537                self.style_provider.load_from_data(css)
538               
539                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
540               
541        #def set_css_info       
542       
543       
544        def get_banner_image(self,app):
545
546                package_rsrc_path=BANNER_PATH
547                img_path=package_rsrc_path+"package.png"
548               
549                for item in os.listdir(package_rsrc_path):
550                        f,ext=item.split(".")
551                        if app["Icon"] == f:
552                                img_path=package_rsrc_path+item
553               
554               
555                img=cairo.ImageSurface.create_from_png(img_path)
556                ctx=cairo.Context(img)
557
558                if not self.check_app_dependences(app):
559                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
560                        ctx.rectangle(0,0,235,110)
561                        ctx.fill()
562               
563
564                ctx.set_source_rgba(0,0,0,0.8)
565                ctx.rectangle(0,90,235,110)
566                ctx.fill()
567
568
569                show_status=True
570                if "Depends" in app:
571
572                        if not self.check_app_dependences(app):
573                               
574                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
575                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
576                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
577                                ctx.rectangle(0, 0, 200, 20)
578                                ctx.set_source(lg1)
579                                ctx.fill()
580                                                                                       
581                                ctx.select_font_face("Ubuntu")
582                                ctx.set_font_size(15)
583                                ctx.move_to(5,15)
584                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
585                                                                                       
586                                ctx.show_text(_("Unmet dependences"))
587                                ctx.stroke()
588                               
589                                show_status=False
590
591
592                if "Service" in app and show_status:
593
594                        if app["Service"].lower()=="true":
595
596                                if app["configured"]==1:
597
598                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
599                                                               
600                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
601                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
602                                        ctx.rectangle(0, 0, 200, 20)
603                                        ctx.set_source(lg1)
604                                        ctx.fill()
605                                                       
606                                        ctx.select_font_face("Ubuntu")
607                                        ctx.set_font_size(15)
608                                        ctx.move_to(5,15)
609                                        ctx.set_source_rgb(1,1,1)
610                                                       
611                                        ctx.show_text(_("Configured"))
612                                        ctx.stroke()
613
614
615                                elif app["configured"]==0:
616
617                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
618                                                               
619                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
620                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
621                                        ctx.rectangle(0, 0, 200, 20)
622                                        ctx.set_source(lg1)
623                                        ctx.fill()
624                                                       
625                                        ctx.select_font_face("Ubuntu")
626                                        ctx.set_font_size(15)
627                                        ctx.move_to(5,15)
628                                        ctx.set_source_rgb(1,1,1)
629                                                       
630                                        ctx.show_text(_("Not configured"))
631                                        ctx.stroke()
632                                       
633                                else:
634                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
635                                        lg1.add_color_stop_rgba(0, 1, 0, 0, 1)
636                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
637                                        ctx.rectangle(0, 0, 200, 20)
638                                        ctx.set_source(lg1)
639                                        ctx.fill()
640                                                               
641                                        ctx.select_font_face("Ubuntu")
642                                        ctx.set_font_size(15)
643                                        ctx.move_to(5,15)
644                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
645                                                               
646                                        ctx.show_text(_("Failed"))
647                                        ctx.stroke()
648
649                ctx.select_font_face("Ubuntu")
650                ctx.set_font_size(15)
651                ctx.move_to(5,105)
652                ctx.set_source_rgb(1,1,1)
653                txt=""
654                fix=True
655               
656                text=self.get_name(app)
657               
658               
659                for char in range(30):
660                        try:
661                                txt+=text[char]
662                        except:
663                                fix=False
664                                break
665                                                       
666                if fix:
667                        txt+="…"
668               
669                ctx.show_text(txt)
670                ctx.stroke()
671
672                #img.write_to_png(self.user_rsrc_path+item)
673                image=Gtk.Image()
674                #image.set_from_file(self.user_rsrc_path+item)
675                image.set_from_pixbuf(Gdk.pixbuf_get_from_surface(img,0,0,235,110))
676                image.set_name("BIMAGE")
677                return image
678               
679        #def get_image
680
681       
682        def drawing_banner_event(self,widget,ctx,app):
683               
684                package_rsrc_path=BANNER_PATH
685                img_path=package_rsrc_path+"package.png"
686                for item in os.listdir(package_rsrc_path):
687                        f,ext=item.split(".")
688                        if app["Icon"] == f:
689                                img_path=package_rsrc_path+item
690               
691       
692                img=cairo.ImageSurface.create_from_png(img_path)
693                ctx.set_source_surface(img,0,0)
694               
695                if not self.check_app_dependences(app):
696                        ctx.paint_with_alpha(0.2)
697                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
698                        ctx.rectangle(0,0,235,110)
699                        ctx.fill()
700                else:
701                        ctx.paint()
702
703
704                if "pulsating" in app and app["pulsating"]:
705                       
706                        '''
707                        if app["pulsating"]:
708                                ctx.set_source_rgba(1,1,1,app["pulsating_alpha"])
709                                ctx.rectangle(0,0,235,110)
710                                ctx.fill()             
711                        '''
712                       
713                        app.setdefault("pulsating_alpha",0.0)
714       
715                        lg1 = cairo.LinearGradient(0.0,10.0, 235.0, 10.0)
716                        lg1.add_color_stop_rgba(0, 0, 0.0, 0.8, 0.7)
717                        lg1.add_color_stop_rgba(app["pulsating_alpha"], 0.1, 0.7, 0.9, 1)
718                        lg1.add_color_stop_rgba(1, 0, 0, 0.8, 0.5)
719                        ctx.rectangle(0,app["bar_height"],235,20)
720                        ctx.set_source(lg1)
721                        ctx.fill()
722                        ctx.set_source_rgba(0,0,0,0.8)
723                        ctx.rectangle(0,app["bar_height"]+20,235,110)
724                        ctx.fill()                     
725                       
726                else:
727                       
728                        ctx.set_source_rgba(0,0,0,0.7)
729                        ctx.rectangle(0,app["bar_height"],235,110)
730                        ctx.fill()
731               
732                show_status=True
733                if "Depends" in app:
734
735                        if not self.check_app_dependences(app):
736                               
737                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
738                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
739                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
740                                ctx.rectangle(0, 0, 200, 20)
741                                ctx.set_source(lg1)
742                                ctx.fill()
743                                                                                       
744                                ctx.select_font_face("Ubuntu")
745                                ctx.set_font_size(15)
746                               
747                                ctx.move_to(6,16)
748                                ctx.set_source_rgba(0,0,0,app["conf_alpha"])
749                                ctx.show_text(_("Unmet dependences"))
750                                ctx.stroke()
751                               
752                               
753                                ctx.move_to(5,15)
754                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
755                                ctx.show_text(_("Unmet dependences"))
756                                ctx.stroke()
757                               
758                                show_status=False
759
760                if "Service" in app and show_status:
761                       
762                        if app["Service"].lower()=="true":
763
764                                if app["configured"]==1:
765
766                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
767                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
768                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
769                                        ctx.rectangle(0, 0, 200, 20)
770                                        ctx.set_source(lg1)
771                                        ctx.fill()
772                                                       
773                                        ctx.select_font_face("Ubuntu")
774                                        ctx.set_font_size(15)
775                                       
776                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
777                                        ctx.move_to(6,16)               
778                                        ctx.show_text(_("Configured"))
779                                        ctx.stroke()
780                                       
781                                       
782                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
783                                        ctx.move_to(5,15)               
784                                        ctx.show_text(_("Configured"))
785                                        ctx.stroke()
786                                                       
787                                elif app["configured"]==-1:
788
789                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
790                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
791                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
792                                        ctx.rectangle(0, 0, 200, 20)
793                                        ctx.set_source(lg1)
794                                        ctx.fill()
795                                                       
796                                        ctx.select_font_face("Ubuntu")
797                                        ctx.set_font_size(15)
798                                       
799                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
800                                        ctx.move_to(6,16)               
801                                        ctx.show_text(_("Failed"))
802                                        ctx.stroke()
803                                       
804                                       
805                                        ctx.move_to(5,15)
806                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
807                                        ctx.show_text(_("Failed"))
808                                        ctx.stroke()
809                                       
810                                else:
811                                       
812                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
813                                        lg1.add_color_stop_rgba(0, 0.8, 0, 0, 1)
814                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
815                                        ctx.rectangle(0, 0, 200, 20)
816                                        ctx.set_source(lg1)
817                                        ctx.fill()
818
819                                        ctx.select_font_face("Ubuntu")
820                                        ctx.set_font_size(15)
821                                       
822                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
823                                        ctx.move_to(6,16)               
824                                        ctx.show_text(_("Not configured"))
825                                        ctx.stroke()                                   
826                                       
827                                        ctx.move_to(5,15)
828                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
829                                        ctx.show_text(_("Not configured"))
830                                        ctx.stroke()                                   
831
832
833                txt=""
834                fix=True
835                for char in range(30):
836                        try:
837                                txt+=self.get_name(app)[char]
838                        except:
839                                fix=False
840                                break
841                                                       
842                if fix:
843                        txt+="…"
844
845
846                ctx.select_font_face("Ubuntu")
847                ctx.set_font_size(15)
848               
849                ctx.move_to(6,app["bar_height"]+16)
850                ctx.set_source_rgb(0,0,0)
851                ctx.show_text(txt)
852                ctx.stroke()           
853               
854                ctx.move_to(5,app["bar_height"]+15)
855                ctx.set_source_rgb(0.9,0.9,0.9)
856                ctx.show_text(txt)
857                ctx.stroke()           
858
859               
860               
861               
862                y=app["bar_height"]+30
863                pctx = PangoCairo.create_layout(ctx)
864                desc = Pango.font_description_from_string ("Ubuntu 8")
865                pctx.set_font_description(desc)
866                pctx.set_alignment(Pango.Alignment.LEFT)
867                pctx.set_justify(True)
868                pctx.set_width(225000)
869                pctx.set_height(10)
870                ctx.set_source_rgb(1,1,0.8)
871                pctx.set_text(self.get_comment(app),-1)
872               
873
874                ctx.move_to(6,y)
875                PangoCairo.show_layout (ctx, pctx)
876               
877                if "custom_text" in app:
878                       
879                        ctx.set_source_rgb(0.5,0.5,1)
880                        pctx.set_text(app["custom_text"],-1)
881                        ctx.move_to(6,y+60)
882                        PangoCairo.show_layout (ctx, pctx)
883                       
884               
885        #def drawing_event
886       
887
888        def mouse_over(self,widget,event,app,img):
889               
890                if not app["expanding"]:
891                        app["restoring"]=False
892                        app["expanding"]=True
893                        GLib.timeout_add(10,self.expand_black_area,app,img)
894               
895        #def mouse_over
896
897       
898        def mouse_left(self,widget,event,app,img):
899               
900                if not app["restoring"]:
901                        app["expanding"]=False
902                        app["restoring"]=True
903                        GLib.timeout_add(10,self.restore_black_area,app,img)
904               
905        #def mouse_left
906
907       
908        def expand_black_area(self,app,img):
909               
910                while app["bar_height"]>0 and app["expanding"]:
911                        app["bar_height"]-=2
912                        if app["conf_alpha"]>0.0:
913                                app["conf_alpha"]-=0.025
914                        img.queue_draw()
915                        return True
916                       
917                if not app["expanding"]:
918                        return False
919                       
920                app["expanding"]=False
921                app["conf_alpha"]=0.0
922                img.queue_draw()
923                return False
924               
925        #def expand_black_area
926       
927       
928        def restore_black_area(self,app,img):
929               
930                while app["bar_height"]<BAR_HEIGHT and app["restoring"]:
931                        app["bar_height"]+=2
932                        if app["conf_alpha"]<1.0:
933                                app["conf_alpha"]+=0.025
934                        img.queue_draw()
935                        return True
936                       
937                if not app["restoring"]:
938                        return False
939                       
940                app["restoring"]=False
941                app["conf_alpha"]=1.0
942                img.queue_draw()
943                return False
944               
945        #def restore_black_area
946       
947       
948        def check_app_groups(self,app,verbose=True):
949               
950                if verbose:
951                        sys.stdout.write(" * Checking " + app["ID"] + " ... ")
952                groups=[]
953                if "Groups" not in app:
954                        if verbose:
955                                print("OK")
956                        return True
957               
958                try:
959                       
960                        if os.environ["USER"]=="root":
961                                if verbose:
962                                        print("OK")
963                                return True
964                       
965                        groups=app["Groups"].strip("\n").split(";")
966                        for group in groups:
967                                if group in self.user_groups:
968                                        if verbose:
969                                                print("OK")             
970                                        return True
971                       
972                except Exception as e:
973                        print e
974                        pass
975                       
976                if verbose:
977                        print "NOT ALLOWED"
978                        print "\t[!] App groups: ",sorted(groups)
979                return False
980               
981        #def check_app_groups
982
983       
984        def add_pulsating(self,app,image):
985               
986                GLib.timeout_add(70,self.pulsate_color,app,image)
987               
988        #def add_pulsating
989
990
991        def pulsate_color(self,app,image):
992               
993                app["pulsating_alpha"]+=app["pulsating_increment"]
994               
995                if app["pulsating_alpha"] >= 1.0 :
996                       
997                        app["pulsating_increment"]=-0.02
998                       
999                if app["pulsating_alpha"] <= 0.0 :
1000                       
1001                        app["pulsating_increment"]=0.02
1002                       
1003                image.queue_draw()
1004                return app["pulsating"]
1005               
1006        #def pulsate_color
1007               
1008               
1009        def check_app_dependences(self,app):
1010               
1011                if "Depends" in app:
1012                        depends=app["Depends"].split(";")
1013                        for dep in depends:
1014                               
1015                                if dep not in self.configured_apps:
1016                                        return False
1017                               
1018                return True
1019               
1020        #def check_app_dependences
1021
1022       
1023        def add_categories_to_window(self,category,verbose=True):
1024               
1025                for child in self.content_hbox.get_children():
1026                        self.content_hbox.remove(child)
1027               
1028                for category in self.categories_parser.categories:
1029                       
1030                        icon=category["icon"]
1031                        category=category["name"].lower()
1032                       
1033                        once=True
1034                        hbox=Gtk.FlowBox()
1035                        hbox.set_margin_left(5)
1036                        hbox.set_margin_right(5)
1037                        hbox.set_homogeneous(True)
1038                        hbox.set_column_spacing(5)
1039                        hbox.set_row_spacing(10)
1040                        hbox.set_halign(Gtk.Align.FILL)
1041                        hbox.set_valign(Gtk.Align.START)
1042                        hbox.set_selection_mode(Gtk.SelectionMode.NONE)
1043                        count=0
1044                        if category in self.app_parser.apps:
1045                                for app in sorted(self.app_parser.apps[category]):
1046                                       
1047                                        if self.check_app_groups(app,verbose):
1048
1049                                                search_txt=self.search_entry.get_text().lower().strip()
1050
1051                                                if search_txt not in app["ID"] and search_txt not in self.get_translation(app["Category"]).lower() and search_txt not in self.get_name(app).lower() and len(search_txt)>2:
1052                                                        continue
1053                                                button=Gtk.Button()
1054                                                button.set_name("APPBUTTON")
1055                                                button.set_size_request(235,110)
1056                                                #button.set_margin_top(10)
1057                                                button.set_halign(Gtk.Align.FILL)
1058                                                button.set_valign(Gtk.Align.FILL)
1059                                               
1060                                               
1061                                                if not self.drawing_mode:
1062                                                        image=self.get_banner_image(app)
1063                                                else:
1064                                                        image=Gtk.DrawingArea()
1065                                                       
1066                                                        image.show()
1067                                                        image.connect("draw",self.drawing_banner_event,app)
1068                                                       
1069                                                        if "pulsating" in app:
1070                                                                if app["pulsating"]:
1071                                                                        app["pulsating_alpha"]=0.0
1072                                                                        app["pulsating_increment"]=0.02
1073                                                                        self.add_pulsating(app,image)
1074                                                       
1075                                                       
1076                                                        button.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
1077                                                        button.connect("motion-notify-event",self.mouse_over,app,image)
1078                                                        button.connect("leave_notify_event",self.mouse_left,app,image)
1079                                                       
1080                                                        #button.set_size_request(245,120)
1081                                               
1082                                                button.add(image)
1083                                                if "Name["+self.lang+"]" in app:
1084                                                        button.set_tooltip_text(app["Name["+self.lang+"]"])
1085                                                else:
1086                                                        button.set_tooltip_text(app["Name"])
1087                                                button.connect("clicked",self.app_clicked,app)
1088                                                app["gtk_button"]=button
1089                                               
1090                                                child=Gtk.FlowBoxChild()
1091                                                child.set_border_width(10)
1092                                                child.set_halign(Gtk.Align.START)
1093                                                #child.set_size_request(235,110)
1094                                               
1095                                                child.add(button)
1096                                               
1097                                                hbox.add(child)
1098                                                count+=1
1099                                               
1100                        if count!=0:
1101                                hbox.show_all()
1102                                if once:
1103                                        self.add_label(self.get_translation(category),icon)
1104                                        once=False
1105                                hbox.set_margin_left(20)
1106                                self.content_hbox.pack_start(hbox,True,True,5)
1107               
1108                if len(self.content_hbox.get_children()) > 0:
1109                        self.content_hbox.get_children()[-1].set_margin_bottom(10)
1110               
1111        #def add_categories_to_window
1112       
1113       
1114       
1115       
1116        def add_label(self,label_name,icon_name=None):
1117               
1118                if icon_name==None:
1119                        icon_name="system"
1120                       
1121                tmpbox=Gtk.HBox()
1122                img=Gtk.Image()
1123                img.set_from_icon_name(icon_name,Gtk.IconSize.MENU)
1124                label=Gtk.Label(label_name)
1125                label.set_name("WHITE-15")
1126                expander=Gtk.HSeparator()
1127                expander.set_margin_right(15)
1128                tmpbox.set_margin_left(10)
1129                tmpbox.set_margin_top(5)
1130                tmpbox.pack_start(img,False,False,0)
1131                tmpbox.pack_start(label,False,False,10)
1132                tmpbox.pack_start(expander,True,True,5)
1133                tmpbox.show_all()
1134                self.content_hbox.pack_start(tmpbox,False,False,5)             
1135               
1136        #def add_label
1137       
1138       
1139        def app_clicked(self,widget,app):
1140
1141                try:
1142                        if  self.client.get_variable("","VariablesManager","MASTER_SERVER_IP"):
1143                                if app["ID"] in self.blacklist:
1144                                        result = self.open_dialog("Warning",_("We are in a center model and therefore should install this service on the master \n server to be accessible from any computer in the center, whether to continue \n with the installation on this computer the service is only available on computers \n that are in the internal network of this server."),True)
1145                                        if result == Gtk.ResponseType.CANCEL:
1146                                                return -1
1147                except:
1148                        # n4d is not alive. Let's pass this for now
1149                        pass
1150
1151                if app["ID"] in self.configured_apps:
1152                        ret=self.open_dialog("Warning",_("<b>%s</b> is already configured. Do you want to execute it again?")%self.get_name(app),True)
1153                        if ret==Gtk.ResponseType.CANCEL:
1154                                return -1
1155               
1156                if self.check_app_dependences(app):
1157               
1158                        cmd=""
1159                               
1160                        if "Using" in app:
1161                                cmd+=app["Using"].strip(" ").strip("\n") +" "
1162                                       
1163                        cmd+=self.app_parser.ZMD_PATH + app["ScriptPath"]
1164                       
1165                        gt=False
1166                        if "Gnome-terminal" in app:
1167                                if app["Gnome-terminal"].lower()=="true":
1168                                        cmd='gnome-terminal --command="'+cmd+'"'
1169                                        gt=True
1170                                       
1171                        if not gt:
1172                                if "gnome-terminal" in app:
1173                                        if app["gnome-terminal"].lower()=="true":
1174                                                cmd='gnome-terminal --command="'+cmd+'"'
1175                               
1176                               
1177                       
1178                        blocked=False
1179                        print(' * Executing "' + cmd + '" ...')
1180                        if "Modal" in app:
1181                                if app["Modal"].lower()=="true" and not self.mprocess.is_alive():
1182                                        GLib.timeout_add(250,self.pulse_progress)
1183                                        self.progress_bar.show()
1184                                       
1185                                        try:
1186                                                txt="Executing %s"%app["Name["+self.lang+"]"]
1187                                        except:
1188                                                txt="Executing %s"%app["Name"]
1189                                        self.progress_label.set_text(txt)
1190                                        self.progress_label.set_max_width_chars(32)
1191                                        self.progress_label.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
1192                                        self.progress_label.show()
1193                                        self.mprocess_app_name=app["Name"]
1194                                        blocked=True
1195                                else:
1196                                        self.open_dialog("Warning","<b>%s</b> is being executed. Please wait until it finishes."%self.mprocess_app_name )
1197                                        return -1
1198               
1199                        self.execute(cmd,blocked,app,widget)
1200                       
1201                else:
1202                       
1203                        self.open_dialog("Warning","<b>%s</b> dependences have not been configured."%self.get_name(app) +"\n[ %s ]"%app["Depends"])
1204               
1205        #def app_clicked
1206       
1207       
1208        def check_output(self,process,app,button):
1209               
1210                if not process.is_alive():
1211                       
1212                        print "[ZeroCenter] %s has ended"%app["ID"]
1213                       
1214                        if "Service" in app:
1215                                if app["Service"].lower()=="true":
1216                                       
1217                                        try:
1218                                                self.get_states()
1219                       
1220                                                for cat in self.app_parser.apps:
1221                                                        for item in self.app_parser.apps[cat]:
1222                                                                item["gtk_button"].get_child().queue_draw()
1223                                               
1224                                                darea=button.get_child()
1225                                                darea.queue_draw()
1226                                               
1227                                        except Exception as e:
1228                                                pass
1229                                       
1230                return process.is_alive()
1231               
1232        #def check_output
1233       
1234       
1235        def pulse_progress(self):
1236               
1237                self.progress_bar.pulse()
1238                if not self.mprocess.is_alive():
1239                        self.progress_bar.hide()
1240                        self.progress_label.hide()
1241                return self.mprocess.is_alive()
1242
1243        #def pulse_progress
1244
1245       
1246        def execute(self,cmd,blocked=False,app=None,widget=None):
1247               
1248                if not blocked:
1249                        p=multiprocessing.Process(target=self._execute,args=(cmd,))
1250                        #p.daemon=True
1251                        GLib.timeout_add(1000,self.check_output,p,app,widget)
1252                        p.start()
1253                       
1254                if blocked:
1255                       
1256                        if not self.mprocess.is_alive():
1257                                self.mprocess=multiprocessing.Process(target=self._execute,args=(cmd,))
1258                                #self.mprocess.daemon=True
1259                                self.mprocess.start()
1260                                GLib.timeout_add(1000,self.check_output,self.mprocess,app,widget)
1261                        else:
1262                                self.open_dialog("Warning",_("<b>%s</b> is being executed. Please wait until it finishes.")%self.mprocess_app_name )
1263               
1264        #def execute
1265
1266
1267        def _execute(self,cmd):
1268               
1269               
1270                subprocess.call(cmd,shell=True,preexec_fn=lambda: signal.signal(signal.SIGPIPE,signal.SIG_DFL))
1271               
1272                #os.system(cmd)
1273               
1274        #def _execute
1275
1276       
1277        def close_window(self,widget,data):
1278               
1279                if self.mprocess.is_alive():
1280                        ret=self.open_dialog("Warning",_("<b>%s</b> is being executed. Are you sure you want to exit?")%self.mprocess_app_name ,True)
1281               
1282                        if ret==Gtk.ResponseType.CANCEL:
1283                                return -1
1284                               
1285                        self.mprocess.terminate()
1286                        self.mprocess=multiprocessing.Process()
1287               
1288                Gtk.main_quit()
1289                print("")
1290               
1291        #def close_window
1292
1293               
1294        def open_dialog(self,title,text,show_cancel=False):
1295
1296                label = Gtk.Label()
1297                label.set_markup(text)
1298                if show_cancel:
1299                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT,Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL))
1300                else:
1301                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
1302                hbox = Gtk.HBox()
1303                img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
1304                hbox.pack_start(img,True,True,5)
1305                hbox.pack_start(label,True,True,10)
1306                hbox.show_all()
1307                dialog.vbox.pack_start(hbox,True,True,10)
1308                dialog.set_border_width(6)
1309                response = dialog.run()
1310                dialog.destroy()
1311                return response
1312               
1313        #def open_dialog
1314
1315       
1316        def get_state(self,app):
1317
1318                try:
1319                        configured=self.client.get_state("","ZCenterVariables",app["ID"])
1320                        return configured
1321                except:
1322                        return 0
1323               
1324        #def get_state
1325
1326       
1327        def set_configured(self,app,key):
1328               
1329                if app in self.app_parser.app_list:
1330                       
1331                        try:
1332                                self.client.set_configured(key,"ZCenterVariables",app)
1333                        except Exception as e:
1334                                print e
1335                               
1336                else:
1337                        print("[!] %s is not installed"%app)
1338               
1339                sys.exit(0)
1340                               
1341        #def set_configured
1342
1343       
1344        def set_non_configured(self,app,key):
1345               
1346                if app in self.app_parser.app_list:
1347                       
1348                        try:
1349                                self.client.set_non_configured(key,"ZCenterVariables",app)
1350                        except:
1351                                pass
1352                               
1353                else:
1354                        print("\t[!] %s is not installed"%app)
1355               
1356                sys.exit(0)
1357               
1358        #def set_non_configured
1359       
1360        def set_failed(self,app,key):
1361               
1362                if app in self.app_parser.app_list:
1363                       
1364                        try:
1365                                self.client.set_failed(key,"ZCenterVariables",app)
1366                        except:
1367                                pass
1368                               
1369                else:
1370                        print("\t[!] %s is not installed"%app)
1371               
1372                sys.exit(0)
1373               
1374        #def set_non_configured
1375
1376       
1377        def set_custom_text(self,app,text,key):
1378               
1379                if app in self.app_parser.app_list:
1380                       
1381                        try:
1382                                self.client.set_custom_text(key,"ZCenterVariables",app,text)
1383                        except:
1384                                pass
1385                               
1386                else:
1387                        print("\t[!] %s is not installed"%app)
1388               
1389                sys.exit(0)
1390               
1391        #def set_custom_text
1392
1393       
1394        def add_pulsating_color(self,key,app):
1395               
1396                try:
1397                        self.client.add_pulsating_color(key,"ZCenterVariables",app)
1398                except:
1399                        pass
1400                       
1401                sys.exit(0)
1402               
1403        #def add_pulsating_color
1404
1405       
1406        def remove_pulsating_color(self,key,app):
1407               
1408                try:
1409                        self.client.remove_pulsating_color(key,"ZCenterVariables",app)
1410                except:
1411                        pass
1412               
1413                sys.exit(0)
1414               
1415        #def add_pulsating_color
1416
1417       
1418        def add_zc_notification(self,key,app,text,text_es="",text_qcv=""):
1419               
1420                try:
1421                        self.client.set_zc_message(key,"ZCenterVariables",app,text,text_es,text_qcv)
1422                except Exception as e:
1423                        print e
1424                       
1425                sys.exit(0)
1426               
1427        #def add_zc_notification
1428
1429       
1430        def remove_zc_notification(self,key,app):
1431               
1432                try:
1433                        self.client.remove_zc_message(key,"ZCenterVariables",app)
1434                except Exception as e:
1435                        print e
1436                       
1437                sys.exit(0)
1438               
1439        #def remove_zc_notification
1440
1441
1442        def usage(self):
1443               
1444                print("USAGE:")
1445                print("\tzero-center [ OPTION [ APP ] ]")
1446                print("Options:")
1447                print("\tset-configured APP") 
1448                print("\tset-non-configured APP") 
1449                print("\tset-custom-text APP TEXT") 
1450                print("\tadd-zero-center-notification APP TEXT_EN [TEXT_ES TEXT_QCV]") 
1451                print("\tremove-zero-center-notification APP") 
1452                print("\tadd-pulsating-color APP") 
1453                print("\tremove-pulsating-color APP") 
1454                print("\tnon-animated")
1455                print("\tanimated")
1456                print("\thelp")
1457                print("")
1458                sys.exit(0)
1459               
1460        #def usage
1461       
1462
1463def check_root():
1464        try:
1465                f=open("/etc/n4d/key","r")
1466                key=f.readline().strip("\n")
1467                f.close()
1468                return key
1469        except:
1470                print("[!] You need root privileges to execute this option [!]")
1471                sys.exit(1)
1472
1473if __name__=="__main__":
1474       
1475
1476        zc=ZeroCenter()
1477        zc.drawing_mode=True
1478
1479        if len(sys.argv)>=2:
1480               
1481                if sys.argv[1] not in zc.commands:
1482                        zc.usage()
1483                        sys.exit(1)
1484                       
1485                if sys.argv[1] == "help":
1486                        zc.usage()
1487                       
1488                if sys.argv[1] == "set-configured":
1489                        key=check_root()
1490                        zc.set_configured(sys.argv[2],key)
1491                       
1492                if sys.argv[1] == "set-non-configured":
1493                        key=check_root()
1494                        zc.set_non_configured(sys.argv[2],key)
1495                       
1496                if sys.argv[1] == "set-failed":
1497                        key=check_root()
1498                        zc.set_failed(sys.argv[2],key)
1499                       
1500                if sys.argv[1] == "set-custom-text":
1501                        key=check_root()
1502                        zc.set_custom_text(sys.argv[2],sys.argv[3],key)
1503                       
1504                if sys.argv[1] == "add-zero-center-notification":
1505                        key=check_root()
1506                       
1507                        try:
1508                                app=sys.argv[2]
1509                        except:
1510                                zc.usage()
1511                        try:
1512                                text=sys.argv[3]
1513                        except:
1514                                zc.usage()
1515                        try:
1516                                text_es=sys.argv[4]
1517                        except Exception as e:
1518                                print e
1519                                text_es=""
1520                        try:
1521                                text_qcv=sys.argv[5]
1522                        except Exception as e:
1523                                print e
1524                                text_qcv=""
1525                       
1526                        zc.add_zc_notification(key,app,text,text_es,text_qcv)
1527                       
1528                if sys.argv[1] == "remove-zero-center-notification":
1529                       
1530                        key=check_root()
1531                       
1532                        try:
1533                                app=sys.argv[2]
1534                        except:
1535                                zc.usage()
1536                               
1537                        zc.remove_zc_notification(key,app)
1538                       
1539                if sys.argv[1] == "add-pulsating-color":
1540                        key=check_root()
1541                        try:
1542                                app=sys.argv[2]
1543                        except:
1544                                zc.usage()
1545                               
1546                        zc.add_pulsating_color(key,app)
1547                               
1548                if sys.argv[1] == "remove-pulsating-color":
1549                        key=check_root()
1550                       
1551                        try:
1552                                app=sys.argv[2]
1553                        except:
1554                                zc.usage()
1555                               
1556                        zc.remove_pulsating_color(key,app)
1557                       
1558
1559                if sys.argv[1]=="animated":
1560                        zc.drawing_mode=True
1561                       
1562                if sys.argv[1]=="non-animated":
1563                        zc.drawing_mode=False
1564               
1565       
1566       
1567        zc.start_gui()
1568
Note: See TracBrowser for help on using the repository browser.