--- sourceforge.net/trunk/rdesktop/xwin.c 2002/08/24 20:04:56 100 +++ sourceforge.net/trunk/rdesktop/xwin.c 2002/09/11 11:45:20 118 @@ -248,6 +248,41 @@ } BOOL +get_key_state(int keysym) +{ + int keysymMask = 0, modifierpos, key; + Window wDummy1, wDummy2; + int iDummy3, iDummy4, iDummy5, iDummy6; + unsigned int current_state; + int offset; + + XModifierKeymap *map = XGetModifierMapping(display); + KeyCode keycode = XKeysymToKeycode(display, keysym); + + if (keycode == NoSymbol) + return False; + + for (modifierpos = 0; modifierpos < 8; modifierpos++) + { + offset = map->max_keypermod * modifierpos; + + for (key = 0; key < map->max_keypermod; key++) + { + if (map->modifiermap[offset + key] == keycode) + keysymMask = 1 << modifierpos; + } + } + + XQueryPointer(display, DefaultRootWindow(display), &wDummy1, + &wDummy2, &iDummy3, &iDummy4, &iDummy5, &iDummy6, ¤t_state); + + XFreeModifiermap(map); + + return (current_state & keysymMask) ? True : False; +} + + +BOOL ui_init() { Screen *screen; @@ -266,7 +301,7 @@ return True; } -BOOL +void ui_create_window_obj(int xpos, int ypos, int width, int height, int valuemask) { XClassHint *classhints; @@ -277,8 +312,8 @@ screen = DefaultScreenOfDisplay(display); wnd = XCreateWindow(display, RootWindowOfScreen(screen), xpos, - ypos, width, height, 0, CopyFromParent, - InputOutput, CopyFromParent, valuemask, &attribs); + ypos, width, height, 0, CopyFromParent, + InputOutput, CopyFromParent, valuemask, &attribs); XStoreName(display, wnd, title); @@ -311,7 +346,8 @@ XMapWindow(display, wnd); /* Wait for VisibilityNotify Event */ - for (;;) { + for (;;) + { XNextEvent(display, &xevent); if (xevent.type == VisibilityNotify) break; @@ -393,11 +429,8 @@ attribs.override_redirect = False; } - width = (width + 3) & ~3; /* make width a multiple of 32 bits */ - - input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | - VisibilityChangeMask | FocusChangeMask; + VisibilityChangeMask | FocusChangeMask; if (grab_keyboard) input_mask |= EnterWindowMask | LeaveWindowMask; @@ -408,7 +441,8 @@ input_mask |= ExposureMask; if (fullscreen) - ui_create_window_obj(0, 0, width, height, CWBackingStore | CWBackPixel | CWOverrideRedirect); + ui_create_window_obj(0, 0, width, height, + CWBackingStore | CWBackPixel | CWOverrideRedirect); else ui_create_window_obj(0, 0, width, height, CWBackingStore | CWBackPixel); @@ -462,15 +496,16 @@ XFreePixmap(display, backstore); XFreeGC(display, gc); XDestroyWindow(display, wnd); - if (fullscreen) { + if (fullscreen) + { attribs.override_redirect = True; ui_create_window_obj(0, 0, dpy_width, dpy_height, - CWBackingStore | CWBackPixel | CWOverrideRedirect); + CWBackingStore | CWBackPixel | CWOverrideRedirect); } - else { + else + { attribs.override_redirect = False; - ui_create_window_obj(0, 0, width, height, - CWBackingStore | CWBackPixel); + ui_create_window_obj(0, 0, width, height, CWBackingStore | CWBackPixel); } ui_set_cursor(cache_get_cursor(0)); ui_move_pointer(width / 2, height / 2); @@ -539,29 +574,20 @@ str, sizeof(str), &keysym, NULL); } - /* FIXME needs alt modifier */ - if (keysym == XK_Break) /* toggle full screen */ - { - toggle_fullscreen(); - break; - } ksname = get_ksname(keysym); DEBUG_KBD(("\nKeyPress for (keysym 0x%lx, %s)\n", keysym, ksname)); - if (inhibit_key(keysym)) - { - DEBUG_KBD(("Inhibiting key\n")); + if (handle_special_keys(keysym, ev_time, True)) break; - } tr = xkeymap_translate_key(keysym, xevent.xkey.keycode, xevent.xkey.state); - ensure_remote_modifiers(ev_time, tr); - if (tr.scancode == 0) break; + ensure_remote_modifiers(ev_time, tr); + rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode); break; case KeyRelease: @@ -572,7 +598,7 @@ DEBUG_KBD(("\nKeyRelease for (keysym 0x%lx, %s)\n", keysym, ksname)); - if (inhibit_key(keysym)) + if (handle_special_keys(keysym, ev_time, False)) break; tr = xkeymap_translate_key(keysym,