Changeset 328

Show
Ignore:
Timestamp:
10/21/06 20:29:28 (22 months ago)
Author:
daelstorm
Message:

Murmur: Version to 0.2.5; add setup.py; images in imagedata.py; more icons in menus; cleanup

Location:
murmur/trunk/sources
Files:
14 added
4 removed
5 modified

Legend:

Unmodified
Added
Removed
  • murmur/trunk/sources/CHANGELOG

    r280 r328  
     1Updated 21 October 2006 
     2Version: 0.2.5 
     3 * UI Changes 
     4 * Lots of more code refactoring. Moved a lot of functions into classes. 
     5 * Improved Trayicon's menu 
     6 * Images are now included in imagedata.py 
     7 * Added a Window icon  
     8 * Distutils setup.py added; Murmur can now be installed 
     9 
    110Version: 0.2.0 
    211 * Sorted out the threading issues, doesn't lock up with Xlib errors, anymore 
  • murmur/trunk/sources/README

    r280 r328  
    1 To build trayicon 
    2 run: 
    3     ./autogen.py 
    4     make 
     1Murmur is a PyGTK2 Client for Museek / Museek-Plus 
     2 
     3-< DEPENDENCIES >-------------------------------------------------------------- 
     4 
     5Murmur requires: 
     6    GTK2   >= 2.4 
     7    PyGTK2 >= 2.4 
     8    Python >= 2.4 
     9    mucipher (encryption Python module that comes with Museek) 
     10    messages.py and driver.py from museek+ 
     11 
     12-< INSTALLATION >-------------------------------------------------------------- 
     13 
     14To run from source: 
     15#    ./murmur 
    516     
    6 And/or run: 
    7     ./murmur 
     17To install, run as root: 
     18 
     19#    python setup.py install 
     20 
     21-< TRAYICON >------------------------------------------------------------------ 
     22 
     23To build trayicon, you must have: 
     24 * Python's development headers 
     25 * gcc (or another suitable compiler) 
     26 * pkg-config 
     27 * GTK2's development headers 
     28  
     29To compile: 
     30#    cd trayicon/ 
     31#    ./autogen.py 
     32#    make 
     33#    make install     
     34Or, run: 
     35#    ./trayicon-install 
  • murmur/trunk/sources/murmur

    r280 r328  
    11#! /usr/bin/python 
    22#-*- coding: utf-8 -*- 
     3# Murmur - a PyGTK2 client for museek  
     4# Code fragments taken from mucous, musetup-gtk, and nicotine 
     5# 
     6# daelstorm (C) 2005-2006 
     7# 
     8# This program is free software; you can redistribute it and/or modify 
     9# it under the terms of the GNU General Public License as published by 
     10# the Free Software Foundation; either version 2 of the License, or 
     11# (at your option) any later version. 
     12# 
     13# This program is distributed in the hope that it will be useful, 
     14# but WITHOUT ANY WARRANTY; without even the implied warranty of 
     15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     16# GNU General Public License for more details. 
     17# 
     18# You should have received a copy of the GNU General Public License 
     19# along with this program; if not, write to the Free Software 
     20# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
     21 
    322import pygtk 
    423pygtk.require("2.0") 
    524import gtk, gobject 
     25import sys, os 
    626import threading 
    727from threading import Thread 
    8 import  select,  pwd 
     28 
     29try: 
     30        import mucipher 
     31except: 
     32        print "WARNING: The Mucipher Module for Python wasn't found. This is absolutely necessary to allow Murmur to connect to the Museek Daemon.\nDownload it here: http://thegraveyard.org/files/pymucipher-0.0.1.tar.gz\nExtract the tarball, and as Root or sudo, run:\npython setup.py install\nYou'll need GCC, Python and SWIG." 
     33        sys.exit() 
     34try: 
     35        import messages, driver 
     36except: 
     37        try: 
     38                from museek import messages, driver 
     39        except: 
     40                print "WARNING: The Museek Message-Parsing modules, messages.py and/or driver.py  were not found. Please install them into your '/usr/lib/python2.X/site-packages/museek' directory, or place them in a 'museek' subdirectory of the directory that contains the murmur python scipt." 
     41                sys.exit() 
    942 
    1043trayicon_load = 1 
     
    1447        print "Optional TrayIcon module not found. Please build it if you want the TrayIcon to work." 
    1548        trayicon_load = 0 
    16 import Queue 
    17  
    18 from museek import messages, driver 
     49try: 
     50        from pymurmur import imagedata 
     51        from pymurmur.settings import Settings 
     52        from pymurmur.utils import *  
     53        from pymurmur.utils import _ 
     54         
     55except ImportError: 
     56        print "Failed loading pymurmur modules. Murmur cannot load." 
     57 
    1958from time import sleep 
    2059 
    21 import select, string, re, ConfigParser, sys, os, getopt, shutil, commands 
     60import select, string, re, ConfigParser, getopt, shutil, commands, pwd 
    2261import threading, time 
    2362import signal 
    2463import tempfile 
    2564import imghdr 
    26 from pymurmur.settings import Settings 
    27 from pymurmur.utils import *  
    28 from pymurmur.utils import _ 
    29  
     65 
     66         
    3067pid = os.getpid() 
    3168 
     
    4077log_dir = str(os.path.expanduser("~/.murmur/logs/")) 
    4178config_file = config_dir+"config" 
    42 version = "0.2.0" 
     79 
    4380debugmode = False 
    4481 
     
    171208             
    172209        self.combo = gtk.combo_box_entry_new_text() 
    173         #if "buddies" in Mapp.ProcessMessages.config.keys(): 
    174         alist = List #Mapp.ProcessMessages.config["buddies"].keys() 
     210 
     211        alist = List 
    175212        alist.sort() 
    176213        for i in alist: 
     
    226263            label.show() 
    227264        if picture is not None and picture != "": 
    228                 pixbufanim2 = gtk.gdk.PixbufAnimation("%s"% picture) 
     265                #pixbufanim2 = gtk.gdk.PixbufAnimation("%s"% picture) 
    229266                image1 = gtk.Image() 
    230                 image1.set_from_animation(pixbufanim2) 
     267                image1.set_from_pixbuf(picture) 
    231268                image1.show() 
    232269                box.pack_start(image1) 
     
    254291                self.frame = self.app=xapp 
    255292                self.config = {} 
    256                 self.queue = Queue.Queue(1) 
    257293                self.invalidpass = 0 
    258294                self.socket = None 
     
    262298                #self.timer.start() 
    263299 
    264         # Ping 
     300        ## Ping 
    265301        def cb_ping(self): 
    266302                if debugmode == True: print " **** cb_ping" 
     
    305341                gtk.threads_leave() 
    306342 
    307         #Delete keys from self.config 
     343        ## Delete keys from self.config 
    308344        def cb_config_remove(self, domain, key): 
    309345                gtk.threads_enter() 
     
    323359                #self.display_config_update(domain) 
    324360         
    325         #Copy config to self.config at connection 
     361        ## Copy config to self.config at connection 
    326362        def cb_config_state(self, config): 
    327363                gtk.threads_enter() 
     
    348384                gtk.threads_leave() 
    349385                                 
    350         #Add new/replace old keys to self.config 
    351          
     386        ## Add new/replace old keys to self.config 
    352387        def mod_config(self, changetype, username, value): 
    353388 
     
    534569                                self.frame.room_lists[str(rooms1)] = numbers 
    535570                        self.frame.chatrooms.roomsmaster.UpdateRoomList(roomlist) 
    536                          
    537                         for room in joined: 
     571                        joined_rooms = joined.keys() 
     572                        joined_rooms.sort(key=str.lower) 
     573                        for room in joined_rooms: 
    538574                                room = str(room) 
    539575                                if room not in self.frame.roomlogs: 
     
    862898                                                if debugmode == True: 
    863899                                                        print "connect attempt" 
    864                                                         #Mapp.Qqueue.put("Connecting") 
    865                                                 #break 
     900 
    866901                                        else: 
    867902                                                raise Exception,  "NOPASS" 
     
    885920                                self.connected = False 
    886921 
    887  
     922        ## Process Socket Data 
    888923        def run(self): 
    889924                if debugmode == True:  print self.frame.pid 
     
    937972                                menuitem = gtk.MenuItem() 
    938973                        elif item[0] == 1: 
    939                                 menuitem = gtk.MenuItem() 
    940974                                menuitem = gtk.MenuItem(item[1]) 
    941975                                menuitem.set_submenu(item[2]) 
     
    12531287                self.imagedirectory = "images" 
    12541288                self.images = {} 
    1255          
    1256                 for i in "away",  "online",  "offline", "noexist": 
    1257                         #loader = gtk.gdk.PixbufLoader("gif") 
    1258                         self.images[i] =  gtk.gdk.pixbuf_new_from_file(os.path.join(self.imagedirectory, i)+".gif") 
    1259  
    1260                  
     1289                 
     1290                for i in "away",  "online",  "offline", "noexist", "logo", "close", "green", "yellow", "red", "icon": 
     1291                        loader = gtk.gdk.PixbufLoader("png") 
     1292                        data = getattr(imagedata, i) 
     1293                        loader.write(data, len(data)) 
     1294                        loader.close() 
     1295                        self.images[i] = loader.get_pixbuf() 
     1296 
     1297                self.MurmurWindow.set_icon(self.images["icon"]) 
    12611298                self.chatroom_users = {} 
    12621299                self.popup_menu = {} 
     
    12691306                self.roomtab = None 
    12701307                 
    1271                 self.close_image = os.path.join(self.imagedirectory, "x.png") 
     1308                #self.close_image = os.path.join(self.imagedirectory, "x.png") 
     1309                #self.close_image = self.images["close"] 
    12721310                vbox_murmurwindow = gtk.VBox() 
    12731311                vbox_murmurwindow.set_spacing(2) 
     
    14241462 
    14251463                self.userinfos = UserInfos(self) 
    1426                  
    1427                 self.userinfovbox.pack_start(self.userinfos, True, True, 0) 
    14281464         
    14291465                self.hbox21 = gtk.HBox(False, 5) 
     
    14311467                self.hbox21.set_spacing(5) 
    14321468                self.hbox21.set_border_width(5) 
    1433          
     1469                 
     1470                self.UserinfoEntry = gtk.Entry() 
     1471                self.UserinfoEntry.set_text("") 
     1472                self.UserinfoEntry.set_editable(True) 
     1473                self.UserinfoEntry.show() 
     1474                self.UserinfoEntry.set_visibility(True) 
     1475                self.hbox21.pack_start(self.UserinfoEntry, False, True, 0) 
     1476                 
    14341477                self.sUserinfoButton = gtk.Button() 
    14351478                self.sUserinfoButton.show() 
     
    14571500                self.sUserinfoButton.add(self.alignment12) 
    14581501         
    1459                 self.hbox21.pack_end(self.sUserinfoButton, False, False, 0) 
    1460          
    1461                 self.UserinfoEntry = gtk.Entry() 
    1462                 self.UserinfoEntry.set_text("") 
    1463                 self.UserinfoEntry.set_editable(True) 
    1464                 self.UserinfoEntry.show() 
    1465                 self.UserinfoEntry.set_visibility(True) 
    1466                 self.hbox21.pack_end(self.UserinfoEntry, False, True, 0) 
    1467          
    1468                 self.label30 = gtk.Label(_("Input a user:")) 
    1469                 self.label30.set_padding(0, 0) 
    1470                 self.label30.show() 
    1471                 self.hbox21.pack_end(self.label30, False, False, 0) 
     1502                self.hbox21.pack_start(self.sUserinfoButton, False, False, 0) 
     1503 
     1504         
     1505                #self.label30 = gtk.Label(_("Input a user:")) 
     1506                #self.label30.set_padding(0, 0) 
     1507                #self.label30.show() 
     1508                #self.hbox21.pack_end(self.label30, False, False, 0) 
    14721509         
    14731510                self.userinfovbox.pack_start(self.hbox21, False, True, 0) 
     
    14751512                self.sUserinfoButton.connect("clicked", self.OnGetUserInfo) 
    14761513                self.UserinfoEntry.connect("activate", self.OnGetUserInfo) 
    1477                  
     1514                self.userinfovbox.pack_start(self.userinfos, True, True, 0) 
    14781515                # User Browse Construction 
    14791516                self.userbrowsevbox = gtk.VBox(False, 0) 
     
    16471684                file1.show() 
    16481685                 
    1649                 connect_item = gtk.MenuItem("_Connect") 
     1686                connect_item = gtk.ImageMenuItem("_Connect") 
    16501687                connect_item.connect_object("activate", self.connect_process, None) 
    16511688                connect_item.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("C"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1689                connect_item.set_image(gtk.image_new_from_stock(gtk.STOCK_CONNECT, gtk.ICON_SIZE_MENU)) 
    16521690                connect_item.show() 
    16531691                 
    1654                 disconnect_item = gtk.MenuItem("_Disconnect") 
     1692                disconnect_item = gtk.ImageMenuItem("_Disconnect") 
    16551693                disconnect_item.connect_object("activate", self.disconnect, "disconnect") 
    16561694                disconnect_item.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("D"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1695                disconnect_item.set_image(gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_MENU)) 
    16571696                disconnect_item.show() 
    16581697                 
    1659                 settings_item = gtk.MenuItem("_Settings") 
    1660                 settings_item.connect_object("activate", self.popup, "settings") 
     1698                settings_item = gtk.ImageMenuItem("_Settings") 
     1699                settings_item.connect_object("activate", self.SettingsWindow, "settings") 
    16611700                settings_item.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("S"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1701                settings_item.set_image(gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU)) 
    16621702                settings_item.show() 
    16631703                 
     
    16881728                leave1.show() 
    16891729                 
    1690                 away_item = gtk.MenuItem("Toggle _Away") 
     1730                away_item = gtk.ImageMenuItem("Toggle _Away") 
    16911731                away_item.connect_object("activate", self.away_toggle, "file.away") 
    16921732                away_item.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("A"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1733                img = gtk.Image() 
     1734                img.set_from_pixbuf(self.images["away"]) 
     1735                away_item.set_image(img) 
    16931736                away_item.show() 
    16941737                 
    16951738                 
    1696                 quit1 = gtk.MenuItem("_Quit Murmur Chat") 
     1739                 
     1740                quit1 = gtk.ImageMenuItem("_Quit Murmur Chat") 
    16971741                quit1.connect("activate", self.window_quit, "") 
    16981742                quit1.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("Q"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1743                quit1.set_image(gtk.image_new_from_stock(gtk.STOCK_QUIT, gtk.ICON_SIZE_MENU)) 
    16991744                quit1.show() 
    17001745                 
    1701                 join1 = gtk.MenuItem("_Join Room") 
     1746                join1 = gtk.ImageMenuItem("_Join Room") 
    17021747                join1.connect("activate", self.join_popup, "") 
    17031748                join1.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("J"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1749                join1.set_image(gtk.image_new_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)) 
    17041750                join1.show() 
    17051751                 
     
    17701816                menu4 = gtk.Menu() 
    17711817         
    1772                 about1 = gtk.MenuItem(("_About")) 
     1818                about1 = gtk.ImageMenuItem(("_About")) 
    17731819                about1.connect("activate", self.about) 
    17741820                about1.add_accelerator("activate", self.accel_group, gtk.gdk.keyval_from_name("F1"), gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) 
     1821                about1.set_image(gtk.image_new_from_stock(gtk.STOCK_HELP, gtk.ICON_SIZE_MENU)) 
    17751822                about1.show() 
    17761823                 
     
    20032050        def MouseAction(self, widget, event): 
    20042051                if debugmode == True:  print "-- Click -- :" 
    2005                 #user = self.tabs["browse"][self.notebook_browsing.get_current_page()] 
     2052 
    20062053                d = self.DirTreeView.get_path_at_pos(int(event.x), int(event.y)) 
    20072054                if not d: 
     
    20242071                except Exception,e: 
    20252072                        if debugmode == True: print "get_shares", Exception,e 
    2026                          
    2027         def CloseBrowse(self, user): 
    2028                 self.widgets["browse"]["notebook"].remove_page( self.widgets["browse"]["notebook"].page_num( self.widgets["browse"][user]["container"] ) ) 
    2029                 del self.widgets["browse"][user]  
    2030                 self.tabs["browse"].remove(user) 
    20312073                                 
    20322074        def SearchShares(self, user): 
     
    21352177                        UserName.set_padding(0, 0) 
    21362178                        UserName.show() 
    2137                         image = gtk.image_new_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU) 
     2179                        image = gtk.image_new_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU) 
    21382180                        image.show() 
    21392181                        button1 = gtk.Button() 
     
    24672509                self.popup_menu = popup = PopupMenu(self.frame, "something") 
    24682510                popup.setup( 
    2469                         ("#" + _("Close"), self.OnClose, gtk.STOCK_CANCEL), 
     2511                        ("#" + _("Close"), self.OnClose, gtk.STOCK_CLOSE), 
    24702512                        ("", None), 
    24712513                        ("#" + _("Show IP address"), popup.OnShowIPaddress, gtk.STOCK_NETWORK), 
     
    27302772                        label.show() 
    27312773                        self.append_page(tab.Main, label) #, tab.OnClose) 
    2732                         #self.frame.np.queue.put(slskmessages.GetUserStatus(user)) 
     2774 
    27332775                if direction: 
    27342776                        if self.get_current_page() != self.page_num(self.users[user].Main): 
     
    30443086                if self.leaving: 
    30453087                        return 
    3046                 #self.frame.np.queue.put(slskmessages.LeaveRoom(self.room)) 
    30473088                if self.room in self.roomsmaster.joinedrooms: 
    30483089                        self.frame.ProcessMessages.Send(messages.LeaveRoom(self.room)) 
     
    31273168                popup.setup( 
    31283169                        ("#" + _("_Join Room"), popup.OnJoinRoom, gtk.STOCK_JUMP_TO), 
    3129                         ("#" + _("_Leave Room"), popup.OnLeaveRoom, gtk.STOCK_CANCEL), 
     3170                        ("#" + _("_Leave Room"), popup.OnLeaveRoom, gtk.STOCK_CLOSE), 
    31303171                                        ) 
    31313172                self.treeview.connect("button_press_event", self.OnPopupMenu) 
     
    32143255                                path, column, x, y = d 
    32153256                                room = self.roomsmodel.get_value(self.roomsmodel.get_iter(path), 0) 
    3216                                 #if not room in self.joinedrooms.keys(): 
    3217                                         #self.frame.np.queue.put(slskmessages.JoinRoom(room)) 
     3257 
    32183258                        return True 
    32193259                elif event.button == 3: 
     
    32713311                                #list = self.frame.np.config.sections["server"]["autojoin"] 
    32723312 
    3273                         #for room in list: 
    3274                                 #self.frame.np.queue.put(slskmessages.JoinRoom(room)) 
     3313 
    32753314 
    32763315                #self.roomsmodel = RoomsListModel(msg.rooms) 
     
    36393678                self.Main.pack_end(addhbox, False, False, 0) 
    36403679                self.Main.show() 
    3641                  
    3642                 #vseparator = gtk.VSeparator() 
    3643                 #vseparator.show() 
    3644                  
     3680 
    36453681                # Naming the tab 
    36463682                self.label = gtk.Label(_("Banned") ) 
     
    42194255                if trayicon_load == 0: 
    42204256                        return 
     4257                self.is_mapped = 1 
    42214258                if self.t == None: 
    4222                          
    4223                         self.t = trayicon.TrayIcon("MyFirstTrayIcon") 
     4259                        self.t = trayicon.TrayIcon("Murmur") 
    42244260                        self.eventbox = gtk.EventBox() 
    4225                         self.menu() 
     4261                        self.TrayMenu() 
    42264262                        if debugmode == True: print "Status:", self.status 
    42274263                        if self.status: 
     
    44434479                                                 
    44444480                        scrolledwindow1.add(treeview) 
     4481                         
     4482                        # Tab  
    44454483                        label2 = gtk.Label( ( self.s_query[query] ) ) 
    44464484                        label2.set_padding(0, 0) 
    44474485                        label2.show() 
    4448                         image = gtk.image_new_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU) 
     4486                        image = gtk.Image() 
     4487                        image.set_from_pixbuf(self.images["close"]) 
    44494488                        image.show() 
    44504489                        button1 = gtk.Button() 
     
    44544493                        hbox1 = gtk.HBox(False, 0) 
    44554494                        hbox1.show() 
    4456                         hbox1.set_spacing(0) 
     4495                        hbox1.set_spacing(2) 
    44574496                        hbox1.pack_start(label2, False, False, 0) 
    44584497                        hbox1.pack_start(button1, False, False, 0) 
     
    46584697 
    46594698                 
    4660                  
    4661         def menu(self): 
    4662                 try: 
     4699        def OnPopupServer(self, widget): 
     4700                items = self.tray_popup_menu_server.get_children() 
     4701                 
     4702                 
     4703                if self.current_image_name == "red": 
     4704                        items[0].set_sensitive(True) 
     4705                        items[1].set_sensitive(False) 
     4706                else: 
     4707                        items[0].set_sensitive(False) 
     4708                        items[1].set_sensitive(True) 
     4709                return   
     4710        def HideUnhideWindow(self, widget): 
     4711                if self.is_mapped: 
     4712                        self.MurmurWindow.unmap() 
     4713                        self.is_mapped = 0 
     4714                else: 
     4715                        self.MurmurWindow.map() 
     4716                        self.MurmurWindow.grab_focus() 
     4717                        self.is_mapped = 1 
     4718                         
     4719        def TrayMenu(self): 
     4720                try: 
     4721                        self.tray_popup_menu_server= popup0 = PopupMenu(self, "") 
     4722                        popup0.setup( 
     4723                                ("#" + _("_Connect"), self.connect_process, gtk.STOCK_CONNECT), 
     4724                                ("#" + _("_Disconnect"), self.disconnect, gtk.STOCK_DISCONNECT), 
     4725                        ) 
     4726      &nbs