[완료] GTK 윈도우를 움지이지 못하게 할 순 없을까요?

liveeasily의 이미지

안녕하세요?

GTK 로 응용을 만들고 있습니다.

현재 GTK 로 만들어진 윈도우의 위치가 바뀌지 않길 바라고 있습니다.

gtk_window_set_resizable 은 크기만 고정 시켜주고, 움직이지 못하게는 안 되더군요.

혹시 윈도우가 움직이면 발생하는 시그널이 있으면 콜백함수로 묶어두려고 했더니,

관련 시그널이 없는듯 하군요.

(못찾은 거라면.. 수면 부족인듯 ^^;;;;; api 문서를 몇번을 봣는지 모릅니다 ㅜㅜ)

이와 관련된 조언 부탁드리겠습니다...

linuxs의 이미지

popup으로 하심 안되나요
popup으로 하면 타이틀바가 안나오는 단점이 있을거에요..

꿈은 이루어진다.

꿈은 이루어진다.

liveeasily의 이미지

타이틀 바 없는 것 까지는 괜찮은데 보더가 없으니 보기가 좀 안 좋더라구요 ^^

혹시 popup 의 보더 줄 수 있는 방법 있나요? ^^;;; 이것도 찾아 봤지만.. 안될 것 같더군요

ganadist의 이미지

1. gtk_window_set_decorated () 를 써서 마우스로 움직일 만한 여지를 주지 않는다.
2. window 타입을 GDK_WINDOW_TYPE_HINT_SPLASHSCREEN 로 설정한다.

이정도면 되지 않을까요?

----
Do not feed troll!

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

liveeasily의 이미지

1. gtk_window_set_decorated () 를 false 로 하면 우선 타이틀 바와, 보더가 사라집니다.. 이것이 마우스로 움직일만한 여지를 주지 않는다고 하신거겠죠?

2. 그리고 말씀대로 splashscreen 으로 설정 했지만. POPUP 처럼 생긴 윈도우로 생성이 되더군요...

음.. 저는 윈도우의 테두리가 꼭 있었으면 합니다...

 
....
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(window, FALSE);
gtk_window_set_type_hint(window, GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
....

bushi의 이미지

타이틀바/테두리가 없을 때 참고.
window 위치조정은 [Alt] + [Btn1]
window 크기조정은 [Alt] + [Btn3]

OTL

keedi의 이미지

창의 움직임은 윈도우 매니저쪽도 제어할 수 있을텐데요.
아무리 창을 움직이지 못한다고 해도 윗분이 말씀하신 것 처럼
윈도우 매니저가 제공하는 기능이니까 결국 움직일 수 있겠지요.

그렇다면 차라리 gtk_window_move()를 이용해서
계속 지정한 위치로 설정하는 함수를 일정주기로 호출하게
하는것은 어떨까요. :-)

gtk_window_get_position()으로 위치를 파악한다음 실행할 수도 있겠지만
gtk_window_get_position() 의 설명에 보니까 윈도우 매니저와
gravity의 문제로 반환하는 위치 값이 언제나 똑같을 수는 없기 때문에
이렇게 윈도우의 위치를 설정할 경우 약간씩 움직일 수 도 있다는군요.

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

keedi의 이미지

찾아보니 다음과 같은 이야기가 있네요.
읽어보시면 도움되실듯 합니다. :-)

* 결론은,
- 구현하지 않는다.
* 이유는
- 윈도우 매니저나 유저와 싸우게 된다.
- 무한루프가 될 수 있다.
* 방법은,
- override redirect window!

Quote:

/* Position Constraints
* ====================
*
* POS_CENTER_ALWAYS is conceptually a constraint rather than
* a default. The other POS_ values are used only when the
* window is shown, not after that.
*
* However, we can't implement a position constraint as
* "anytime the window size changes, center the window"
* because this may well end up fighting the WM or user. In
* fact it gets in an infinite loop with at least one WM.
*
* Basically, applications are in no way in a position to
* constrain the position of a window, with one exception:
* override redirect windows. (Really the intended purpose
* of CENTER_ALWAYS anyhow, I would think.)
*
* So the way we implement this "constraint" is to say that when WE
* cause a move or resize, i.e. we make a configure request changing
* window size, we recompute the CENTER_ALWAYS position to reflect
* the new window size, and include it in our request. Also, if we
* just turned on CENTER_ALWAYS we snap to center with a new
* request. Otherwise, if we are just NOTIFIED of a move or resize
* done by someone else e.g. the window manager, we do NOT send a
* new configure request.
*
* For override redirect windows, this works fine; all window
* sizes are from our configure requests. For managed windows,
* it is at least semi-sane, though who knows what the
* app author is thinking.
*/

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

