Changes to make the new testgtk compile after gtk_menu_append was removed.

2000-11-09  Alexander Larsson  <alexl@redhat.com>

	* demos/testgtk/menus.c:
	Changes to make the new testgtk compile after
	gtk_menu_append was removed.

	* gdk/linux-fb/gdkdrawable-fb2.c
	(gdk_fb_get_depth, gdk_fb_get_visual,
	gdk_drawable_impl_fb_class_init): Implement
	these drawable functions. Now GtkImages work again.

	* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.

	* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.

	* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
	gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
	Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
	GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
This commit is contained in:
Alexander Larsson 2000-11-09 12:15:40 +00:00 committed by Alexander Larsson
parent 8ced8f9d84
commit 8898529c12
13 changed files with 668 additions and 97 deletions

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -1,3 +1,23 @@
2000-11-09 Alexander Larsson <alexl@redhat.com>
* demos/testgtk/menus.c:
Changes to make the new testgtk compile after
gtk_menu_append was removed.
* gdk/linux-fb/gdkdrawable-fb2.c
(gdk_fb_get_depth, gdk_fb_get_visual,
gdk_drawable_impl_fb_class_init): Implement
these drawable functions. Now GtkImages work again.
* gdk/linux-fb/gdkimage-fb.c (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkprivate-fb.h (_gdk_fb_get_image): Change prototype.
* gdk/linux-fb/gdkmain-fb.c (fb_modes_parse_mode,
gdk_fb_setup_mode_from_name, gdk_fb_set_mode, gdk_fb_display_new);
Parse /etc/fb.modes, use the environment variables GDK_DISPLAY_MODE,
GDK_DISPLAY_DEPTH, GDK_DISPLAY_WIDTH, GDK_DISPLAY_HEIGHT.
2000-11-08 Havoc Pennington <hp@pobox.com>
* gtk/gtktexttag.c (gtk_text_tag_class_init): Add visible and

View File

@ -30,7 +30,7 @@ create_menu (gint depth, gboolean tearoff)
if (tearoff)
{
menuitem = gtk_tearoff_menu_item_new ();
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
}
@ -41,7 +41,7 @@ create_menu (gint depth, gboolean tearoff)
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
if (depth % 2)
gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
if (i == 3)
gtk_widget_set_sensitive (menuitem, FALSE);
@ -120,7 +120,7 @@ do_menus (void)
gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
@ -129,7 +129,7 @@ do_menus (void)
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE);
menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
@ -138,7 +138,7 @@ do_menus (void)
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",

View File

@ -30,7 +30,7 @@ create_menu (gint depth, gboolean tearoff)
if (tearoff)
{
menuitem = gtk_tearoff_menu_item_new ();
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
}
@ -41,7 +41,7 @@ create_menu (gint depth, gboolean tearoff)
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
if (depth % 2)
gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
if (i == 3)
gtk_widget_set_sensitive (menuitem, FALSE);
@ -120,7 +120,7 @@ do_menus (void)
gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
@ -129,7 +129,7 @@ do_menus (void)
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE);
menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
@ -138,7 +138,7 @@ do_menus (void)
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",

View File

