void MergeWinState(struct SubWin *d, int state) { if (d->Win) { sub_window_set_visibility(d, state); return; } if (! state) { return; } list_sub_window_create(d, "Merge Window", MERG_WIN_COL_NUM, Mlist, Mergewin_xpm, Mergewin48_xpm); d->data.data->update = MergeWinUpdate; d->data.data->setup_dialog = MergeDialog; d->data.data->dialog = &DlgMerge; d->data.data->obj = chkobject("merge"); sub_win_create_popup_menu(d->data.data, POPUP_ITEM_NUM, Popup_list, G_CALLBACK(popup_show_cb)); init_dnd(d); gtk_tree_view_set_enable_search(GTK_TREE_VIEW(d->data.data->text), TRUE); gtk_tree_view_set_search_column(GTK_TREE_VIEW(d->data.data->text), MERG_WIN_COL_FILE); tree_view_set_tooltip_column(GTK_TREE_VIEW(d->data.data->text), MERG_WIN_COL_FILE); }
int gl_open_window () { _gl_display = XOpenDisplay(0); if (!_gl_display) { fprintf( stderr, "Cannot connect to X server\n"); return 1; } _gl_screen = DefaultScreen(_gl_display); int attrList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 4, GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16, GLX_ARB_multisample, 1, None }; XVisualInfo* vi = glXChooseVisual(_gl_display, _gl_screen, attrList); if (!vi) { fprintf(stderr, "GLX visual is not supported\n"); XCloseDisplay(_gl_display); return 1; } int glxMajor, glxMinor; glXQueryVersion(_gl_display, &glxMajor, &glxMinor); if (want_verbose) { printf("GLX-Version : %d.%d\n", glxMajor, glxMinor); } Window xParent = RootWindow(_gl_display, _gl_screen); Colormap cmap = XCreateColormap( _gl_display, xParent, vi->visual, AllocNone); XSetWindowAttributes attr; memset(&attr, 0, sizeof(XSetWindowAttributes)); attr.colormap = cmap; attr.border_pixel = 0; _gl_width = ffctv_width; _gl_height = ffctv_height; attr.event_mask = ExposureMask | KeyPressMask | Button1MotionMask | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask; _gl_win = XCreateWindow( _gl_display, xParent, 0, 0, _gl_width, _gl_height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &attr); if (!_gl_win) { XCloseDisplay(_gl_display); return 1; } XStoreName(_gl_display, _gl_win, "xjadeo"); Atom wmDelete = XInternAtom(_gl_display, "WM_DELETE_WINDOW", True); XSetWMProtocols(_gl_display, _gl_win, &wmDelete, 1); setup_window_hints_and_icon(_gl_display, _gl_win, xParent, 4096 /*TODO query max texture size*/); _gl_ctx = glXCreateContext(_gl_display, vi, 0, GL_TRUE); if (!_gl_ctx) { XDestroyWindow(_gl_display, _gl_win); XCloseDisplay(_gl_display); return 1; } #ifdef DND init_dnd(_gl_display, _gl_win); #endif XMapRaised(_gl_display, _gl_win); if (want_verbose) { if (glXIsDirect(_gl_display, _gl_ctx)) { printf("GLX: DRI enabled\n"); } else { printf("GLX: No DRI available\n"); } } XFree(vi); if (start_fullscreen) { gl_set_fullscreen(1); } if (start_ontop) { gl_set_ontop(1); } glXMakeCurrent(_gl_display, _gl_win, _gl_ctx); gl_init(); if (gl_reallocate_texture(movie_width, movie_height)) { gl_close_window (); return 1; } #if 1 // check for VBlank sync /* https://www.opengl.org/wiki/Swap_Interval ; -1 for adaptive */ int (*glXSwapIntervalSGI)(int interval) = (int (*)(int)) glXGetProcAddress((const GLubyte *)"glXSwapIntervalSGI"); GLint (*glXSwapIntervalMESA) (unsigned interval) = (GLint (*)(unsigned)) glXGetProcAddress((const GLubyte *)"glXSwapIntervalMESA"); int (*glXSwapIntervalEXT)(Display *dpy, GLXDrawable drw, int interval) = (int (*)(Display*, GLXDrawable, int)) glXGetProcAddress((const GLubyte *)"glXSwapIntervalEXT"); int vblank = -1; if (glXSwapIntervalSGI && check_glx_extention("GLX_SGI_swap_control")) { vblank = glXSwapIntervalSGI(1); if (want_verbose) printf("GLX: use SGI Vblank\n"); } else if (glXSwapIntervalMESA && check_glx_extention("GLX_MESA_swap_control")) { vblank = glXSwapIntervalMESA(1); if (want_verbose) printf("GLX: use MESA Vblank\n"); } else if (glXSwapIntervalEXT && check_glx_extention("GLX_EXT_swap_control")) { GLXDrawable drawable = glXGetCurrentDrawable(); if (drawable) { vblank = glXSwapIntervalEXT(_gl_display, drawable, 1); if (want_verbose) printf("GLX: use EXT Vblank\n"); } } else { if (!want_quiet) { fprintf(stderr, "openGL VBlank not synced\n"); } } // https://www.opengl.org/wiki/Swap_Interval#GPU_vs_CPU_synchronization //_gl_vblank_sync = (vblank == 0) ? 1 : 0; #endif return 0; }