디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

다음과 같은 에러가 났다. 어떻게 해결하는 것이 좋겠는가?

나르시갤로그로 이동합니다. 2025.09.27 17:33:34
조회 72 추천 0 댓글 1

이 에러는 GTK 4.18 버전부터 X11 백엔드에 직접 접근하는 함수들이 비권장(deprecated)으로 처리되었고, 컴파일 옵션에 -Werror가 포함되어 경고가 에러로 취급되었기 때문에 발생합니다.

해결책은 GTK의 내장 함수인 gtk_widget_translate_coordinates를 사용하여 X11 종속적인 코드를 제거하는 것입니다. 이 방법은 코드를 간결하게 만들고 Wayland 환경에서도 문제없이 동작하게 해줍니다.


## 문제 원인

GTK4는 특정 윈도우 시스템(X11, Wayland 등)에 종속되지 않는 것을 목표로 합니다. 이 때문에 gdk_x11_display_get_xdisplay gdk_x11_surface_get_xid처럼 X11의 내부적인 Display Window ID에 직접 접근하는 함수들의 사용을 막고 있습니다.

기존 코드의 목적은 위젯의 지역 좌표를 화면 전체의 전역 좌표로 변환하는 것이었는데, 이 작업을 더 이상 X11 함수로 직접 처리해서는 안 됩니다.


## 해결 방안

nimf_gic_set_cursor_pos 함수를 다음과 같이 수정하여 GTK가 제공하는 백엔드 독립적인 방식으로 좌표를 변환할 수 있습니다.

수정 전 코드 (X11 종속)
static void nimf_gic_set_cursor_pos (GtkIMContext* context, GdkRectangle* area)
{
  NimfGic *gic = NIMF_GIC (context);

  GdkRectangle root_area = *area;

  if (gic->client_widget)
  {
    GtkNative *native = gtk_widget_get_native (gic->client_widget);  /* do not free */

    if (native)
    {
#ifdef GDK_WINDOWING_X11

      GdkSurface *surface = gtk_native_get_surface (native); /* do not free */
      GdkDisplay *display = gdk_surface_get_display (surface); /* do not free */

      if (GDK_IS_X11_DISPLAY (display))
      {
        Window          child;
        XWindowAttributes attr;
        Display        *xdisplay = gdk_x11_display_get_xdisplay (display);
        Window          xwin     = gdk_x11_surface_get_xid (surface);

        XGetWindowAttributes (xdisplay, xwin, &attr);

        if (area->x < 0 && area->y < 0)
          XTranslateCoordinates (xdisplay, xwin, attr.root, 0, attr.height,
                                 &root_area.x, &root_area.y, &child);
        else
          XTranslateCoordinates (xdisplay, xwin, attr.root, area->x, area->y,
                                 &root_area.x, &root_area.y, &child);
      }
#endif
    }
  }

  nimf_ic_set_cursor_pos (gic->ic, (const CRect*) &root_area);
}
수정 후 코드 (백엔드 독립)

X11 관련 코드를 모두 제거하고 gtk_widget_translate_coordinates를 사용합니다.

static void nimf_gic_set_cursor_pos (GtkIMContext* context, GdkRectangle* area)
{
  NimfGic *gic = NIMF_GIC (context);
  GdkRectangle root_area = *area;

  if (gic->client_widget)
  {
    // 위젯의 최상위 창(Toplevel window)을 가져옵니다.
    GtkWidget *toplevel = gtk_widget_get_ancestor (gic->client_widget, GTK_TYPE_WINDOW);

    if (toplevel)
    {
      double dest_x, dest_y;

      // client_widget의 좌표를 toplevel 창의 좌표로 변환합니다.
      gtk_widget_translate_coordinates (gic->client_widget,
                                        toplevel,
                                        (double) area->x,
                                        (double) area->y,
                                        &dest_x,
                                        &dest_y);

      // 변환된 좌표는 toplevel 창 내에서의 상대 좌표이므로,
      // toplevel 창의 위치를 더해주어 화면 전체의 절대 좌표를 구합니다.
      int win_x, win_y;
      GtkNative* native = gtk_widget_get_native (toplevel);
      GdkSurface* surface = gtk_native_get_surface (native);
      gdk_surface_get_root_coords (surface, 0, 0, &win_x, &win_y);
      
      root_area.x = win_x + (int) dest_x;
      root_area.y = win_y + (int) dest_y;
    }
  }

  nimf_ic_set_cursor_pos (gic->ic, (const CRect*) &root_area);
}

