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

Last change on this file since 8311 was 8311, checked in by hectorgh, 5 months ago

changed entry style

  • Property svn:executable set to *
File size: 35.2 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               
469
470
471                /*@define-color arc-blue #3a87e2;*/
472                @define-color arc-blue #0062f5;
473                @define-color arc-blue-light #4accf5;
474                @define-color arc-black #2d323d;
475                @define-color arc-red #000000;
476                @define-color arc-blue-hover #629de2;
477                @define-color arc-blue-active #3aa3e2;
478                @define-color default-grey #666666;
479
480
481               
482                #BLACK {
483                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#1a1a1a),  to (#616161));
484                       
485                }
486
487                #ORANGE {
488                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#575757),  to (#373737));
489                       
490                }
491               
492                #BLACKEXPANDER {
493                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#1a1a1a),  to (#1a1a1a));
494                        color: white;
495                        box-shadow: 50px 50px;
496                       
497                }
498               
499                #WHITE {
500                        color: white;
501                        text-shadow: 0px 1px black;
502                }               
503               
504                #WHITE-15 {
505                        color: white;
506                        font-size: 15px;
507                        text-shadow: 1px 2px black;
508                }
509
510               
511                #BLACKBUTTON{
512                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#2a2a2a),  to (#616161));
513                        color: #e0e0e0;
514                        border-color: #000;
515                        border-style: none;
516                        border-radius: 10px;
517                       
518                }
519               
520               
521               
522                #APPBUTTON{
523
524                        padding: 0px 0px;
525                        border:none;
526                        background-image: none;
527                        box-shadow: none;
528                        background-color: transparent;
529                        box-shadow: 0px 2px 5px rgba(0,0,0,0.8);
530
531                }
532
533                #APPBUTTON:hover{
534
535                       
536                        border-width: 0;
537                        border-radius: 0px;
538                        border-color: transparent;
539                        border: none;   
540                        box-shadow: 0px 1px 8px rgba(0,0,0,1);
541                }
542               
543                GtkSeparator {
544                        color: rgba(255,255,255,0.8);
545                }
546               
547
548                .entry
549                {
550                        color: rgba(255,255,255,0.8);
551                        border: none;
552                        /*border-radius: 5px;*/
553                        background-color: @arc-blue;
554                        border-bottom: 1px solid #888888;
555                        padding: 4px;
556                        background: #2d2d2d;
557                       
558                        /*border-bottom: 2px solid transparent;*/
559       
560                }
561               
562                .entry:selected
563                {
564                        color: white;
565                        background: @arc-blue;
566
567                }
568               
569                .entry:focus
570                {
571                        color: rgba(255,255,255,0.8);
572                        border-bottom: 1px solid rgba(255,255,255,1);
573                        /*border-bottom: 2px solid rgba(0,0,0,0);*/
574                        /*background-color: transparent;*/
575               
576       
577                }
578
579               
580                """
581               
582                self.style_provider=Gtk.CssProvider()
583                self.style_provider.load_from_data(css)
584               
585                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
586               
587        #def set_css_info       
588       
589       
590        def get_banner_image(self,app):
591
592                package_rsrc_path=BANNER_PATH
593                img_path=package_rsrc_path+"package.png"
594               
595                for item in os.listdir(package_rsrc_path):
596                        f,ext=item.split(".")
597                        if app["Icon"] == f:
598                                img_path=package_rsrc_path+item
599               
600               
601                img=cairo.ImageSurface.create_from_png(img_path)
602                ctx=cairo.Context(img)
603
604                if not self.check_app_dependences(app):
605                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
606                        ctx.rectangle(0,0,235,110)
607                        ctx.fill()
608               
609
610                ctx.set_source_rgba(0,0,0,0.8)
611                ctx.rectangle(0,90,235,110)
612                ctx.fill()
613
614
615                show_status=True
616                if "Depends" in app:
617
618                        if not self.check_app_dependences(app):
619                               
620                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
621                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
622                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
623                                ctx.rectangle(0, 0, 200, 20)
624                                ctx.set_source(lg1)
625                                ctx.fill()
626                                                                                       
627                                ctx.select_font_face("Ubuntu")
628                                ctx.set_font_size(15)
629                                ctx.move_to(5,15)
630                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
631                                                                                       
632                                ctx.show_text(_("Unmet dependences"))
633                                ctx.stroke()
634                               
635                                show_status=False
636
637
638                if "Service" in app and show_status:
639
640                        if app["Service"].lower()=="true":
641
642                                if app["configured"]==1:
643
644                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
645                                                               
646                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
647                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
648                                        ctx.rectangle(0, 0, 200, 20)
649                                        ctx.set_source(lg1)
650                                        ctx.fill()
651                                                       
652                                        ctx.select_font_face("Ubuntu")
653                                        ctx.set_font_size(15)
654                                        ctx.move_to(5,15)
655                                        ctx.set_source_rgb(1,1,1)
656                                                       
657                                        ctx.show_text(_("Configured"))
658                                        ctx.stroke()
659
660
661                                elif app["configured"]==0:
662
663                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
664                                                               
665                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
666                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
667                                        ctx.rectangle(0, 0, 200, 20)
668                                        ctx.set_source(lg1)
669                                        ctx.fill()
670                                                       
671                                        ctx.select_font_face("Ubuntu")
672                                        ctx.set_font_size(15)
673                                        ctx.move_to(5,15)
674                                        ctx.set_source_rgb(1,1,1)
675                                                       
676                                        ctx.show_text(_("Not configured"))
677                                        ctx.stroke()
678                                       
679                                else:
680                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
681                                        lg1.add_color_stop_rgba(0, 1, 0, 0, 1)
682                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
683                                        ctx.rectangle(0, 0, 200, 20)
684                                        ctx.set_source(lg1)
685                                        ctx.fill()
686                                                               
687                                        ctx.select_font_face("Ubuntu")
688                                        ctx.set_font_size(15)
689                                        ctx.move_to(5,15)
690                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
691                                                               
692                                        ctx.show_text(_("Failed"))
693                                        ctx.stroke()
694
695                ctx.select_font_face("Ubuntu")
696                ctx.set_font_size(15)
697                ctx.move_to(5,105)
698                ctx.set_source_rgb(1,1,1)
699                txt=""
700                fix=True
701               
702                text=self.get_name(app)
703               
704               
705                for char in range(30):
706                        try:
707                                txt+=text[char]
708                        except:
709                                fix=False
710                                break
711                                                       
712                if fix:
713                        txt+="…"
714               
715                ctx.show_text(txt)
716                ctx.stroke()
717
718                #img.write_to_png(self.user_rsrc_path+item)
719                image=Gtk.Image()
720                #image.set_from_file(self.user_rsrc_path+item)
721                image.set_from_pixbuf(Gdk.pixbuf_get_from_surface(img,0,0,235,110))
722                image.set_name("BIMAGE")
723                return image
724               
725        #def get_image
726
727       
728        def drawing_banner_event(self,widget,ctx,app):
729               
730                package_rsrc_path=BANNER_PATH
731                img_path=package_rsrc_path+"package.png"
732                for item in os.listdir(package_rsrc_path):
733                        f,ext=item.split(".")
734                        if app["Icon"] == f:
735                                img_path=package_rsrc_path+item
736               
737       
738                img=cairo.ImageSurface.create_from_png(img_path)
739                ctx.set_source_surface(img,0,0)
740               
741                if not self.check_app_dependences(app):
742                        ctx.paint_with_alpha(0.2)
743                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
744                        ctx.rectangle(0,0,235,110)
745                        ctx.fill()
746                else:
747                        ctx.paint()
748
749
750                if "pulsating" in app and app["pulsating"]:
751                       
752                        '''
753                        if app["pulsating"]:
754                                ctx.set_source_rgba(1,1,1,app["pulsating_alpha"])
755                                ctx.rectangle(0,0,235,110)
756                                ctx.fill()             
757                        '''
758                       
759                        app.setdefault("pulsating_alpha",0.0)
760       
761                        lg1 = cairo.LinearGradient(0.0,10.0, 235.0, 10.0)
762                        lg1.add_color_stop_rgba(0, 0, 0.0, 0.8, 0.7)
763                        lg1.add_color_stop_rgba(app["pulsating_alpha"], 0.1, 0.7, 0.9, 1)
764                        lg1.add_color_stop_rgba(1, 0, 0, 0.8, 0.5)
765                        ctx.rectangle(0,app["bar_height"],235,20)
766                        ctx.set_source(lg1)
767                        ctx.fill()
768                        ctx.set_source_rgba(0,0,0,0.8)
769                        ctx.rectangle(0,app["bar_height"]+20,235,110)
770                        ctx.fill()                     
771                       
772                else:
773                       
774                        ctx.set_source_rgba(0,0,0,0.7)
775                        ctx.rectangle(0,app["bar_height"],235,110)
776                        ctx.fill()
777               
778                show_status=True
779                if "Depends" in app:
780
781                        if not self.check_app_dependences(app):
782                               
783                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
784                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
785                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
786                                ctx.rectangle(0, 0, 200, 20)
787                                ctx.set_source(lg1)
788                                ctx.fill()
789                                                                                       
790                                ctx.select_font_face("Ubuntu")
791                                ctx.set_font_size(15)
792                               
793                                ctx.move_to(6,16)
794                                ctx.set_source_rgba(0,0,0,app["conf_alpha"])
795                                ctx.show_text(_("Unmet dependences"))
796                                ctx.stroke()
797                               
798                               
799                                ctx.move_to(5,15)
800                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
801                                ctx.show_text(_("Unmet dependences"))
802                                ctx.stroke()
803                               
804                                show_status=False
805
806                if "Service" in app and show_status:
807                       
808                        if app["Service"].lower()=="true":
809
810                                if app["configured"]==1:
811
812                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
813                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
814                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 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(_("Configured"))
825                                        ctx.stroke()
826                                       
827                                       
828                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
829                                        ctx.move_to(5,15)               
830                                        ctx.show_text(_("Configured"))
831                                        ctx.stroke()
832                                                       
833                                elif app["configured"]==-1:
834
835                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
836                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
837                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
838                                        ctx.rectangle(0, 0, 200, 20)
839                                        ctx.set_source(lg1)
840                                        ctx.fill()
841                                                       
842                                        ctx.select_font_face("Ubuntu")
843                                        ctx.set_font_size(15)
844                                       
845                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
846                                        ctx.move_to(6,16)               
847                                        ctx.show_text(_("Failed"))
848                                        ctx.stroke()
849                                       
850                                       
851                                        ctx.move_to(5,15)
852                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
853                                        ctx.show_text(_("Failed"))
854                                        ctx.stroke()
855                                       
856                                else:
857                                       
858                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
859                                        lg1.add_color_stop_rgba(0, 0.8, 0, 0, 1)
860                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
861                                        ctx.rectangle(0, 0, 200, 20)
862                                        ctx.set_source(lg1)
863                                        ctx.fill()
864
865                                        ctx.select_font_face("Ubuntu")
866                                        ctx.set_font_size(15)
867                                       
868                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
869                                        ctx.move_to(6,16)               
870                                        ctx.show_text(_("Not configured"))
871                                        ctx.stroke()                                   
872                                       
873                                        ctx.move_to(5,15)
874                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
875                                        ctx.show_text(_("Not configured"))
876                                        ctx.stroke()                                   
877
878
879                txt=""
880                fix=True
881                for char in range(30):
882                        try:
883                                txt+=self.get_name(app)[char]
884                        except:
885                                fix=False
886                                break
887                                                       
888                if fix:
889                        txt+="…"
890
891
892                ctx.select_font_face("Ubuntu")
893                ctx.set_font_size(15)
894               
895                ctx.move_to(6,app["bar_height"]+16)
896                ctx.set_source_rgb(0,0,0)
897                ctx.show_text(txt)
898                ctx.stroke()           
899               
900                ctx.move_to(5,app["bar_height"]+15)
901                ctx.set_source_rgb(0.9,0.9,0.9)
902                ctx.show_text(txt)
903                ctx.stroke()           
904
905               
906               
907               
908                y=app["bar_height"]+30
909                pctx = PangoCairo.create_layout(ctx)
910                desc = Pango.font_description_from_string ("Ubuntu 8")
911                pctx.set_font_description(desc)
912                pctx.set_alignment(Pango.Alignment.LEFT)
913                pctx.set_justify(True)
914                pctx.set_width(225000)
915                pctx.set_height(10)
916                ctx.set_source_rgb(1,1,0.8)
917                pctx.set_text(self.get_comment(app),-1)
918               
919
920                ctx.move_to(6,y)
921                PangoCairo.show_layout (ctx, pctx)
922               
923                if "custom_text" in app:
924                       
925                        ctx.set_source_rgb(0.5,0.5,1)
926                        pctx.set_text(app["custom_text"],-1)
927                        ctx.move_to(6,y+60)
928                        PangoCairo.show_layout (ctx, pctx)
929                       
930               
931        #def drawing_event
932       
933
934        def mouse_over(self,widget,event,app,img):
935               
936                if not app["expanding"]:
937                        app["restoring"]=False
938                        app["expanding"]=True
939                        GLib.timeout_add(10,self.expand_black_area,app,img)
940               
941        #def mouse_over
942
943       
944        def mouse_left(self,widget,event,app,img):
945               
946                if not app["restoring"]:
947                        app["expanding"]=False
948                        app["restoring"]=True
949                        GLib.timeout_add(10,self.restore_black_area,app,img)
950               
951        #def mouse_left
952
953       
954        def expand_black_area(self,app,img):
955               
956                while app["bar_height"]>0 and app["expanding"]:
957                        app["bar_height"]-=2
958                        if app["conf_alpha"]>0.0:
959                                app["conf_alpha"]-=0.025
960                        img.queue_draw()
961                        return True
962                       
963                if not app["expanding"]:
964                        return False
965                       
966                app["expanding"]=False
967                app["conf_alpha"]=0.0
968                img.queue_draw()
969                return False
970               
971        #def expand_black_area
972       
973       
974        def restore_black_area(self,app,img):
975               
976                while app["bar_height"]<BAR_HEIGHT and app["restoring"]:
977                        app["bar_height"]+=2
978                        if app["conf_alpha"]<1.0:
979                                app["conf_alpha"]+=0.025
980                        img.queue_draw()
981                        return True
982                       
983                if not app["restoring"]:
984                        return False
985                       
986                app["restoring"]=False
987                app["conf_alpha"]=1.0
988                img.queue_draw()
989                return False
990               
991        #def restore_black_area
992       
993       
994        def check_app_groups(self,app,verbose=True):
995               
996                if verbose:
997                        sys.stdout.write(" * Checking " + app["ID"] + " ... ")
998                groups=[]
999                if "Groups" not in app:
1000                        if verbose:
1001                                print("OK")
1002                        return True
1003               
1004                try:
1005                       
1006                        if os.environ["USER"]=="root":
1007                                if verbose:
1008                                        print("OK")
1009                                return True
1010                       
1011                        groups=app["Groups"].strip("\n").split(";")
1012                        for group in groups:
1013                                if group in self.user_groups:
1014                                        if verbose:
1015                                                print("OK")             
1016                                        return True
1017                       
1018                except Exception as e:
1019                        print e
1020                        pass
1021                       
1022                if verbose:
1023                        print "NOT ALLOWED"
1024                        print "\t[!] App groups: ",sorted(groups)
1025                return False
1026               
1027        #def check_app_groups
1028
1029       
1030        def add_pulsating(self,app,image):
1031               
1032                GLib.timeout_add(70,self.pulsate_color,app,image)
1033               
1034        #def add_pulsating
1035
1036
1037        def pulsate_color(self,app,image):
1038               
1039                app["pulsating_alpha"]+=app["pulsating_increment"]
1040               
1041                if app["pulsating_alpha"] >= 1.0 :
1042                       
1043                        app["pulsating_increment"]=-0.02
1044                       
1045                if app["pulsating_alpha"] <= 0.0 :
1046                       
1047                        app["pulsating_increment"]=0.02
1048                       
1049                image.queue_draw()
1050                return app["pulsating"]
1051               
1052        #def pulsate_color
1053               
1054               
1055        def check_app_dependences(self,app):
1056               
1057                if "Depends" in app:
1058                        depends=app["Depends"].split(";")
1059                        for dep in depends:
1060                               
1061                                if dep not in self.configured_apps:
1062                                        return False
1063                               
1064                return True
1065               
1066        #def check_app_dependences
1067
1068       
1069        def add_categories_to_window(self,category,verbose=True):
1070               
1071                for child in self.content_hbox.get_children():
1072                        self.content_hbox.remove(child)
1073               
1074                for category in self.categories_parser.categories:
1075                       
1076                        icon=category["icon"]
1077                        category=category["name"].lower()
1078                       
1079                        once=True
1080                        hbox=Gtk.FlowBox()
1081                        hbox.set_margin_left(5)
1082                        hbox.set_margin_right(5)
1083                        hbox.set_homogeneous(True)
1084                        hbox.set_column_spacing(5)
1085                        hbox.set_row_spacing(10)
1086                        hbox.set_halign(Gtk.Align.FILL)
1087                        hbox.set_valign(Gtk.Align.START)
1088                        hbox.set_selection_mode(Gtk.SelectionMode.NONE)
1089                        count=0
1090                        if category in self.app_parser.apps:
1091                                for app in sorted(self.app_parser.apps[category]):
1092                                       
1093                                        if self.check_app_groups(app,verbose):
1094
1095                                                search_txt=self.search_entry.get_text().lower().strip()
1096
1097                                                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:
1098                                                        continue
1099                                                button=Gtk.Button()
1100                                                button.set_name("APPBUTTON")
1101                                                button.set_size_request(235,110)
1102                                                #button.set_margin_top(10)
1103                                                button.set_halign(Gtk.Align.FILL)
1104                                                button.set_valign(Gtk.Align.FILL)
1105                                               
1106                                               
1107                                                if not self.drawing_mode:
1108                                                        image=self.get_banner_image(app)
1109                                                else:
1110                                                        image=Gtk.DrawingArea()
1111                                                       
1112                                                        image.show()
1113                                                        image.connect("draw",self.drawing_banner_event,app)
1114                                                       
1115                                                        if "pulsating" in app:
1116                                                                if app["pulsating"]:
1117                                                                        app["pulsating_alpha"]=0.0
1118                                                                        app["pulsating_increment"]=0.02
1119                                                                        self.add_pulsating(app,image)
1120                                                       
1121                                                       
1122                                                        button.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
1123                                                        button.connect("motion-notify-event",self.mouse_over,app,image)
1124                                                        button.connect("leave_notify_event",self.mouse_left,app,image)
1125                                                       
1126                                                        #button.set_size_request(245,120)
1127                                               
1128                                                button.add(image)
1129                                                if "Name["+self.lang+"]" in app:
1130                                                        button.set_tooltip_text(app["Name["+self.lang+"]"])
1131                                                else:
1132                                                        button.set_tooltip_text(app["Name"])
1133                                                button.connect("clicked",self.app_clicked,app)
1134                                                app["gtk_button"]=button
1135                                               
1136                                                child=Gtk.FlowBoxChild()
1137                                                child.set_border_width(10)
1138                                                child.set_halign(Gtk.Align.START)
1139                                                #child.set_size_request(235,110)
1140                                               
1141                                                child.add(button)
1142                                               
1143                                                hbox.add(child)
1144                                                count+=1
1145                                               
1146                        if count!=0:
1147                                hbox.show_all()
1148                                if once:
1149                                        self.add_label(self.get_translation(category),icon)
1150                                        once=False
1151                                hbox.set_margin_left(20)
1152                                self.content_hbox.pack_start(hbox,True,True,5)
1153               
1154                if len(self.content_hbox.get_children()) > 0:
1155                        self.content_hbox.get_children()[-1].set_margin_bottom(10)
1156               
1157        #def add_categories_to_window
1158       
1159       
1160       
1161       
1162        def add_label(self,label_name,icon_name=None):
1163               
1164                if icon_name==None:
1165                        icon_name="system"
1166                       
1167                tmpbox=Gtk.HBox()
1168                img=Gtk.Image()
1169                img.set_from_icon_name(icon_name,Gtk.IconSize.MENU)
1170                label=Gtk.Label(label_name)
1171                label.set_name("WHITE-15")
1172                expander=Gtk.HSeparator()
1173                expander.set_margin_right(15)
1174                tmpbox.set_margin_left(10)
1175                tmpbox.set_margin_top(5)
1176                tmpbox.pack_start(img,False,False,0)
1177                tmpbox.pack_start(label,False,False,10)
1178                tmpbox.pack_start(expander,True,True,5)
1179                tmpbox.show_all()
1180                self.content_hbox.pack_start(tmpbox,False,False,5)             
1181               
1182        #def add_label
1183       
1184       
1185        def app_clicked(self,widget,app):
1186
1187                try:
1188                        if  self.client.get_variable("","VariablesManager","MASTER_SERVER_IP"):
1189                                if app["ID"] in self.blacklist:
1190                                        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)
1191                                        if result == Gtk.ResponseType.CANCEL:
1192                                                return -1
1193                except:
1194                        # n4d is not alive. Let's pass this for now
1195                        pass
1196
1197                if app["ID"] in self.configured_apps:
1198                        ret=self.open_dialog("Warning",_("<b>%s</b> is already configured. Do you want to execute it again?")%self.get_name(app),True)
1199                        if ret==Gtk.ResponseType.CANCEL:
1200                                return -1
1201               
1202                if self.check_app_dependences(app):
1203               
1204                        cmd=""
1205                               
1206                        if "Using" in app:
1207                                cmd+=app["Using"].strip(" ").strip("\n") +" "
1208                                       
1209                        cmd+=self.app_parser.ZMD_PATH + app["ScriptPath"]
1210                       
1211                        gt=False
1212                        if "Gnome-terminal" in app:
1213                                if app["Gnome-terminal"].lower()=="true":
1214                                        cmd='gnome-terminal --command="'+cmd+'"'
1215                                        gt=True
1216                                       
1217                        if not gt:
1218                                if "gnome-terminal" in app:
1219                                        if app["gnome-terminal"].lower()=="true":
1220                                                cmd='gnome-terminal --command="'+cmd+'"'
1221                               
1222                               
1223                       
1224                        blocked=False
1225                        print(' * Executing "' + cmd + '" ...')
1226                        if "Modal" in app:
1227                                if app["Modal"].lower()=="true" and not self.mprocess.is_alive():
1228                                        GLib.timeout_add(250,self.pulse_progress)
1229                                        self.progress_bar.show()
1230                                       
1231                                        try:
1232                                                txt="Executing %s"%app["Name["+self.lang+"]"]
1233                                        except:
1234                                                txt="Executing %s"%app["Name"]
1235                                        self.progress_label.set_text(txt)
1236                                        self.progress_label.set_max_width_chars(32)
1237                                        self.progress_label.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
1238                                        self.progress_label.show()
1239                                        self.mprocess_app_name=app["Name"]
1240                                        blocked=True
1241                                else:
1242                                        self.open_dialog("Warning","<b>%s</b> is being executed. Please wait until it finishes."%self.mprocess_app_name )
1243                                        return -1
1244               
1245                        self.execute(cmd,blocked,app,widget)
1246                       
1247                else:
1248                       
1249                        self.open_dialog("Warning","<b>%s</b> dependences have not been configured."%self.get_name(app) +"\n[ %s ]"%app["Depends"])
1250               
1251        #def app_clicked
1252       
1253       
1254        def check_output(self,process,app,button):
1255               
1256                if not process.is_alive():
1257                       
1258                        print "[ZeroCenter] %s has ended"%app["ID"]
1259                       
1260                        if "Service" in app:
1261                                if app["Service"].lower()=="true":
1262                                       
1263                                        try:
1264                                                self.get_states()
1265                       
1266                                                for cat in self.app_parser.apps:
1267                                                        for item in self.app_parser.apps[cat]:
1268                                                                item["gtk_button"].get_child().queue_draw()
1269                                               
1270                                                darea=button.get_child()
1271                                                darea.queue_draw()
1272                                               
1273                                        except Exception as e:
1274                                                pass
1275                                       
1276                return process.is_alive()
1277               
1278        #def check_output
1279       
1280       
1281        def pulse_progress(self):
1282               
1283                self.progress_bar.pulse()
1284                if not self.mprocess.is_alive():
1285                        self.progress_bar.hide()
1286                        self.progress_label.hide()
1287                return self.mprocess.is_alive()
1288
1289        #def pulse_progress
1290
1291       
1292        def execute(self,cmd,blocked=False,app=None,widget=None):
1293               
1294                if not blocked:
1295                        p=multiprocessing.Process(target=self._execute,args=(cmd,))
1296                        #p.daemon=True
1297                        GLib.timeout_add(1000,self.check_output,p,app,widget)
1298                        p.start()
1299                       
1300                if blocked:
1301                       
1302                        if not self.mprocess.is_alive():
1303                                self.mprocess=multiprocessing.Process(target=self._execute,args=(cmd,))
1304                                #self.mprocess.daemon=True
1305                                self.mprocess.start()
1306                                GLib.timeout_add(1000,self.check_output,self.mprocess,app,widget)
1307                        else:
1308                                self.open_dialog("Warning",_("<b>%s</b> is being executed. Please wait until it finishes.")%self.mprocess_app_name )
1309               
1310        #def execute
1311
1312
1313        def _execute(self,cmd):
1314               
1315               
1316                subprocess.call(cmd,shell=True,preexec_fn=lambda: signal.signal(signal.SIGPIPE,signal.SIG_DFL))
1317               
1318                #os.system(cmd)
1319               
1320        #def _execute
1321
1322       
1323        def close_window(self,widget,data):
1324               
1325                if self.mprocess.is_alive():
1326                        ret=self.open_dialog("Warning",_("<b>%s</b> is being executed. Are you sure you want to exit?")%self.mprocess_app_name ,True)
1327               
1328                        if ret==Gtk.ResponseType.CANCEL:
1329                                return -1
1330                               
1331                        self.mprocess.terminate()
1332                        self.mprocess=multiprocessing.Process()
1333               
1334                Gtk.main_quit()
1335                print("")
1336               
1337        #def close_window
1338
1339               
1340        def open_dialog(self,title,text,show_cancel=False):
1341
1342                label = Gtk.Label()
1343                label.set_markup(text)
1344                if show_cancel:
1345                        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))
1346                else:
1347                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
1348                hbox = Gtk.HBox()
1349                img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
1350                hbox.pack_start(img,True,True,5)
1351                hbox.pack_start(label,True,True,10)
1352                hbox.show_all()
1353                dialog.vbox.pack_start(hbox,True,True,10)
1354                dialog.set_border_width(6)
1355                response = dialog.run()
1356                dialog.destroy()
1357                return response
1358               
1359        #def open_dialog
1360
1361       
1362        def get_state(self,app):
1363
1364                try:
1365                        configured=self.client.get_state("","ZCenterVariables",app["ID"])
1366                        return configured
1367                except:
1368                        return 0
1369               
1370        #def get_state
1371
1372       
1373        def set_configured(self,app,key):
1374               
1375                if app in self.app_parser.app_list:
1376                       
1377                        try:
1378                                self.client.set_configured(key,"ZCenterVariables",app)
1379                        except Exception as e:
1380                                print e
1381                               
1382                else:
1383                        print("[!] %s is not installed"%app)
1384               
1385                sys.exit(0)
1386                               
1387        #def set_configured
1388
1389       
1390        def set_non_configured(self,app,key):
1391               
1392                if app in self.app_parser.app_list:
1393                       
1394                        try:
1395                                self.client.set_non_configured(key,"ZCenterVariables",app)
1396                        except:
1397                                pass
1398                               
1399                else:
1400                        print("\t[!] %s is not installed"%app)
1401               
1402                sys.exit(0)
1403               
1404        #def set_non_configured
1405       
1406        def set_failed(self,app,key):
1407               
1408                if app in self.app_parser.app_list:
1409                       
1410                        try:
1411                                self.client.set_failed(key,"ZCenterVariables",app)
1412                        except:
1413                                pass
1414                               
1415                else:
1416                        print("\t[!] %s is not installed"%app)
1417               
1418                sys.exit(0)
1419               
1420        #def set_non_configured
1421
1422       
1423        def set_custom_text(self,app,text,key):
1424               
1425                if app in self.app_parser.app_list:
1426                       
1427                        try:
1428                                self.client.set_custom_text(key,"ZCenterVariables",app,text)
1429                        except:
1430                                pass
1431                               
1432                else:
1433                        print("\t[!] %s is not installed"%app)
1434               
1435                sys.exit(0)
1436               
1437        #def set_custom_text
1438
1439       
1440        def add_pulsating_color(self,key,app):
1441               
1442                try:
1443                        self.client.add_pulsating_color(key,"ZCenterVariables",app)
1444                except:
1445                        pass
1446                       
1447                sys.exit(0)
1448               
1449        #def add_pulsating_color
1450
1451       
1452        def remove_pulsating_color(self,key,app):
1453               
1454                try:
1455                        self.client.remove_pulsating_color(key,"ZCenterVariables",app)
1456                except:
1457                        pass
1458               
1459                sys.exit(0)
1460               
1461        #def add_pulsating_color
1462
1463       
1464        def add_zc_notification(self,key,app,text,text_es="",text_qcv=""):
1465               
1466                try:
1467                        self.client.set_zc_message(key,"ZCenterVariables",app,text,text_es,text_qcv)
1468                except Exception as e:
1469                        print e
1470                       
1471                sys.exit(0)
1472               
1473        #def add_zc_notification
1474
1475       
1476        def remove_zc_notification(self,key,app):
1477               
1478                try:
1479                        self.client.remove_zc_message(key,"ZCenterVariables",app)
1480                except Exception as e:
1481                        print e
1482                       
1483                sys.exit(0)
1484               
1485        #def remove_zc_notification
1486
1487
1488        def usage(self):
1489               
1490                print("USAGE:")
1491                print("\tzero-center [ OPTION [ APP ] ]")
1492                print("Options:")
1493                print("\tset-configured APP") 
1494                print("\tset-non-configured APP") 
1495                print("\tset-custom-text APP TEXT") 
1496                print("\tadd-zero-center-notification APP TEXT_EN [TEXT_ES TEXT_QCV]") 
1497                print("\tremove-zero-center-notification APP") 
1498                print("\tadd-pulsating-color APP") 
1499                print("\tremove-pulsating-color APP") 
1500                print("\tnon-animated")
1501                print("\tanimated")
1502                print("\thelp")
1503                print("")
1504                sys.exit(0)
1505               
1506        #def usage
1507       
1508
1509def check_root():
1510        try:
1511                f=open("/etc/n4d/key","r")
1512                key=f.readline().strip("\n")
1513                f.close()
1514                return key
1515        except:
1516                print("[!] You need root privileges to execute this option [!]")
1517                sys.exit(1)
1518
1519if __name__=="__main__":
1520       
1521
1522        zc=ZeroCenter()
1523        zc.drawing_mode=True
1524
1525        if len(sys.argv)>=2:
1526               
1527                if sys.argv[1] not in zc.commands:
1528                        zc.usage()
1529                        sys.exit(1)
1530                       
1531                if sys.argv[1] == "help":
1532                        zc.usage()
1533                       
1534                if sys.argv[1] == "set-configured":
1535                        key=check_root()
1536                        zc.set_configured(sys.argv[2],key)
1537                       
1538                if sys.argv[1] == "set-non-configured":
1539                        key=check_root()
1540                        zc.set_non_configured(sys.argv[2],key)
1541                       
1542                if sys.argv[1] == "set-failed":
1543                        key=check_root()
1544                        zc.set_failed(sys.argv[2],key)
1545                       
1546                if sys.argv[1] == "set-custom-text":
1547                        key=check_root()
1548                        zc.set_custom_text(sys.argv[2],sys.argv[3],key)
1549                       
1550                if sys.argv[1] == "add-zero-center-notification":
1551                        key=check_root()
1552                       
1553                        try:
1554                                app=sys.argv[2]
1555                        except:
1556                                zc.usage()
1557                        try:
1558                                text=sys.argv[3]
1559                        except:
1560                                zc.usage()
1561                        try:
1562                                text_es=sys.argv[4]
1563                        except Exception as e:
1564                                print e
1565                                text_es=""
1566                        try:
1567                                text_qcv=sys.argv[5]
1568                        except Exception as e:
1569                                print e
1570                                text_qcv=""
1571                       
1572                        zc.add_zc_notification(key,app,text,text_es,text_qcv)
1573                       
1574                if sys.argv[1] == "remove-zero-center-notification":
1575                       
1576                        key=check_root()
1577                       
1578                        try:
1579                                app=sys.argv[2]
1580                        except:
1581                                zc.usage()
1582                               
1583                        zc.remove_zc_notification(key,app)
1584                       
1585                if sys.argv[1] == "add-pulsating-color":
1586                        key=check_root()
1587                        try:
1588                                app=sys.argv[2]
1589                        except:
1590                                zc.usage()
1591                               
1592                        zc.add_pulsating_color(key,app)
1593                               
1594                if sys.argv[1] == "remove-pulsating-color":
1595                        key=check_root()
1596                       
1597                        try:
1598                                app=sys.argv[2]
1599                        except:
1600                                zc.usage()
1601                               
1602                        zc.remove_pulsating_color(key,app)
1603                       
1604
1605                if sys.argv[1]=="animated":
1606                        zc.drawing_mode=True
1607                       
1608                if sys.argv[1]=="non-animated":
1609                        zc.drawing_mode=False
1610               
1611       
1612       
1613        zc.start_gui()
1614
Note: See TracBrowser for help on using the repository browser.