You are not logged in.

#26 2008-12-09 19:51:26

Mr Green
Forum Fellow
From: U.K.
Registered: 2003-12-21
Posts: 5,896
Website

Re: [solved] PyPanel Won't show task names, or any characters.

I assume gnome panel works ok?


Mr Green

Offline

#27 2008-12-09 20:22:02

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

I dunno, didn't even know it was installed. I think it is downloaded with Xfce.


"We're all mad here. I'm mad. You're mad."

Offline

#28 2008-12-09 20:22:42

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

Yes. I checked, it works perfectly.


"We're all mad here. I'm mad. You're mad."

Offline

#29 2008-12-09 23:26:25

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

I found a new code containing pypanel. It is only in he X session, not a terminal.

Traceback (most recent call last):
   File "/usr/bin/pypanel", line 957, in <module>
      PyPanel(display.Display())
   File "/usr/bin/pypanel", line 98, in __init__
      self.loop(self.display, self.root, self.windows, self.panel)
   File "/usr/bin/pypanel", line 818, in loop
      self.updateTasks(dsp, root, win, panel)
   File "/usr/bin/pypanel", line 732, in updateTasks
      tasks = root.get_full_property(self._CLIENT_LIST, Xatom.WINDOW).valve
AttributeError: 'NoneType' object has no variable 'value'

And my /usr/bin/pypanel file is as follows...

#!/usr/bin/python -OO
"""
PyPanel v2.4 - Lightweight panel/taskbar for X11 window managers
Copyright (c) 2003-2005 Jon Gelo (ziljian@users.sourceforge.net)

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
"""

#----------------------------------------------------------------------------                
class Obj(object):
#---------------------------------------------------------------------------- 
    """ Multi-purpose class """
    #----------------------------
    def __init__(self, **kwargs):
    #---------------------------- 
        self.__dict__.update(kwargs)
        
