| version 1.5, 2007/01/20 22:33:06 | version 1.13, 2011/01/15 16:48:39 | 
| 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 <signal.h> | 
 |  |  | 
 |  | #include <X11/Xlib.h> | 
 |  | #include <X11/Xatom.h> | 
 |  |  | 
 | #include "gtk2/xnp2.h" | #include "gtk2/xnp2.h" | 
 |  |  | 
 | #include <gdk/gdkx.h> | #include <gdk/gdkx.h> | 
 |  |  | 
 | extern int verbose; | extern int verbose; | 
 |  | extern volatile sig_atomic_t np2running; | 
 |  |  | 
 |  | #ifdef DEBUG | 
 |  | #ifndef VERBOSE | 
 |  | #define VERBOSE(s)      if (verbose) g_printerr s | 
 |  | #endif  /* !VERBOSE */ | 
 |  | #else   /* !DEBUG */ | 
 |  | #define VERBOSE(s) | 
 |  | #endif  /* DEBUG */ | 
 |  |  | 
 | 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 105  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; | 
 |  | static int is_fullscreen; | 
 |  |  | 
 | #ifdef HAVE_XF86VIDMODE | #ifdef HAVE_XF86VIDMODE | 
 | #include <X11/extensions/xf86vmode.h> | #include <X11/extensions/xf86vmode.h> | 
 |  |  | 
| Line 96  static XF86VidModeModeInfo **modes = NUL | Line 120  static XF86VidModeModeInfo **modes = NUL | 
 | static int modeidx = -1; | static int modeidx = -1; | 
 | static XF86VidModeModeInfo *saved_modes; | static XF86VidModeModeInfo *saved_modes; | 
 | static XF86VidModeModeInfo orig_mode; | static XF86VidModeModeInfo orig_mode; | 
 |  | static Display *fs_xdisplay; | 
 |  | static int fs_xscreen; | 
 | static int view_x, view_y; | static int view_x, view_y; | 
 | static gint orig_x, orig_y; | static gint orig_x, orig_y; | 
 |  |  | 
| Line 109  XF86VidModeGetModeInfo(Display *d, int s | Line 135  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; | 
 | XF86VidModeModeInfo mode; |  | 
 | int xscreen; | int xscreen; | 
 |  | XF86VidModeModeInfo mode; | 
 | int event_base, error_base; | int event_base, error_base; | 
 | int major_ver, minor_ver; | int major_ver, minor_ver; | 
 | int nmodes; | int nmodes; | 
| Line 145  gtk_window_init_fullscreen(GtkWidget *wi | Line 169  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 166  gtk_window_init_fullscreen(GtkWidget *wi | Line 188  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); |  | 
| } |  | 
 |  |  | 
| rv = XF86VidModeValidateModeLine(xdisplay, xscreen, modes[i]); | if ((modes[i]->hdisplay == 640) | 
| if (rv) { | && (modes[i]->vdisplay == 480)) { | 
| if ((modes[i]->hdisplay == 640) | rv = XF86VidModeGetModeInfo(xdisplay, xscreen, | 
| && (modes[i]->vdisplay == 480)) { | &orig_mode); | 
| rv = XF86VidModeGetModeInfo(xdisplay, xscreen, | if (rv) { | 
| &orig_mode); | VERBOSE(("found\n")); | 
| if (rv) { | modeidx = i; | 
| if (verbose) { | ret = TRUE; | 
| printf("found\n"); | break; | 
| } |  | 
| modeidx = i; |  | 
| ret = TRUE; |  | 
| break; |  | 
| } |  | 
 | } | } | 
 | } | } | 
 | } | } | 
