On Jan 15, 2008 9:29 AM, Mark Hammond <[EMAIL PROTECTED]> wrote:
> > I wonder if anyone can provide some clue or pointer on how I can
> > resolve this issue.
>
> The best way would be to create an example which reproduces your problem.
> Its likely that I would be able to simply locate the source once I could see
> it.

Attached are two files to create the issue:

1. install the extension:

    python overlay.py

2. open a file dialog:

    python filedialog.py

BTW, I also noticed that returning 100 from GetPriority() also fixes
the problem, but somehow no overlay icons are displayed on Explorer.
Per msdn, "Possible values range from zero to 100, with zero the
highest priority."
import os
import win32api
import win32con
from win32com.shell import shell, shellcon
import _winreg

class IconOverlayExtension(object):
    _com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier]
    _public_methods_ = [
        "GetOverlayInfo", "GetPriority", "IsMemberOf"
        ]

    def GetOverlayInfo(self): 
        return ("", 0, 0) 

    def GetPriority(self):
        return 0

    def IsMemberOf(self, path, attrib):
        return S_FALSE

def make_icon_overlay(name, icon, state, clsid):
    """
    Make an icon overlay COM class.

    Used to create different COM server classes for highlighting the
    files with different source controlled states (eg: unchanged, 
    modified, ...).
    """
    classname = "%sOverlay" % name
    prog_id = "Mercurial.ShellExtension.%s" % classname
    desc = "Merucurial icon overlay shell extension for %s files" % name.lower()
    reg = [
        (_winreg.HKEY_LOCAL_MACHINE, 
r"Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\%s"
 % name) ]
    cls = type(
            classname,
            (IconOverlayExtension, ),
            dict(_reg_clsid_=clsid, _reg_progid_=prog_id, _reg_desc_=desc, 
registry_keys=reg, icon=icon, state=state))

    _overlay_classes.append(cls)
    # We need to register the class as global, as pythoncom will
    # create an instance of it.
    globals()[classname] = cls

def RegisterServer(cls):
    try:
        key = "CLSID\\%s\\PythonCOMPath" % cls._reg_clsid_
        path = _winreg.QueryValue(_winreg.HKEY_CLASSES_ROOT, key)
        _winreg.SetValue(_winreg.HKEY_CLASSES_ROOT, key, _winreg.REG_SZ, 
"%s;%s" % (path, hg_path))
    except:
        pass
        
    # Add the appropriate shell extension registry keys
    for category, keyname in cls.registry_keys: 
        _winreg.SetValue(category, keyname, _winreg.REG_SZ, cls._reg_clsid_)

    print cls._reg_desc_, "registration complete."
    
def UnregisterServer(cls):
    for category, keyname in cls.registry_keys:
        try:
            _winreg.DeleteKey(category, keyname)
        except WindowsError, details:
            import errno
            if details.errno != errno.ENOENT:
                raise
    print cls._reg_desc_, "unregistration complete."
    
_overlay_classes = []
make_icon_overlay("Changed", "changed.ico", "MODIFIED", 
"{102C6A24-5F38-4186-B64A-237011809FAB}")

if __name__=='__main__':
    from win32com.server import register

    register.UseCommandLine(ChangedOverlay,
            finalize_register = lambda: RegisterServer(ChangedOverlay),
            finalize_unregister = lambda: UnregisterServer(ChangedOverlay))
def runWindows():
    import win32gui, win32con

    fname, customfilter, flags=win32gui.GetSaveFileNameW(
        Flags=win32con.OFN_EXPLORER,
        DefExt='py',
        Filter="",
        CustomFilter="",
        FilterIndex=1)

runWindows()        
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to