Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index 93279934cb9b56fa4ac5615357ba5a4915b0a6ac..adaaa6e266f779464b5d12099179a8aad94c9f6c 100644 (file)
@@ -1173,6 +1173,24 @@ if( debug && event->type != ClientMessage ) {
 //__LINE__,
 //keysym);
 
+// force setting modifiers state if a modifier key pressed
+               switch( keysym ) {
+               case XK_Alt_L:
+               case XK_Alt_R:
+                       alt_mask = 1;
+                       break;
+               case XK_Shift_L:
+               case XK_Shift_R:
+                       shift_mask = 1;
+                       break;
+               case XK_Control_L:
+               case XK_Control_R:
+                       ctrl_mask = 1;
+                       break;
+               default:
+                       break;
+               }
+
 // block out control keys
                if(keysym > 0xffe0 && keysym < 0xffff) break;
 // block out Alt_GR key
@@ -1309,8 +1327,26 @@ if( debug && event->type != ClientMessage ) {
 
        case KeyRelease:
                XLookupString((XKeyEvent*)event, keys_return, 1, &keysym, 0);
+               get_key_masks(event->xkey.state);
+// force clearing modifiers state if a modifier key released
+               switch( keysym ) {
+               case XK_Alt_L:
+               case XK_Alt_R:
+                       alt_mask = 0;
+                       break;
+               case XK_Shift_L:
+               case XK_Shift_R:
+                       shift_mask = 0;
+                       break;
+               case XK_Control_L:
+               case XK_Control_R:
+                       ctrl_mask = 0;
+                       break;
+               default:
+                       break;
+               }
                dispatch_keyrelease_event();
-// printf("BC_WindowBase::dispatch_event KeyRelease keysym=0x%x keystate=0x%lld\n",
+// printf("BC_WindowBase::dispatch_event KeyRelease keysym=%#lx keystate=%04x\n",
 // keysym, event->xkey.state);
                break;
 
@@ -2530,7 +2566,11 @@ void BC_WindowBase::init_im()
        if(!(input_method = XOpenIM(display, NULL, NULL, NULL)))
        {
                printf("BC_WindowBase::init_im: Could not open input method.\n");
+               XSetLocaleModifiers("@im=local");
+               if(!(input_method = XOpenIM(display, NULL, NULL, NULL))) {
+               printf("BC_WindowBase::init_im: Could not open input method local.\n");
                exit(1);
+               }
        }
        if(XGetIMValues(input_method, XNQueryInputStyle, &xim_styles, NULL) ||
                        xim_styles == NULL)