gmail-notify/notifier.conf.sample0000755000175000017500000000102110315557113017227 0ustar jgrandejgrande#MAKE SURE YOU CHANGE THE BELOW OPTIONS TO SUIT YOUR SYSTEM #THE README FILE EXPLAINS EACH OPTION [options] lang = English browserpath = your_browser_path # account information gmailusername = your_gmail_username gmailpassword = your_gmail_password # popup position voffset = 25 hoffset = 10 # all values below are in in milliseconds # you should not set this lower than 20000 (20 seconds) checkinterval = 60000 # you shouldn't need to change this one animationdelay = 15 # change to whatever you like popuptimespan = 5000 gmail-notify/icon.jpg0000644000175000017500000000073410177777225014740 0ustar jgrandejgrandeJFIFHHCreated with The GIMPC  !"$"$C"#1AQb$ 1!2ABQr ?ߣgPwMP34Cj[h׎H 9~BS5Jg`!.[ْ)׿Z1fp/0%#Cl%ʜ2 AW +Z !t|jGCېϱˊgmail-notify/README0000644000175000017500000001213710712126056014147 0ustar jgrandejgrande++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GMAIL NOTIFIER 1.6.1.1 README ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DESCRIPTION: Gmail Notifier is a MSN Messenger like popup for Linux written in Python that pops up an alert when new mail is received to your Gmail account. WHAT'S NEW: 1.6.1.1: In the last two years many people have contributed with the project by sending to me translations that I have never posted. The development of Gmail Notifier 1.7 is now starting, so I'm releasing this version just to include those translations and to say thank you to all the people that have supported the project. 1.6.1: Gmail-notify is not using libgmail anymore. A new interface has been developed that retrieves the information from Gmail Atom service, making the notifier more stable and reliable. 1.6: Many, many new enhanements have been added that improve the notifiers performance and usabilty. Configuration can now completely be done from within the program, quota can be checked and it has multilanguage support. You can exit the program gracefully and it is faster and more reliable. THANKS! A big thanks to Juan Grande for his large amount of development work. This application is proof of his excellent coding skills. Thankyou also to Richard Viney and Japostoles for their very helpful code contributions and testing. Thanks to all the people that uses gmail-notify, and special thanks to the ones that sent new languages files to the team! REQUIREMENTS: Python (version 2.4 or higher) PyGTK (version 2.0 or higher) GTK (version 2.4 or higher) libgmail is not used any more. INSTALLATION: Once you have the required libraries installed, open the notifier.conf file in your favourite text editor and edit the configuration options to match your system. Below is an explanation of each option: gmailusername - fairly self explanatory, must be without the @gmail.com at the end gmailpassword - obvious browserpath - this is the full path to the browser that you want Gmail Notifier to open when you click the popup to goto your Gmail inbox voffset - this is the amount (in pixels) the popup will be displaced from the bottom of the screen, it will almost definately need changing to suit your system, ideally, you want it to look like it came out of the bar along the bottom of the screen the best way to adjust it is to run it initially with the default value and then add/remove from it then test again. Higher values result in the popup appearing higher up the screen. hoffset - same as above only this is the amount the popup will be displaced from the side of the screen. Higher values will displace it more to the left of the screen. checkinterval - this is how often Gmail Notifier will check for new mail (in ms), do NOT set it lower than 20000 (20 seconds), or the libgmail library will not keep up, causing many strange side effects. If you need to check your mail more than once every 20 seconds, then chances are your famous and don't have time to read your mail anyway. animationdelay - this is the amount of time (in ms) that Gmail Notifier will wait before moving the popup up one step, when the popup is popping up, to high values will cause the animation to be jerky, to low values will cause tearing at the bottom of the popup. 15ms seems about right. Only small adjustments are necercery, best thing is to leave it alone. popuptimespan - this is the amount of time before the popup will dissappear again after popping up you can set this to whatever you want RUNNING: For testing purposes, you can just run it from an X console by going into the working directory and typing ./notifier.py it will tell you in the console what the popup is doing. Long term, you will want the notifier to start when X windows starts, there are a number of ways to bring this about, the best way is probably to use your window manager (eg. kde,gnome,icewm etc) Instructions for running it on startup of KDE are given below: Start a Konqueror window, click 'Go' and then 'Autostart' then right click and click Create New->File->Link to application... Type a name for the Link eg. gmail-notify on the window that comes up, then click on the Application tab and in the 'Command' box, type PATH_TO_GMAIL_NOTIFIER_DIRECTORY/notifier.py > /tmp/gmailnotify.log replacing PATH_TO_GMAIL_NOTIFIER_DIRECTORY with the path to the place you untarred your Gmail Notifier to. Then, in the 'Work Path', put just the path to the place you untarred your Gmail Notifier to. Then click 'Advanced Options...' and uncheck the 'Enable launch feedback' checkbox, that way you won't get an annoying hourglass the bottom of the screen while the notifier launches. For autostarting the Notifier on other windows managers, consult the window managers documentation That should be it, when new mail arrives, a popup will come up notifying you. If you have questions or comments, please email me on wintersoft@gmail.com If you make modifications that you find are useful, please let me know as well, and perhaps we could migrate them into future releases. Thankyou for using Gmail Notifier. John Winter wintersoft@gmail.com gmail-notify/background.jpg0000644000175000017500000000666410177777225016137 0ustar jgrandejgrandeJFIFHHC  !"$"$C"G !1AQTaqs#26r"&35Bt$8RSVbc.!1Q"Aq2a ?,$D03")=DP^Q,O)I:T(HaqaSTةe44 LdU_j)i&4FrI"33ٷ_6vZZa&.Fmj-P=P.+A/EJ#8N SIL]lK+h2Qt4Y9< ke}ۥm\iYS)Q'DEׂ7V>O2U Wy -mu1⌊f==Tbh[J$N5tGx露0 z=)q lɜf_.ui.uHM4pe'$CMO* H%}2{fZT#\Ԣ-\ReS̢ tUrcWڪmCiAlIYYikKiQxz>3?+F() iGJiI8QTTfdC@#Ҙn6d\U484q[Ui0|JXܷ}4WehHT\&T' -.r.cn*J҇kQ m,>_;$Ï i\f|ҵF²sk/۪SqpnxjJx[J1mׂ۽~c=nG}z[Im-㘝 iIZ6E烇[M_Uqi]9=SZx^K_oӇW34rٷeVgkfUgu%Aq>#VGIХ,J֢J`ϠQ 8\L^8NNܩ۩Ay4hEǯ`ɪ.mW4m} ~-gܱfҢݞu;rMjm\{ IP]:pme$d+#Zj*f#-4qk,.gi攑< .^ϫtUiQ >򑫗MN0ɨ`<ij^3JČ&Z\y:Y/GZt $ _lK(jt+wޑCb݆鶡E,FM̎r^eص07#=`oC_G{#\누̿J\0̯J::#HxHVZSlIe q."|\B#(1^%vja[Ͱ}Ϝ|^0$|۠Zə*OpJS>K~<ӄJBТ4[2_ bGܬJUKcYv~5{VO82g&II`Ae<͢>IbSp]WFN=TnMf5$|g~JS4HX""E 0FdV3-RɵGע.nkYfNxd0aSrjQ`ggn)ҩs'!-\mc,,mn.25$Ise`lkezD^mƣjR<;vKE=4Iq9Us~Pw>⯹TM 5ݻ3vrF[6Ol9|f8 ;G` 7WLDHv+YWJU +I an2LǣtqN~݊êZ}g6:kIO#lvsE(JRDFFf|Zurnj?C$n\.kyIm A >2>9ez_A((1YUKC>x]>+n[(jt+wޑᬨfز8\"85Hȋ{Y+tJ1))F#Ǩur9M~+ӫǏs'~Y쎕=-t<]FD:Cbyz$Ah)έ>̯J0Asph2Q{G eEDe \bFRC{D)r$&`2J2 5$d`̥·:@G2(wO=sy823#I d$`D fBF$A d$`D fBF$A 7Gޭ? έ>+Se:;_f]# P%!"2  $FB@A) fBFd$`A fBF;'ޭ?̏I `$ˮti2A ^𒐑%HR"" HH%!"  HR"" HH%!"  H̏J Y`&Lmn]UfXRGj}c=!𒐑 H%!"2 HHR#! H%!"2 HHR#!$ HHȈI?z&&.Ithl픴Mf◬j]]s% $R]]ZȚuHHwֻ&}ߑ5uHHwֻ&{}ߑ3uHHw׻&{}ߑ3uHHw׻&{}ߑ3uHHw׻&{}ߑ3uHHw׻&{}ߑ3uHHw׻&{}ߑ3uHHw׻&{}ߑ3#R. ~Doc}k"g5#P 5#vWS%I&I\$?gmail-notify/gmail-notify-icon.png0000644000175000017500000000163410220200435017306 0ustar jgrandejgrandePNG  IHDR@@iqcIDATxn@6Phk>4=CʡRRU*TKCN=`{zw3HVc{w~;;`>!+:::j~|ΚILusX?Bx[ :/%B7@x8Un$fsIurȍWj@3(M(c:˴>R\o~B(dUVȄ]4H4C) H/mH(.joQ3/pqE\,p&oX1iw-҅ dŌ`0 ăs% cBݱ髌b[ [FFӠ0U 8&ayip0/l2PD2A1a;>|YA/5>ɵz n.ls5/{F0Br% vLݸA}[p0iɯ)e: E.YضNɯA)x073+Uj$ V iҘA.s k*^iRNCfIL2Irq7W.{pq78l\#܎pt˹ v|7AVvIENDB`gmail-notify/GmailPopupMenu.py0000755000175000017500000000263510315555153016553 0ustar jgrandejgrande#!/usr/bin/env python # -*- coding: utf-8 -*- # Uploaded by juan_grande 2005/02/14 18:38 UTC import pygtk import gtk class GmailPopupMenu: def __init__(self, gmailnotify): # Create menu items self.item_check = gtk.MenuItem( gmailnotify.lang.get_string(9), gtk.TRUE) self.item_usage = gtk.MenuItem( gmailnotify.lang.get_string(10), gtk.TRUE) self.item_inbox = gtk.MenuItem( gmailnotify.lang.get_string(23), gtk.TRUE) self.item_conf = gtk.MenuItem( gmailnotify.lang.get_string(11), gtk.TRUE) self.item_exit = gtk.MenuItem( gmailnotify.lang.get_string(12), gtk.TRUE) # Connect the events self.item_check.connect( 'activate', gmailnotify.mail_check) self.item_usage.connect( 'activate', gmailnotify.show_quota_info) self.item_inbox.connect( 'activate', gmailnotify.gotourl) self.item_conf.connect( 'activate', gmailnotify.update_config) self.item_exit.connect( 'activate', gmailnotify.exit) # Create the menu self.menu = gtk.Menu() # Append menu items to the menu self.menu.append( self.item_check) #self.menu.append( self.item_usage) self.menu.append( self.item_inbox) self.menu.append( gtk.SeparatorMenuItem()) self.menu.append( self.item_conf) self.menu.append( gtk.SeparatorMenuItem()) self.menu.append( self.item_exit) self.menu.show_all() return def show_menu(self, event): # Display the menu self.menu.popup( None, None, None, event.button, event.time) return gmail-notify/xmllangs.py0000755000175000017500000000571510220200435015461 0ustar jgrandejgrande#!/usr/bin/python # -*- coding: utf-8 -*- # xmllangs 0.0.1 # # HOW TO USE: # 1) Create an instance of 'LangsParser' class. The only argument # its constructor takes is the filename of the language xml file. # 2) To find a language use the 'find_lang' method of the object # created above. This method returns a 'Lang' class object. # 3) To get all the languages readed from the XML file, use the # 'get_all_langs' method from the 'LangsParser' class object. # 4) To get a specific string from a 'Lang' class object, use the # 'get_string' method. It takes only one parameter: the 'id' of # the string. # 5) To get the name of a language from a 'Lang' class object use # the 'get_name' method. It returns a string. # Language XML file structure # # # # # Here goes my first string # This is my second string # ... # # ... # # # by Juan Grande # juan.grande@gmail.com from xml.sax.handler import ContentHandler from xml import sax # A string description class String: def __init__( self, id): self.id = id self.string=str() # Accessors an mutators def set_string(self, string): self.string = string def get_string( self): return self.string def set_id( self, id): self.id = id def get_id(self): return self.id # A language description class Lang: def __init__(self, name): self.name=name self.strings=list() # Adds a string to this language def add_string(self, string): self.strings.append( string) # Returns a string with the name of the language def get_name(self): return self.name # Returns the string with id=='id' def get_string(self, id): for s in self.strings: if s.id==str(id): return s.get_string() return "(empty)" # Language XML file parser class LangHandler(ContentHandler): def __init__(self): self.langs=list() def startElement( self, name, attrs): if name=="lang": temp_lang = Lang(attrs.getValue("name")) self.langs.append(temp_lang) if name=="string": s = String( attrs.getValue("id")) temp_lang = self.langs.pop() temp_lang.add_string(s) self.langs.append( temp_lang) def endElement( self, name): return def characters( self, content): if content.strip()!="": l = self.langs.pop() s = l.strings.pop() s.set_string(content) l.strings.append(s) self.langs.append(l) # The main class class LangsParser: def __init__(self, filename): self.lh = LangHandler() try: p = sax.parse( filename, self.lh) print "xmllangs: XML file succesfully parsed" except: print "xmllangs: Error parsing XML file." # Returns a list of all 'Lang' objects def get_all_langs( self): return self.lh.langs # Returns a 'Lang' class object where Lang.name==langname def find_lang(self, langname): for one_lang in self.lh.langs: if one_lang.get_name()==langname: return one_lang return self.lh.langs[0] gmail-notify/notifier.py0000755000175000017500000003102410712120035015446 0ustar jgrandejgrande#!/usr/bin/env python # -*- coding: utf-8 -*- # Uploaded by juan_grande 2005/02/24 18:38 UTC import pygtk pygtk.require('2.0') import gtk import time import os import pytrayicon import sys import warnings import ConfigParser import xmllangs import GmailConfig import GmailPopupMenu import gmailatom BKG_PATH=sys.path[0]+"/background.jpg" ICON_PATH=sys.path[0]+"/icon.png" ICON2_PATH=sys.path[0]+"/icon2.png" def removetags(text): raw=text.split("") raw2=raw[1].split("") final=raw2[0] return final def shortenstring(text,characters): if text == None: text = "" mainstr="" length=0 splitstr=text.split(" ") for word in splitstr: length=length+len(word) if len(word)>characters: if mainstr=="": mainstr=word[0:characters] break else: break mainstr=mainstr+word+" " if length>characters: break return mainstr.strip() class GmailNotify: configWindow = None options = None def __init__(self): self.init=0 print "Gmail Notifier v1.6.1b ("+time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())+")" print "----------" # Configuration window self.configWindow = GmailConfig.GmailConfigWindow( ) # Reference to global options self.options = self.configWindow.options # Check if there is a user and password, if not, load config window while ( self.options["gmailusername"] == None or self.options["gmailpassword"] == None ): self.configWindow.show() # Load selected language self.lang = self.configWindow.get_lang() print "selected language: "+self.lang.get_name() # Creates the main window self.window = gtk.Window(gtk.WINDOW_POPUP) self.window.set_title(self.lang.get_string(21)) self.window.set_resizable(1) self.window.set_decorated(0) self.window.set_keep_above(1) self.window.stick() self.window.hide() # Define some flags self.senddown=0 self.popup=0 self.newmessages=0 self.mailcheck=0 self.hasshownerror=0 self.hassettimer=0 self.dont_connect=0 self.unreadmsgcount=0 # Define the timers self.maintimer=None self.popuptimer=0 self.waittimer=0 # Create the tray icon object self.tray = pytrayicon.TrayIcon(self.lang.get_string(21)); self.eventbox = gtk.EventBox() self.tray.add(self.eventbox) self.eventbox.connect("button_press_event", self.tray_icon_clicked) # Tray icon drag&drop options self.eventbox.drag_dest_set( gtk.DEST_DEFAULT_ALL, [('_NETSCAPE_URL', 0, 0),('text/uri-list ', 0, 1),('x-url/http', 0, 2)], gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE) # Create the tooltip for the tray icon self._tooltip = gtk.Tooltips() # Set the image for the tray icon self.imageicon = gtk.Image() pixbuf = gtk.gdk.pixbuf_new_from_file( ICON_PATH ) scaled_buf = pixbuf.scale_simple(24,24,gtk.gdk.INTERP_BILINEAR) self.imageicon.set_from_pixbuf(scaled_buf) self.eventbox.add(self.imageicon) # Show the tray icon self.tray.show_all() # Create the popup menu self.popup_menu = GmailPopupMenu.GmailPopupMenu( self) # Create the popup self.fixed=gtk.Fixed() self.window.add(self.fixed) self.fixed.show() self.fixed.set_size_request(0,0) # Set popup's background image self.image=gtk.Image() self.image.set_from_file( BKG_PATH ) self.image.show() self.fixed.put(self.image,0,0) # Set popup's label self.label=gtk.Label() self.label.set_line_wrap(1) self.label.set_size_request(170,140) self.default_label = ""+self.lang.get_string(21)+"\n\n\n"+self.lang.get_string(20) self.label.set_markup( self.default_label) # Show popup self.label.show() # Create popup's event box self.event_box = gtk.EventBox() self.event_box.set_visible_window(0) self.event_box.show() self.event_box.add(self.label) self.event_box.set_size_request(180,125) self.event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK) self.event_box.connect("button_press_event", self.event_box_clicked) # Setup popup's event box self.fixed.put(self.event_box,6,25) self.event_box.realize() self.event_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1)) # Resize and move popup's event box self.window.resize(180,1) self.width, self.height = self.window.get_size() self.height+=self.options['voffset'] self.width+=self.options['hoffset'] self.window.move(gtk.gdk.screen_width() - self.width, gtk.gdk.screen_height() - self.height) self.init=1 while gtk.events_pending(): gtk.main_iteration(gtk.TRUE) # Attemp connection for first time if self.connect()==1: # Check mail for first time self.mail_check() self.maintimer=gtk.timeout_add(self.options['checkinterval'],self.mail_check) def connect(self): # If connecting, cancel connection if self.dont_connect==1: print "connection attemp suspended" return 0 self.dont_connect=1 print "connecting..." self._tooltip.set_tip(self.tray,self.lang.get_string(13)) while gtk.events_pending(): gtk.main_iteration( gtk.TRUE) # Attemp connection try: self.connection=gmailatom.GmailAtom(self.options['gmailusername'],self.options['gmailpassword']) self.connection.refreshInfo() print "connection successful... continuing" self._tooltip.set_tip(self.tray,self.lang.get_string(14)) self.dont_connect=0 return 1 except: print "login failed, will retry" self._tooltip.set_tip(self.tray,self.lang.get_string(15)) self.default_label = ""+self.lang.get_string(15)+"\n\n"+self.lang.get_string(16) self.label.set_markup(self.default_label) self.show_popup() self.dont_connect=0 return 0 def mail_check(self, event=None): # If checking, cancel mail check if self.mailcheck==1: print "self.mailcheck=1" return gtk.TRUE # If popup is up, destroy it if self.popup==1: self.destroy_popup() self.mailcheck=1 print "----------" print "checking for new mail ("+time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())+")" while gtk.events_pending(): gtk.main_iteration( gtk.TRUE) # Get new messages count attrs = self.has_new_messages() # If mail check was unsuccessful if attrs[0]==-1: self.mailcheck=0 return gtk.TRUE # Update tray icon self.eventbox.remove(self.imageicon) self.imageicon = gtk.Image() if attrs[1]>0: print str(attrs[1])+" new messages" sender = attrs[2] subject= attrs[3] snippet= attrs[4] if len(snippet)>0: self.default_label=""+self.lang.get_string(17)+sender[0:24]+"\n"+shortenstring(subject,20)+"\n\n"+snippet+"..." else: self.default_label=""+self.lang.get_string(17)+sender[0:24]+"\n"+shortenstring(subject,20)+"\n\n"+snippet+"..." self.show_popup() if attrs[0]>0: print str(attrs[0])+" unread messages" s = ' ' if attrs[0]>1: s=self.lang.get_string(35)+" " self._tooltip.set_tip(self.tray,(self.lang.get_string(19))%{'u':attrs[0],'s':s}) pixbuf = gtk.gdk.pixbuf_new_from_file( ICON2_PATH ) else: print "no new messages" self.default_label=""+self.lang.get_string(21)+"\n\n\n"+self.lang.get_string(18) self._tooltip.set_tip(self.tray,self.lang.get_string(18)) pixbuf = gtk.gdk.pixbuf_new_from_file( ICON_PATH ) self.label.set_markup(self.default_label) scaled_buf = pixbuf.scale_simple(24,24,gtk.gdk.INTERP_BILINEAR) self.imageicon.set_from_pixbuf(scaled_buf) self.eventbox.add(self.imageicon) self.tray.show_all() self.unreadmsgcount=attrs[0] self.mailcheck=0 return gtk.TRUE def has_new_messages( self): unreadmsgcount=0 # Get total messages in inbox try: self.connection.refreshInfo() unreadmsgcount=self.connection.getUnreadMsgCount() except: # If an error ocurred, cancel mail check print "getUnreadMsgCount() failed, will try again soon" return (-1,) sender='' subject='' snippet='' finalsnippet='' if unreadmsgcount>0: # Get latest message data sender = self.connection.getMsgAuthorName(0) subject = self.connection.getMsgTitle(0) snippet = self.connection.getMsgSummary(0) if len(sender)>12: finalsnippet=shortenstring(snippet,20) else: finalsnippet=shortenstring(snippet,40) # Really new messages? Or just repeating... newmsgcount=unreadmsgcount-self.unreadmsgcount self.unreadmsgcount=unreadmsgcount if unreadmsgcount>0: return (unreadmsgcount, newmsgcount, sender, subject, finalsnippet) else: return (unreadmsgcount,0, sender, subject, finalsnippet) def show_popup(self): # If popup is up, destroy it if self.popup==1: self.destroy_popup() # Generate popup print "generating popup" self.popuptimer = gtk.timeout_add(self.options['animationdelay'],self.popup_proc) self.window.show() return def destroy_popup(self): print "destroying popup" if self.popuptimer>0:gtk.timeout_remove(self.popuptimer) if self.waittimer>0: gtk.timeout_remove(self.waittimer) self.senddown=0 self.hassettimer=0 self.window.hide() self.window.resize(180,1) self.window.move(gtk.gdk.screen_width() - self.width, gtk.gdk.screen_height() - self.height) return def popup_proc(self): # Set popup status flag if self.popup==0: self.popup=1 currentsize=self.window.get_size() currentposition=self.window.get_position() positiony=currentposition[1] sizey=currentsize[1] if self.senddown==1: if sizey<2: # If popup is down self.senddown=0 self.window.hide() self.window.resize(180,1) self.window.move(gtk.gdk.screen_width() - self.width, gtk.gdk.screen_height() - self.height) self.popup=0 return gtk.FALSE else: # Move it down self.window.resize(180,sizey-2) self.window.move(gtk.gdk.screen_width() - self.width,positiony+2) else: if sizey<140: # Move it up self.window.resize(180,sizey+2) self.window.move(gtk.gdk.screen_width() - self.width,positiony-2) else: # If popup is up, run wait timer sizex=currentsize[0] self.popup=1 if self.hassettimer==0: self.waittimer = gtk.timeout_add(self.options['popuptimespan'],self.wait) self.hassettimer=1 return gtk.TRUE def wait(self): self.senddown=1 self.hassettimer=0 return gtk.FALSE def tray_icon_clicked(self,signal,event): if event.button==3: self.popup_menu.show_menu(event) else: self.label.set_markup(self.default_label) self.show_popup() def event_box_clicked(self,signal,event): if event.button==1: self.gotourl() def exit(self, event): dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, self.lang.get_string(5)) dialog.width, dialog.height = dialog.get_size() dialog.move( gtk.gdk.screen_width()/2-dialog.width/2, gtk.gdk.screen_height()/2-dialog.height/2) ret = dialog.run() if( ret==gtk.RESPONSE_YES): gtk.main_quit(0) dialog.destroy() def gotourl( self, wg=None): print "----------" print "launching browser "+self.options['browserpath']+" http://gmail.google.com" os.system(self.options['browserpath']+" http://gmail.google.com &") def show_quota_info( self, event): print "Not available" #if self.popup==1:self.destroy_popup() #print "----------" #print "retrieving quota info" #while gtk.events_pending()!=0: # gtk.main_iteration(gtk.TRUE) #try: # usage=self.connection.getQuotaInfo() #except: # if self.connect()==0: # return # else: # usage=self.connection.getQuotaInfo() #self.label.set_markup(""+self.lang.get_string(6)+"\n\n"+self.lang.get_string(24)%{'u':usage[0],'t':usage[1],'p':usage[2]}) #self.show_popup() def update_config(self, event=None): # Kill all timers if self.popup==1:self.destroy_popup() if self.init==1:gtk.timeout_remove(self.maintimer) # Run the configuration dialog self.configWindow.show() # Update timeout self.maintimer = gtk.timeout_add(self.options["checkinterval"], self.mail_check ) # Update user/pass self.connection=gmailatom.GmailAtom(self.options["gmailusername"],self.options["gmailpassword"]) self.connect() self.mail_check() # Update popup location self.window.resize(180,1) self.width, self.height = self.window.get_size() self.height +=self.options["voffset"] self.width +=self.options["hoffset"] self.window.move(gtk.gdk.screen_width() - self.width, gtk.gdk.screen_height() - self.height) # Update language self.lang=self.configWindow.get_lang() # Update popup menu self.popup_menu = GmailPopupMenu.GmailPopupMenu(self) return def main(self): gtk.main() if __name__ == "__main__": warnings.filterwarnings( action="ignore", category=DeprecationWarning) gmailnotifier = GmailNotify() gmailnotifier.main() gmail-notify/langs.xml0000644000175000017500000006215610712124426015122 0ustar jgrandejgrande Gmail Notifier Config Username: Browser path: Language: Are you sure do you want to leave Gmail Notifier? Quota info %(u)s used, %(t)s total (%(p)s) _Check now _Quota info... _Configure... _Exit Connecting... Connected Connection failed Connection to your Gmail inbox failed, will retry New mail from No unread mail %(u)d unread message%(s)s Connecting... Gmail Notifier Password: Go to inbox... Mailcheck failed, will retry Advanced >> Horizontal offset: Vertical offset: Animation delay: Popup time span: Check interval: Conns time span Some value is missing Save username and password s Configuración de Gmail Notifier Nombre de usuario Navegador Idioma ¿Está seguro que desea salir de Gmail Notifier? Espacio libre %(u)s usados de %(t)s totales (%(p)s) _Revisar ahora! _Espacio libre... _Configurar... _Salir Conectando... Conectado Error de conexión La conexión con Gmail ha fallado. Nuevo mail de No tiene mensajes sin leer %(u)d mensaje%(s)s sin leer Conectando... Gmail Notifier Contraseña Bandeja de entrada... No se pudo revisar su casilla Avanzadas >> Despl. horizontal Despl. vertical Vel. de animación Duración de avisos Intervalo e/checkeos Intervalo e/conexiones Falta completar algún valor Guardar nombre de usuario y contraseña s Gmail Notifier - konfiguration Användarnamn: Sökväg till webläsare: Språk: Är du säker på att du vill avsluta Gmail Notifier? Quota info %(u)s använt, %(t)s totalt (%(p)s) _Kolla nu _Quota info... _Konfigurera... _Avsluta Kopplar upp... Uppkopplad Uppkoppling misslyckades Uppkoppling mot Gmail misslyckades, försöker igen Nytt mejl från Inga olästa mejl %(u)d oläst(a) meddelande%(s)s Kopplar upp... Gmail Notifier Lösenord: Gå till din mejlbox... Mejlkoll misslyckades, försöker igen Avancerat >> Horisontell offset: Vertikal offset: Animationsdelay: Popupens tidsintervall: Mejlkollintervall: Conns time span Några värden fattas Spara användarnamn och lösenord n Gmail Notifier Configurazione Nome Utente: Comando Browser: Lingua: Sei sicuro di uscire da Gmail Notifier? Informazioni Spazio Libero/Utilizzato %(u)s usato, %(t)s totale (%(p)s) _Controlla Mail _Spazio Libero/Utilizzato _Configura... _Esci Connessione in corso... Connesso Connessione fallita Connessione alla Inbox fallita, riprovo Nuova Mail da Nessuna nuova Mail %(u)d messaggi non letti %(s)s Connessione in corso... Gmail Notifier Password: Vai alla Inbox... Controllo Mail fallito, riprovo Avanzate >> Posizione Popup Info (orizzontale): Posizione Popup Info (verticale): Velocità animazione Popup: Tempo di span Popup Info: Intervallo Controllo Mail: Intervallo Tentativi Connessione: Mancano dei valori Salva nome utente e password s Gmail Notifier Instellingen Gebruikers naam: Browser lokatie: Taal: Weet u zeker dat u Gmail Notifier wilt afsluiten? Quota info %(u)s gebruikt, %(t)s totaal (%(p)s) _Controleer nu _Quota info... _Instellingen... _Sluiten Verbinden... Verbonden Verbinding gefaalt Verbinding met uw Gmail inbox heeft gefaalt, probeer het opnieuw Nieuw mail van Geen nieuwe mail %(u)d ongelezen berichten%(s)s Verbinding... Gmail Notifier Wachtwoord: Ga naar inbox... Controle mail gefaalt, probeer het opnieuw Geavanceerd>> Horizontal offset: Vertical offset: Animatie vertraging: Popup tijdsduur: Check interval: Controle interval Enkele invoer niet aanwezig Opslaan gebruikersnaam en wachtwoord s Gmail Notifier - Einstellungen Nutzername: Browserpfad: Sprache: Sind sie sicher, dass sie Gmail Notifier beenden möchten? Speicherplatz Sie verwenden derzeit %(u)s (%(p)s) von Ihren %(t)s. Jetzt _prüfen _Speicherplatz... _Einstellungen... _Beenden Verbinde... Verbunden Verbindung fehlgeschlagen Verbindungsversuch zu Ihrem Gmail-Posteingang fehlgeschlagen, versuche es erneut Neue E-Mail von Keine ungelesenen Nachrichten %(u)d ungelesene Nachricht%(s)s Verbinde... Gmail Notifier Passwort: _Zum Posteingang... Überprüfung auf neue Nachrichten fehlgeschlagen, versuche es erneut Erweitert >> Horizontale Verschiebung: Vertikale Verschiebung: Animationsgeschwindigkeit: Anzeigedauer des Popup-Fensters: Überprüfungsinterval: Verbindungsdauer Ein Wert fehlt Nutzername und Passwort speichern en Configuração do Gmail Notifier Login: Comando do browser: Indioma: Você tem certeza que deseja sair do Gmail Notifier? Espaço utilizado %(u)s usado, %(t)s total (%(p)s) _Verificar _Espaço utilizado... _Configurações... _Sair Conectando... Conectado Falha na conexão Sua conexão com o Gmail falhou, nova tentativa em adamento Nova mensagem de Sem novas mensagens %(u)d mensagen%(s)s não lidas Conectando... Gmail Notifier Senha: Ir para caixa de entrada... Verificação de mensagens falhou, nova tentativa em adamento Avançado >> Espaçamento horizontal: Espaçamento vertical: Duração da animação: Duração da janela popup: Intervalo de verificação: Tempo limite para conexão Algum valor precisa ser preenchido Lembrar meu login e senha s Configuration de Gmail Notifier Utilisateur: Chemin du navigateur: Langue: Êtes-vous sûr de vouloir quitter Gmail Notifier ? Espace libre %(u)s utilisés sur %(t)s au total (%(p)s) _Vérifier maintenant _Espace libre... _Configuration... _Quitter Connection en cours... Connecté Impossible de se connecter Impossible de se connecter à votre compte Gmail. Le programme va réessayer. Nouveau message de Aucun nouveau message Il y a %(u)d message%(s)s non lu%(s)s Connection en cours... Gmail Notifier Mot de passe: Consulter ma boîte... Impossible de vérifier les nouveaux message. Le programme va réessayer. Avancé >> Décalage horizontal: Décalage vertical: Temps d'animation: Temps d'affichage: Vérifier tous les (ms): Interval de connection Il manque certaines valeurs Enregistrer mon utilisateur et mot de passe s Nastavení Gmail oznamovatele Uživatelské jméno: Prohlížeč: Jazyk: Skutečně chcete ukončit Gmail oznamovatele? Kvóta info %(u)s využito, %(t)s celkem (%(p)s) _Zkontrolovat poštu _Kvóta info _Nastavení _Ukončit Probíhá připojování... Připojeno Připojení selhalo Připojení k Vaší Gmail schránce se nezdařilo, zkusím to znovu Nová zpráva od: Žádné nepřečtené zprávy %(u)d zpráv%(s)s k přečtení Probíhí připojování... Gmail oznamovatel Heslo: Přejít do schránky Kontrola pošty selhala, zkusím to znovu Pokročilé >> Vodorovný posun: Svislý posun: Zpoždění animace: Doba zobrazení hlášení: Interval kontroly: Doba kontrolování Některá hodnota chybí Uložit uživatelské jméno a heslo y Настройка Gmail Notifier Имя пользователя: Браузер: Язык: Вы действительно хотите закрыть Gmail Notifier? Квота %(u)s используется, %(t)s всего (%(p)s) _Проверить сейчас _Квота... _Настройка... _Выход Соединение... Соединено Соединение невозможно Соединение невозможно, ожидается повторное подключение Новое письмо от Непрочтенных писем нет Непрочитанных писем: %(u)d Соединение... Gmail Notifier Пароль: Входящие... Ошибка Подробнее >> Горизонтальной смещение: Вертикальное смещение: Задержка анимации: Время показа уведомления: Интервал проверки: Время соединения: Некоторые значения потеряны Сохранить имя пользователя и пароль Konfiguracja Gmail Notifier Nazwa Użytkownika: Ścieżka przglądarki: Język: Czy jesteś pewny, że chcesz opuścić Gmail Notifier? Informacja o pojemności skrzynki %(u)s używanych, %(t)s wszystkich (%(p)s) _Sprzawdź teraz _Informacja o pojemności skrzynki _Konfiguracja... _Wyjście Łączenie... Połączono Połączenie nieudane Połączenie z Twoją skrzynką Gmail nie powiodło się, spróbuję ponownie Nowa wiadomość od Nie masz nowych wiadomości %(u)d nieprzeczytanych wiadomości Łącze... Gmail Notifier Hasło: Przejdź do skrzynki... Sprawdzanie poczty nie powiodło się, spróbuję ponownie Zaawansowane >> Położenie okienka informacyjnego (poziome): Położenie okienka informacyjnego (pionowe): Opóźnienie animacji: Czas wyświetlania okienka informacyjnego: Okres sprawdzania: Okres prób ponownego łączenia: Brakuje jakiś danych Zachowan nazwę użytkownika i hasło Gmail Notifier Uzskaņošana Lietotājvārds: Pārlūks: Valoda: Vai tiešām vēlaties aizvērt Gmail Notifier? Informācija par kvotām _Pārbaudīt e-pastu _Informācija par kvotām... _Uzskaņot... _Aizvērt Veidoju savienojumu... Savienojums izveidots Neizdevās izveidot savienojumu Neizdevās pieslēgties Gmail serverim, mēģināšu vēlreiz Saņemts jauns e-pasts no Nav jaunu e-pastu %(u)d neizlasīta%(s)s ziņa%(s)s Veidoju savienojumu... Gmail Notifier Parole: Iet uz iesūtni... %(u)s izmantoti, %(t)s kopā (%(p)s) Nesanāca pārbaudīt e-pastu, mēģināšu vēlreiz Advanced >> Horizontālā nobīde: Vertikālā nobīde: Animācijas ātrums: Uznirstošā loga rādīšanas ilgums: Pārbaudīšanas biežums: Savienojuma ilgums Kāda no vērtībām nav ievadīta Saglabāt lietotājvārdu un paroli s Gmail Notifier إعداد اسم المستخدم: مسار المتصفح: اللغة: هل تريد حقا مغادرة Gmail Notifier? الحيز المتوفر %(u)s مستعملة, %(t)s المجموع (%(p)s) ا_فحص الآن الحيز المتوفر... إعداد... إ_نهاء يجري الاتصال... متصل فشل الاتصال الاتصال ببريد Gmail فشل، محاولة ثانية... بريد جديد من لا رسائل غير مقروءة %(u)d من الرسائل غير مقروءة يجري الاتصال... Gmail Notifier كلمة السر: اذهب إلى الوارد... فشل فحص البريد، محاولة ثانية... متقدم >> تعديل أفقي: تعديل رأسي: فاصل الرسوم المتحركة: الفترة الزمنية للرسائل المنبثقة: فاصل الفحص: فاصل الاتصال لم تملئ كل الخانات تذكر اسم المستخدم وكلمة السر Gmail Notifier 設定 ユーザ名: ブラウザパス: 言語: Gmail Notifier を終了してもよろしいですか? Quota 情報 %(u)s 使用済み, %(t)s トータル (%(p)s) 今チェックする _Quota 情報... 設定... 終了 接続しています... 接続を完了しました 接続に失敗しました Gmail 受信トレイへの接続に失敗。再試行します メール差し出し人: 未読メールはありません %(u)d 通の未読メッセージ 接続しています... Gmail Notifier パスワード: 受信トレイを開く... メールチェックに失敗。再試行します 高度な設定 >> 水平補正値: 垂直補正値: アニメーション遅延: ポップアップ時間間隔: 受信チェック間隔: 接続間隔 値が見つかりません ユーザ名とパスワードを保存する Agordoj de Gmail Notifier Uzantnomo: Retumilalvoko: Lingvo: Ĉu vi certas ke vi volas forlasi Gmail Notifier? Kvantlimaj informoj %(u)s uzite, %(t)s entute (%(p)s) _Kontrolu nun Kvantlimaj _informoj... _Agordu... _Ĝis! Konektante... Konektite Konekta fiasko Fiaskis konekti al via retpoŝtkesto de Gmail, reprovos Nova retpoŝtaĵo de Neniu nelegita retpoŝto %(u)d nelegita%(s)s mesaĝo%(s)s Konektante... Gmail Notifier Pasvorto: Al nova retpoŝto... Fiaska retpoŝtkontrolo, reprovos Pli da ebloj >> Horizontala distigo: Vertikala distigo: Animada atendo: Levdaŭro: Kontrolintervalo: Konektodaŭro Valoro mankas Konservu nomon k pasvorton j gmail-notify/icon2.jpg0000644000175000017500000000074410177777225015023 0ustar jgrandejgrandeJFIFHHExifMM*Created with The GIMPC  !"$"$C"$1AQb!21q ?=NVטfhj[a3(%4u-ʫʾ(Уrj#e#WU,`1s.(r83gGئQPU38s.[G PMn2*ʊ"&UMGgmail-notify/pytrayicon.so0000644000175000017500000003675010177777772016070 0ustar jgrandejgrandeELF4x:4 (556FFh7hGhG((Qtdap2/]Bni\PRO_m'EkfX56`^0IHoTGSj h?14alcNYZ-V,%[egJd*Qb!&#$):87@3.+F=>"(UWDCA<KM9L;   1 1 F dGhGHHHHIhGTkc:F;P`F Sv^ 0f/  Iq7+m> m<ZqT IS`Z Ia*;51 F*T_ $ ;">!EWIC- HI" ;? l0# J VKD@~ _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesinitpytrayiconPyImport_ImportModulePyModule_GetDictPyDict_GetItemStringPyCObject_TypePyExc_RuntimeErrorPyErr_SetStringPyCObject_AsVoidPtr_PyGObject_APIpytrayicon_functionsPy_InitModule4pytrayicon_register_classesPyExc_ImportErrorPyEggTrayIcon_TypePy_BuildValueegg_tray_icon_get_typePyArg_ParseTupleAndKeywordsegg_tray_icon_newg_type_check_instance_castegg_tray_icon_cancel_message_Py_NoneStructegg_tray_icon_get_orientationPyInt_FromLonggtk_plug_get_typeg_type_register_staticegg_tray_icon_new_for_xscreengdk_x11_lookup_xdisplayXScreenNumberOfScreengdk_display_get_screenegg_tray_icon_new_for_screengdk_screen_get_typeg_type_check_instance_is_ag_object_newg_logegg_tray_icon_send_messagegtk_plug_get_idgtk_widget_get_typegdk_x11_get_server_timegtk_widget_get_displaygdk_x11_display_get_xdisplaygdk_error_trap_pushXSendEventXSyncgdk_error_trap_popXInternAtommemcpystrlengtk_widget_add_eventsg_type_class_peek_parentgtk_orientation_get_typedcgettextg_param_spec_enumg_object_class_install_propertyg_type_nameg_value_set_enumg_type_check_class_castgtk_widget_get_screengdk_screen_get_displaygdk_screen_get_numberg_snprintfgdk_screen_get_root_windowgdk_window_add_filtergdk_window_remove_filtergdk_window_lookup_for_displayXGrabServerXGetSelectionOwnerXUngrabServerXFlushXSelectInputXGetWindowPropertyXFreeg_object_notifylibgtk-x11-2.0.so.0libgdk-x11-2.0.so.0libatk-1.0.so.0libgdk_pixbuf-2.0.so.0libm.so.6libpangoxft-1.0.so.0libpangox-1.0.so.0libpango-1.0.so.0libgobject-2.0.so.0libgmodule-2.0.so.0libdl.so.2libglib-2.0.so.0libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.1.3GLIBC_2.0si ii FF F$F0F4FlFFF G(GLG\GI!I#I-I;IAIGIOIUIkIoHHH H$H%H&H'H(H)H*H+H,H.H/H1H2H3H4H6H7I8I9I: I<I=I>I?I@ IB$IC(ID,IE0IF4IH8IK$&$NGU1ɉT$1҉T$L$ 4$L$4$1D$t)I*T$L$T$U(uu]#t t9tD$4$t]u]Ív$*T$\D$fD$t$L$ T$1멍U1҉uu]U)#:D$4$$T$m]u]Í&UWVSM" $QLMLqytQxt$|$4$E 4$T$ljL$D$u1ɉL$xT$t$ |$ $GD$T$U$[^_]Ít&'U8uu]!}}D$4$} tp24$Ƌ$D$M t$ wL$t$T$|$ t$L$$]u}]ËT$U$܉UWVS,}\0!]D$<$6D$LƉ$"Pt<$J$\$lj $t$T$4$D$ t$1<$D$\1҉T$t$<$81҉T$t$<$1҉T$t$<$ $0$n$t$|$8,[^_]Ðt$L $<$PtvUWVS æD$U$dƅunM $$$t$|$zD$LƉ$fxxu [^_]Ét$L<$Eu4$PxۋE$$L$'$t$|$g`UWVSl}ED$<$$i$ƅ4$4$L$@4$4$iul[^_]É<$UT$$$t$N$L$|$XD$<$$EuȋuE!t$E Ủ<$H4 $2EԋUuEU܉t$EE<$U$=$e^M1҉L$1ɉL$T$ 4$T$4$1ɉL$<$rD$BT$4$tv<$UT$$$L$$|$L$M7UWVSL}EÜD$<$O$7$_XEUMT$,UL$(MT$$UL$ T$1҉L$T$1҉L$T$ L$4$T$uu}t%UuL[^_]É$U1:9tˉP<$xt$j$|$$,L$T$t$L$ T$D$t&Uxuu]}}F>!>9Nt]1u}]ËuED$<$$$Ƌ~4$4$L$<4$4$g<$UT$0$$t$v$L$|$D$<$$!EuȋuE!E t$Ủ<$H4 $ZEԋUEEUEED$<$}$e$M1҉L$1ɉL$T$ 4$T$4$1ɉL$<$ID$BL$4$<$UT$$$L$>$|$L$x>9N<$ 9V9V ED$<$s$[$Ƌ 4$4$L$y4$4$[5<$UT$$$t$D$L$|$ND$<$$EME!uȋL$E ủ<$P4$(EԋuEEuD$BL$4$<$UT$7$$L$}$|$L$UVSFp@t Ћu[^]US[R:]_PyGObject_APIpytrayiconcould not import gobjectcould not find _PyGObject_API objectpytrayicon.TrayIconPlug(O)EggTrayIconcould not import gtknameids:EggTrayIcon.__init__i:EggTrayIcon.cancel_messagecannot import name Plug from gtkcould not create EggTrayIcon objecttitleGDK_IS_SCREEN (screen)egg_tray_icon_new_for_screensrc/eggtray/eggtrayicon.c_NET_SYSTEM_TRAY_MESSAGE_DATAmessage != NULLegg_tray_icon_send_messagetimeout >= 0EGG_IS_TRAY_ICON (icon)id > 0egg_tray_icon_cancel_messageegg_tray_icon_get_orientationThe orientation of the tray.strawOrientationpropertysrc/eggtray/eggtrayicon.c:138_NET_SYSTEM_TRAY_S%dMANAGER_NET_SYSTEM_TRAY_OPCODE_NET_SYSTEM_TRAY_ORIENTATIONicon->manager_window != Nonefile %s: line %d (%s): assertion `%s' failed%s: invalid %s id %u for "%s" of type `%s' in `%s'egg_tray_icon_get_orientation_propertyfile %s: line %d (%s): assertion failed: (%s)FH204E2 F 22%`%$9L^r  1   Hoooo hG"2BRbr"2BRbr"2BRbr"2BRbr.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss L  !o.o0= F  OJU[11a211 iF6d odGd7yhGh7(H8H8H8H84I9$9gmail-notify/icon.png0000644000175000017500000000052410220200435014706 0ustar jgrandejgrandePNG  IHDR szzIDATx헽 0F/!"0KP Dt#I-"2}3s~ϲSt]'9cݽxJ<r.q6v&xݕ 1pE jW`**5^\jP >*H!4܄ ˳U$V˼ 53Un@.؎vM+e]Qy oib_JJH<[% kY$FG%TJDRt,u)"^rD7%|IENDB`gmail-notify/icon2.png0000644000175000017500000000051110220200435014764 0ustar jgrandejgrandePNG  IHDR szzIDATxM F!ZfFkfݔueH/81ҟgSS_@DˣrmqM߱6Z"