| XFree(modes); |  | 
|  | if (ret) { | 
|  | fs_xdisplay = xdisplay; | 
|  | fs_xscreen = xscreen; | 
|  | } else { | 
|  | XFree(modes); | 
|  | modes = NULL; | 
|  | } | 
 |  |  | 
 | 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) { | 
 |  | VERBOSE(("Using XF86VidMode extension\n")); | 
 |  | } else if (use_netwm) { | 
 |  | VERBOSE(("Using _NET_WM_STATE_FULLSCREEN\n")); | 
 |  | } else { | 
 |  | VERBOSE(("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; |  | 
 | GdkWindow *w; |  | 
 | Display *xdisplay; |  | 
 | int xscreen; |  | 
 |  |  | 
 | g_return_if_fail(widget != NULL); | g_return_if_fail(widget != NULL); | 
 |  | g_return_if_fail(widget->window != NULL); | 
 |  |  | 
| if (modeidx < 0) | #ifdef HAVE_XF86VIDMODE | 
| return; | if (use_xvid && modes != NULL && modeidx >= 0) { | 
|  | GtkWindow *window = GTK_WINDOW(widget); | 
| window = GTK_WINDOW(widget); |  | 
| w = widget->window; |  | 
| xdisplay = GDK_WINDOW_XDISPLAY(w); |  | 
| xscreen = XDefaultScreen(xdisplay); |  | 
 |  |  | 
| XLockDisplay(xdisplay); | XLockDisplay(fs_xdisplay); | 
 |  |  | 
| XF86VidModeLockModeSwitch(xdisplay, xscreen, True); | XF86VidModeLockModeSwitch(fs_xdisplay, fs_xscreen, True); | 
| XF86VidModeGetViewPort(xdisplay, xscreen, &view_x, &view_y); | XF86VidModeGetViewPort(fs_xdisplay,fs_xscreen,&view_x,&view_y); | 
| gdk_window_get_origin(w, &orig_x, &orig_y); | gdk_window_get_origin(widget->window, &orig_x, &orig_y); | 
| gtk_window_move(window, 0, 0); | if (window) | 
| XF86VidModeSwitchToMode(xdisplay, xscreen, modes[modeidx]); | gtk_window_move(window, 0, 0); | 
|  | XF86VidModeSwitchToMode(fs_xdisplay,fs_xscreen,modes[modeidx]); | 
 |  |  | 
| XUnlockDisplay(xdisplay); | XUnlockDisplay(fs_xdisplay); | 
|  | } | 
 | #endif  /* HAVE_XF86VIDMODE */ | #endif  /* HAVE_XF86VIDMODE */ | 
 |  | if (use_netwm) { | 
 |  | gtk_window_fullscreen(GTK_WINDOW(widget)); | 
 |  | } | 
 |  | is_fullscreen = 1; | 
 | } | } | 
 |  |  | 
 | void | void | 
 | gtk_window_restore_mode(GtkWidget *widget) | gtk_window_restore_mode(GtkWidget *widget) | 
 | { | { | 
 | #ifdef HAVE_XF86VIDMODE |  | 
 | GtkWindow *window; |  | 
 | GdkWindow *w; |  | 
 | Display *xdisplay; |  | 
 | int xscreen; |  | 
 | 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)) | if (!is_fullscreen) | 
 | return; | return; | 
 |  |  | 
| window = GTK_WINDOW(widget); | #ifdef HAVE_XF86VIDMODE | 
| w = widget->window; | if (use_xvid) { | 
| xdisplay = GDK_WINDOW_XDISPLAY(w); | XF86VidModeModeInfo mode; | 
| xscreen = XDefaultScreen(xdisplay); | int rv; | 
 |  |  | 
| XLockDisplay(xdisplay); | if ((orig_mode.hdisplay == 0) || (orig_mode.vdisplay == 0)) | 
|  | return; | 
 |  |  | 
| rv = XF86VidModeGetModeInfo(xdisplay, xscreen, &mode); | XLockDisplay(fs_xdisplay); | 
| if (rv) { |  | 
| if ((orig_mode.hdisplay != mode.hdisplay) | rv = XF86VidModeGetModeInfo(fs_xdisplay, fs_xscreen, &mode); | 
| || (orig_mode.vdisplay != mode.vdisplay)) { | if (rv) { | 
| XF86VidModeSwitchToMode(xdisplay, xscreen, &orig_mode); | if ((orig_mode.hdisplay != mode.hdisplay) | 
| XF86VidModeLockModeSwitch(xdisplay, xscreen, False); | || (orig_mode.vdisplay != mode.vdisplay)) { | 
| } | XF86VidModeSwitchToMode(fs_xdisplay, fs_xscreen, | 
| if ((view_x != 0) || (view_y != 0)) { | &orig_mode); | 
| XF86VidModeSetViewPort(xdisplay,xscreen,view_x,view_y); | XF86VidModeLockModeSwitch(fs_xdisplay, | 
|  | fs_xscreen, False); | 
|  | } | 
|  | if ((view_x != 0) || (view_y != 0)) { | 
|  | XF86VidModeSetViewPort(fs_xdisplay, fs_xscreen, | 
|  | view_x, view_y); | 
|  | } | 
 | } | } | 
 | } |  | 
 |  |  | 
| gtk_window_move(window, orig_x, orig_y); | if (np2running) { | 
|  | gtk_window_move(GTK_WINDOW(widget), orig_x, orig_y); | 
|  | } | 
 |  |  | 
| XUnlockDisplay(xdisplay); | XUnlockDisplay(fs_xdisplay); | 
|  | } | 
 | #endif  /* HAVE_XF86VIDMODE */ | #endif  /* HAVE_XF86VIDMODE */ | 
 |  | if (use_netwm) { | 
 |  | gtk_window_unfullscreen(GTK_WINDOW(widget)); | 
 |  | } | 
 | } | } |