#----------------------------------------------------------------------------
class PyPanel(object):
#----------------------------------------------------------------------------
    #---------------------------
    def __init__(self, display):
    #---------------------------
        """ Initialize and display the panel """
        self.display = display                   # Display obj
        self.screen  = display.screen()          # Screen obj
        self.root    = self.screen.root          # Display root
        self.error   = error.CatchError()        # Error Handler/Suppressor
        self.panel   = {"sections":[]}           # Panel data and layout
        self.colors  = {}                        # Alloc'd colors
        self.hidden  = 0                         # Panel hidden/minimized
        self.focus   = 0                         # Currently focused window
        self.rpm     = None                      # Root pixmap ID
                
        global P_HEIGHT, P_WIDTH, P_LOCATION
        
        # Misc. initializations
        if SHOWLINES or SHOWBORDER:
            self.lgc = self.root.create_gc(foreground=self.getColor(LINE_COLOR))
        if not P_WIDTH:
            P_WIDTH = self.screen.width_in_pixels - P_START
        if SHOWBORDER:
            P_HEIGHT += 2 
        if P_LOCATION:
            P_LOCATION = self.screen.height_in_pixels - P_HEIGHT
        else:
            P_LOCATION = 0
        
        # Setup the panel's window
        self.window = self.screen.root.create_window(P_START, P_LOCATION,
            P_WIDTH, P_HEIGHT, 0, self.screen.root_depth, window_class=X.InputOutput,
            visual=X.CopyFromParent, colormap=X.CopyFromParent, 
            event_mask=(X.ExposureMask|X.ButtonPressMask|X.ButtonReleaseMask|X.EnterWindowMask))
        ppinit(self.window.id, FONT)        
        
        # Init the panel sections
        if DESKTOP:
            self.panel["sections"].append(DESKTOP)
            self.panel[DESKTOP] = Obj(id="desktop", names=[], first=0, last=0)
        if CLOCK:
            self.panel["sections"].append(CLOCK)
            self.panel[CLOCK] = Obj(id="clock", name="", first=0, last=0, x1=0, x2=0,
                color=self.getColor(CLOCK_COLOR), shadow=self.getColor(CLOCK_SHADOW_COLOR))
        if TRAY:
            self.panel["sections"].append(TRAY)
            self.panel[TRAY] = Obj(id="tray", tasks={}, order=[], first=0, last=0, window=self.window)
            self.createTray(self.display, self.screen)
        if LAUNCHER and LAUNCH_LIST:
            self.panel["sections"].append(LAUNCHER)
            self.panel[LAUNCHER] = Obj(id="launcher", tasks={}, order=[], first=0, last=0)
            self.createLauncher()
        
        self.panel["sections"].append(TASKS)
        self.panel[TASKS] = Obj(id="tasks", tasks={}, order=[], first=0, last=0)      
        self.panel["sections"].sort()
        self.panel[self.panel["sections"][0]].first = 1
        self.panel[self.panel["sections"][-1]].last = 1

        # Init the properties and then start the event loop
        self.setProps(self.display, self.window)
        self.setStruts(self.window)
        self.getDesktopNames()
        self.root.change_attributes(event_mask=(X.PropertyChangeMask)) 
        self.window.map()
        self.display.flush()
        self.loop(self.display, self.root, self.window, self.panel)
                
    #------------------------------------
    def clearPanel(self, x1, y1, x2, y2):
    #------------------------------------
        """ Clear panel at the given coordinates """ 
        ppclear(self.window.id, int(x1), y1, int(x2), y2)
        if SHOWBORDER:
            self.window.rectangle(self.lgc, 0, 0, P_WIDTH-1, P_HEIGHT-1)
        
    #------------------------
    def createLauncher(self):
    #------------------------
        """ Initialize the Application Launcher """
        order = []
        tasks = {}
        for app, icon in LAUNCH_LIST:
            order.append(app)
            iobj = Obj(path=icon, data="", width=0, height=0, pixmap=0, mask=0)
            tasks[app] = Obj(x1=0, x2=0, app=app+" &", icon=iobj)
            self.panel[LAUNCHER].tasks = tasks
            self.panel[LAUNCHER].order = order         
        
    #------------------------------
    def createTray(self, dsp, scr):
    #------------------------------
        """ Create the System Tray Selection Owner Window """
        self._OPCODE = dsp.intern_atom("_NET_SYSTEM_TRAY_OPCODE")
        manager      = dsp.intern_atom("MANAGER")
        selection    = dsp.intern_atom("_NET_SYSTEM_TRAY_S%d" % dsp.get_default_screen())
          
        # Selection owner window          
        self.selowin = scr.root.create_window(-1, -1, 1, 1, 0, self.screen.root_depth)
        self.selowin.set_selection_owner(selection, X.CurrentTime)
        self.sendEvent(self.root, manager,[X.CurrentTime, selection,
            self.selowin.id], (X.StructureNotifyMask))
    
    #---------------------------------
    def drawText(self, obj, x, width):
    #---------------------------------
        """ Draw the given objects name at x """
        if SHADOWS:
            ppfont(self.window.id, obj.shadow, x+1, P_HEIGHT+2, width, obj.name) 
        ppfont(self.window.id, obj.color, x, P_HEIGHT, width, obj.name)
        
    #----------------------------------
    def setStruts(self, win, hidden=0):
    #----------------------------------
        """ Set the panel struts according to the state (hidden/visible) """
        if P_LOCATION == 0:
            # top
            if not hidden:
                top = P_HEIGHT
            else:
                top = HIDDEN_SIZE
                    
            top_start = P_START
            top_end   = P_START + P_WIDTH
            bottom = bottom_start = bottom_end = 0
        else:
            # bottom
            top = top_start = top_end = 0
            if not hidden:
                bottom = P_HEIGHT
            else:
                bottom = HIDDEN_SIZE
                    
            bottom_start = P_START
            bottom_end   = P_START + P_WIDTH
                
        win.change_property(self._STRUT, Xatom.CARDINAL, 32, [0, 0, top, bottom])
        win.change_property(self._STRUTP, Xatom.CARDINAL, 32, [0, 0, top, bottom,
            0, 0, 0, 0, top_start, top_end, bottom_start, bottom_end])
            
    #----------------------------
    def setProps(self, dsp, win):
    #----------------------------
        """ Set necessary X atoms and panel window properties """   
        self._ABOVE           = dsp.intern_atom("_NET_WM_STATE_ABOVE")
        self._BELOW           = dsp.intern_atom("_NET_WM_STATE_BELOW")
        self._BLACKBOX        = dsp.intern_atom("_BLACKBOX_ATTRIBUTES")  
        self._CHANGE_STATE    = dsp.intern_atom("WM_CHANGE_STATE")
        self._CLIENT_LIST     = dsp.intern_atom("_NET_CLIENT_LIST")
        self._CURRENT_DESKTOP = dsp.intern_atom("_NET_CURRENT_DESKTOP")
        self._DESKTOP         = dsp.intern_atom("_NET_WM_DESKTOP")
        self._DESKTOP_COUNT   = dsp.intern_atom("_NET_NUMBER_OF_DESKTOPS")
        self._DESKTOP_NAMES   = dsp.intern_atom("_NET_DESKTOP_NAMES")   
        self._HIDDEN          = dsp.intern_atom("_NET_WM_STATE_HIDDEN")
        self._ICON            = dsp.intern_atom("_NET_WM_ICON")
        self._NAME            = dsp.intern_atom("_NET_WM_NAME")
        self._RPM             = dsp.intern_atom("_XROOTPMAP_ID")
        self._SHADED          = dsp.intern_atom("_NET_WM_STATE_SHADED")
        self._SHOWING_DESKTOP = dsp.intern_atom("_NET_SHOWING_DESKTOP")
        self._SKIP_PAGER      = dsp.intern_atom("_NET_WM_STATE_SKIP_PAGER")
        self._SKIP_TASKBAR    = dsp.intern_atom("_NET_WM_STATE_SKIP_TASKBAR")
        self._STATE           = dsp.intern_atom("_NET_WM_STATE")
        self._STICKY          = dsp.intern_atom("_NET_WM_STATE_STICKY")
        self._STRUT           = dsp.intern_atom("_NET_WM_STRUT")
        self._STRUTP          = dsp.intern_atom("_NET_WM_STRUT_PARTIAL")
        self._WMSTATE         = dsp.intern_atom("WM_STATE")
        
        win.set_wm_name("PyPanel")
        win.set_wm_class("pypanel","PyPanel") 
        win.set_wm_hints(flags=(Xutil.InputHint|Xutil.StateHint),
            input=0, initial_state=1)
        win.set_wm_normal_hints(flags=(
            Xutil.PPosition|Xutil.PMaxSize|Xutil.PMinSize),
            min_width=P_WIDTH, min_height=P_HEIGHT,
            max_width=P_WIDTH, max_height=P_HEIGHT)
        win.change_property(dsp.intern_atom("_WIN_STATE"),Xatom.CARDINAL,32,[1]) 
        win.change_property(dsp.intern_atom("_MOTIF_WM_HINTS"),
            dsp.intern_atom("_MOTIF_WM_HINTS"), 32, [0x2, 0x0, 0x0, 0x0, 0x0])
        win.change_property(self._DESKTOP, Xatom.CARDINAL, 32, [0xffffffffL])
        win.change_property(dsp.intern_atom("_NET_WM_WINDOW_TYPE"),
            Xatom.ATOM, 32, [dsp.intern_atom("_NET_WM_WINDOW_TYPE_DOCK")])
              
    #-----------------------------------------
    def setState(self, task, panel, win=None):
    #-----------------------------------------
        """ Set/Update a tasks state.  Returns -
            0 - no panel update needed
            1 - panel update needed
        """
        task.state   = []
                        
        try:
            task.state = task.obj.get_full_property(self._STATE, Xatom.ATOM).value
        except:
            pass
        try:
            wmstate = task.obj.get_full_property(self._WMSTATE, 0).value
            if wmstate and (wmstate[0] == Xutil.IconicState):
                task.state.insert(0, self._HIDDEN)
        except:
            if self.taskDelete(task.id, panel):
                return 1
                      
        # set color based on state
        if task.id == self.focus:
            task.color = self.getColor(FOCUSED_COLOR)
            task.shadow = self.getColor(FOCUSED_SHADOW_COLOR)
        elif self._SHADED in task.state:
            task.color = self.getColor(SHADED_COLOR)
            task.shadow = self.getColor(SHADED_SHADOW_COLOR)
        elif self._HIDDEN in task.state:     
            task.color = self.getColor(MINIMIZED_COLOR)
            task.shadow = self.getColor(MINIMIZED_SHADOW_COLOR) 
        else:
            task.color = self.getColor(TASK_COLOR)
            task.shadow = self.getColor(TASK_SHADOW_COLOR)
            
        if SHOWMINIMIZED:
            if (self._HIDDEN not in task.state and task.visible) or\
               (self._HIDDEN in task.state and not task.visible):
                return 1
                
        if win and task.visible:
            x = task.x1+P_SPACER
            if APPICONS:
                x += I_WIDTH+P_SPACER
            self.clearPanel(x, 0, task.x2-x, P_HEIGHT)
            self.drawText(task, x, task.x2-x-P_SPACER)
        
        return 0
    
    #----------------------------
    def setName(self, win, task):
    #----------------------------
        """ Set/update the name of the given task """       
        name = self.getName(task.obj)
        if task.name != name:
            task.name = name
            if task.visible:
                x = task.x1 + P_SPACER                 
                if APPICONS:
                    x += I_WIDTH+P_SPACER
                self.clearPanel(x, 0, task.x2-x, P_HEIGHT)
                self.drawText(task, x, task.x2-x-P_SPACER)
                
    #-----------------------
    def setIcon(self, task):
    #-----------------------
        """ Create an icon object for the given task """                     
        if not APPICONS:
            return
            
        icon = Obj(path="", data="", width=0, height=0, pixmap=0L, mask=0L)
            
        for tc in task.tclass:
            if tc in ICON_LIST:
                icon.path = ICON_LIST[tc]
                task.icon = icon
                return
        try:
            # _net_wm_icon
            data = task.obj.get_full_property(self._ICON, 0)
            if data:
                data        = data.value[:]
                icon.width  = data[0]
                icon.height = data[1]
                icon.data   = data[2:data[0]*data[1]+2].tostring()  
            else:
                # wmhints icon
                hints       = task.obj.get_wm_hints()
                geom        = hints.icon_pixmap.get_geometry()
                icon.pixmap = hints.icon_pixmap.id
                icon.mask   = hints.icon_mask.id
                icon.width  = geom.width
                icon.height = geom.height
                
                if icon.mask > sys.maxint:
                    icon.mask = 0
                if icon.pixmap > sys.maxint:
                    raise
        except:
            # default icon
            icon.path = ICON_LIST["default"] or "%s/pypanel/ppicon.png" % sysconfig.get_python_lib()
                   
        task.icon = icon 
            
    #--------------------------------------
    def getIcon(self, task, x, launcher=0):
    #--------------------------------------
        """ Get the icon from the given task and draw it at x """
        if not launcher and not APPICONS: 
            return 0
            
        if launcher:
            y = (P_HEIGHT-APPL_I_HEIGHT)/2
            w = APPL_I_WIDTH
            h = APPL_I_HEIGHT
            name = task.app
        else:
            y = (P_HEIGHT-I_HEIGHT)/2
            w = I_WIDTH
            h = I_HEIGHT
            name = task.tclass
        
        icon = task.icon           
        rc   = ppicon(self.window.id, icon.pixmap, icon.mask, x, y, icon.width,
                      icon.height, w, h, icon.data, icon.path)  
        if not rc:
            self.clearPanel(x, 0, w, P_HEIGHT)
            sys.stderr.write("Failed to get icon for '%s'\n%s\n\n" % (name, icon.path))
        
        return 1
    
    #-------------------------
    def getDesktopNames(self):
    #-------------------------
        """ Populate the desktop obj with the names of each desktop """
        if not DESKTOP:
            return
        
        if SHADOWS:
            shadow = self.getColor(DESKTOP_SHADOW_COLOR)
        else:
            shadow = None
        
        color         = self.getColor(DESKTOP_COLOR)    
        desktop       = self.panel[DESKTOP]
        desktop.names = []
        desktop.total = self.root.get_full_property(self._DESKTOP_COUNT, 0).value[0]
                                      
        if DESKTOP_NAMES:
            names = DESKTOP_NAMES
        else:
            names = self.root.get_full_property(self._DESKTOP_NAMES, 0)  
            if hasattr(names, "value"):
                names = names.value.split("\x00")
            else:
                names = []
                for x in range(desktop.total):
                    names.append(str(x)) 
                    
        if len(names) < desktop.total:
            for x in range(len(names), desktop.total):
                names.append(str(x))  
                  
        for name in names:
            obj = Obj(name=name, width=ppfontsize(name), color=color, shadow=shadow)
            desktop.names.append(obj)        
            
    #-------------------------------
    def getDesktop(self, task=None):
    #-------------------------------
        """ Return the desktop number of the given task obj """
        if task is None:
            return self.root.get_full_property(self._CURRENT_DESKTOP, Xatom.CARDINAL).value[0]  
           
        try:
            return task.get_full_property(self._DESKTOP, Xatom.CARDINAL).value[0]
        except:
            try:
                return task.get_full_property(self._BLACKBOX, 0).value[2]
            except:
                return None
            
    #-------------------------
    def getColor(self, color):
    #-------------------------
        """ Function to get/convert/alloc a color given a single hex str """
        if color in self.colors:
            return self.colors[color]
        else:      
            r = int("0x"+color[2:4],0)*257
            g = int("0x"+color[4:6],0)*257
            b = int("0x"+color[6:8],0)*257
            c = self.screen.default_colormap.alloc_color(r, g, b)
        
            if not c:
                sys.stderr.write("Error allocating color: %s\n" % color)
                return self.screen.white_pixel
            else:
                self.colors[color] = c.pixel
                return c.pixel
            
    #-----------------------
    def getName(self, task):
    #-----------------------
        """ Return the name of the given task obj """
        try:
            name = task.get_full_property(self._NAME, 0) or task.get_full_property(Xatom.WM_NAME, 0)
            return name.value
        except:
            return ""
        
    #------------------------------------------------
    def sendEvent(self, win, ctype, data, mask=None):
    #------------------------------------------------
        """ Send a ClientMessage event to the root """
        data = (data+[0]*(5-len(data)))[:5]
        ev = Xlib.protocol.event.ClientMessage(window=win, client_type=ctype, data=(32,(data)))

        if not mask:
            mask = (X.SubstructureRedirectMask|X.SubstructureNotifyMask)
        self.root.send_event(ev, event_mask=mask)
                                             
    #----------------------------
    def changeDesktop(self, num):
    #----------------------------
        """ Increase/Decrease the current desktop number by num """
        cur = self.getDesktop() + num

        if cur < 0:
            cur = self.panel[DESKTOP].total - 1
        elif cur == self.panel[DESKTOP].total:
            cur = 0
            
        self.sendEvent(self.root, self._CURRENT_DESKTOP, [cur])
            
    #---------------------
    def showDesktop(self):
    #---------------------
        """ Toggle between hiding and unhiding ALL applications """
        showing = self.root.get_full_property(self._SHOWING_DESKTOP, 0)
        
        if hasattr(showing, "value"):
            if showing.value[0] == 0:
                self.sendEvent(self.root, self._SHOWING_DESKTOP, [1])
            else:
                self.sendEvent(self.root, self._SHOWING_DESKTOP, [0])
        
    #----------------------
    def toggleHidden(self):
    #----------------------
        """ Hide/Unhide the Panel """
        if self.hidden:
            self.window.configure(y=P_LOCATION, height=P_HEIGHT)
            self.setStruts(self.window)
            if ABOVE:
                self.sendEvent(self.window, self._STATE, [0, self._BELOW])
                self.sendEvent(self.window, self._STATE, [1, self._ABOVE])
            else:
                self.sendEvent(self.window, self._STATE, [1, self._BELOW])
                self.sendEvent(self.window, self._STATE, [0, self._ABOVE])
        else:
            if P_LOCATION == 0:
                y = 0;
            else:
                y = self.screen.height_in_pixels - HIDDEN_SIZE

            self.window.configure(y=y, height=HIDDEN_SIZE)
            self.setStruts(self.window, hidden=1)
            
        self.hidden = not self.hidden
            
    #----------------------------------------
    def toggleMinimize(self, task, traise=1):
    #----------------------------------------
        """ Iconify/Deiconify a task """ 
        self.sendEvent(task.obj, self._STATE, [2, self._HIDDEN])
        if self._HIDDEN in task.state:
            task.obj.map()
        else:
            self.sendEvent(task.obj, self._CHANGE_STATE, [Xutil.IconicState])
        if traise:
            self.taskRaise(task, 0)
                
    #---------------------------
    def toggleShade(self, task):
    #---------------------------
        """ Shade/Unshade a task """
        self.sendEvent(task.obj, self._STATE, [2, self._SHADED])
        
    #--------------------------------
    def taskDelete(self, tid, panel):
    #--------------------------------
        """ Delete the given task ID if it's in the tray/task list """
        for section in (TASKS, TRAY):                
            if section and tid in panel[section].tasks:
                del panel[section].tasks[tid]
                panel[section].order.remove(tid)
                return 1
        return 0
            
    #-------------------------
    def taskFocus(self, task):
    #-------------------------
        """ Give focus to an unfocused task else toggle minimization """
        if task.id == self.focus or self._HIDDEN in task.state:
            self.toggleMinimize(task)
        else:
            self.taskRaise(task, 1)
            
    #----------------------------------
    def taskRaise(self, task, focus=0):
    #----------------------------------
        """ Raise a task """
        if self._HIDDEN not in task.state:
            task.obj.configure(stack_mode=X.Above)
            if focus:
                task.obj.set_input_focus(X.RevertToNone, X.CurrentTime)
    
    #----------------------------------
    def taskLower(self, task, focus=0):
    #----------------------------------
        """ Lower a task """
        if self._HIDDEN not in task.state:
            task.obj.configure(stack_mode=X.Below)
            if focus:
                task.obj.set_input_focus(X.RevertToNone, X.CurrentTime)
                
    #---------------------------------------
    def buttonRelease(self, root, panel, e):
    #---------------------------------------
        """ Button Release event handler """
        x = e.event_x
        for section in panel["sections"]:
            if panel[section].id == "tray":
                continue
            elif panel[section].id == "desktop":
                if x > panel[section].x1 and x < panel[section].x2:
                    desktopButtonEvent(self, e.detail)
                    return
            elif panel[section].id == "clock":
                if x > panel[section].x1 and x < panel[section].x2:
                    clockButtonEvent(self, e.detail)
                    return
            elif panel[section].id == "launcher" and e.detail == 1:
                for a in panel[section].tasks.values():
                    if x > a.x1 and x < a.x2:
                        os.system(a.app)
                        return   
            else:
                if not panel[TASKS].tasks:
                    try:
                        panelButtonEvent(self, e.detail)
                    except NameError, e:
                        sys.stderr.write("\n'panelButtonEvent()' is not defined in your pypanelrc.\n")
                        sys.stderr.write("A current pypanelrc example can be found here -\n")
                        sys.stderr.write("%s/pypanel/pypanelrc\n" % sysconfig.get_python_lib())
                else:
                    cdt = self.getDesktop()
                    for t in panel[TASKS].tasks.values():
                        if t.visible and x > t.x1 and x < t.x2:
                            cdt = self.getDesktop()
                            tdt = t.desk
                            if SHOWALL and cdt != tdt and tdt != 0xffffffffL:
                                if SHOWALL == 1:
                                    # Move task to current desktop
                                    self.sendEvent(t.obj, self._DESKTOP, [cdt])
                                elif SHOWALL == 2:
                                    # Switch to tasks desktop
                                    self.sendEvent(root, self._CURRENT_DESKTOP, [tdt])
                                t.obj.map()
                                t.obj.configure(stack_mode=X.Above)
                            else:
                                taskButtonEvent(self, e.detail, t)
                            return
                               
    #-------------------------------------
    def updateBackground(self, root, win):
    #-------------------------------------
        """ Check and update the panel background if necessary """  
        rpm = root.get_full_property(self._RPM, Xatom.PIXMAP)
        
        if hasattr(rpm, "value"):
            rpm = rpm.value[0]
        else:
            rpm = root.id
            
        if self.rpm != rpm:
            self.rpm = rpm
            r = int("0x"+BG_COLOR[2:4],0)
            g = int("0x"+BG_COLOR[4:6],0)
            b = int("0x"+BG_COLOR[6:8],0)
            ppshade(win.id, rpm, P_START, P_LOCATION, P_WIDTH, P_HEIGHT,
                r, g, b, SHADE)
                                         
    #---------------------------------------
    def updatePanel(self, root, win, panel):
    #---------------------------------------
        """ Redraw the panel """
        tasks    = panel[TASKS].tasks     # all tasks
        visible  = []                     # visible tasks
        curr_x   = 0
        space    = P_WIDTH
        cdt      = self.getDesktop()
        clock    = None
        desktop  = None
        tray     = None
        launcher = None
                
        if CLOCK:
            clock = panel[CLOCK]
            clock.name  = time.strftime(CLOCK_FORMAT, time.localtime())
            clock.width = ppfontsize(clock.name) + 2
            space -= clock.width + P_SPACER*2
        if DESKTOP:
            desktop = panel[DESKTOP]
            space -= desktop.names[cdt].width + P_SPACER*2
        if LAUNCHER and panel[LAUNCHER].tasks:
            launcher = panel[LAUNCHER]
            space -= len(launcher.order)*APPL_I_WIDTH + 2
        if TRAY and panel[TRAY].tasks:
            tray = panel[TRAY]
            space -= 2 
            for t in panel[TRAY].tasks.values():
                if TRAY_I_WIDTH:
                    t.width = TRAY_I_WIDTH
                    space -= t.width
                else:
                    try:
                        t.width = t.obj.get_wm_normal_hints().min_width
                        space -= t.width
                    except:
                        pass
        if TASKS and tasks: 
            for task in panel[TASKS].order:
                t = tasks[task]
                t.visible = 0
                if not t.hidden:
                    if SHOWALL or (t.desk == cdt or t.desk == 0xffffffffL):
                        t.visible = 1
                    if SHOWMINIMIZED and self._HIDDEN not in t.state:
                        t.visible = 0
                    if t.visible:
                        visible.append(task)
        
        # Clear the panel and add the objects
        self.updateBackground(root, win)
        self.clearPanel(0, 0, 0, 0)
            
        for section in panel["sections"]:
            if panel[section].id == "tasks" and TASKS:
                if not visible:
                    curr_x += space
                else:
                    limit = space/float(len(visible)) - P_SPACER*2 
                    if APPICONS:
                        limit -= I_WIDTH + P_SPACER 
                    if limit < 1:
                        limit = 1
                    for v in range(len(visible)):  
                        t = tasks[visible[v]]
                        t.x1 = curr_x
                        curr_x += P_SPACER
                        if self.getIcon(t, curr_x):
                            curr_x += I_WIDTH + P_SPACER
                        self.drawText(t, curr_x, limit)
                        curr_x += limit + P_SPACER
                        t.x2 = curr_x
                        if v < len(visible) and SHOWLINES:
                            win.poly_segment(self.lgc, [(curr_x, 0, curr_x, P_HEIGHT)])
                if SHOWLINES and not panel[section].last:
                    win.poly_segment(self.lgc, [(curr_x, 0, curr_x, P_HEIGHT)])
            elif panel[section].id == "clock":
                clock.x1 = curr_x
                curr_x += P_SPACER
                self.drawText(clock, curr_x, 0)
                curr_x += clock.width + P_SPACER
                clock.x2 = curr_x
                if SHOWLINES and not clock.last:
                    win.poly_segment(self.lgc, [(curr_x, 0, curr_x, P_HEIGHT)])
            elif panel[section].id == "desktop":
                desk = panel[section].names[cdt]
                desktop.x1 = curr_x
                curr_x += P_SPACER
                self.drawText(desk, curr_x, 0)
                curr_x += desk.width + P_SPACER
                desktop.x2 = curr_x
                if SHOWLINES and not desktop.last:
                    win.poly_segment(self.lgc, [(curr_x, 0, curr_x, P_HEIGHT)])
            elif panel[section].id == "tray" and tray:
                curr_x += 2
                for tid in tray.order:
                    t = tray.tasks[tid]
                    t.x = curr_x
                    t.y = (P_HEIGHT-t.height)/2
                    t.obj.configure(onerror=self.error, x=curr_x, y=t.y, 
                         width=t.width, height=t.height)
                    t.obj.map(onerror=self.error)
                    curr_x += t.width
                curr_x += 1
                if SHOWLINES and not tray.last:
                    win.poly_segment(self.lgc, [(curr_x, 0, curr_x, P_HEIGHT)])
            elif panel[section].id == "launcher" and launcher:
                curr_x += 2
                for app in launcher.order:
                    a = launcher.tasks[app]
                    a.x1 = curr_x
                    if self.getIcon(a, curr_x, 1):
                        curr_x += APPL_I_WIDTH
                    a.x2 = curr_x
                curr_x += 1    
                if SHOWLINES and not launcher.last:
                    win.poly_segment(self.lgc, [(curr_x, 0, curr_x, P_HEIGHT)])
                    
    #------------------------------------------------------
    def updateTasks(self, dsp, root, win, panel, update=0):
    #------------------------------------------------------
        """ Check the tasklist for additions/deletions/changes """     
        cdt   = self.getDesktop()
        tasks = root.get_full_property(self._CLIENT_LIST, Xatom.WINDOW).value
        count = 0
                 
        for task in [t for t in tasks if t not in panel[TASKS].tasks]: 
            obj  = dsp.create_resource_object("window", task)
            odt  = self.getDesktop(obj)
            name = self.getName(obj)
            hide = 0
            
            try:
                if self._SKIP_TASKBAR in obj.get_full_property(self._STATE, Xatom.ATOM).value:
                    hide = 1
            except:
                pass
            try:
                tclass = obj.get_full_property(Xatom.WM_CLASS, Xatom.STRING)
                      
                if tclass is None:
                    tclass = ["",""]
                else:
                    tclass = tclass.value.split("\0")[:2]
                    for t in tclass:
                        if t in HIDE_LIST:
                            hide = 1
            except:
                continue 
                
            if name == "PyPanel":
                hide = 1
                count += 1
                if count == 2:
                    sys.stderr.write("\nPyPanel is already running! Terminating ...\n\n")
                    sys.exit()              
            if not hide:
                obj.change_attributes(event_mask=(
                    X.PropertyChangeMask|X.FocusChangeMask|X.StructureNotifyMask))
            
            t = Obj(id=task, obj=obj, name=name, tclass=tclass, x1=-1, x2=-1,
                desk=odt, visible=0, hidden=hide)
                
            panel[TASKS].order.append(task)
            panel[TASKS].tasks[task] = t
            self.setIcon(t)
                                          
            if self.setState(t, panel):
                update = 1
            if not update and odt == cdt:
                update = 1
        
        if update:
            self.updatePanel(root, win, panel)
                              
    #-------------------------------------
    def loop(self, dsp, root, win, panel):
    #-------------------------------------
        """ Event loop - handle events as they occur until we're killed """ 
        if CLOCK:
            clock = panel[CLOCK]
        if TRAY:
            tray = panel[TRAY]
            
        tasks = panel[TASKS]  
        focus = dsp.get_input_focus().focus
        
        if hasattr(focus, "id"):
            self.focus = focus.id 
                   
        while 1:     
            while dsp.pending_events():
                e = dsp.next_event()
                if e.type == X.ButtonRelease:
                    self.buttonRelease(root, panel, e)
                elif e.type == X.DestroyNotify:
                    if self.taskDelete(e.window.id, panel):
                        self.updatePanel(root, win, panel)
                elif e.type == X.PropertyNotify:
                    if e.atom in [self._CURRENT_DESKTOP, self._DESKTOP]:
                        if hasattr(e, "window"):
                            if e.window.id in tasks.tasks:
                                t = tasks.tasks[e.window.id]
                                t.desk = self.getDesktop(t.obj)
                        self.updatePanel(root, win, panel)
                    elif e.atom in [self._DESKTOP_NAMES, self._DESKTOP_COUNT]:
                        self.getDesktopNames()
                        self.updatePanel(root, win, panel)                                  
                    elif e.atom == self._CLIENT_LIST:
                        self.updateTasks(dsp, root, win, panel)
                    elif e.atom == self._RPM:
                        self.updatePanel(root, win, panel)
                    elif e.window.id in tasks.tasks:
                        if e.atom in [self._STATE, self._WMSTATE]:
                            if self.setState(tasks.tasks[e.window.id], panel, win):
                                self.updatePanel(root, win, panel)
                        elif e.atom in [Xatom.WM_NAME, self._NAME]:
                            self.setName(win, tasks.tasks[e.window.id])
                        elif e.atom in [Xatom.WM_HINTS, self._ICON]:
                            t = tasks.tasks[e.window.id]
                            self.setIcon(t)
                            if t.visible:
                                x = t.x1 + P_SPACER
                                self.clearPanel(x, 0, t.x2-x, P_HEIGHT)
                                if self.getIcon(t, x):
                                    x += I_WIDTH+P_SPACER
                                self.drawText(t, x, t.x2-x-P_SPACER)
                elif e.type == X.ConfigureNotify and TRAY:
                    if e.window.id in tray.tasks:
                        task = tray.tasks[e.window.id]
                        task.obj.configure(onerror=self.error, width=task.width, height=task.height)                                            
                elif e.type == X.ClientMessage and TRAY:
                    if e.window == self.selowin:
                        data = e.data[1][1] # opcode
                        task = e.data[1][2] # taskid
                        if e.client_type == self._OPCODE and data == 0:
                            # SYSTEM_TRAY_REQUEST_DOCK opcode = 0
                            obj = dsp.create_resource_object("window", task)
                            obj.reparent(tray.window.id, 0, 0)   
                            obj.change_attributes(event_mask=(X.ExposureMask|X.StructureNotifyMask))
                            tray.tasks[task] = Obj(obj=obj, x=0, y=0, width=0, height=TRAY_I_HEIGHT)
                            tray.order.append(task)                            
                            self.updatePanel(root, win, panel)
                elif e.type == X.EnterNotify and self.hidden:
                    if e.window.id == win.id:
                        self.toggleHidden() 
                        self.updateTasks(dsp, root, win, panel)
                elif e.type == X.FocusIn:
                    prev_focus = self.focus
                    self.focus = e.window.id
                    for wid in (e.window.id, prev_focus):
                        if wid in tasks.tasks:
                            if self.setState(tasks.tasks[wid], panel, win):
                                self.updatePanel(root, win, panel)    
                elif e.type == X.Expose and e.count == 0:
                    if e.width == P_WIDTH:
                        win.change_property(self._DESKTOP, Xatom.CARDINAL, 32, [0xffffffffL])
                        self.sendEvent(win, self._STATE, [1, self._STICKY])
                        self.sendEvent(win, self._STATE, [1, self._SKIP_PAGER])
                        self.sendEvent(win, self._STATE, [1, self._SKIP_TASKBAR])
                        if ABOVE:
                            self.sendEvent(win, self._STATE, [1, self._ABOVE])
                        else:
                            self.sendEvent(win, self._STATE, [1, self._BELOW])
                        self.updateTasks(dsp, root, win, panel, 1)                      
                    else:
                        self.updatePanel(root, win, panel)
                        
            rs, ws, es = select.select([dsp.display.socket], [], [], CLOCK_DELAY) 
            if not rs:
                if AUTOHIDE and not self.hidden:
                    self.toggleHidden()
            if CLOCK:
                now = time.strftime(CLOCK_FORMAT, time.localtime())
                if clock.name != now:
                    clock.name = now
                    self.clearPanel(clock.x1+1, 0, clock.x2-(clock.x1+1), P_HEIGHT)
                    self.drawText(clock, clock.x1+P_SPACER, 0)
                                              
