Diff for /np2/x11/gtk2/gtk_wrapper.c between versions 1.1 and 1.7

version 1.1, 2004/07/14 16:01:40 version 1.7, 2007/01/22 16:37:05
Line 1 Line 1
   /*      $Id$    */
   
 /*  /*
  * Copyright (c) 2002-2004 NONAKA Kimihiro   * Copyright (c) 2002-2004 NONAKA Kimihiro
  * All rights reserved.   * All rights reserved.
Line 10 Line 12
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. The name of the author may not be used to endorse or promote products  
  *    derived from this software without specific prior written permission.  
  *   *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Line 25 Line 25
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */   */
   
 #include "compiler.h"  #ifdef HAVE_CONFIG_H
   #include "config.h"
   #endif
   
 #include <errno.h>  #include <string.h>
 #include <stdio.h>  
 #include <stdlib.h>  
   
 #include "gtk2/xnp2.h"  #include "gtk2/xnp2.h"
   
 #include <gdk/gdkx.h>  #include <gdk/gdkx.h>
   
   extern int verbose;
   
 void  void
 gtk_scale_set_default_values(GtkScale *scale)  gtk_scale_set_default_values(GtkScale *scale)
Line 52  gdk_window_set_pointer(GdkWindow *w, gin Line 53  gdk_window_set_pointer(GdkWindow *w, gin
         Display *xdisplay;          Display *xdisplay;
         Window xwindow;          Window xwindow;
   
         if (w) {          g_return_if_fail(w != NULL);
                 xdisplay = GDK_WINDOW_XDISPLAY(w);  
                 xwindow = GDK_WINDOW_XWINDOW(w);          xdisplay = GDK_WINDOW_XDISPLAY(w);
                 XWarpPointer(xdisplay, None, xwindow, 0, 0, 0, 0, x, y);          xwindow = GDK_WINDOW_XWINDOW(w);
         }          XWarpPointer(xdisplay, None, xwindow, 0, 0, 0, 0, x, y);
 }  }
   
 int  gboolean
 is_32bpp(GdkWindow *w)  gdk_window_get_pixmap_format(GdkWindow *w, GdkVisual *visual, pixmap_format_t *fmtp)
 {  {
         Display *xdisplay;          Display *xdisplay;
         XPixmapFormatValues *format;          XPixmapFormatValues *format;
         int nbit = 0;  
         int count;          int count;
         int i;          int i;
   
         if (w == NULL)          g_return_val_if_fail(w != NULL, FALSE);
                 return 0;          g_return_val_if_fail(visual != NULL, FALSE);
           g_return_val_if_fail(fmtp != NULL, FALSE);
   
         xdisplay = GDK_WINDOW_XDISPLAY(w);          xdisplay = GDK_WINDOW_XDISPLAY(w);
         format = XListPixmapFormats(xdisplay, &count);          format = XListPixmapFormats(xdisplay, &count);
         if (format != 0) {          if (format) {
                 for (i = 0; i < count; i++) {                  for (i = 0; i < count; i++) {
                         if (format[i].depth != 24)                          if (visual->depth == format[i].depth) {
                                 continue;                                  fmtp->depth = format[i].depth;
                                   fmtp->bits_per_pixel = format[i].bits_per_pixel;
                         if (format[i].bits_per_pixel == 32) {                                  fmtp->scanline_pad = format[i].scanline_pad;
                                 nbit = 32;                                  XFree(format);
                         } else {                                  return TRUE;
                                 nbit = 24;  
                         }                          }
                         break;  
                 }                  }
                 XFree(format);                  XFree(format);
           }
           return FALSE;
   }
   
   #ifdef HAVE_XF86VIDMODE
   #include <X11/extensions/xf86vmode.h>
   
   static XF86VidModeModeInfo **modes = NULL;
   static int modeidx = -1;
   static XF86VidModeModeInfo *saved_modes;
   static XF86VidModeModeInfo orig_mode;
   static int view_x, view_y;
   static gint orig_x, orig_y;
   
   static inline Bool
   XF86VidModeGetModeInfo(Display *d, int s, XF86VidModeModeInfo *info)
   {
           XF86VidModeModeLine *line;
   
           memset(info, 0, sizeof(*info));
           line = (void *)((char *)info + sizeof(info->dotclock));
   
           return XF86VidModeGetModeLine(d, s, (int *)&info->dotclock, line);
   }
   #endif
   
   gboolean
   gtk_window_init_fullscreen(GtkWidget *widget)
   {
           gboolean ret = FALSE;
   #ifdef HAVE_XF86VIDMODE
           GtkWindow *window;
           GdkWindow *w;
           Display *xdisplay;
           XF86VidModeModeInfo mode;
           int xscreen;
           int event_base, error_base;
           int major_ver, minor_ver;
           int nmodes;
           int i;
           Bool rv;
   
           g_return_val_if_fail(widget != NULL, FALSE);
   
           window = GTK_WINDOW(widget);
           w = widget->window;
           xdisplay = GDK_WINDOW_XDISPLAY(w);
           xscreen = XDefaultScreen(xdisplay);
   
           XLockDisplay(xdisplay);
   
           rv = XF86VidModeQueryExtension(xdisplay, &event_base, &error_base);
           if (!rv) {
                   goto out;
           }
   
           rv = XF86VidModeQueryVersion(xdisplay, &major_ver, &minor_ver);
           if (!rv) {
                   goto out;
           }
           if (verbose) {
                   printf("XF86VidMode Extension: ver.%d.%d detected\n",
                       major_ver, minor_ver);
           }
   
           rv = XF86VidModeGetModeInfo(xdisplay, xscreen, &mode);
           if (rv) {
                   if ((mode.hdisplay == 640) && (mode.vdisplay == 480)) {
                           orig_mode = mode;
                           saved_modes = &orig_mode;
                           modes = &saved_modes;
                           modeidx = 0;
                           ret = TRUE;
                           goto out;
                   }
           }
   
           rv = XF86VidModeGetAllModeLines(xdisplay, xscreen, &nmodes, &modes);
           if (!rv) {
                   goto out;
           }
           if (verbose) {
                   printf("XF86VidMode Extension: %d modess\n", nmodes);
           }
   
           for (i = 0; i < nmodes; i++) {
                   if (verbose) {
                           printf("XF86VidMode Extension: %d: %dx%d\n", i,
                               modes[i]->hdisplay, modes[i]->vdisplay);
                   }
   
                   rv = XF86VidModeValidateModeLine(xdisplay, xscreen, modes[i]);
                   if (rv) {
                           if ((modes[i]->hdisplay == 640)
                            && (modes[i]->vdisplay == 480)) {
                                   rv = XF86VidModeGetModeInfo(xdisplay, xscreen,
                                       &orig_mode);
                                   if (rv) {
                                           if (verbose) {
                                                   printf("found\n");
                                           }
                                           modeidx = i;
                                           ret = TRUE;
                                           break;
                                   }
                           }
                   }
           }
           if (!ret) {
                   XFree(modes);
                   modes = NULL;
           }
   
   out:
           XUnlockDisplay(xdisplay);
   #endif  /* HAVE_XF86VIDMODE */
   
           return ret;
   }
   
   void
   gtk_window_fullscreen_mode(GtkWidget *widget)
   {
   #ifdef HAVE_XF86VIDMODE
           GtkWindow *window;
           GdkWindow *w;
           Display *xdisplay;
           int xscreen;
   
           g_return_if_fail(widget != NULL);
   
           if (modeidx < 0)
                   return;
   
           window = GTK_WINDOW(widget);
           w = widget->window;
           xdisplay = GDK_WINDOW_XDISPLAY(w);
           xscreen = XDefaultScreen(xdisplay);
   
                 if (i == count) {          XLockDisplay(xdisplay);
                         fprintf(stderr, "24bpp depth not support?\n");  
                         return 0;          XF86VidModeLockModeSwitch(xdisplay, xscreen, True);
                 }          XF86VidModeGetViewPort(xdisplay, xscreen, &view_x, &view_y);
         } else {          gdk_window_get_origin(w, &orig_x, &orig_y);
                 fprintf(stderr, "Can't get PixmapFormats.\n");          gtk_window_move(window, 0, 0);
                 return 0;          XF86VidModeSwitchToMode(xdisplay, xscreen, modes[modeidx]);
   
           XUnlockDisplay(xdisplay);
   #endif  /* HAVE_XF86VIDMODE */
   }
   
   void
   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);
   
           if ((orig_mode.hdisplay == 0) || (orig_mode.vdisplay == 0))
                   return;
   
           window = GTK_WINDOW(widget);
           w = widget->window;
           xdisplay = GDK_WINDOW_XDISPLAY(w);
           xscreen = XDefaultScreen(xdisplay);
   
           XLockDisplay(xdisplay);
   
           rv = XF86VidModeGetModeInfo(xdisplay, xscreen, &mode);
           if (rv) {
                   if ((orig_mode.hdisplay != mode.hdisplay)
                    || (orig_mode.vdisplay != mode.vdisplay)) {
                           XF86VidModeSwitchToMode(xdisplay, xscreen, &orig_mode);
                           XF86VidModeLockModeSwitch(xdisplay, xscreen, False);
                   }
                   if ((view_x != 0) || (view_y != 0)) {
                           XF86VidModeSetViewPort(xdisplay,xscreen,view_x,view_y);
                   }
         }          }
         return (nbit == 32) ? 1 : 0;  
           gtk_window_move(window, orig_x, orig_y);
   
           XUnlockDisplay(xdisplay);
   #endif  /* HAVE_XF86VIDMODE */
 }  }

Removed from v.1.1  
changed lines
  Added in v.1.7


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