Всегда полноэкранный на втором мониторе с использованием OpenGL на Ubuntu 14.04
У меня есть два монитора с разными собственными разрешениями с одинаковой частотой обновления, с графическим процессором Nvidia Titan X (версия драйвера 375.66) в Ubuntu 14.04. Я хотел бы в режиме реального времени показывать захваченное изображение во весь экран на втором мониторе и одновременно управлять графическим интерфейсом камеры на основном мониторе.
Минимальное воспроизведение с использованием glfw
а также OpenGL
является:
#include <stdio.h>
#include <stdlib.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
GLFWwindow* open_window(const char* title, GLFWmonitor* monitor)
{
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwWindowHint(GLFW_RED_BITS, mode->redBits);
glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, title, monitor, NULL);
if (!window)
return NULL;
glfwMakeContextCurrent(window);
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
glfwSwapInterval(1);
glfwShowWindow(window);
return window;
}
GLuint create_texture(GLFWmonitor* monitor)
{
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
int width = mode->width;
int hieght = mode->height;
char pixels[width * hieght];
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
for (int y = 0; y < hieght; y++)
for (int x = 0; x < width; x++)
pixels[y * width + x] = rand() % width;
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, hieght, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
return texture;
}
void draw_quad(GLuint texture)
{
int width, height;
glfwGetFramebufferSize(glfwGetCurrentContext(), &width, &height);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.f, 1.f, 0.f, 1.f, 0.f, 1.f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBegin(GL_QUADS);
glTexCoord2f(0.f, 0.f);
glVertex2f(0.f, 0.f);
glTexCoord2f(1.f, 0.f);
glVertex2f(1.f, 0.f);
glTexCoord2f(1.f, 1.f);
glVertex2f(1.f, 1.f);
glTexCoord2f(0.f, 1.f);
glVertex2f(0.f, 1.f);
glEnd();
}
int main(int argc, char** argv)
{
if (!glfwInit())
exit(EXIT_FAILURE);
// detect and print monitor information
int monitor_count;
GLFWmonitor** monitors = glfwGetMonitors(&monitor_count);
printf("Number of monitors detected: %d\n", monitor_count);
if (monitor_count < 2)
{
printf("The second monitor is not connected.\n");
return false;
}
// open a window fullscreen on second monitor
GLFWwindow *window = open_window("Captured image", monitors[1]);
if (!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
// the loop
while (!glfwWindowShouldClose(window))
{
// create the image (say, the captured image via camera App)
GLuint texture = create_texture(monitors[1]);
// show the image
draw_quad(texture);
glfwSwapBuffers(window);
}
glfwTerminate();
exit(EXIT_SUCCESS);
}
Проблема в том, что строка заголовка Ubuntu появляется, когда я переключаю текущий фокус на графический интерфейс камеры или на терминал. Например: Вверху: сфокусируйтесь на окне (на весь экран отлично). Внизу: фокус на терминале; обратите внимание, что теперь отображается нежелательная верхняя строка заголовка (отмечена красным).
X воспринимает два монитора как один большой экран, поэтому мои снимки экрана содержат дополнительные черные пиксели:
Я обнаружил https://bugs.launchpad.net/unity/+bug/853865 котором говорится, что верхняя панель на втором дисплее не может быть скрыта, и это рассматривается как реализуемая функция для Unity.
Как я могу преодолеть эту проблему в течение glfw
? Если нет, то любой другой OpenGL
рамки альтернативы предложения? Я хотел бы сохранить мультиплатформенность.