liveeasily의 이미지

이 부분에 있어서 윈도우 매니저가 관련 될 수 있다는 것을 알게 되었습니다 :)

마잇의 이미지

이유가 어찌 되었든 유저의 입장으로서 그런식으로 구현하는 것은 짜증날 소지가 많아서 말리고 싶습니다.

그놈(gtk) 프로그램 쓰면서 창 자체가 고정되는 프로그램 본 적이 없습니다. 창이 반드시 고정 되어야 하는 이유가 있을까요? 가급적 일관성을 유지하는 것을 좋아하는 편이라 그런 구현은 말리고 싶네요.

--
마잇


--
마잇

keedi의 이미지

음 저기 설명에도 나오지만 CENTER ALWAYS 같은 경우가 그런 경우일 것 같군요.
대부분의 경우 불편하지만 고정되는 프로그램을 본적이 없는 것은 아무래도
윈도우 매니저가 분리되어 있는 특색때문에 그럴 것 같은데 정말 가끔씩은
상황에 따라 그런 프로그램이 필요할 수도 있을 것 같습니다~ :-)

예를 들어 창 몇개를 화면 가득 채워 마치 컴퓨터같지 않게 만들어놓고
기능을 제공하는 프로그램일 수도 있구요(물론 이런경우 데코레이션도 다 빼겠지만...)
박물관이나 공중전화에 있는 프로그램을 GTK로 짰는데 사용자가 응용창을 막 움직이면
좀 그렇잖아요? 특정한 상황에 딱 맞춘다거나와 같이 필요할 수도 있지 않겠나 하네요.

그리고 만약에 설득할 수 없는 중요한 고객이 원한다면...
해야죠 뭐. :-)

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

liveeasily의 이미지

우선 조언 해주신 분들께 진심으로 감사드립니다^^;

지금 현재 임베디드 보드에서 실행되는 응용 프로그램을 만들고 있습니다.

이것이 가장 문제 인거 같습니다.

matchbox 라는 window manager 에서는 응용 프로그램의 창 제어가 되질 않았습니다.

무조건 전체창으로만 생성이 되더군요... window manager 때문이라는 결론을 내리게 되었습니다.

그래서 blackbox 로 window manager 를 바꾸게 되었습니다.

그랬더니 창 크기 제어가 원하는 데로 되었습니다.

하지만 터치 스크린의 감도가 너무 민감한 것인지 살짝만 터치를 하여도, 창이 움직여 버립니다.

그래서 꼼수(?)를 생각하게 된 것이었습니다 ^^;

그렇다면 window manager 가 창을 움직이지 못하게.. 할 순 없을까요?

( 현재 임베디드 공모전에 참가중인 학생입니다. ^^;.. )

ganadist의 이미지

사용하시는 창 관리자가 다음 스펙을 지원하는지 확인하십시오.

http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#id2507474

그런다음 해당 window에 xatom을 설정하면 될겁니다.

지원하는 창 관리자가 없다면 직접 창관리자에 해당하는 것을 만들어야 할겁니다.

----
Do not feed troll!

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

liveeasily의 이미지

올 추석은 방콕 될것 같습니다 ㅜㅜ

liveeasily의 이미지

....
winMain = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (winMain, 240, 199);
gtk_window_set_resizable(GTK_WINDOW (winMain), FALSE);  // 크기, 무빙 금지
gtk_widget_show(winMain);
gdk_window_set_decorations(winMain->window, GDK_DECOR_BORDER); // 보더만 설정
...

은근히 gdk api 볼 것이 많네요.. ^^;;

그리고 gtk_widget_show를 해주기 전까지 GtkWidget 의 멤버변수 GdkWindow *window 가 인식을 못하더군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.