New file containing the abstracted keyboard driver. Most code taken from

2000-12-08  Alexander Larsson  <alla@lysator.liu.se>

	* gdk/linux-fb/gdkkeyboard-fb.c:
	New file containing the abstracted keyboard driver. Most code
	taken from gdkinput-ps2.c

	* gdk/linux-fb/gdkinput-ps2.c:
	Removed file.

	* gdk/linux-fb/Makefile.am:
	Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.

	* gdk/linux-fb/gdkcolor-fb.c:
	display->fb was renamed to display->fb_fd.

	* gdk/linux-fb/gdkcursor-fb.c:
	gdk_mouse_get_info -> gdk_fb_mouse_get_info

	* gdk/linux-fb/gdkinput.c:
	Moved gdk_input_init here from gdkinput-ps2.c

	* gdk/linux-fb/gdkmain-fb.c:
	display->fb was renamed to display->fb_fd.
	Now the tty and the console is opened here instead
	of in the keyboard driver. Also check GDK_VT to see what
	tty to open.
	Move gdk_beep () here from gdkinput-ps2.c
	gdk_mouse_get_info -> gdk_fb_mouse_get_info

	* gdk/linux-fb/gdkmouse-fb.c:
	Add header.
	gdk_mouse_get_info -> gdk_fb_mouse_get_info
	Return correct keyboard modifiers.
	GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy

	* gdk/linux-fb/gdkprivate-fb.h:
	Add tty and vt info to display.
	Add orignal modeinfo storage to display
	Update global functions

	* gdk/linux-fb/gdkwindow-fb.c:
	Added gdk_fb_window_find_focus().
	gdk_mouse_get_info -> gdk_fb_mouse_get_info
This commit is contained in:
Alexander Larsson 2000-12-08 12:38:48 +00:00 committed by Alexander Larsson
parent 73773718b0
commit 6d0c6b792e
17 changed files with 2030 additions and 882 deletions

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -1,3 +1,47 @@
2000-12-08 Alexander Larsson <alla@lysator.liu.se>
* gdk/linux-fb/gdkkeyboard-fb.c:
New file containing the abstracted keyboard driver. Most code
taken from gdkinput-ps2.c
* gdk/linux-fb/gdkinput-ps2.c:
Removed file.
* gdk/linux-fb/Makefile.am:
Added gdkkeyboard-fb.c, removed gdkinput-ps2.c.
* gdk/linux-fb/gdkcolor-fb.c:
display->fb was renamed to display->fb_fd.
* gdk/linux-fb/gdkcursor-fb.c:
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkinput.c:
Moved gdk_input_init here from gdkinput-ps2.c
* gdk/linux-fb/gdkmain-fb.c:
display->fb was renamed to display->fb_fd.
Now the tty and the console is opened here instead
of in the keyboard driver. Also check GDK_VT to see what
tty to open.
Move gdk_beep () here from gdkinput-ps2.c
gdk_mouse_get_info -> gdk_fb_mouse_get_info
* gdk/linux-fb/gdkmouse-fb.c:
Add header.
gdk_mouse_get_info -> gdk_fb_mouse_get_info
Return correct keyboard modifiers.
GDK_MOUSETYPE -> GDK_MOUSE_TYPE for consistancy
* gdk/linux-fb/gdkprivate-fb.h:
Add tty and vt info to display.
Add orignal modeinfo storage to display
Update global functions
* gdk/linux-fb/gdkwindow-fb.c:
Added gdk_fb_window_find_focus().
gdk_mouse_get_info -> gdk_fb_mouse_get_info
2000-12-07 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkkeys-x11.c (gdk_keymap_lookup_key): fix name of

View File

@ -49,7 +49,7 @@ libgdk_linux_fb_la_SOURCES = \
gdkwindow-fb.c \
gdkprivate-fb.h \
gdkinputprivate.h \
gdkinput-ps2.c \
gdkkeyboard-fb.c \
gdkmouse-fb.c \
gdkevents-fb.c \
gdkrender-fb.c \

View File

@ -155,7 +155,7 @@ gdk_colormap_new (GdkVisual *visual,
fbc.green = green;
fbc.blue = blue;
if (ioctl (fbd->fd, FBIOGETCMAP, &fbc))
if (ioctl (fbd->fb_fd, FBIOGETCMAP, &fbc))
g_error("ioctl(FBIOGETCMAP) failed");
for (i = 0; i < colormap->size; i++)
@ -351,7 +351,7 @@ gdk_colormap_change (GdkColormap *colormap,
colormap->colors[i].green +
colormap->colors[i].blue)/3;
}
ioctl (gdk_display->fd, FBIOPUTCMAP, &fbc);
ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc);
break;
case GDK_VISUAL_PSEUDO_COLOR:
@ -361,7 +361,7 @@ gdk_colormap_change (GdkColormap *colormap,
green[i] = colormap->colors[i].green;
blue[i] = colormap->colors[i].blue;
}
ioctl (gdk_display->fd, FBIOPUTCMAP, &fbc);
ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc);
break;
default:
@ -565,7 +565,7 @@ gdk_colormap_alloc1 (GdkColormap *colormap,
fbc.green = &green;
fbc.blue = &blue;
ioctl (gdk_display->fd, FBIOPUTCMAP, &fbc);
ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc);
ret->pixel = i;
colormap->colors[ret->pixel] = *ret;
@ -785,7 +785,7 @@ gdk_color_change (GdkColormap *colormap,
fbc.red = &color->red;
fbc.green = &color->green;
fbc.blue = &color->blue;
ioctl (gdk_display->fd, FBIOPUTCMAP, &fbc);
ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc);
break;
default:

