update instalar for linux user-interface ubuntu gtk

instalar - En GTK/Linux, ¿cuál es la forma correcta de obtener el factor de escala DPI?



install gtk ubuntu 18 (1)

Contexto: escribir un programa de dibujo que se supone que es multiplataforma. Por lo tanto, tengo varias interfaces responsables de proporcionar acceso de clase backend a un contexto de El Cairo, manejo de eventos básicos e información de tamaño de widget. Recientemente decidí agregar la escala de UI actual (para pantallas de alta resolución) a ese último bit, principalmente porque quiero cambiar los gráficos para que se procesen en una memoria caché, así que necesito saber el nivel de detalle más alto que la pantalla puede admitir .

En mi pequeño mundo multiplataforma, espero que el adaptador front-end para la clase de backend al que me refiero configure correctamente el contexto de El Cairo para trabajar en píxeles virtualizados antes de entregármelo a mí. Solo necesito la escala para limitar la cantidad de escala que uso en mis teselas.

En AppKit esto fue fácil: pedir a NSView que escale un NSSize de 1 píxel virtual en "coordenadas de la tienda de respaldo", y entregarlo a la clase back-end. Apple también fue lo suficientemente inteligente como para proporcionar un contexto CoreGraphics pre escalado, por lo que todo lo que tengo que hacer es solicitar coordenadas volteadas y meter el CGContext en Cairo.

En GTK estoy un poco más confundido. Parece haber demasiadas formas de hacer esto. GtkWidget tiene una llamada de " obtener factor de escala ", gint gtk_widget_get_scale_factor (GtkWidget *widget) que devuelve un valor entero. Esto parece un poco demasiado restrictivo porque no puede tratar con pantallas que están en el medio con este tipo de escenario. Es decir, el monitor 28 "3840x2160 que he estado observando se supone que es un monitor 1.5x, pero bajo GTK todo será demasiado pequeño o demasiado grande.

Ubuntu lanza su propia llave en mano también, porque tiene su propio factor de escala DPI que parece ser diferente de todo lo demás. Solo unas pocas aplicaciones parecen ser compatibles. Lo cambié a 1.5; Firefox y Brackets no escalaron, Nautilus y la terminal sí escalaron, y Empathy hace esta cosa rara donde todo, excepto el texto de la conversación, se amplía. Entonces claramente no está en todo el sistema ni está incorporado en GTK ... blarrgh.

Además, X11 tiene su propia manera de obtener información DPI que he escuchado es hilarantemente inexacta y no vale la pena pensar de todos modos ya que Mir y Wayland van a reemplazarlo de todos modos.

Sin embargo, no puedo encontrar ninguna información sobre esta súper especial API de Unity para obtener la escala de IU especificada por el usuario. Así que voy a tomar la escala entera propia de GTK por ahora, lo que no creo que sea adecuado, pero lo que sea. Me gustaría saber cómo obtener el parámetro de escala Unity o los parámetros de escala de UI propios de cualquier otro entorno de escritorio, pero tengo la sensación de que también debería enviar una preferencia personalizada para configurar manualmente la escala de UI para esta interfaz concreta.

(Para los curiosos: mi código está disponible here - la clase backend de la que estoy hablando está en src / canvasview.cpp y ejemplos de "adaptadores de vista" front-end están en frontends / gtk / src / CanvasWidget.cpp y frontends / appkit / src / ICAKCanvasView.m, respectivamente. Tenga en cuenta que el código está actualmente en un estado descompuesto ya que estoy ocupado depurando la representación basada en mosaicos).


No he visto un captador de dpi en GTK, pero con algunas líneas de código de fuentes abiertas y algunos cambios, generalmente le pido al servidor X con este fragmento de código que obtenga los valores de ppp para la dirección xey. Para el nombre de visualización puede pasar los valores que desee a través de argv [].

Si lo llamas ''getdpi.c'', compila con

gcc -Wall -std=c99 -o getdpi getdpi.c -lX11

Si te ayuda, un voto será apreciado. :-)

#include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> const static unsigned int FALSE = 0; const static unsigned int TRUE = 1; typedef unsigned int bool; int getDpi(Display *dpy, int scr, bool xRes) { /* * an inch is 25.4 millimeters. * dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch)) * = N pixels / (M inch / 25.4) * = N * 25.4 pixels / M inch */ double res = xRes ? ((((double) DisplayWidth(dpy,scr)) * 25.4) / ((double) DisplayWidthMM(dpy,scr))) : ((((double) DisplayHeight(dpy,scr)) * 25.4) / ((double) DisplayHeightMM(dpy,scr))); return (int) (res + 0.5); } // print_Screen_info int main(int argc, char *argv[]) { Display *dpy; /* X connection */ char *displayname = NULL; /* set to what you want or need */ dpy = XOpenDisplay (displayname); if (!dpy) { fprintf (stderr, "xdpi: unable to open display /"%s/"./n", XDisplayName (displayname)); exit (1); } for (int i = 0; i < ScreenCount(dpy); ++i) printf ("Xdpi: %d, Ydpi %d/n", getDpi(dpy, i, TRUE), getDpi(dpy, i, FALSE)); } // main