디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.27 17:33:34
조회 30 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 센터해도 될 것 같이 비주얼 물오른 아이돌 멤버는? 운영자 25/09/22 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47485 65
2892546 'ㅎㅂ) 벗방 시작한 강 인 경 프갤러(183.109) 00:55 0 0
2892545 Ada 프로그래밍, 3.2 예약어 (reserved words) 나르시갤로그로 이동합니다. 00:49 2 0
2892544 Ada 프로그래밍, 3.1 식별자 (identifier) 나르시갤로그로 이동합니다. 00:48 4 0
2892543 근데 영업 전환이라는게 결국은 CTO로써 도태됐거나 그 이상의 기술이 ㅆㅇㅆ(124.216) 00:41 17 0
2892542 어딜가도 커리어 최종은 영업인게 맞냐? [3] 프갤러(125.128) 00:31 17 0
2892541 러스트 사용하는 이유 프갤러(110.8) 00:12 15 0
2892540 C++ 을 사용하는 이유. 프갤러(59.16) 00:12 14 0
2892539 주요 대기업 임원 다 합쳐도 몇천명 안되서 국내외 정부가 인사 관여 가능 발명도둑잡기(118.216) 00:07 14 0
2892537 아씨 MBC 불꽃놀이 유튜브 생방 안끝나서 계속 듣는데 [1] 발명도둑잡기(118.216) 09.27 14 0
2892536 카톡 업데이트 욕하는 애들 특징 [5] 야옹아저씨갤로그로 이동합니다. 09.27 50 6
2892535 c++ 왜쓰냐 [2] 프갤러(1.245) 09.27 30 0
2892534 노드VPN "블루투스 해킹 급증…스마트홈·자동차까지 위협" 발명도둑잡기(118.216) 09.27 11 0
2892533 aws 공부를 한다는게 뭔 말임? [1] 프갤러(220.93) 09.27 27 0
2892532 리액트를 하려다가도 안하게 되는게 프갤러(220.93) 09.27 13 0
2892531 음치를 일컫는 병명 발명도둑잡기(118.216) 09.27 8 0
2892530 친중극좌 이재명 때문에 관세폭탄 100% 환율 1410원 돌파 ♥냥덩이♥갤로그로 이동합니다. 09.27 17 0
2892529 진보당 청년 국회의원 손솔의 다짐과 포부 [3] 발명도둑잡기(118.216) 09.27 12 0
2892528 터미네이터3가 시리즈 중 최고임 [1] ♥냥덩이♥갤로그로 이동합니다. 09.27 16 0
2892527 핵전쟁 ♥냥덩이♥갤로그로 이동합니다. 09.27 15 0
2892526 매크로 키보드 자작하는 이유 발명도둑잡기(118.216) 09.27 12 0
2892525 아이폰폴드 펜지원 안하면 절대 안 사줌 ㅅㄱ [1] ♥냥덩이♥갤로그로 이동합니다. 09.27 18 0
2892524 저장용 [1] ♥냥덩이♥갤로그로 이동합니다. 09.27 11 0
2892523 어제 밤 12시, 트위터 라이브 발명도둑잡기(118.216) 09.27 21 0
2892522 야 아래 포폴 사이트 찾는놈아 내가 찾음 ㅇㅇ ㅆㅇㅆ(124.216) 09.27 20 0
2892521 전쟁 끝나고 영화관 없을 때 천막 쳐놓고 상영했는데 발명도둑잡기(118.216) 09.27 12 0
2892520 제 N장: C 언어 인터페이스 연동 나르시갤로그로 이동합니다. 09.27 10 0
2892519 Ada 저술, Cim을 Ada로 코딩, Nimf를 Ada로 코딩... 흠 나르시갤로그로 이동합니다. 09.27 13 0
2892518 누구땜에 또 갤... 난장판 됐네 그려 ㅠㅠ 나르시갤로그로 이동합니다. 09.27 15 0
2892517 코딩천재는 신체부터가 다르당 ♥냥덩이♥갤로그로 이동합니다. 09.27 23 0
2892516 포폴 웹사이트 만들려 하는데 이 템플릿 뭔지 아는사람??? [4] 프갤러(61.75) 09.27 41 0
2892515 ㅆㅇㅆ 도대체 뭘 알려준다는거냐? [1] 프갤러(210.217) 09.27 40 2
2892514 오늘의 영상 기획 실마리: 불꽃놀이 전체 선곡표 발명도둑잡기(118.216) 09.27 13 0
2892513 한국인이 체취 없는 이유 ♥냥덩이♥갤로그로 이동합니다. 09.27 18 0
2892511 병렬처리 디버깅 비법 알려준다. [1] ㅆㅇㅆ(124.216) 09.27 30 0
2892509 병렬처리에서 멈추는건 원인이 99퍼 락 경합임? [5] 프갤러(58.29) 09.27 42 0
2892508 구해조 나 좀 구해조 ♥냥덩이♥갤로그로 이동합니다. 09.27 13 0
2892507 나님 살짝쿵야 끙야 기운.. ♥냥덩이♥갤로그로 이동합니다. 09.27 13 0
2892504 파워 정상이 컬러가 자체적으로 안돌고 메인보드에서 돌림. 넥도리아(220.74) 09.27 12 0
2892503 파워 테스텨 하얀색은 1개만 연결하라던데... 넥도리아(220.74) 09.27 9 0
2892502 마키마씨의 발냄새 똥팬티냄새.. ♥냥덩이♥갤로그로 이동합니다. 09.27 22 0
2892501 요즘은 코딩보다 비트코인투자 영어공부중 [4] 초코냥갤로그로 이동합니다. 09.27 39 0
2892500 모기 때문에 오늘 5 시간밖에 못 잤더니 불꽃놀이구 뭐구 [1] 발명도둑잡기(118.216) 09.27 14 0
2892498 한국인이 핵폭탄 불꽃놀이 맞는 2가지 방법 [2] 발명도둑잡기(118.216) 09.27 19 0
2892497 인간이 문명을 이룬건 두 손의 정밀한 조작과 언어소통이 가능한 구강구조 ♥냥덩이♥갤로그로 이동합니다. 09.27 13 0
2892496 이게 항상 그래, 내가 평소에 뭘 쓴다 이런건 기억도 안돼 ㅆㅇㅆ(124.216) 09.27 27 0
2892495 근데 저 짝 갤 사건 사고 많아가지고 [2] 루도그담당(58.239) 09.27 40 0
2892494 이게 참 좋은 일을 했어도 나쁘게 기억 된다니까? 미짜 술맥여서 성폭행 [1] ㅆㅇㅆ(124.216) 09.27 26 0
2892493 오늘의 발명 실마리: 불꽃놀이나 스피커로 신호 전송하는 장치 발명도둑잡기(118.216) 09.27 14 0
2892492 9월26일 국정원 화재 중국신원확인 무력화 9월29일 중국인 무비자입국 ♥냥덩이♥갤로그로 이동합니다. 09.27 27 0
뉴스 “혼자 봐도 눈물 펑펑”…넷플릭스 켰다가 밤새 울게 만든 ‘견생’ 반려견 영화 5편 디시트렌드 09.27
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2