표시되지 않습니다. 실행하는 동안 창의 텍스트 내용이 변경되므로 텍스트 크기와 일치하도록 창 크기를 조정하고 싶습니다. 텍스트 범위의 크기가 변경되지 않으면 창은 항상 새 텍스트로 올바르게 업데이트됩니다.는 XResizeWindow 후, 그려 새로운 윈도우 내용은 내가 그 안에 텍스트를 그릴 창 및 <strong>카이로</strong>을 관리 할 수 <strong>Xlib를</strong>를 사용하여 리눅스에서 응용 프로그램을 쓰고 있어요
그러나 텍스트 범위가 변경되어 그에 따라 창의 크기가 조정되면 창은 지워지지 만 새 텍스트는 표시되지 않습니다. XResizeWindow에 대한 호출이없는 경우에만 텍스트가 실제로 표시됩니다. 내가 사용하고 코드 나 또한 텍스트를 방법 cairo_surface_flush 및 XFlush (예에서 주석)하지만 아무것도 변경되지 무 카이로 코드 뒤에 추가하는 시도
if (/* Text extent is changed */)
{
XResizeWindow (display, window, new_width, new_height);
cairo_xlib_surface_set_size (surface, new_width, new_height);
}
XClearWindow (display, window);
/* ... Cairo code to draw the text ... */
// cairo_surface_flush (surface);
// XFlush (display);
입니다.
편집 : 내가 두 개의 스레드를 사용하여 문제 해결 : 내용과 창의 크기 조정을 발행 두 번째 스레드를 다시 그리기 위해 노출 사건 플러스 코드를 듣고에 대한 일반적인 루프를 사용하여 첫 번째 스레드를하고 첫 번째 스레드를 깨우기 위해 Expose 이벤트를 보냅니다.
이 예제에서는 임의의 너비와 높이로 500ms마다 창 크기가 조정되고 모든 크기 조정시 프로그레시브 카운터가 표시됩니다.
g++ -std=c++11 -o test test.cpp -lX11 -lcairo -lpthread
코드는 다음과 같습니다 : 나는 C++ (11), 컴파일 사용
#include <random>
#include <chrono>
#include <thread>
#include <string>
#include <X11/Xlib.h>
#include <cairo/cairo-xlib.h>
Display * d;
Window w;
cairo_surface_t * surface;
int width = 300, height = 300;
unsigned char counter = 0;
std::random_device rd;
std::knuth_b gen (rd());
std::uniform_int_distribution < > dist (150, 300);
void logic()
{
XEvent send_event;
send_event.type = Expose;
send_event.xexpose.window = w;
while (true)
{
std::this_thread::sleep_for (std::chrono::milliseconds (500));
++ counter;
width = dist (gen);
height = dist (gen);
cairo_xlib_surface_set_size (surface, width, height);
XResizeWindow (d, w, width, height);
XSendEvent (d, w, False, ExposureMask, & send_event);
XFlush (d);
}
}
int main ()
{
XInitThreads();
d = XOpenDisplay (NULL);
w = XCreateSimpleWindow (d, RootWindow (d, 0), 0, 0, width, height, 0, 0, 0x000000);
XMapWindow (d, w);
XSelectInput (d, w, ExposureMask | KeyPressMask);
surface = cairo_xlib_surface_create (d, w, DefaultVisual (d, 0), width, height);
cairo_t * cairo = cairo_create (surface);
cairo_select_font_face (cairo, "FreeSans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size (cairo, 40);
cairo_set_source_rgb (cairo, 0.8, 0.8, 0.8);
cairo_move_to (cairo, 40.0, 60.0);
cairo_show_text (cairo, std::to_string (counter).c_str());
XFlush (d);
std::thread T (logic);
XEvent event;
while (true)
{
XNextEvent (d, & event);
if (event.type == Expose)
{
XClearWindow (d, w);
cairo_move_to (cairo, 40.0, 60.0);
cairo_show_text (cairo, std::to_string (counter).c_str());
}
else if (event.type == KeyPress)
{
XCloseDisplay (d);
return 0;
}
}
}
을하지만 문제는 남아있다 : 그것은 만 가능 하나의 스레드를 사용하여 동일한 결과를 얻을?
테스트 할 수있는 자체 포함 된 예가 있습니까? 귀하의 이벤트 루프는 어떻게 보이나요? 즉, 폭로 이벤트에서 무엇을합니까? –
좋아요. 나는이 동작을 재현하는 소형 자체 포함 코드 예제를 제공 할 것입니다. – disquisitiones