X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcwindowbase.C;h=1ef0d5939cc8e697ae71ffe3a94b2bbcdc894b3b;hp=c380792efce09c9ffd16e6c9933af95033620ffe;hb=04031cc2a664d2a6d9d2a37954c55cc68742d78c;hpb=c5feedfabe3ee87dfae9a254c9b67c566ec15d2e diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index c380792e..1ef0d593 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -62,7 +62,6 @@ #include #include - BC_ResizeCall::BC_ResizeCall(int w, int h) { this->w = w; @@ -547,6 +546,7 @@ int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title PropModeReplace, (unsigned char *)&XGroupLeader, true); } init_im(); + set_icon(get_resources()->default_icon); } #ifdef HAVE_LIBXXF86VM @@ -997,7 +997,7 @@ locking_message = event->xclient.message_type; done = 1; } else { // We currently use X marshalling for xatom events, we can switch to something else later - recieve_custom_xatoms((xatom_event *)ptr); + receive_custom_xatoms((xatom_event *)ptr); } break; @@ -1233,25 +1233,25 @@ locking_message = event->xclient.message_type; case XK_KP_Subtract: key_pressed = KPMINUS; break; case XK_KP_Multiply: key_pressed = KPSTAR; break; case XK_KP_Divide: key_pressed = KPSLASH; break; - case XK_KP_1: key_pressed = '1'; break; + case XK_KP_1: case XK_KP_End: key_pressed = KP1; break; - case XK_KP_2: key_pressed = '2'; break; + case XK_KP_2: case XK_KP_Down: key_pressed = KP2; break; - case XK_KP_3: key_pressed = '3'; break; + case XK_KP_3: case XK_KP_Page_Down: key_pressed = KP3; break; - case XK_KP_4: key_pressed = '4'; break; + case XK_KP_4: case XK_KP_Left: key_pressed = KP4; break; - case XK_KP_5: key_pressed = '5'; break; + case XK_KP_5: case XK_KP_Begin: key_pressed = KP5; break; - case XK_KP_6: key_pressed = '6'; break; + case XK_KP_6: case XK_KP_Right: key_pressed = KP6; break; - case XK_KP_7: key_pressed = '7'; break; + case XK_KP_7: case XK_KP_Home: key_pressed = KP7; break; - case XK_KP_8: key_pressed = '8'; break; + case XK_KP_8: case XK_KP_Up: key_pressed = KP8; break; - case XK_KP_9: key_pressed = '9'; break; + case XK_KP_9: case XK_KP_Page_Up: key_pressed = KP9; break; - case XK_KP_0: key_pressed = '0'; break; + case XK_KP_0: case XK_KP_Insert: key_pressed = KPINS; break; case XK_KP_Decimal: case XK_KP_Delete: key_pressed = KPDEL; break; @@ -1338,19 +1338,26 @@ locking_message = event->xclient.message_type; break; case LeaveNotify: - if( cursor_entered && event->xcrossing.window == win ) { - cursor_entered = 0; - } + if( event->xcrossing.mode != NotifyNormal ) break; + cursor_entered = 0; event_win = event->xany.window; dispatch_cursor_leave(); break; case EnterNotify: - if( !cursor_entered && event->xcrossing.window == win ) { - if( !event->xcrossing.focus && get_resources()->grab_input_focus ) { - XSetInputFocus(display, win, RevertToParent, CurrentTime); + if( event->xcrossing.mode != NotifyNormal ) break; + + if( !cursor_entered ) { + for( int i=0; iwin == event->xcrossing.window ) + cursor_entered = 1; } - cursor_entered = 1; + if( !cursor_entered && get_resources()->grab_input_focus && + !event->xcrossing.focus && event->xcrossing.window == win ) { + cursor_entered = 1; + } + if( cursor_entered ) + focus(); } event_win = event->xany.window; cursor_x = event->xcrossing.x; @@ -1978,7 +1985,7 @@ int BC_WindowBase::arm_repeat(int64_t duration) } #endif -int BC_WindowBase::recieve_custom_xatoms(xatom_event *event) +int BC_WindowBase::receive_custom_xatoms(xatom_event *event) { return 0; } @@ -3465,6 +3472,38 @@ BC_WindowBase::get_xinerama_info(int screen) return 0; } +void BC_WindowBase::get_fullscreen_geometry(int &wx, int &wy, int &ww, int &wh) +{ + XineramaScreenInfo *info = top_level->get_xinerama_info(-1); + if( info ) { + wx = info->x_org; wy = info->y_org; + ww = info->width; wh = info->height; + } + else { + wx = get_screen_x(0, -1); + wy = get_screen_y(0, -1); + int scr_w0 = get_screen_w(0, 0); + int root_w = get_root_w(0); + int root_h = get_root_h(0); + if( root_w > scr_w0 ) { // multi-headed + if( wx >= scr_w0 ) { + // assumes right side is the big one + ww = root_w - scr_w0; + wh = root_h; + } + else { + // use same aspect ratio to compute left height + ww = scr_w0; + wh = (w*root_h) / (root_w-scr_w0); + } + } + else { + ww = root_w; + wh = root_h; + } + } +} + int BC_WindowBase::get_screen_x(int lock_display, int screen) { int result = -1; @@ -4538,3 +4577,11 @@ void BC_WindowBase::flicker(int n, int ms) set_opaque(); } +void BC_WindowBase::focus() +{ + XWindowAttributes xwa; + XGetWindowAttributes(top_level->display, top_level->win, &xwa); + if( xwa.map_state == IsViewable ) + XSetInputFocus(top_level->display, top_level->win, RevertToParent, CurrentTime); +} +