@ -18,80 +18,82 @@ typedef enum { GPR_USED_BG, GPR_AA_GRAYVAL, GPR_NONE, GPR_ERR_BOUNDS } GetPixelR
static GetPixelRet gdk_fb_drawable_get_pixel(GdkDrawable *drawable, GdkGC *gc, int x, int y, GdkColor *spot,
gboolean abs_coords, GdkDrawable *bg_relto, GdkDrawable *bgpm);
void gdk_fb_draw_rectangle (GdkDrawable *drawable,
GdkGC *gc,
gint filled,
gint x,
gint y,
gint width,
gint height);
static void gdk_fb_draw_arc (GdkDrawable *drawable,
GdkGC *gc,
gint filled,
gint x,
gint y,
gint width,
gint height,
gint angle1,
gint angle2);
static void gdk_fb_draw_polygon (GdkDrawable *drawable,
GdkGC *gc,
gint filled,
GdkPoint *points,
gint npoints);
static void gdk_fb_draw_text (GdkDrawable *drawable,
GdkFont *font,
GdkGC *gc,
gint x,
gint y,
const gchar *text,
gint text_length);
static void gdk_fb_draw_text_wc (GdkDrawable *drawable,
GdkFont *font,
GdkGC *gc,
gint x,
gint y,
const GdkWChar *text,
gint text_length);
static void gdk_fb_draw_glyphs(GdkDrawable *drawable,
GdkGC *gc,
PangoFont *font,
gint x,
gint y,
PangoGlyphString *glyphs);
void gdk_fb_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
gint xsrc,
gint ysrc,
gint xdest,
gint ydest,
gint width,
gint height);
static void gdk_fb_draw_image(GdkDrawable *drawable,
GdkGC *gc,
GdkImage *image,
gint xsrc,
gint ysrc,
gint xdest,
gint ydest,
gint width,
gint height);
static void gdk_fb_draw_points (GdkDrawable *drawable,
GdkGC *gc,
GdkPoint *points,
gint npoints);
static void gdk_fb_draw_segments (GdkDrawable *drawable,
GdkGC *gc,
GdkSegment *segs,
gint nsegs);
static void gdk_fb_draw_lines (GdkDrawable *drawable,
GdkGC *gc,
GdkPoint *points,
gint npoints);
static GdkColormap* gdk_fb_get_colormap (GdkDrawable *drawable);
static void gdk_fb_set_colormap (GdkDrawable *drawable,
GdkColormap *colormap);
void gdk_fb_draw_rectangle (GdkDrawable *drawable,
GdkGC *gc,
gint filled,
gint x,
gint y,
gint width,
gint height);
static void gdk_fb_draw_arc (GdkDrawable *drawable,
GdkGC *gc,
gint filled,
gint x,
gint y,
gint width,
gint height,
gint angle1,
gint angle2);
static void gdk_fb_draw_polygon (GdkDrawable *drawable,
GdkGC *gc,
gint filled,
GdkPoint *points,
gint npoints);
static void gdk_fb_draw_text (GdkDrawable *drawable,
GdkFont *font,
GdkGC *gc,
gint x,
gint y,
const gchar *text,
gint text_length);
static void gdk_fb_draw_text_wc (GdkDrawable *drawable,
GdkFont *font,
GdkGC *gc,
gint x,
gint y,
const GdkWChar *text,
gint text_length);
static void gdk_fb_draw_glyphs (GdkDrawable *drawable,
GdkGC *gc,
PangoFont *font,
gint x,
gint y,
PangoGlyphString *glyphs);
void gdk_fb_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkPixmap *src,
gint xsrc,
gint ysrc,
gint xdest,
gint ydest,
gint width,
gint height);
static void gdk_fb_draw_image (GdkDrawable *drawable,
GdkGC *gc,
GdkImage *image,
gint xsrc,
gint ysrc,
gint xdest,
gint ydest,
gint width,
gint height);
static void gdk_fb_draw_points (GdkDrawable *drawable,
GdkGC *gc,
GdkPoint *points,
gint npoints);
static void gdk_fb_draw_segments (GdkDrawable *drawable,
GdkGC *gc,
GdkSegment *segs,
gint nsegs);
static void gdk_fb_draw_lines (GdkDrawable *drawable,
GdkGC *gc,
GdkPoint *points,
gint npoints);
static GdkColormap* gdk_fb_get_colormap (GdkDrawable *drawable);
static void gdk_fb_set_colormap (GdkDrawable *drawable,
GdkColormap *colormap);
static gint gdk_fb_get_depth (GdkDrawable *drawable);
static GdkVisual* gdk_fb_get_visual (GdkDrawable *drawable);
static gpointer parent_class = NULL;
@ -126,7 +128,11 @@ gdk_drawable_impl_fb_class_init (GdkDrawableFBClass *klass)
drawable_class->set_colormap = gdk_fb_set_colormap;
drawable_class->get_colormap = gdk_fb_get_colormap;
drawable_class->get_size = gdk_fb_get_size;
drawable_class->get_depth = gdk_fb_get_depth;
drawable_class->get_visual = gdk_fb_get_visual;
drawable_class->get_image = _gdk_fb_get_image;
}
@ -1376,3 +1382,15 @@ gdk_fb_draw_image(GdkDrawable *drawable,
gdk_fb_draw_drawable_2(drawable, gc, (GdkPixmap *)&fbd, xsrc, ysrc, xdest, ydest, width, height, TRUE, TRUE);
}
static gint
gdk_fb_get_depth (GdkDrawable *drawable)
{
return GDK_DRAWABLE_IMPL_FBDATA (drawable)->depth;
}
static GdkVisual*
gdk_fb_get_visual (GdkDrawable *drawable)
{
return gdk_visual_get_system();
}