#----------------------------------------------------------------------------
#                                  Main
#----------------------------------------------------------------------------
from distutils import sysconfig
from ppmodule import ppinit, ppshade, ppicon, ppfont, ppfontsize, ppclear
from Xlib import X, display, error, Xatom, Xutil
import Xlib.protocol.event
import locale, os, pwd, select, sys, time

# New default config options which may not exist in ~/.pypanelrc if upgrading
# v2.2
HIDDEN_SIZE   = 2   
SHOWBORDER    = 0 
SHOWMINIMIZED = 0
# v2.3
ABOVE         = 1 
LAUNCHER      = 0  
LAUNCH_LIST   = [] 
APPL_I_HEIGHT = 24         
APPL_I_WIDTH  = 24  
ICON_LIST     = {"default":""}  
# v2.4
SHADOWS                = 0   
TASK_SHADOW_COLOR      = "0xffffff"
FOCUSED_SHADOW_COLOR   = "0xffffff"
SHADED_SHADOW_COLOR    = "0xffffff"
MINIMIZED_SHADOW_COLOR = "0xffffff" 
DESKTOP_SHADOW_COLOR   = "0xffffff"
CLOCK_SHADOW_COLOR     = "0xffffff"

#-------------------------
if __name__ == "__main__":
#-------------------------
    try:
        src  = None
        dst  = None
        home = pwd.getpwuid(os.getuid())[5]
        if os.access("/etc/pypanelrc", os.F_OK|os.R_OK):
            src = "/etc/pypanelrc"
            execfile(src)
        if not os.access("%s/.pypanelrc" % home, os.F_OK|os.R_OK):
            # Create ~/.pypanelrc from /etc/pypanelrc if it exists else
            # create it from /<pythonlib>/site-packages/pypanel/pypanelrc
            import shutil
            if not src:
                src = "%s/pypanel/pypanelrc" % sysconfig.get_python_lib()
            dst = "%s/.pypanelrc" % home
            shutil.copyfile(src, dst)
        execfile("%s/.pypanelrc" % home)
        del src, dst, home
    except StandardError, e:
        sys.stderr.write("\nFailed to open ~/.pypanelrc -\n\n")
        sys.stderr.write(str(e)+"\n\n")
        sys.exit()
        
    # Version check
    main   = 2.4
    config = globals().get("VERSION", None)
    
    # Set locale to user's default
    locale.setlocale(locale.LC_ALL, "")
    
    if not config or config != main:
        sys.stderr.write("\npypanelrc version : %s\n" % config)
        sys.stderr.write("pypanel   version : %s\n" % main)
        sys.stderr.write("\nA current pypanelrc example can be found here -\n")
        sys.stderr.write("%s/pypanel/pypanelrc\n\n" % sysconfig.get_python_lib())
    del main, config

    PyPanel(display.Display())

