int photon_input_pulse(input_region_data_t *regdat) { static PhEvent_t *event; if (event == NULL) { if ((event = malloc(EVENT_SIZE)) == NULL) { perror("malloc"); return -1; } } switch( PhEventPeek(event, EVENT_SIZE)) { case Ph_EVENT_MSG: if (event->type == Ph_EV_SYSTEM) { system_event(event, regdat); } else if (event->type == Ph_EV_SERVICE) { service_event(event, regdat); } break; case _Ph_SERV_INTERACT: case _Ph_SERV_KEYBOARD: case _Ph_SERV_POINTER: service_message((struct _Ph_msg_forward *) event, regdat); break; case -1: perror( "PhEventPeek failed" ); break; } return (0); }
/* perform a blocking read if no events available */ int ph_Pending(_THIS) { /* Flush the display connection and look to see if events are queued */ PgFlush(); while (1) { switch(PhEventPeek(event, EVENT_SIZE)) { case Ph_EVENT_MSG: return 1; break; case -1: perror("ph_Pending(): PhEventNext failed"); break; default: return 0; } } /* Oh well, nothing is ready .. */ return(0); }
/***************************************************************************** * QNXManage: handle QNX events ***************************************************************************** * This function should be called regularly by video output thread. It allows * window resizing. It returns a non null value on error. *****************************************************************************/ static int QNXManage( vout_thread_t *p_vout ) { int i_ev, i_buflen; PhEvent_t *p_event; bool b_repos = 0; if (!vlc_object_alive (p_vout)) { return ( 0 ); } /* allocate buffer for event */ i_buflen = sizeof( PhEvent_t ) * 4; if( ( p_event = malloc( i_buflen ) ) == NULL ) return( 1 ); /* event loop */ do { memset( p_event, 0, i_buflen ); i_ev = PhEventPeek( p_event, i_buflen ); if( i_ev == Ph_RESIZE_MSG ) { PhEvent_t *buf; i_buflen = PhGetMsgSize( p_event ); buf = realloc( p_event, i_buflen ); if( buf == NULL ) { free( p_event ); return( 1 ); } p_event = buf; } else if( i_ev == Ph_EVENT_MSG ) { PtEventHandler( p_event ); if( p_event->type == Ph_EV_WM ) { PhWindowEvent_t *p_ev = PhGetData( p_event ); switch( p_ev->event_f ) { case Ph_WM_CLOSE: p_vout->p_libvlc->b_die = true; break; case Ph_WM_MOVE: p_vout->p_sys->pos.x = p_ev->pos.x; p_vout->p_sys->pos.y = p_ev->pos.y; b_repos = 1; break; case Ph_WM_RESIZE: p_vout->p_sys->old_dim.w = p_vout->p_sys->dim.w; p_vout->p_sys->old_dim.h = p_vout->p_sys->dim.h; p_vout->p_sys->dim.w = p_ev->size.w; p_vout->p_sys->dim.h = p_ev->size.h; p_vout->i_changes |= VOUT_SIZE_CHANGE; break; } } else if( p_event->type == Ph_EV_KEY ) { PhKeyEvent_t *p_ev = PhGetData( p_event ); long i_key = p_ev->key_sym; if( ( p_ev->key_flags & Pk_KF_Key_Down ) && ( p_ev->key_flags & Pk_KF_Sym_Valid ) ) { switch( i_key ) { case Pk_q: case Pk_Q: p_vout->p_libvlc->b_die = true; break; case Pk_f: case Pk_F: p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; break; default: break; } } } } } while( i_ev != -1 && i_ev != 0 ); free( p_event ); /* * fullscreen */ if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ) { PhDim_t dim; p_vout->b_fullscreen = !p_vout->b_fullscreen; p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; if( p_vout->b_fullscreen ) { p_vout->p_sys->old_pos.x = p_vout->p_sys->pos.x; p_vout->p_sys->old_pos.y = p_vout->p_sys->pos.y; p_vout->p_sys->pos.x = p_vout->p_sys->pos.y = 0; dim.w = p_vout->p_sys->screen_dim.w + 1; dim.h = p_vout->p_sys->screen_dim.h + 1; } else { p_vout->p_sys->pos.x = p_vout->p_sys->old_pos.x; p_vout->p_sys->pos.y = p_vout->p_sys->old_pos.y; dim.w = p_vout->p_sys->old_dim.w + 1; dim.h = p_vout->p_sys->old_dim.h + 1; } /* modify render flags, border */ PtSetResource( p_vout->p_sys->p_window, Pt_ARG_WINDOW_RENDER_FLAGS, p_vout->b_fullscreen ? Pt_FALSE : Pt_TRUE, Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE ); /* set position and dimension */ PtSetResource( p_vout->p_sys->p_window, Pt_ARG_POS, &p_vout->p_sys->pos, 0 ); PtSetResource( p_vout->p_sys->p_window, Pt_ARG_DIM, &dim, 0 ); /* mark as damaged to force redraw */ PtDamageWidget( p_vout->p_sys->p_window ); } /* * size change */ if( p_vout->i_changes & VOUT_SIZE_CHANGE ) { p_vout->i_changes &= ~VOUT_SIZE_CHANGE; if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { ResizeOverlayOutput(p_vout); } #if 0 else { p_vout->output.i_width = p_vout->p_sys->dim.w; p_vout->output.i_height = p_vout->p_sys->dim.h; p_vout->i_changes |= VOUT_YUV_CHANGE; QNXEnd( p_vout ); if( QNXInit( p_vout ) ) { msg_Err( p_vout, "cannot resize display" ); return( 1 ); } } #endif msg_Dbg( p_vout, "video display resized (%dx%d)", p_vout->p_sys->dim.w, p_vout->p_sys->dim.h ); } /* * position change, move video channel */ if( b_repos && p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY ) { ResizeOverlayOutput(p_vout); } return( i_ev == -1 ); }