~fluendo-elisa/moovida/elisa-pancake

« back to all changes in this revision

Viewing changes to elisa-plugins/elisa/plugins/pigment/windows_messages_handler.py

  • Committer: pancake
  • Date: 2009-03-27 12:16:38 UTC
  • mfrom: (1115.2.37 elisa)
  • Revision ID: pancake@flubox-20090327121638-2da0c1a0zu3byufd
* Merge against the head

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
# Elisa - Home multimedia server
 
3
# Copyright (C) 2006-2009 Fluendo Embedded S.L. (www.fluendo.com).
 
4
# All rights reserved.
 
5
#
 
6
# This file is available under one of two license agreements.
 
7
#
 
8
# This file is licensed under the GPL version 3.
 
9
# See "LICENSE.GPL" in the root of this distribution including a special
 
10
# exception to use Elisa with Fluendo's plugins.
 
11
#
 
12
# The GPL part of Elisa is also available under a commercial licensing
 
13
# agreement from Fluendo.
 
14
# See "LICENSE.Elisa" in the root directory of this distribution package
 
15
# for details on that license.
 
16
 
 
17
from elisa.core import log
 
18
 
 
19
class WindowsMessagesHandler(log.Loggable):
 
20
 
 
21
    def __init__(self, viewport):
 
22
        super(WindowsMessagesHandler, self).__init__()
 
23
        self.viewport = viewport
 
24
        self._signal_id = self.viewport.connect("win32-message-event",
 
25
                                                self._on_windows_message)
 
26
        self._wndprocs = {}
 
27
 
 
28
    def add_wndproc(self, signal_id, callback):
 
29
        """
 
30
        Add a new window proc handler to the viewport windows messages handler.
 
31
 
 
32
        @param signal_id: windows signal ID
 
33
        @type signal_id: C{int}
 
34
        @param callback: callable(viewport, event) to call when signal is
 
35
                         received by the viewport
 
36
        @type callback: C{callable}
 
37
        """
 
38
        msg_filter = self.viewport.get_message_filter()
 
39
        if signal_id in msg_filter:
 
40
            raise ValueError("Signal already handled")
 
41
 
 
42
        self._wndprocs[signal_id] = callback
 
43
        msg_filter.append(signal_id)
 
44
        self.viewport.set_message_filter(msg_filter)
 
45
 
 
46
    def remove_wndproc(self, signal_id):
 
47
        """
 
48
        Remove a window proc handler from the viewport windows messages handler.
 
49
 
 
50
        @param signal_id: windows signal ID
 
51
        @type signal_id: C{int}
 
52
        """
 
53
        msg_filter = self.viewport.get_message_filter()
 
54
        if signal_id in msg_filter:
 
55
            msg_filter.remove(signal_id)
 
56
            self.viewport.set_message_filter(msg_filter)
 
57
            del self._wndprocs[signal_id]
 
58
 
 
59
    def _on_windows_message(self, viewport, event):
 
60
        if event.message in self._wndprocs:
 
61
            return self._wndprocs[event.message](viewport, event)
 
62
 
 
63
    def clean(self):
 
64
        self.viewport.disconnect(self._signal_id)
 
65
        self._wndprocs = {}
 
66
        self.viewport.set_message_filter([])