コード例 #1
0
static void
app_reshape(struct app_data *data)
{
   const EGLint img_attribs[] = {
      EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
      EGL_NONE
   };

   XResizeWindow(data->xdpy, data->cube, data->width, data->height);
   XMoveWindow(data->xdpy, data->cube, data->width, 0);

   if (data->img)
      data->eglDestroyImageKHR(data->dpy, data->img);
   if (data->pix)
      XFreePixmap(data->xdpy, data->pix);

   data->pix = XCreatePixmap(data->xdpy, data->canvas, data->width, data->height, data->depth);
   XFillRectangle(data->xdpy, data->pix, data->bg, 0, 0, data->width, data->height);

   data->img = data->eglCreateImageKHR(data->dpy, EGL_NO_CONTEXT,
         EGL_NATIVE_PIXMAP_KHR, (EGLClientBuffer) data->pix, img_attribs);

   gl_reshape(data->width, data->height);
}
コード例 #2
0
ファイル: display_glx.c プロジェクト: krytarowski/xjadeo
void gl_handle_events () {
	XEvent event;
	while (XPending(_gl_display) > 0) {
		XNextEvent(_gl_display, &event);
#ifdef XDLG
		if (handle_xdlg_event(_gl_display, &event)) continue;
#endif
#ifdef XFIB
		if (x_fib_handle_events (_gl_display, &event)) {
			if (x_fib_status () > 0) {
				char *fn = x_fib_filename ();
				xapi_open (fn);
				free (fn);
			}
		}
#endif
		if (event.xany.window != _gl_win) {
			continue;
		}
#ifdef DND
		if (handle_dnd_event(_gl_display, _gl_win, &event)) continue;
#endif
		switch (event.type) {
			case MapNotify:
				loop_run=1;
				break;
			case UnmapNotify:
				loop_run=0;
				break;

			case ConfigureNotify:
				if (
						(event.xconfigure.width > 1 && event.xconfigure.height > 1)
						&&
						(event.xconfigure.width != _gl_width || event.xconfigure.height != _gl_height)
					 )
				{
					gl_reshape(event.xconfigure.width, event.xconfigure.height);
				}
				break;
			case Expose:
				if (event.xexpose.count != 0) {
					break;
				}
				_gl_reexpose = true;
				break;
			case MotionNotify:
				if (osd_seeking && ui_syncsource() == SYNC_NONE && OSD_mode & OSD_POS) {
					const float sk = calc_slider (event.xmotion.x, event.xmotion.y);
					if (sk >= 0)
						ui_sync_manual (sk);
				}
				break;
			case ButtonPress:
				if (event.xbutton.button == 1 && ui_syncsource() == SYNC_NONE && OSD_mode & OSD_POS) {
					const float sk = calc_slider (event.xbutton.x, event.xbutton.y);
					if (sk >= 0) {
						ui_sync_manual (sk);
						osd_seeking = 1;
						force_redraw = 1;
					}
				}
				break;
			case ButtonRelease:
				if (osd_seeking) {
					osd_seeking = 0;
					force_redraw = 1;
				} else
#ifdef XDLG
				if (event.xbutton.button == 3) {
					if (event.xbutton.x >= 0 && event.xbutton.x < _gl_width
							&& event.xbutton.y >= 0 && event.xbutton.y < _gl_height)
						show_x_dialog(_gl_display, _gl_win,
								event.xbutton.x_root, event.xbutton.y_root
								);
				} else
#endif
				xjglButton(event.xbutton.button);
				break;
			case ReparentNotify:
				break;
			case KeyPress:
				{
				KeySym  sym;
				char    buf[6] = {0,0,0,0,0,0};
				static XComposeStatus stat;
				int n = XLookupString(&event.xkey, buf, sizeof(buf), &sym, &stat);
				if (event.xkey.state & ControlMask && n == 1 && sym == XK_o) {
#ifdef XFIB
					if (!(interaction_override & OVR_LOADFILE)) {
						x_fib_cfg_filter_callback(fib_filter_movie_filename);
						x_fib_show (_gl_display, _gl_win, 0, 0);
					}
#endif
				}
				else if (event.xkey.state & ControlMask && n == 1 && sym == XK_w) {
					if (!(interaction_override & OVR_LOADFILE))
						xapi_close (NULL);
				}
				else if (event.xkey.state & ControlMask && n == 1 && sym == XK_q) {
					if (!(interaction_override&OVR_QUIT_WMG))
						loop_flag = 0;
				}
				else if (n == 1) {
					xjglKeyPress(sym, buf);
				}
				}
				break;
			case ClientMessage:
				if (!strcmp(XGetAtomName(_gl_display, event.xclient.message_type), "WM_PROTOCOLS")) {
					if ((interaction_override&OVR_QUIT_WMG) == 0) loop_flag=0;
				}
				break;
			default:
				break;
		}
	}
	if (_gl_reexpose) {
		_gl_reexpose = false;
		force_redraw = true;
	}

	static int periodic = 10;
	if (--periodic == 0) {
		periodic = 50 * framerate; // we should use 1/delay if delay > 0
		XResetScreenSaver(_gl_display);
		// ..or spawn `xdg-screensaver`
	}
}