## 수정된 코드의 장점

  • 백엔드 독립성: 이 코드는 X11과 Wayland 모두에서 수정 없이 동일하게 동작합니다. ?+
  • 코드 간결성: 복잡한 #ifdef 전처리기와 Xlib 함수 호출이 사라지고 간결한 GTK API 호출로 대체됩니다.
  • 미래 호환성: GTK가 권장하는 최신 API를 사용하므로 앞으로의 GTK 버전에서도 안정적으로 작동할 가능성이 높습니다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47669 65
2894415 러빨러.. ㅋㅋ 나한테 개털리네 ㅋㅋ 나르시갤로그로 이동합니다. 23:12 1 0
2894414 별 잡다한 짓을 좀 관둘까 생각중임 ㅇㅇ(223.38) 23:06 3 0
2894413 개발일 때려치고 싶다 [1] 프갤러(182.217) 23:05 10 0
2894412 카톡 안드로이드 아이폰 윈도우 넷플릭스 스포티파이 멜론같은 발명도둑잡기(118.216) 23:02 5 0
2894411 러스트는 해외에서도 안 써요 ㅋㅋㅋ 나르시갤로그로 이동합니다. 23:01 3 0
2894410 하이텔 개오동 최고 최악 게임 발명도둑잡기(118.216) 22:59 6 0
2894406 누가 더 유명함 아리아나 그란데 호날두 디바(59.28) 22:43 4 0
2894402 러스트가 너무 뛰어난 언어이기 때문에 배우면 오히려 인생 망합니다. [1] 프갤러(110.8) 22:37 19 0
2894396 옥상달빛 발명도둑잡기(118.216) 22:29 6 0
2894393 카톡 쉴드치는 병신들이 어이없는점 [1] 밀우갤로그로 이동합니다. 22:25 19 0
2894392 이제 이재명 때문에 외식 안한다 중금속 발암물질 먹기 싫음 [2] ♥덩냥이♥갤로그로 이동합니다. 22:25 25 1
2894389 신념에 따라 180도 다르게 보일 내용 ㅇㅇ(121.168) 22:20 8 0
2894385 러스트는 단순히 실행성능이 좋은 언어가 아닙니다. [20] 프갤러(110.8) 22:13 51 0
2894383 러스트 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 22:03 15 0
2894378 나도 예전에는 로레벨과 효율성에 애정이 깊었는데 [2] ㅇㅇ(121.168) 21:23 43 0
2894376 그알에서 2번이나 제보를 요청했지만 방영 실패한 미제사건 발명도둑잡기(118.216) 21:19 15 0
2894374 앱개발자의 현실을 보여줌 [5] 프갤러(121.142) 21:17 128 13
2894371 코인 자동매매는 외주받을때마다 로직 천차만별이고 [1] ㅆㅇㅆ(124.216) 21:08 39 0
2894367 멘헤라 모모링..❤ ♥덩냥이♥갤로그로 이동합니다. 20:55 23 0
2894366 AI 갓파더 얀 르쿤의 충격 경고 "LLM은 막다른 길, AGI는 오지 [1] 발명도둑잡기(118.216) 20:53 19 0
2894365 나라가 니꺼냐? 망하든 말든 신경꺼 ㅋㅋ [2] 나르시갤로그로 이동합니다. 20:53 31 0
2894358 나라망하는데이유있냐??기득권들이부패해서그렇지ㅋㅋ 타이밍뒷.통수한방(1.213) 20:30 15 0
2894354 아이폰 구매자 중 20% 확률로 똥가루폰 받는거 아님? [1] 야옹아저씨갤로그로 이동합니다. 20:20 26 0
2894352 요번에 한국 여행 가는데 포항이나 가볼까? Kyle(103.21) 20:18 14 0
2894350 러스트 담론을 해체하다 나르시갤로그로 이동합니다. 20:15 17 0
2894348 Rust 틀딱들의 죄가 너무도 많습니다 나르시갤로그로 이동합니다. 20:14 18 0
2894339 삼성 디바이스 컴포지트 디바이스 랑 연결성 디바이스 V2 뭡니까? 넥도리아2025(220.74) 19:56 28 0
2894335 AI를 쓴다는게 AI가 주는 소스 그대로 쓰는게 아닌데 착각하네 [1] 프갤러(125.184) 19:52 40 0
2894334 c cpp 틀딱들의 죄가 많습니다. 프갤러(110.8) 19:49 22 0
2894332 웹 프론트 엔드는 사실 문법보다 어떻게 꾸미느냐가 더 중요해서 [1] ㅆㅇㅆ(124.216) 19:43 48 0
2894328 연휴에도 회사에서 연락오는 사람? [9] ㅇㅇ(211.235) 19:28 58 0
2894327 언어가 메모리 안전성 보장해주면 좋은거 아닌가요? [22] ㅇㅇ(121.168) 19:28 58 0
2894326 c cpp 대체되는거는 그냥 요즘 젊은이들이 틀딱어 싫어합니다. 프갤러(110.8) 19:26 26 0
2894325 C++ 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 19:23 27 0
2894324 나님.. 왤케 특별한걸깡..? ♥덩냥이♥갤로그로 이동합니다. 19:21 21 0
2894323 러스트는 특장점이 과장되고 과대성으로 홍보된 언어입니다. 나르시갤로그로 이동합니다. 19:17 20 0
2894322 러스트는 장기적으로도 c++ 대체 불가능해요. 입증 有 [5] 나르시갤로그로 이동합니다. 19:11 40 0
2894320 이력서 한줄도 작성 못함 ㅇㅇ(211.235) 19:10 19 0
2894318 ㅋㅅㅋ ♥덩냥이♥갤로그로 이동합니다. 19:07 19 0
2894311 러스트는 장기적으로 CPP 대체하겠지 이건 어쩔 수 없는 흐름임 [3] ㅆㅇㅆ(124.216) 19:00 39 0
2894310 엥? 프로그래머 중에 러스트를 한번도 안들어보신 분이 있다고요? 프갤러(110.8) 18:58 18 0
2894307 STAGE_DIR = 'stage' 이렇게 하지 말고, Rakefile이 나르시갤로그로 이동합니다. 18:54 13 0
2894304 나르시 저거 고도의 러빠임 [1] 프갤러(118.235) 18:50 24 0
2894301 러스트 사용하면 안 되는 이유: 버려지는 러스트 플젝틀 나르시갤로그로 이동합니다. 18:47 19 0
2894297 좋은 언어 나쁜 언어는 없습니다. 입증 有 [1] 나르시갤로그로 이동합니다. 18:36 19 0
2894296 좋은 언어라 함은 바로 얼마나 러스트와 유사한가가 척도이니라 프갤러(110.8) 18:32 14 0
2894295 좌파들 선동에 검찰 없대고 경찰도 없애야할 판 ㅋㅋ 나르시갤로그로 이동합니다. 18:31 11 0
2894294 러스트 빠는 이유가 대체 뭐야? 안전해서? 나르시갤로그로 이동합니다. 18:26 12 0
2894293 좋은 언어가 무엇인지가 [2] ㅇㅇ(121.168) 18:24 30 0
뉴스 곽튜브 살 더 빠졌네…“형 부부와 같은 시기 임신” 결혼 앞두고 ‘깜짝 근황’ 디시트렌드 10.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2