View File

@ -151,7 +151,7 @@ gdk_image_new (GdkImageType type,
}
GdkImage*
_gdk_fb_get_image (GdkWindow *window,
_gdk_fb_get_image (GdkDrawable *drawable,
gint x,
gint y,
gint width,
@ -162,12 +162,12 @@ _gdk_fb_get_image (GdkWindow *window,
gint bits_per_pixel = GDK_DRAWABLE_IMPL_FBDATA(gdk_parent_root)->depth;
GdkPixmapFBData fbd;
g_return_val_if_fail (window != NULL, NULL);
g_return_val_if_fail (drawable != NULL, NULL);
image = (GdkImage *)private = (GdkImagePrivateFB *)g_object_new (gdk_image_get_type(), NULL);
image->type = GDK_IMAGE_NORMAL;
image->visual = gdk_window_get_visual (window);
image->visual = gdk_drawable_get_visual (drawable);
image->width = width;
image->height = height;
image->depth = bits_per_pixel;
@ -193,7 +193,7 @@ _gdk_fb_get_image (GdkWindow *window,
fbd.drawable_data.depth = image->depth;
fbd.drawable_data.window_type = GDK_DRAWABLE_PIXMAP;
gdk_fb_draw_drawable_2((GdkPixmap *)&fbd, NULL, window, x, y, 0, 0, width, height, TRUE, TRUE);
gdk_fb_draw_drawable_2((GdkPixmap *)&fbd, NULL, drawable, x, y, 0, 0, width, height, TRUE, TRUE);
return image;
}

View File

@ -34,6 +34,7 @@
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "gdk.h"
@ -60,6 +61,412 @@ GdkArgDesc _gdk_windowing_args[] = {
{ NULL }
};
static const GScannerConfig fb_modes_scanner_config =
{
(
" \t\n"
) /* cset_skip_characters */,
(
G_CSET_a_2_z
G_CSET_A_2_Z
) /* cset_identifier_first */,
(
G_CSET_a_2_z
"_-0123456789"
G_CSET_A_2_Z
) /* cset_identifier_nth */,
( "#\n" ) /* cpair_comment_single */,
FALSE /* case_sensitive */,
FALSE /* skip_comment_multi */,
TRUE /* skip_comment_single */,
FALSE /* scan_comment_multi */,
TRUE /* scan_identifier */,
TRUE /* scan_identifier_1char */,
FALSE /* scan_identifier_NULL */,
TRUE /* scan_symbols */,
FALSE /* scan_binary */,
FALSE /* scan_octal */,
FALSE /* scan_float */,
FALSE /* scan_hex */,
FALSE /* scan_hex_dollar */,
FALSE /* scan_string_sq */,
TRUE /* scan_string_dq */,
TRUE /* numbers_2_int */,
FALSE /* int_2_float */,
FALSE /* identifier_2_string */,
TRUE /* char_2_token */,
FALSE /* symbol_2_token */,
FALSE /* scope_0_fallback */,
};
enum {
FB_MODE,
FB_ENDMODE,
FB_GEOMETRY,
FB_TIMINGS,
FB_LACED,
FB_HSYNC,
FB_VSYNC,
FB_CSYNC,
FB_EXTSYNC,
FB_DOUBLE
};
char *fb_modes_keywords[] =
{
"mode",
"endmode",
"geometry",
"timings",
"laced",
"hsync",
"vsync",
"csync",
"extsync",
"double"
};
static int
fb_modes_parse_mode (GScanner *scanner,
struct fb_var_screeninfo *modeinfo,
char *specified_modename)
{
guint token;
int keyword;
int i;
char *modename;
int geometry[5];
int timings[7];
int vsync=0, hsync=0, csync=0, extsync=0, doublescan=0, laced=0;
int found_geometry = 0;
int found_timings = 0;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_SYMBOL)
return -1;
keyword = GPOINTER_TO_INT(scanner->value.v_symbol);
if (keyword != FB_MODE)
return -1;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_STRING)
return -1;
modename = g_strdup(scanner->value.v_string);
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_SYMBOL)
{
g_free (modename);
return -1; /* Not a valid keyword */
}
keyword = GPOINTER_TO_INT(scanner->value.v_symbol);
while ( keyword != FB_ENDMODE )
{
switch (GPOINTER_TO_INT(scanner->value.v_symbol))
{
case FB_GEOMETRY:
for (i=0;i<5;i++) {
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_INT)
{
g_free (modename);
return -1; /* need a integer */
}
geometry[i] = scanner->value.v_int;
}
found_geometry = TRUE;
break;
case FB_TIMINGS:
for (i=0;i<7;i++) {
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_INT)
{
g_free (modename);
return -1; /* need a integer */
}
timings[i] = scanner->value.v_int;
}
found_timings = TRUE;
break;
case FB_LACED:
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_IDENTIFIER)
{
g_free (modename);
return -1;
}
if (g_strcasecmp(scanner->value.v_identifier, "true")==0)
laced = 1;
else if (g_strcasecmp(scanner->value.v_identifier, "false")==0)
laced = 0;
else
{
g_free (modename);
return -1;
}
break;
case FB_EXTSYNC:
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_IDENTIFIER)
{
g_free (modename);
return -1;
}
if (g_strcasecmp(scanner->value.v_identifier, "true")==0)
extsync = 1;
else if (g_strcasecmp(scanner->value.v_identifier, "false")==0)
extsync = 0;
else
{
g_free (modename);
return -1;
}
break;
case FB_DOUBLE:
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_IDENTIFIER)
{
g_free (modename);
return -1;
}
if (g_strcasecmp(scanner->value.v_identifier, "true")==0)
doublescan = 1;
else if (g_strcasecmp(scanner->value.v_identifier, "false")==0)
doublescan = 0;
else
{
g_free (modename);
return -1;
}
break;
case FB_VSYNC:
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_IDENTIFIER)
{
g_free (modename);
return -1;
}
if (g_strcasecmp(scanner->value.v_identifier, "high")==0)
vsync = 1;
else if (g_strcasecmp(scanner->value.v_identifier, "low")==0)
vsync = 0;
else
{
g_free (modename);
return -1;
}
break;
case FB_HSYNC:
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_IDENTIFIER)
{
g_free (modename);
return -1;
}
if (g_strcasecmp(scanner->value.v_identifier, "high")==0)
hsync = 1;
else if (g_strcasecmp(scanner->value.v_identifier, "low")==0)
hsync = 0;
else
{
g_free (modename);
return -1;
}
break;
case FB_CSYNC:
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_IDENTIFIER)
{
g_free (modename);
return -1;
}
if (g_strcasecmp(scanner->value.v_identifier, "high")==0)
csync = 1;
else if (g_strcasecmp(scanner->value.v_identifier, "low")==0)
csync = 0;
else
{
g_free (modename);
return -1;
}
break;
}
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_SYMBOL)
{
g_free (modename);
return -1; /* Not a valid keyword */
}
keyword = GPOINTER_TO_INT(scanner->value.v_symbol);
}
if (strcmp(modename, specified_modename)== 0) {
if (!found_geometry)
g_warning("Geometry not specified\n");
if (found_geometry)
{
modeinfo->xres = geometry[0];
modeinfo->yres = geometry[1];
modeinfo->xres_virtual = geometry[2];
modeinfo->yres_virtual = geometry[3];
modeinfo->bits_per_pixel = geometry[4];
}
if (!found_timings)
g_warning("Timing not specified\n");
if (found_timings)
{
modeinfo->pixclock = timings[0];
modeinfo->left_margin = timings[1];
modeinfo->right_margin = timings[2];
modeinfo->upper_margin = timings[3];
modeinfo->lower_margin = timings[4];
modeinfo->hsync_len = timings[5];
modeinfo->vsync_len = timings[6];
modeinfo->vmode = 0;
if (laced)
modeinfo->vmode |= FB_VMODE_INTERLACED;
if (doublescan)
modeinfo->vmode |= FB_VMODE_DOUBLE;
modeinfo->sync = 0;
if (hsync)
modeinfo->sync |= FB_SYNC_HOR_HIGH_ACT;
if (vsync)
modeinfo->sync |= FB_SYNC_VERT_HIGH_ACT;
}
g_free(modename);
return 1;
}
g_free(modename);
return 0;
}
static int
gdk_fb_setup_mode_from_name(struct fb_var_screeninfo *modeinfo, char *modename)
{
GScanner *scanner;
char *filename;
gint result;
int fd, i;
int retval;
retval = 0;
filename = "/etc/fb.modes";
fd = open (filename, O_RDONLY);
if (fd < 0)
{
g_warning ("Cannot read %s\n", filename);
return retval;
}
scanner = g_scanner_new ((GScannerConfig *) &fb_modes_scanner_config);
scanner->input_name = filename;
for (i=0;i<sizeof(fb_modes_keywords)/sizeof(fb_modes_keywords[0]);i++)
g_scanner_add_symbol(scanner, fb_modes_keywords[i], GINT_TO_POINTER(i));
g_scanner_input_file (scanner, fd);
while (1) {
if (g_scanner_peek_next_token(scanner) == G_TOKEN_EOF) {
break;
}
result = fb_modes_parse_mode(scanner, modeinfo, modename);
if (result < 0) {
g_warning("parse error in %s at line %d\n", filename, scanner->line);
break;
}
if (result > 0)
{
retval = 1;
break;
}
}
g_scanner_destroy (scanner);
close(fd);
return retval;
}
static int
gdk_fb_set_mode(GdkFBDisplay *display)
{
char *env, *end;
int depth, height, width;
if (ioctl (display->fd, FBIOGET_VSCREENINFO, &display->modeinfo) < 0)
return -1;
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);
}
env = getenv("GDK_DISPLAY_DEPTH");
if (env)
{
depth = strtol(env, &end, 10);
if (env != end)
display->modeinfo.bits_per_pixel = depth;
}
env = getenv("GDK_DISPLAY_WIDTH");
if (env)
{
width = strtol(env, &end, 10);
if (env != end)
{
display->modeinfo.xres = width;
display->modeinfo.xres_virtual = width;
}
}
env = getenv("GDK_DISPLAY_HEIGHT");
if (env)
{
height = strtol(env, &end, 10);
if (env != end)
{
display->modeinfo.yres = height;
display->modeinfo.yres_virtual = height;
}
}
if (ioctl (display->fd, FBIOPUT_VSCREENINFO, &display->modeinfo) < 0)
{
g_warning("Couldn't set specified mode\n");
return -1;
}
if (ioctl (display->fd, FBIOGET_FSCREENINFO, &display->sinfo) < 0)
{
g_warning("Error getting fixed screen info\n");
return -1;
}
return 0;
}
static GdkFBDisplay *
gdk_fb_display_new(const char *filename)
{
@ -72,16 +479,21 @@ gdk_fb_display_new(const char *filename)
retval = g_new0(GdkFBDisplay, 1);
retval->fd = fd;
if (gdk_fb_set_mode(retval) < 0)
{
g_free (retval);
return NULL;
}
ioctl(retval->fd, FBIOBLANK, 0);
n = ioctl(fd, FBIOGET_FSCREENINFO, &retval->sinfo);
n |= ioctl(fd, FBIOGET_VSCREENINFO, &retval->modeinfo);
g_assert(!n);
/* 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_PSEUDOCOLOR)
{
guint16 red[256], green[256], blue[256];

View File

@ -72,7 +72,8 @@ struct _GdkDrawableFBData
guint rowstride;
/* Due to excursions in gdk, this stuff has to be stored here instead of in GdkDrawable where it belongs */
/* Due to excursions in gdk, this stuff has to be stored here
instead of in GdkDrawable where it belongs */
gint width, height, depth;
GdkColormap *colormap;
GdkWindowType window_type;
@ -202,11 +203,11 @@ 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, GdkGCValuesMask values_mask);
GdkImage*_gdk_fb_get_image (GdkWindow *window,
gint x,
gint y,
gint width,
gint height);
GdkImage*_gdk_fb_get_image (GdkDrawable *drawable,
gint x,
gint y,
gint width,
gint height);
void gdk_fb_drawable_clear (GdkDrawable *drawable);
void gdk_fb_draw_drawable (GdkDrawable *drawable,