--- sourceforge.net/trunk/rdesktop/xwin.c 2002/08/24 20:04:56 100 +++ sourceforge.net/trunk/rdesktop/xwin.c 2002/08/26 17:14:04 102 @@ -247,6 +247,41 @@ } } +static 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() { @@ -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; @@ -397,7 +433,7 @@ input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | - VisibilityChangeMask | FocusChangeMask; + VisibilityChangeMask | FocusChangeMask; if (grab_keyboard) input_mask |= EnterWindowMask | LeaveWindowMask; @@ -408,7 +444,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 +499,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,12 +577,15 @@ str, sizeof(str), &keysym, NULL); } - /* FIXME needs alt modifier */ - if (keysym == XK_Break) /* toggle full screen */ + if (keysym == XK_Break) /* toggle full screen */ { - toggle_fullscreen(); - break; + if (get_key_state(XK_Alt_L) || get_key_state(XK_Alt_R)) + { + toggle_fullscreen(); + break; + } } + ksname = get_ksname(keysym); DEBUG_KBD(("\nKeyPress for (keysym 0x%lx, %s)\n", keysym, ksname));