View File

@ -517,6 +517,6 @@ gdk_fb_cursor_reset(void)
GdkWindow *win = gdk_window_at_pointer (NULL, NULL);
gint x, y;
gdk_mouse_get_info (&x, &y, NULL);
gdk_fb_mouse_get_info (&x, &y, NULL);
gdk_fb_cursor_move (x, y, win);
}

View File

@ -1,781 +0,0 @@
/* GDK - The GIMP Drawing Kit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <gdk/gdk.h>
#include <gdk/gdkinternals.h>
#include "gdkinputprivate.h"
#include "gdkkeysyms.h"
#include "gdkprivate-fb.h"
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <time.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <sys/vt.h>
#include <sys/time.h>
#include <sys/kd.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <linux/fb.h>
/* Two minutes */
#define BLANKING_TIMEOUT 120*1000
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
typedef struct {
gint fd, fd_tag, consfd;
int vtnum, prev_vtnum;
guint modifier_state;
gboolean caps_lock : 1;
} Keyboard;
static guint blanking_timer = 0;
static Keyboard * tty_keyboard_open(void);
static Keyboard *keyboard = NULL;
#ifndef VESA_NO_BLANKING
#define VESA_NO_BLANKING 0
#define VESA_VSYNC_SUSPEND 1
#define VESA_HSYNC_SUSPEND 2
#define VESA_POWERDOWN 3
#endif
#if 0
static gboolean
input_activity_timeout(gpointer p)
{
blanking_timer = 0;
ioctl(gdk_display->fd, FBIOBLANK, VESA_POWERDOWN);
return FALSE;
}
#endif
/* This is all very broken :( */
static void
input_activity (void)
{
#if 0
if (blanking_timer)
g_source_remove (blanking_timer);
else
gdk_fb_redraw_all ();
blanking_timer = g_timeout_add (BLANKING_TIMEOUT, input_activity_timeout, NULL);
#endif
}
void
gdk_input_init (void)
{
gdk_input_devices = g_list_append (NULL, gdk_core_pointer);
gdk_input_ignore_core = FALSE;
gdk_fb_mouse_open ();
}
GdkWindow *
gdk_window_find_focus (void)
{
if (_gdk_fb_keyboard_grab_window)
return _gdk_fb_keyboard_grab_window;
else if (GDK_WINDOW_P (gdk_parent_root)->children)
{
GList *item;
for (item = GDK_WINDOW_P (gdk_parent_root)->children; item; item = item->next)
{
GdkWindowObject *priv = item->data;
if (priv->mapped)
return item->data;
}
}
return gdk_parent_root;
}
/* Bogus implementation */
gboolean
gdk_keymap_get_entries_for_keycode (GdkKeymap *keymap,
guint hardware_keycode,
GdkKeymapKey **keys,
guint **keyvals,
gint *n_entries)
{
return FALSE;
}
static const guint trans_table[256][3] = {
/* 0x00 */
{0, 0, 0},
{GDK_Escape, 0, 0},
{'1', '!', 0},
{'2', '@', 0},
{'3', '#', 0},
{'4', '$', 0},
{'5', '%', 0},
{'6', '^', 0},
{'7', '&', 0},
{'8', '*', 0},
{'9', '(', 0},
{'0', ')', 0},
{'-', '_', 0},
{'=', '+', 0},
{GDK_BackSpace, 0, 0},
{GDK_Tab, 0, 0},
/* 0x10 */
{'q', 'Q', 0},
{'w', 'W', 0},
{'e', 'E', 0},
{'r', 'R', 0},
{'t', 'T', 0},
{'y', 'Y', 0},
{'u', 'U', 0},
{'i', 'I', 0},
{'o', 'O', 0},
{'p', 'P', 0},
{'[', '{', 0},
{']', '}', 0},
{GDK_Return, 0, 0},
{GDK_Control_L, 0, 0}, /* mod */
{'a', 'A', 0},
{'s', 'S', 0},
/* 0x20 */
{'d', 'D', 0},
{'f', 'F', 0},
{'g', 'G', 0},
{'h', 'H', 0},
{'j', 'J', 0},
{'k', 'K', 0},
{'l', 'L', 0},
{';', ':', 0},
{'\'', '"', 0},
{'`', '~', 0},
{GDK_Shift_L, 0, 0}, /* mod */
{'\\', 0, 0},
{'z', 0, 0},
{'x', 0, 0},
{'c', 0, 0},
{'v', 'V', 0},
/* 0x30 */
{'b', 'B', 0},
{'n', 'N', 0},
{'m', 'M', 0},
{',', 0, 0},
{'.', 0, 0},
{'/', 0, 0},
{GDK_Shift_R, 0, 0}, /* mod */
{GDK_KP_Multiply, 0, 0},
{0, 0, 0},
{GDK_space, 0, 0},
{0, 0, 0},
{GDK_F1, 0, 0},
{GDK_F2, 0, 0},
{GDK_F3, 0, 0},
{GDK_F4, 0, 0},
{GDK_F5, 0, 0},
/* 0x40 */
{GDK_F6, 0, 0},
{GDK_F7, 0, 0},
{GDK_F8, 0, 0},
{GDK_F9, 0, 0},
{GDK_F10, 0, 0},
{0, 0, 0},
{0, 0, 0},
{'7', 0, 0},
{'8', 0, 0},
{'9', 0, 0},
{'-', 0, 0},
{'4', 0, 0},
{'5', 0, 0},
{'6', 0, 0},
{'+', 0, 0},
{'1', 0, 0},
/* 0x50 */
{'2', 0, 0},
{'3', 0, 0},
{'0', 0, 0},
{'.', 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{GDK_F11, 0, 0},
{GDK_F12, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0x60 */
{GDK_Return, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0x70 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0x80 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0x90 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0xA0 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0xB0 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0xC0 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{GDK_Up, 0, 0},
{0, 0, 0},
{0, 0, 0},
{GDK_Left, 0, 0},
{0, 0, 0},
{GDK_Right, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0xD0 */
{GDK_Down, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0xE0 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
/* 0xF0 */
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
};
#define TRANS_TABLE_SIZE (sizeof(trans_table)/sizeof(trans_table[0]))
static gboolean
handle_mediumraw_keyboard_input (GIOChannel *gioc,
GIOCondition cond,
gpointer data)
{
guchar buf[128];
int i, n;
Keyboard *k = data;
guint32 now;
n = read (k->fd, buf, sizeof(buf));
if (n <= 0)
g_error("Nothing from keyboard!");
/* Now turn this into a keyboard event */
now = gdk_fb_get_time ();
for (i = 0; i < n; i++)
{
guchar keycode;
gboolean key_up;
GdkEvent *event;
GdkWindow *win;
char dummy[2];
int mod;
guint keyval;
keycode = buf[i] & 0x7F;
key_up = buf[i] & 0x80;
if (keycode > TRANS_TABLE_SIZE)
{
g_warning ("Unknown keycode\n");
continue;
}
if ( (keycode == 0x1D) /* left Ctrl */
|| (keycode == 0x9D) /* right Ctrl */
|| (keycode == 0x38) /* left Alt */
|| (keycode == 0xB8) /* right Alt */
|| (keycode == 0x2A) /* left Shift */
|| (keycode == 0x36) /* right Shift */)
{
switch (keycode)
{
case 0x1D: /* Left Ctrl */
case 0x9D: /* Right Ctrl */
if (key_up)
k->modifier_state &= ~GDK_CONTROL_MASK;
else
k->modifier_state |= GDK_CONTROL_MASK;
break;
case 0x38: /* Left Alt */
case 0xB8: /* Right Alt */
if (key_up)
k->modifier_state &= ~GDK_MOD1_MASK;
else
k->modifier_state |= GDK_MOD1_MASK;
break;
case 0x2A: /* Left Shift */
case 0x36: /* Right Shift */
if (key_up)
k->modifier_state &= ~GDK_SHIFT_MASK;
else
k->modifier_state |= GDK_SHIFT_MASK;
break;
}
continue; /* Don't generate events for modifiers */
}
if (keycode == 0x3A /* Caps lock */)
{
if (!key_up)
k->caps_lock = !k->caps_lock;
ioctl (k->fd, KDSETLED, k->caps_lock ? LED_CAP : 0);
continue;
}
if (trans_table[keycode][0] >= GDK_F1 &&
trans_table[keycode][0] <= GDK_F35 &&
(k->modifier_state & GDK_MOD1_MASK))
{
if (key_up) /* Only switch on release */
{
gint vtnum = trans_table[keycode][0] - GDK_F1 + 1;
/* Do the whole funky VT switch thing */
ioctl (k->consfd, VT_ACTIVATE, vtnum);
ioctl (k->consfd, VT_WAITACTIVE, k->vtnum);
gdk_fb_redraw_all ();
}
continue;
}
keyval = 0;
mod = 0;
if (k->modifier_state & GDK_CONTROL_MASK)
mod = 2;
else if (k->modifier_state & GDK_SHIFT_MASK)
mod = 1;
do {
keyval = trans_table[keycode][mod--];
} while (!keyval && (mod >= 0));
if (k->caps_lock && (keyval >= 'a') && (keyval <= 'z'))
keyval = toupper (keyval);
/* handle some magic keys */
if (k->modifier_state & (GDK_CONTROL_MASK|GDK_MOD1_MASK))
{
if (key_up)
{
if (keyval == GDK_BackSpace)
exit (1);
if (keyval == GDK_Return)
gdk_fb_redraw_all ();
}
keyval = 0;
}
if (!keyval)
continue;
win = gdk_window_find_focus ();
event = gdk_event_make (win,
key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS,
TRUE);
if (event)
{
/* Find focused window */
event->key.time = now;
event->key.state = k->modifier_state;
event->key.keyval = keyval;
event->key.length = isprint (event->key.keyval) ? 1 : 0;
dummy[0] = event->key.keyval;
dummy[1] = 0;
event->key.string = event->key.length ? g_strdup(dummy) : NULL;
}
}
input_activity ();
return TRUE;
}
static gboolean
handle_xlate_keyboard_input (GIOChannel *gioc,
GIOCondition cond,
gpointer data)
{
guchar buf[128];
int i, n;
Keyboard *k = data;
guint32 now;
n = read (k->fd, buf, sizeof(buf));
if (n <= 0)
g_error ("Nothing from keyboard!");
/* Now turn this into a keyboard event */
now = gdk_fb_get_time ();
for (i = 0; i < n; i++)
{
GdkEvent *event;
GdkWindow *win;
char dummy[2];
guint keyval;
keyval = buf[i];
switch (keyval) {
case '\n':
keyval = GDK_Return;
break;
case '\t':
keyval = GDK_Tab;
break;
case 127:
keyval = GDK_BackSpace;
break;
case 27:
keyval = GDK_Escape;
break;
}
win = gdk_window_find_focus ();
/* Send key down: */
event = gdk_event_make (win, GDK_KEY_PRESS, TRUE);
if (event)
{
/* Find focused window */
event->key.time = now;
event->key.state = k->modifier_state;
event->key.keyval = keyval;
event->key.length = isprint (event->key.keyval) ? 1 : 0;
dummy[0] = event->key.keyval;
dummy[1] = 0;
event->key.string = event->key.length ? g_strdup(dummy) : NULL;
}
/* Send key up: */
event = gdk_event_make (win, GDK_KEY_RELEASE, TRUE);
if (event)
{
/* Find focused window */
event->key.time = now;
event->key.state = k->modifier_state;
event->key.keyval = keyval;
event->key.length = isprint (event->key.keyval) ? 1 : 0;
dummy[0] = event->key.keyval;
dummy[1] = 0;
event->key.string = event->key.length ? g_strdup(dummy) : NULL;
}
}
input_activity ();
return TRUE;
}
static Keyboard *
tty_keyboard_open (void)
{
Keyboard *retval = g_new0 (Keyboard, 1);
GIOChannel *gioc;
const char cursoroff_str[] = "\033[?1;0;0c";
int n;
struct vt_stat vs;
char buf[32];
struct termios ts;
gboolean raw_keyboard;
retval->modifier_state = 0;
retval->caps_lock = 0;
setsid();
retval->consfd = open ("/dev/console", O_RDWR);
ioctl (retval->consfd, VT_GETSTATE, &vs);
retval->prev_vtnum = vs.v_active;
g_snprintf (buf, sizeof(buf), "/dev/tty%d", retval->prev_vtnum);
ioctl (retval->consfd, KDSKBMODE, K_XLATE);
n = ioctl (retval->consfd, VT_OPENQRY, &retval->vtnum);
if (n < 0 || retval->vtnum == -1)
g_error("Cannot allocate VT");
ioctl (retval->consfd, VT_ACTIVATE, retval->vtnum);
ioctl (retval->consfd, VT_WAITACTIVE, retval->vtnum);
#if 0
close (0);
close (1);
close (2);
#endif
g_snprintf (buf, sizeof(buf), "/dev/tty%d", retval->vtnum);
retval->fd = open (buf, O_RDWR|O_NONBLOCK);
if (retval->fd < 0)
return NULL;
raw_keyboard = TRUE;
if (ioctl (retval->fd, KDSKBMODE, K_MEDIUMRAW) < 0)
{
raw_keyboard = FALSE;
g_warning ("K_MEDIUMRAW failed, using broken XLATE keyboard driver");
}
/* Disable normal text on the console */
ioctl (retval->fd, KDSETMODE, KD_GRAPHICS);
/* Set controlling tty */
ioctl (0, TIOCNOTTY, 0);
ioctl (retval->fd, TIOCSCTTY, 0);
tcgetattr (retval->fd, &ts);
ts.c_cc[VTIME] = 0;
ts.c_cc[VMIN] = 1;
ts.c_lflag &= ~(ICANON|ECHO|ISIG);
ts.c_iflag = 0;
tcsetattr (retval->fd, TCSAFLUSH, &ts);
tcsetpgrp (retval->fd, getpgrp());
write (retval->fd, cursoroff_str, strlen (cursoroff_str));
#if 0
if (retval->fd != 0)
dup2 (retval->fd, 0);
if (retval->fd != 1)
dup2 (retval->fd, 1);
if (retval->fd != 2)
dup2 (retval->fd, 2);
#endif
gioc = g_io_channel_unix_new (retval->fd);
retval->fd_tag = g_io_add_watch (gioc,
G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
(raw_keyboard) ? handle_mediumraw_keyboard_input : handle_xlate_keyboard_input,
retval);
return retval;
}
void
gdk_beep (void)
{
static int pitch = 600, duration = 100;
gulong arg;
if (!keyboard)
return;
/* Thank you XFree86 */
arg = ((1193190 / pitch) & 0xffff) |
(((unsigned long)duration) << 16);
ioctl (keyboard->fd, KDMKTONE, arg);
}
void
keyboard_init (void)
{
keyboard = tty_keyboard_open ();
}
void
keyboard_shutdown (void)
{
int tmpfd;
ioctl (keyboard->fd, KDSETMODE, KD_TEXT);
ioctl (keyboard->fd, KDSKBMODE, K_XLATE);
close (keyboard->fd);
g_source_remove (keyboard->fd_tag);
tmpfd = keyboard->consfd;
ioctl (tmpfd, VT_ACTIVATE, keyboard->prev_vtnum);
ioctl (tmpfd, VT_WAITACTIVE, keyboard->prev_vtnum);
ioctl (tmpfd, VT_DISALLOCATE, keyboard->vtnum);
close (tmpfd);
g_free (keyboard);
keyboard = NULL;
}

View File

@ -277,6 +277,13 @@ gdk_input_window_destroy (GdkWindow *window)
g_free (input_window);
}
void
gdk_input_init (void)
{
gdk_input_devices = g_list_append (NULL, gdk_core_pointer);
gdk_input_ignore_core = FALSE;
}
void
gdk_input_exit (void)
{

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,8 @@
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <sys/vt.h>
#include <sys/kd.h>
#include "gdk.h"
@ -308,7 +310,7 @@ fb_modes_parse_mode (GScanner *scanner,
if (strcmp (modename, specified_modename)== 0) {
if (!found_geometry)
g_warning ("Geometry not specified\n");
g_warning ("Geometry not specified");
if (found_geometry)
{
@ -320,7 +322,7 @@ fb_modes_parse_mode (GScanner *scanner,
}
if (!found_timings)
g_warning ("Timing not specified\n");
g_warning ("Timing not specified");
if (found_timings)
{
@ -371,7 +373,7 @@ gdk_fb_setup_mode_from_name (struct fb_var_screeninfo *modeinfo,
fd = open (filename, O_RDONLY);
if (fd < 0)
{
g_warning ("Cannot read %s\n", filename);
g_warning ("Cannot read %s", filename);
return retval;
}
@ -390,7 +392,7 @@ gdk_fb_setup_mode_from_name (struct fb_var_screeninfo *modeinfo,
result = fb_modes_parse_mode (scanner, modeinfo, modename);
if (result < 0) {
g_warning ("parse error in %s at line %d\n", filename, scanner->line);
g_warning ("parse error in %s at line %d", filename, scanner->line);
break;
}
if (result > 0)
@ -413,15 +415,22 @@ gdk_fb_set_mode (GdkFBDisplay *display)
{
char *env, *end;
int depth, height, width;
gboolean changed;
if (ioctl (display->fd, FBIOGET_VSCREENINFO, &display->modeinfo) < 0)
if (ioctl (display->fb_fd, FBIOGET_VSCREENINFO, &display->modeinfo) < 0)
return -1;
display->orig_modeinfo = display->modeinfo;
changed = FALSE;
env = getenv ("GDK_DISPLAY_MODE");
if (env)
{
if (!gdk_fb_setup_mode_from_name (&display->modeinfo, env))
g_warning ("Couldn't find mode named '%s'\n", env);
if (gdk_fb_setup_mode_from_name (&display->modeinfo, env))
changed = TRUE;
else
g_warning ("Couldn't find mode named '%s'", env);
}
env = getenv ("GDK_DISPLAY_DEPTH");
@ -429,7 +438,10 @@ gdk_fb_set_mode (GdkFBDisplay *display)
{
depth = strtol (env, &end, 10);
if (env != end)
display->modeinfo.bits_per_pixel = depth;
{
changed = TRUE;
display->modeinfo.bits_per_pixel = depth;
}
}
env = getenv ("GDK_DISPLAY_WIDTH");
@ -438,6 +450,7 @@ gdk_fb_set_mode (GdkFBDisplay *display)
width = strtol (env, &end, 10);
if (env != end)
{
changed = TRUE;
display->modeinfo.xres = width;
display->modeinfo.xres_virtual = width;
}
@ -449,74 +462,163 @@ gdk_fb_set_mode (GdkFBDisplay *display)
height = strtol (env, &end, 10);
if (env != end)
{
changed = TRUE;
display->modeinfo.yres = height;
display->modeinfo.yres_virtual = height;
}
}
if (ioctl (display->fd, FBIOPUT_VSCREENINFO, &display->modeinfo) < 0)
if (changed &&
(ioctl (display->fb_fd, FBIOPUT_VSCREENINFO, &display->modeinfo) < 0))
{
g_warning ("Couldn't set specified mode\n");
g_warning ("Couldn't set specified mode");
return -1;
}
if (ioctl (display->fd, FBIOGET_FSCREENINFO, &display->sinfo) < 0)
if (ioctl (display->fb_fd, FBIOGET_FSCREENINFO, &display->sinfo) < 0)
{
g_warning ("Error getting fixed screen info\n");
g_warning ("Error getting fixed screen info");
return -1;
}
return 0;
}
static GdkFBDisplay *
gdk_fb_display_new (const char *filename)
gdk_fb_display_new ()
{
int fd;
GdkFBDisplay *retval;
GdkFBDisplay *display;
gchar *fb_filename;
struct vt_stat vs;
int vt, n;
gchar *s, *send;
char buf[32];
fd = open (filename, O_RDWR);
if (fd < 0)
return NULL;
display = g_new0 (GdkFBDisplay, 1);
retval = g_new0 (GdkFBDisplay, 1);
retval->fd = fd;
if (gdk_fb_set_mode (retval) < 0)
display->console_fd = open ("/dev/console", O_RDWR);
if (display->console_fd < 0)
{
g_free (retval);
g_warning ("Can't open /dev/console");
g_free (display);
return NULL;
}
ioctl (display->console_fd, VT_GETSTATE, &vs);
display->start_vt = vs.v_active;
vt = display->start_vt;
s = getenv("GDK_VT");
if (s)
{
if (g_strcasecmp ("new", s)==0)
{
n = ioctl (display->console_fd, VT_OPENQRY, &vt);
if (n < 0 || vt == -1)
g_error("Cannot allocate new VT");
}
else
{
vt = strtol (s, &send, 10);
if (s==send)
{
g_warning ("Cannot parse GDK_TTY");
vt = display->start_vt;
}
}
}
display->vt = vt;
/* Switch to the new VT */
if (vt != display->start_vt)
{
ioctl (display->console_fd, VT_ACTIVATE, vt);
ioctl (display->console_fd, VT_WAITACTIVE, vt);
}
/* Open the tty */
g_snprintf (buf, sizeof(buf), "/dev/tty%d", vt);
display->tty_fd = open (buf, O_RDWR|O_NONBLOCK);
if (display->tty_fd < 0)
{
g_warning ("Can't open %s", buf);
close (display->console_fd);
g_free (display);
return NULL;
}
ioctl (retval->fd, FBIOBLANK, 0);
/* We used to use sinfo.smem_len, but that seemed to be broken in many cases */
retval->fbmem = mmap (NULL,
retval->modeinfo.yres * retval->sinfo.line_length,
PROT_READ|PROT_WRITE,
MAP_SHARED,
fd,
0);
g_assert (retval->fbmem != MAP_FAILED);
if (retval->sinfo.visual == FB_VISUAL_TRUECOLOR)
/* Set controlling tty */
ioctl (0, TIOCNOTTY, 0);
ioctl (display->tty_fd, TIOCSCTTY, 0);
fb_filename = gdk_get_display ();
display->fb_fd = open (fb_filename, O_RDWR);
if (display->fb_fd < 0)
{
retval->red_byte = retval->modeinfo.red.offset >> 3;
retval->green_byte = retval->modeinfo.green.offset >> 3;
retval->blue_byte = retval->modeinfo.blue.offset >> 3;
g_warning ("Can't open %s", fb_filename);
g_free (fb_filename);
close (display->tty_fd);
close (display->console_fd);
g_free (display);
return NULL;
}
g_free (fb_filename);
if (gdk_fb_set_mode (display) < 0)
{
close (display->fb_fd);
close (display->tty_fd);
close (display->console_fd);
g_free (display);
return NULL;
}
return retval;
/* Disable normal text on the console */
ioctl (display->fb_fd, KDSETMODE, KD_GRAPHICS);
ioctl (display->fb_fd, FBIOBLANK, 0);
/* We used to use sinfo.smem_len, but that seemed to be broken in many cases */
display->fbmem = mmap (NULL,
display->modeinfo.yres * display->sinfo.line_length,
PROT_READ|PROT_WRITE,
MAP_SHARED,
display->fb_fd,
0);
g_assert (display->fbmem != MAP_FAILED);
if (display->sinfo.visual == FB_VISUAL_TRUECOLOR)
{
display->red_byte = display->modeinfo.red.offset >> 3;
display->green_byte = display->modeinfo.green.offset >> 3;
display->blue_byte = display->modeinfo.blue.offset >> 3;
}
return display;
}
static void
gdk_fb_display_destroy (GdkFBDisplay *fbd)
gdk_fb_display_destroy (GdkFBDisplay *display)
{
munmap (fbd->fbmem, fbd->modeinfo.yres * fbd->sinfo.line_length);
close (fbd->fd);
g_free (fbd);
}
/* Restore old framebuffer mode */
ioctl (display->fb_fd, FBIOPUT_VSCREENINFO, &display->orig_modeinfo);
/* Enable normal text on the console */
ioctl (display->fb_fd, KDSETMODE, KD_TEXT);
munmap (display->fbmem, display->modeinfo.yres * display->sinfo.line_length);
close (display->fb_fd);
extern void keyboard_init(void);
ioctl (display->console_fd, VT_ACTIVATE, display->start_vt);
ioctl (display->console_fd, VT_WAITACTIVE, display->start_vt);
if (display->vt != display->start_vt)
ioctl (display->console_fd, VT_DISALLOCATE, display->vt);
close (display->tty_fd);
close (display->console_fd);
g_free (display);
}
gboolean
_gdk_windowing_init_check (int argc, char **argv)
@ -524,14 +626,33 @@ _gdk_windowing_init_check (int argc, char **argv)
if (gdk_initialized)
return TRUE;
keyboard_init ();
gdk_display = gdk_fb_display_new ("/dev/fb");
/* Create new session and become session leader */
setsid();
gdk_display = gdk_fb_display_new ();
if (!gdk_display)
return FALSE;
gdk_fb_font_init ();
if (!gdk_fb_keyboard_open ())
{
g_warning ("Failed to initialize keyboard");
gdk_fb_display_destroy (gdk_display);
gdk_display = NULL;
return FALSE;
}
if (!gdk_fb_mouse_open ())
{
g_warning ("Failed to initialize mouse");
gdk_fb_keyboard_close ();
gdk_fb_display_destroy (gdk_display);
gdk_display = NULL;
return FALSE;
}
gdk_initialized = TRUE;
gdk_selection_property = gdk_atom_intern ("GDK_SELECTION", FALSE);
@ -883,12 +1004,16 @@ extern void keyboard_shutdown(void);
void
gdk_windowing_exit (void)
{
gdk_fb_display_destroy (gdk_display);
gdk_display = NULL;
gdk_fb_mouse_close ();
gdk_fb_keyboard_close ();
gdk_fb_font_fini ();
keyboard_shutdown ();
gdk_fb_display_destroy (gdk_display);
gdk_display = NULL;
}
gchar*
@ -906,7 +1031,27 @@ gdk_keyval_from_name (const gchar *keyval_name)
gchar *
gdk_get_display(void)
{
return g_strdup ("/dev/fb0");
gchar *s;
s = getenv ("GDK_DISPLAY");
if (s==0)
s = "/dev/fb";
return g_strdup (s);
}
void
gdk_beep (void)
{
static int pitch = 600, duration = 100;
gulong arg;
/* Thank you XFree86 */
arg = ((1193190 / pitch) & 0xffff) |
(((unsigned long)duration) << 16);
ioctl (gdk_display->tty_fd, KDMKTONE, arg);
}
/* utils */
@ -968,7 +1113,7 @@ gdk_event_make (GdkWindow *window,
{
GdkModifierType mask;
gdk_mouse_get_info (NULL, NULL, &mask);
gdk_fb_mouse_get_info (NULL, NULL, &mask);
if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) ||
((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) ||

View File

@ -1,3 +1,22 @@
/* GDK - The GIMP Drawing Kit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <gdk/gdk.h>
#include <gdk/gdkinternals.h>
#include "gdkprivate-fb.h"
@ -32,9 +51,9 @@ struct _GdkFBMouse {
static GdkFBMouse *gdk_fb_mouse = NULL;
void
gdk_mouse_get_info (gint *x,
gint *y,
GdkModifierType *mask)
gdk_fb_mouse_get_info (gint *x,
gint *y,
GdkModifierType *mask)
{
if (x)
*x = gdk_fb_mouse->x;
@ -45,7 +64,7 @@ gdk_mouse_get_info (gint *x,
(gdk_fb_mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) |
(gdk_fb_mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) |
(gdk_fb_mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) |
/*keyboard->modifier_state*/0; //TODO
gdk_fb_keyboard_modifiers ();
}
static void
@ -90,7 +109,7 @@ handle_mouse_movement(GdkFBMouse *mouse)
state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) |
(mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) |
(mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) |
/*keyboard->modifier_state*/0; // TODO
gdk_fb_keyboard_modifiers ();
event = gdk_event_make (grabwin, GDK_MOTION_NOTIFY, TRUE);
if (event)
@ -137,7 +156,7 @@ send_button_event (GdkFBMouse *mouse,
(mouse->button_pressed[1] ? GDK_BUTTON2_MASK : 0) |
(mouse->button_pressed[2] ? GDK_BUTTON3_MASK : 0) |
(1 << (button + 8)) /* badhack */ |
/*keyboard->modifier_state*/0; // TODO
gdk_fb_keyboard_modifiers ();
event->button.device = gdk_core_pointer;
event->button.x_root = mouse->x;
event->button.y_root = mouse->y;
@ -231,7 +250,7 @@ gdk_fb_mouse_open (void)
mouse = g_new0 (GdkFBMouse, 1);
mouse->fd = -1;
mouse_type = getenv ("GDK_MOUSETYPE");
mouse_type = getenv ("GDK_MOUSE_TYPE");
if (!mouse_type)
mouse_type = "ps2";
@ -243,7 +262,7 @@ gdk_fb_mouse_open (void)
if (i == G_N_ELEMENTS(mouse_devs))
{
g_warning ("No mouse driver of type %s found\n", mouse_type);
g_warning ("No mouse driver of type %s found", mouse_type);
return FALSE;
}
@ -256,7 +275,7 @@ gdk_fb_mouse_open (void)
if (!device->open(mouse))
{
g_warning ("Mouse driver open failed\n");
g_warning ("Mouse driver open failed");
g_free (mouse);
return FALSE;
}

View File

@ -123,12 +123,17 @@ typedef struct {
struct _GdkFBDisplay
{
int fd;
int tty_fd;
int console_fd;
int vt, start_vt;
int fb_fd;
guchar *fbmem;
gpointer active_cmap;
gulong mem_len;
struct fb_fix_screeninfo sinfo;
struct fb_var_screeninfo modeinfo;
struct fb_var_screeninfo orig_modeinfo;
int red_byte, green_byte, blue_byte; /* For truecolor */
};
@ -248,22 +253,21 @@ extern GdkGC *_gdk_fb_screen_gc;
GType gdk_gc_fb_get_type (void) G_GNUC_CONST;
/* Routines from gdkgeometry-fb.c */
void _gdk_selection_window_destroyed (GdkWindow *window);
void gdk_window_invalidate_region_clear (GdkWindow *window,
GdkRegion *region);
void gdk_window_invalidate_rect_clear (GdkWindow *window,
GdkRectangle *rect);
void gdk_fb_window_send_crossing_events (GdkWindow *dest,
GdkCrossingMode mode);
void gdk_fb_window_move_resize (GdkWindow *window,
gint x,
gint y,
gint width,
gint height,
gboolean send_expose_events);
GdkWindow *gdk_fb_window_find_focus (void);
void _gdk_window_init_position (GdkWindow *window);
void _gdk_selection_window_destroyed (GdkWindow *window);
void _gdk_window_move_resize_child (GdkWindow *window,
gint x,
gint y,
gint width,
gint height);
void _gdk_window_process_expose (GdkWindow *window,
gulong serial,
GdkRectangle *area);
void gdk_window_invalidate_region_clear (GdkWindow *window,
GdkRegion *region);
void gdk_window_invalidate_rect_clear (GdkWindow *window,
GdkRectangle *rect);
GdkGC * _gdk_fb_gc_new (GdkDrawable *drawable,
GdkGCValues *values,
@ -386,14 +390,14 @@ void gdk_fb_cursor_hide(void);
void gdk_fb_redraw_all(void);
void gdk_fb_cursor_move (gint x, gint y, GdkWindow *in_window);
void gdk_fb_window_send_crossing_events (GdkWindow *dest,
GdkCrossingMode mode);
gboolean gdk_fb_mouse_open (void);
void gdk_fb_mouse_close (void);
void gdk_mouse_get_info (gint *x,
gint *y,
GdkModifierType *mask);
guint gdk_fb_keyboard_modifiers (void);
gboolean gdk_fb_keyboard_open (void);
void gdk_fb_keyboard_close (void);
gboolean gdk_fb_mouse_open (void);
void gdk_fb_mouse_close (void);
void gdk_fb_mouse_get_info (gint *x,
gint *y,
GdkModifierType *mask);
#define PANGO_TYPE_FB_FONT (pango_fb_font_get_type ())
@ -421,13 +425,6 @@ GType pango_fb_font_get_type (void) G_GNUC_CONST;
PangoFBGlyphInfo *pango_fb_font_get_glyph_info (PangoFont *font,
PangoGlyph glyph);
void gdk_fb_window_move_resize (GdkWindow *window,
gint x,
gint y,
gint width,
gint height,
gboolean send_expose_events);
extern void CM(void); /* Check for general mem corruption */
extern void RP(GdkDrawable *drawable); /* Same, for pixmaps */

View File

@ -440,6 +440,28 @@ gdk_fb_redraw_all (void)
gdk_window_process_all_updates ();
}
/* Focus follows pointer */
GdkWindow *
gdk_fb_window_find_focus (void)
{
if (_gdk_fb_keyboard_grab_window)
return _gdk_fb_keyboard_grab_window;
else if (gdk_fb_window_containing_pointer)
{
GdkWindowObject *priv = (GdkWindowObject *)gdk_fb_window_containing_pointer;
while (priv != (GdkWindowObject *)gdk_parent_root)
{
if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped)
return (GdkWindow *)priv;
priv = priv->parent;
}
}
return gdk_parent_root;
}
static GdkWindow *
gdk_fb_find_common_ancestor (GdkWindow *win1,
GdkWindow *win2)
@ -513,7 +535,7 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest,
if (a==b)
return;
gdk_mouse_get_info (&x, &y, &my_mask);
gdk_fb_mouse_get_info (&x, &y, &my_mask);
c = gdk_fb_find_common_ancestor (a, b);
@ -1407,7 +1429,7 @@ gdk_window_get_pointer (GdkWindow *window,
window = gdk_parent_root;
gdk_window_get_root_origin (window, &x_int, &y_int);
gdk_mouse_get_info (&winx, &winy, &my_mask);
gdk_fb_mouse_get_info (&winx, &winy, &my_mask);
winx -= x_int;
winy -= y_int;