fixed true gap / rightscreen to work again

(rightscreen was not working because table wasn't notified of a change)
(gap screen was not working because ScreenRotate had become a float)
This commit is contained in:
damdoum 2007-02-11 19:41:45 +00:00
parent 8119e076f3
commit 50deb34e86
7 changed files with 107 additions and 51 deletions

View File

@ -24,6 +24,7 @@
/* globals */
int Frameskip = 0;
gboolean ScreenRightForce=FALSE;
gboolean ScreenRight=FALSE;
gboolean ScreenGap=FALSE;
gboolean ScreenInvert=FALSE;
@ -48,20 +49,23 @@ void enable_rom_features() {
void MAINWINDOW_RESIZE() {
GtkWidget * spacer1 = glade_xml_get_widget(xml, "misc_sep3");
GtkWidget * spacer2 = glade_xml_get_widget(xml, "misc_sep4");
int dim = 66 * ScreenCoeff_Size[0];
int dim1,dim2;
BOOL rotate = (ScreenRotate==90.0 || ScreenRotate==270.0 );
/* sees whether we want a gap */
if (!ScreenGap) dim = -1;
if (ScreenRight && rotate) {
gtk_widget_set_usize(spacer1, dim, -1);
} else if (!ScreenRight && !rotate) {
gtk_widget_set_usize(spacer2, -1, dim);
} else {
gtk_widget_set_usize(spacer1, -1, -1);
gtk_widget_set_usize(spacer2, -1, -1);
}
dim1 = dim2 = 66 * ScreenCoeff_Size[0];
/* sees whether we want a gap */
if (!ScreenGap) dim1 = dim2 = -1;
if (ScreenRight == rotate) {
if (ScreenRight)
dim2 = -1;
else
dim1 = -1;
} else {
dim1 = dim2 = -1;
}
gtk_widget_set_usize(spacer1, dim1, -1);
gtk_widget_set_usize(spacer2, -1, dim2);
gtk_window_resize ((GtkWindow*)pWindow,1,1);
}
@ -203,21 +207,25 @@ void gtk_table_reattach(GtkTable * table, GtkWidget * w,
void rightscreen(BOOL apply) {
GtkWidget *chk = glade_xml_get_widget(xml, "wvb_2_Sub");
GtkTable *table = glade_xml_get_widget(xml, "table_layout");
GtkTable *table = (GtkTable *)glade_xml_get_widget(xml, "table_layout");
if (apply) {
ScreenRight = apply || ScreenRightForce;
if (ScreenRight) {
/* we want to change the layout, lower screen goes right */
gtk_table_reattach(table, pDrawingArea2,
3,4, 0,1, 0,0, 0,0);
gtk_table_reattach(table, chk,
4,5, 0,1, 0,0, 0,0);
} else if (!ScreenRight) {
} else {
/* we want to change the layout, lower screen goes down */
gtk_table_reattach(table, pDrawingArea2,
1,2, 2,3, 0,0, 0,0);
gtk_table_reattach(table, chk,
0,1, 2,3, 0,0, 0,0);
ScreenRight = FALSE;
}
gtk_widget_queue_resize (GTK_WIDGET (table));
/* pack the window */
MAINWINDOW_RESIZE();
@ -322,8 +330,8 @@ void on_menu_gapscreen_activate (GtkMenuItem *menuitem, gpointer user_data) {
}
void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data) {
ScreenRight=gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem);
rightscreen(ScreenRight);
ScreenRightForce=gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem);
rightscreen(ScreenRightForce);
}
void on_menu_rotatescreen_activate (GtkMenuItem *menuitem, gpointer user_data) {

View File

@ -81,8 +81,8 @@ void black_screen () {
BOOL my_gl_Begin (int screen) { return FALSE; }
void my_gl_End (int screen) {}
void init_GL_capabilities() {}
void init_GL(GtkWidget * widget, int screen) {}
void reshape (GtkWidget * widget, int screen) {}
void init_GL(GtkWidget * widget, ...) {}
void reshape (GtkWidget * widget, ...) {}
int has_pix_col_map=0;
u32 pix_col_map[0x8000];

View File

@ -24,17 +24,17 @@
#ifdef HAVE_LIBGDKGLEXT_X11_1_0
GLuint Textures[1];
GLuint Textures[2];
GdkGLConfig *my_glConfig=NULL;
GdkGLContext *my_glContext=NULL;
GdkGLContext *my_glContext[3]={NULL,NULL,NULL};
GdkGLDrawable *my_glDrawable[3]={NULL,NULL,NULL};
GtkWidget *pDrawingTexArea;
INLINE void my_gl_Identity() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
INLINE void my_gl_DrawBeautifulQuad() {
@ -50,22 +50,22 @@ INLINE void my_gl_DrawBeautifulQuad() {
}
BOOL my_gl_Begin (int screen) {
return gdk_gl_drawable_gl_begin(my_glDrawable[screen], my_glContext);
return gdk_gl_drawable_gl_begin(my_glDrawable[screen], my_glContext[screen]);
}
void my_gl_End (int screen) {
if (gdk_gl_drawable_is_double_buffered (my_glDrawable[screen]))
gdk_gl_drawable_swap_buffers (my_glDrawable[screen]);
else
glFlush ();
glFlush();
gdk_gl_drawable_gl_end(my_glDrawable[screen]);
}
void init_GL(GtkWidget * widget, int screen) {
void init_GL(GtkWidget * widget, int screen, int share_num) {
// init GL capability
if (!gtk_widget_set_gl_capability(
widget, my_glConfig,
NULL, TRUE,
&my_glContext[share_num], TRUE,
GDK_GL_RGBA_TYPE)) {
printf ("gtk_widget_set_gl_capability\n");
exit(1);
@ -76,22 +76,26 @@ void init_GL(GtkWidget * widget, int screen) {
while (gtk_events_pending()) gtk_main_iteration();
my_glDrawable[screen] = gtk_widget_get_gl_drawable(widget);
// shared context
if (my_glContext == NULL) {
// not initialized !
my_glContext = gtk_widget_get_gl_context(widget);
if (!my_gl_Begin(screen)) return;
/* Set the background black */
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// generated ONE texture (display)
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &Textures[0]);
my_gl_End(screen);
if (screen == share_num) {
my_glContext[screen] = gtk_widget_get_gl_context(widget);
} else {
my_glContext[screen] = my_glContext[share_num];
return;
}
if (!my_gl_Begin(screen)) return;
/* Set the background black */
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
my_gl_DrawBeautifulQuad();
// generate ONE texture (display)
glEnable(GL_TEXTURE_2D);
glGenTextures(2, Textures);
my_gl_End(screen);
reshape(widget, screen);
}
@ -102,9 +106,11 @@ void init_GL_capabilities() {
| GDK_GL_MODE_DOUBLE
);
// initialize 1st drawing area
init_GL(pDrawingArea,0);
init_GL(pDrawingArea,0,0);
// initialize 2nd drawing area (sharing context)
init_GL(pDrawingArea2,1);
init_GL(pDrawingArea2,1,0);
init_GL(pDrawingAreaTex,2,2);
}
void reshape (GtkWidget * widget, int screen) {
@ -145,12 +151,34 @@ void my_gl_ScreenTexApply(int screen) {
glEnd();
}
void other_screen (GtkWidget * widget, int screen) {
if (!my_gl_Begin(screen)) return TRUE;
my_gl_Identity();
glClear( GL_COLOR_BUFFER_BIT );
glBegin(GL_QUADS);
glColor3ub(255,0,0); glVertex2d(-0.75,-0.75);
glColor3ub(128,255,0); glVertex2d(-0.75, 0.75);
glColor3ub(0,255,128); glVertex2d( 0.75, 0.75);
glColor3ub(0,0,255); glVertex2d( 0.75,-0.75);
glEnd();
my_gl_End(screen);
}
gboolean screen (GtkWidget * widget, int viewportscreen) {
int H,W,screen;
if (viewportscreen > 1) {
other_screen(widget,viewportscreen);
return TRUE;
}
// we take care to draw the right thing the right place
// we need to rearrange widgets not to use this trick
screen = (ScreenInvert)?1-viewportscreen:viewportscreen;
// screen = viewportscreen;
if (!my_gl_Begin(viewportscreen)) return TRUE;
glLoadIdentity();
@ -163,13 +191,13 @@ gboolean screen (GtkWidget * widget, int viewportscreen) {
glRotatef(ScreenRotate, 0.0, 0.0, 1.0);
// draw screen
my_gl_Texture2D();
if (viewportscreen==0) my_gl_ScreenTex();
if (viewportscreen==0) {
my_gl_ScreenTex();
}
my_gl_ScreenTexApply(screen);
}
my_gl_End(viewportscreen);
return TRUE;
}
#endif /* if HAVE_LIBGDKGLEXT_X11_1_0 */

View File

@ -34,6 +34,6 @@ BOOL my_gl_Begin (int screen);
void my_gl_End (int screen);
void init_GL_capabilities();
void init_GL(GtkWidget * widget, int screen);
void init_GL(GtkWidget * widget, int screen, int share_num);
void reshape (GtkWidget * widget, int screen);
gboolean screen (GtkWidget * widget, int off);

View File

@ -1271,6 +1271,25 @@
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkDrawingArea" id="wDraw_Tex">
<property name="visible">False</property>
<property name="width_request">256</property>
<property name="height_request">192</property>
<property name="events">GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK</property>
<signal name="configure_event" handler="on_wDrawScreen_configure_event" object="%d:2" last_modification_time="Mon, 05 Feb 2007 00:49:24 GMT"/>
<signal name="expose_event" handler="on_wDrawScreen_expose_event" object="%d:2" last_modification_time="Tue, 02 Jan 2007 10:27:18 GMT"/>
</widget>
<packing>
<property name="left_attach">3</property>
<property name="right_attach">4</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options"></property>
<property name="y_options"></property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>

View File

@ -105,8 +105,7 @@ u16 Keypad_Temp[NB_KEYS];
/* main.c */
GtkWidget * pWindow;
GtkWidget * pDrawingArea;
GtkWidget * pDrawingArea2;
GtkWidget * pDrawingArea, * pDrawingArea2, * pDrawingAreaTex;
GladeXML * xml, * xml_tools;
typedef void (*VoidFunPtr)();

View File

@ -26,8 +26,7 @@
#include "globals.h"
GtkWidget * pWindow;
GtkWidget * pDrawingArea;
GtkWidget * pDrawingArea2;
GtkWidget * pDrawingArea, * pDrawingArea2, * pDrawingAreaTex;
GladeXML * xml, * xml_tools;
SoundInterface_struct *SNDCoreList[] = {
@ -252,6 +251,8 @@ int main(int argc, char *argv[]) {
pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main");
pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub");
pDrawingAreaTex = glade_xml_get_widget(xml, "wDraw_Tex");
/* connect the signals in the interface */
glade_xml_signal_autoconnect_StringObject(xml);
glade_xml_signal_autoconnect_StringObject(xml_tools);
@ -276,6 +277,7 @@ int main(int argc, char *argv[]) {
gtk_widget_show(pDrawingArea);
gtk_widget_show(pDrawingArea2);
//gtk_widget_show(pDrawingAreaTex);
/* start event loop */
gtk_main();