"We're all mad here. I'm mad. You're mad."

Offline

#30 2008-12-09 23:37:38

SenorSnor
Member
From: Delft, Netherlands
Registered: 2006-09-13
Posts: 48

Re: [solved] PyPanel Won't show task names, or any characters.

What video card do you have, and what drivers? From the bug report I linked to a few posts earlier, you can find that there are some font rendering problems with the nvidia 96xx-drivers. If that is the case, I think you'll have to wait for an update of those drivers, or use the open source nv-driver.

Offline

#31 2008-12-10 00:06:35

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

GeForce 6150SE nForce 430 is my chipset, with nvidia-96xx installed.
So reinstall my nvidia drivers? Or can I downgrade?

Last edited by Koonboi (2008-12-10 00:26:11)


"We're all mad here. I'm mad. You're mad."

Offline

#32 2008-12-10 07:21:07

Mr Green
Forum Fellow
From: U.K.
Registered: 2003-12-21
Posts: 5,896
Website

Re: [solved] PyPanel Won't show task names, or any characters.

loaded xfce4 and ran pypanel from terminal works fine...........


Mr Green

Offline

#33 2008-12-10 09:47:12

SenorSnor
Member
From: Delft, Netherlands
Registered: 2006-09-13
Posts: 48

Re: [solved] PyPanel Won't show task names, or any characters.

