xpra icon
Bug tracker and wiki

Changeset 131 in xpra


Ignore:
Timestamp:
08/15/11 15:06:24 (22 months ago)
Author:
antoine
Message:

only use the raw keycode if the client has sent its own keymap to use - otherwise it is very unlikely to work. This should allow MS Windows and Mac OS X to use the new code unmodified (much better than adding platform checks)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/xpra/server.py

    r128 r131  
    272272            if (is_override_redirect(window) and is_mapped(window)): 
    273273                self._add_new_or_window(window) 
     274         
     275        ## These may get set by the client: 
     276        self.xkbmap_print = None 
     277        self.xkbmap_query = None 
    274278 
    275279        ### Set up keymap: 
     
    339343            self.add_listen_socket(sock) 
    340344 
    341     def set_keymap(self, xkbmap_print, xkbmap_query): 
     345    def set_keymap(self): 
    342346        """ xkbmap_print is the output of setxkbmap -print on the client 
    343347            xkbmap_query is the output of setxkbmap -query on the client 
     
    352356                log.info("error calling 'setxkbmap %s': %s" % (str(args), e)) 
    353357        #First we try to use data from setxkbmap -query 
    354         if xkbmap_query: 
     358        if self.xkbmap_query: 
    355359            """ The xkbmap_query data will look something like this: 
    356360            rules:      evdev 
     
    366370            settings = {} 
    367371            opt_re = re.compile("(\w*):\s*(.*)") 
    368             for line in xkbmap_query.splitlines(): 
     372            for line in self.xkbmap_query.splitlines(): 
    369373                m = opt_re.match(line) 
    370374                if m: 
     
    380384            if "options" in settings: 
    381385                exec_setxkbmap(["-option", "", "-option", settings.get("options")]) 
    382         elif xkbmap_print: 
     386        elif self.xkbmap_print: 
    383387            #try to guess the layout by parsing "setxkbmap -print" 
    384388            try:  
    385389                sym_re = re.compile("\s*xkb_symbols\s*{\s*include\s*\"([\w\+]*)")  
    386                 for line in xkbmap_print.splitlines():  
     390                for line in self.xkbmap_print.splitlines():  
    387391                    m = sym_re.match(line)  
    388392                    if m: 
     
    394398                log.info("error setting keymap: %s" % e)  
    395399 
    396         if xkbmap_print: 
     400        if self.xkbmap_print: 
    397401            try: 
    398                 returncode = self.signal_safe_exec(["xkbcomp", "-", os.environ.get("DISPLAY")], xkbmap_print) 
     402                returncode = self.signal_safe_exec(["xkbcomp", "-", os.environ.get("DISPLAY")], self.xkbmap_print) 
    399403                if returncode==0: 
    400404                    log.info("xkbcomp successfully applied new keymap") 
     
    552556    def _keycode(self, keycode, string, keyval, keyname, group=0, level=0): 
    553557        log.debug("keycode(%s,%s,%s,%s,%s,%s)" % (keycode, string, keyval, keyname, group, level)) 
    554         if keycode: 
    555             """ versions 0.0.7.24 and above give us the raw keycode """ 
     558        if keycode and self.xkbmap_print is not None: 
     559            """ versions 0.0.7.24 and above give us the raw keycode, 
     560                we can only use this if we have applied the same keymap - if the client sent one 
     561            """ 
    556562            return  keycode 
    557563        # fallback code for older versions: 
     
    783789            self._protocol.jpegquality = capabilities["jpeg"] 
    784790        if "keymap" in capabilities: 
    785             self.set_keymap(capabilities["keymap"], capabilities.get("xkbmap_query", None)) 
     791            self.xkbmap_print = capabilities["keymap"] 
     792            self.xkbmap_query = capabilities.get("xkbmap_query", None) 
     793            self.set_keymap() 
    786794        # We send the new-window packets sorted by id because this sorts them 
    787795        # from oldest to newest -- and preserving window creation order means 
     
    856864    def _process_keymap(self, proto, packet): 
    857865        (_, keymap, xkbmap_query) = packet 
    858         self.set_keymap(keymap, xkbmap_query) 
     866        self.xkbmap_print = keymap 
     867        self.xkbmap_query = xkbmap_query 
     868        self.set_keymap() 
    859869 
    860870    def _process_key_action(self, proto, packet): 
Note: See TracChangeset for help on using the changeset viewer.