Diff for /np2/x11/gtk2/gtk_wrapper.c between versions 1.8 and 1.9

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));
           }
 }  }

Removed from v.1.8  
changed lines
  Added in v.1.9


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