Koonboi wrote:

GeForce 6150SE nForce 430 is my chipset, with nvidia-96xx installed.
So reinstall my nvidia drivers? Or can I downgrade?

I don't know, maybe search the bug reports? But I think you'd better wait for a stable version of the 96xx-drivers; the one that is in arch now is a beta package because current stable doesn't support current xorg. So if you'll downgrade your nvidia drivers you'll probably have to downgrade xorg as well. Maybe you can try to use the nv driver.

Offline

#34 2008-12-10 13:05:11

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

But changing my video drivers requires conpletely redoing my xorg.conf, doesn't it?


"We're all mad here. I'm mad. You're mad."

Offline

#35 2008-12-10 18:04:15

Mr Green
Forum Fellow
From: U.K.
Registered: 2003-12-21
Posts: 5,896
Website

Re: [solved] PyPanel Won't show task names, or any characters.

http://bbs.archlinux.org/viewtopic.php?id=60513

Give this a shot .................


Mr Green

Offline

#36 2008-12-11 00:29:31

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

Mr Green, I lvoe you. I installed the generic rivers, and it worked. Thank you.


"We're all mad here. I'm mad. You're mad."

Offline

#37 2009-01-04 05:37:59

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

I have found that disabling hardware acceleration fixes the problem (I switched back to the original drivers, the others were WAY to slow), but makes it to where I have to disable compositor. And conky is messed up now.


"We're all mad here. I'm mad. You're mad."

Offline

#38 2009-01-04 05:46:04

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

I changed the font and it looks better, but the font is still messed up somehow.


"We're all mad here. I'm mad. You're mad."

Offline

#39 2009-01-04 10:51:04

Mr Green
Forum Fellow
From: U.K.
Registered: 2003-12-21
Posts: 5,896
Website

Re: [solved] PyPanel Won't show task names, or any characters.

If your Pypanel problem is fixed then edit your first post to [Solved]

Thank you :-)


Mr Green

Offline

#40 2009-01-04 20:50:07

Koonboi
Member
From: El Ghetto
Registered: 2008-08-14
Posts: 59

Re: [solved] PyPanel Won't show task names, or any characters.

Well the problem isn't completely fixed, fonts still blur, but I will edit it since pypanel isn't the broken part.


"We're all mad here. I'm mad. You're mad."

Offline

Board footer

Powered by FluxBB