|
|
| version 1.8, 2007/01/24 14:09:32 | version 1.9, 2007/02/04 11:51:14 |
|---|---|
| Line 29 | Line 29 |
| #include "config.h" | #include "config.h" |
| #endif | #endif |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | #include <string.h> |
| #include <unistd.h> | |
| #include <X11/Xlib.h> | |
| #include <X11/Xatom.h> | |
| #include "gtk2/xnp2.h" | #include "gtk2/xnp2.h" |
| Line 37 | Line 43 |
| extern int verbose; | extern int verbose; |
| #ifndef VERBOSE | |
| #define VERBOSE(s) if (verbose) printf s | |
| #endif | |
| void | void |
| gtk_scale_set_default_values(GtkScale *scale) | gtk_scale_set_default_values(GtkScale *scale) |
| { | { |
| Line 89 gdk_window_get_pixmap_format(GdkWindow * | Line 99 gdk_window_get_pixmap_format(GdkWindow * |
| return FALSE; | return FALSE; |
| } | } |
| /* | |
| * Full screen support. | |
| */ | |
| extern int ignore_fullscreen_mode; | |
| static int use_xvid; | |
| static int use_netwm; | |
| #ifdef HAVE_XF86VIDMODE | #ifdef HAVE_XF86VIDMODE |
| #include <X11/extensions/xf86vmode.h> | #include <X11/extensions/xf86vmode.h> |
| Line 111 XF86VidModeGetModeInfo(Display *d, int s | Line 128 XF86VidModeGetModeInfo(Display *d, int s |
| return XF86VidModeGetModeLine(d, s, (int *)&info->dotclock, line); | return XF86VidModeGetModeLine(d, s, (int *)&info->dotclock, line); |
| } | } |
| #endif | |
| gboolean | static int |
| gtk_window_init_fullscreen(GtkWidget *widget) | check_xvid(GtkWidget *widget) |
| { | { |
| gboolean ret = FALSE; | gboolean ret = FALSE; |
| #ifdef HAVE_XF86VIDMODE | |
| GtkWindow *window; | GtkWindow *window; |
| GdkWindow *w; | GdkWindow *w; |
| Display *xdisplay; | Display *xdisplay; |
| Line 147 gtk_window_init_fullscreen(GtkWidget *wi | Line 162 gtk_window_init_fullscreen(GtkWidget *wi |
| if (!rv) { | if (!rv) { |
| goto out; | goto out; |
| } | } |
| if (verbose) { | VERBOSE(("XF86VidMode Extension: ver.%d.%d detected\n", |
| printf("XF86VidMode Extension: ver.%d.%d detected\n", | major_ver, minor_ver)); |
| major_ver, minor_ver); | |
| } | |
| rv = XF86VidModeGetModeInfo(xdisplay, xscreen, &mode); | rv = XF86VidModeGetModeInfo(xdisplay, xscreen, &mode); |
| if (rv) { | if (rv) { |
| Line 168 gtk_window_init_fullscreen(GtkWidget *wi | Line 181 gtk_window_init_fullscreen(GtkWidget *wi |
| if (!rv) { | if (!rv) { |
| goto out; | goto out; |
| } | } |
| if (verbose) { | VERBOSE(("XF86VidMode Extension: %d modes\n", nmodes)); |
| printf("XF86VidMode Extension: %d modess\n", nmodes); | |
| } | |
| for (i = 0; i < nmodes; i++) { | for (i = 0; i < nmodes; i++) { |
| if (verbose) { | VERBOSE(("XF86VidMode Extension: %d: %dx%d\n", i, |
| printf("XF86VidMode Extension: %d: %dx%d\n", i, | modes[i]->hdisplay, modes[i]->vdisplay)); |
| modes[i]->hdisplay, modes[i]->vdisplay); | |
| } | |
| if ((modes[i]->hdisplay == 640) | if ((modes[i]->hdisplay == 640) |
| && (modes[i]->vdisplay == 480)) { | && (modes[i]->vdisplay == 480)) { |
| rv = XF86VidModeGetModeInfo(xdisplay, xscreen, | rv = XF86VidModeGetModeInfo(xdisplay, xscreen, |
| &orig_mode); | &orig_mode); |
| if (rv) { | if (rv) { |
| if (verbose) { | VERBOSE(("found\n")); |
| printf("found\n"); | |
| } | |
| modeidx = i; | modeidx = i; |
| ret = TRUE; | ret = TRUE; |
| break; | break; |
| Line 203 gtk_window_init_fullscreen(GtkWidget *wi | Line 210 gtk_window_init_fullscreen(GtkWidget *wi |
| out: | out: |
| XUnlockDisplay(xdisplay); | XUnlockDisplay(xdisplay); |
| #endif /* HAVE_XF86VIDMODE */ | |
| return ret; | return ret; |
| } | } |
| #endif /* HAVE_XF86VIDMODE */ | |
| static int | |
| check_netwm(GtkWidget *widget) | |
| { | |
| Display *xdisplay; | |
| Window root_window; | |
| Atom _NET_SUPPORTED; | |
| Atom _NET_WM_STATE_FULLSCREEN; | |
| Atom type; | |
| int format; | |
| unsigned long nitems; | |
| unsigned long remain; | |
| unsigned char *prop; | |
| guint32 *data; | |
| int rv; | |
| long i; | |
| g_return_val_if_fail(widget != NULL, 0); | |
| xdisplay = GDK_WINDOW_XDISPLAY(widget->window); | |
| root_window = DefaultRootWindow(xdisplay); | |
| _NET_SUPPORTED = XInternAtom(xdisplay, "_NET_SUPPORTED", False); | |
| _NET_WM_STATE_FULLSCREEN = XInternAtom(xdisplay, | |
| "_NET_WM_STATE_FULLSCREEN", False); | |
| rv = XGetWindowProperty(xdisplay, root_window, _NET_SUPPORTED, | |
| 0, 65536 / sizeof(guint32), False, AnyPropertyType, | |
| &type, &format, &nitems, &remain, &prop); | |
| if (rv != Success) { | |
| return 0; | |
| } | |
| if (type != XA_ATOM) { | |
| return 0; | |
| } | |
| if (format != 32) { | |
| return 0; | |
| } | |
| rv = 0; | |
| data = (guint32 *)prop; | |
| for (i = 0; i < nitems; i++) { | |
| if (data[i] == _NET_WM_STATE_FULLSCREEN) { | |
| VERBOSE(("Support _NET_WM_STATE_FULLSCREEN\n")); | |
| rv = 1; | |
| break; | |
| } | |
| } | |
| XFree(prop); | |
| return rv; | |
| } | |
| int | |
| gtk_window_init_fullscreen(GtkWidget *widget) | |
| { | |
| #ifdef HAVE_XF86VIDMODE | |
| use_xvid = check_xvid(widget); | |
| #endif | |
| use_netwm = check_netwm(widget); | |
| if (use_xvid && (ignore_fullscreen_mode & 1)) { | |
| VERBOSE(("Support XF86VidMode extension, but disabled\n")); | |
| use_xvid = 0; | |
| } | |
| if (use_netwm && (ignore_fullscreen_mode & 2)) { | |
| VERBOSE(("Support _NET_WM_STATE_FULLSCREEN, but disabled\n")); | |
| use_netwm = 0; | |
| } | |
| if (verbose) { | |
| if (use_xvid) { | |
| printf("Using XF86VidMode extension\n"); | |
| } else if (use_netwm) { | |
| printf("Using _NET_WM_STATE_FULLSCREEN\n"); | |
| } else { | |
| printf("not supported\n"); | |
| } | |
| } | |
| return use_xvid; | |
| } | |
| void | void |
| gtk_window_fullscreen_mode(GtkWidget *widget) | gtk_window_fullscreen_mode(GtkWidget *widget) |
| { | { |
| #ifdef HAVE_XF86VIDMODE | |
| GtkWindow *window; | |
| g_return_if_fail(widget != NULL); | g_return_if_fail(widget != NULL); |
| g_return_if_fail(widget->window != NULL); | g_return_if_fail(widget->window != NULL); |
| if (modes == NULL || modeidx < 0) | #ifdef HAVE_XF86VIDMODE |
| return; | if (use_xvid && modes != NULL && modeidx >= 0) { |
| GtkWindow *window = GTK_WINDOW(widget); | |
| window = GTK_WINDOW(widget); | |
| g_return_if_fail(window != NULL); | |
| XLockDisplay(fs_xdisplay); | XLockDisplay(fs_xdisplay); |
| XF86VidModeLockModeSwitch(fs_xdisplay, fs_xscreen, True); | XF86VidModeLockModeSwitch(fs_xdisplay, fs_xscreen, True); |
| XF86VidModeGetViewPort(fs_xdisplay, fs_xscreen, &view_x, &view_y); | XF86VidModeGetViewPort(fs_xdisplay,fs_xscreen,&view_x,&view_y); |
| gdk_window_get_origin(widget->window, &orig_x, &orig_y); | gdk_window_get_origin(widget->window, &orig_x, &orig_y); |
| gtk_window_move(window, 0, 0); | if (window) |
| XF86VidModeSwitchToMode(fs_xdisplay, fs_xscreen, modes[modeidx]); | gtk_window_move(window, 0, 0); |
| XF86VidModeSwitchToMode(fs_xdisplay,fs_xscreen,modes[modeidx]); | |
| XUnlockDisplay(fs_xdisplay); | XUnlockDisplay(fs_xdisplay); |
| } else | |
| #endif /* HAVE_XF86VIDMODE */ | #endif /* HAVE_XF86VIDMODE */ |
| if (use_netwm) { | |
| gtk_window_fullscreen(GTK_WINDOW(widget)); | |
| } | |
| } | } |
| void | void |
| gtk_window_restore_mode(GtkWidget *widget) | gtk_window_restore_mode(GtkWidget *widget) |
| { | { |
| #ifdef HAVE_XF86VIDMODE | |
| GtkWindow *window; | |
| XF86VidModeModeInfo mode; | |
| int rv; | |
| g_return_if_fail(widget != NULL); | g_return_if_fail(widget != NULL); |
| if ((orig_mode.hdisplay == 0) || (orig_mode.vdisplay == 0)) | #ifdef HAVE_XF86VIDMODE |
| return; | if (use_xvid) { |
| GtkWindow *window; | |
| window = GTK_WINDOW(widget); | XF86VidModeModeInfo mode; |
| int rv; | |
| XLockDisplay(fs_xdisplay); | |
| if ((orig_mode.hdisplay == 0) || (orig_mode.vdisplay == 0)) | |
| rv = XF86VidModeGetModeInfo(fs_xdisplay, fs_xscreen, &mode); | return; |
| if (rv) { | |
| if ((orig_mode.hdisplay != mode.hdisplay) | window = GTK_WINDOW(widget); |
| || (orig_mode.vdisplay != mode.vdisplay)) { | |
| XF86VidModeSwitchToMode(fs_xdisplay, fs_xscreen, | XLockDisplay(fs_xdisplay); |
| &orig_mode); | |
| XF86VidModeLockModeSwitch(fs_xdisplay, fs_xscreen, | rv = XF86VidModeGetModeInfo(fs_xdisplay, fs_xscreen, &mode); |
| False); | if (rv) { |
| } | if ((orig_mode.hdisplay != mode.hdisplay) |
| if ((view_x != 0) || (view_y != 0)) { | || (orig_mode.vdisplay != mode.vdisplay)) { |
| XF86VidModeSetViewPort(fs_xdisplay, fs_xscreen, | XF86VidModeSwitchToMode(fs_xdisplay, fs_xscreen, |
| view_x, view_y); | &orig_mode); |
| XF86VidModeLockModeSwitch(fs_xdisplay, | |
| fs_xscreen, False); | |
| } | |
| if ((view_x != 0) || (view_y != 0)) { | |
| XF86VidModeSetViewPort(fs_xdisplay, fs_xscreen, | |
| view_x, view_y); | |
| } | |
| } | } |
| } | |
| if (window != NULL) { | if (window != NULL) { |
| gtk_window_move(window, orig_x, orig_y); | gtk_window_move(window, orig_x, orig_y); |
| } | } |
| XUnlockDisplay(fs_xdisplay); | XUnlockDisplay(fs_xdisplay); |
| } else | |
| #endif /* HAVE_XF86VIDMODE */ | #endif /* HAVE_XF86VIDMODE */ |
| if (use_netwm) { | |
| gtk_window_unfullscreen(GTK_WINDOW(widget)); | |
| } | |
| } | } |