Diff for /np2/x11/gtk2/gtk_wrapper.c between versions 1.4 and 1.15

version 1.4, 2007/01/12 19:09:58 version 1.15, 2012/01/23 05:00:13
Line 1 Line 1
 /*      $Id$    */  
   
 /*  /*
  * Copyright (c) 2002-2004 NONAKA Kimihiro   * Copyright (c) 2002-2004 NONAKA Kimihiro
  * All rights reserved.   * All rights reserved.
Line 25 Line 23
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */   */
   
   #ifdef HAVE_CONFIG_H
   #include "config.h"
   #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>
   
 #ifdef HAVE_XF86VIDMODE  
 #include <X11/extensions/xf86vmode.h>  
 #endif  
   
 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 103  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>
   
 static XF86VidModeModeInfo **modes = NULL;  static XF86VidModeModeInfo **modes = NULL;
 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 107  XF86VidModeGetModeInfo(Display *d, int s Line 133  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;  
         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 127  gtk_window_init_fullscreen(GtkWidget *wi Line 150  gtk_window_init_fullscreen(GtkWidget *wi
   
         g_return_val_if_fail(widget != NULL, FALSE);          g_return_val_if_fail(widget != NULL, FALSE);
   
         window = GTK_WINDOW(widget);  
         w = widget->window;          w = widget->window;
         xdisplay = GDK_WINDOW_XDISPLAY(w);          xdisplay = GDK_WINDOW_XDISPLAY(w);
         xscreen = XDefaultScreen(xdisplay);          xscreen = XDefaultScreen(xdisplay);
Line 143  gtk_window_init_fullscreen(GtkWidget *wi Line 165  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 164  gtk_window_init_fullscreen(GtkWidget *wi Line 184  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;
           unsigned 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));
           }
 }  }

Removed from v.1.4  
changed lines
  Added in v.1.15


RetroPC.NET-CVS <cvs@retropc.net>