forked from Miroirs/x49gp
exploration for paste #1 (not working)
This commit is contained in:
parent
0a5d99cd80
commit
4f3f0d9e65
1 changed files with 109 additions and 197 deletions
306
src/x50ng/ui.c
306
src/x50ng/ui.c
|
@ -1,3 +1,4 @@
|
||||||
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -20,6 +21,8 @@
|
||||||
|
|
||||||
#include "gdbstub.h"
|
#include "gdbstub.h"
|
||||||
|
|
||||||
|
// #define TEST_PASTE true
|
||||||
|
|
||||||
#define KB_NB_ROWS 10
|
#define KB_NB_ROWS 10
|
||||||
|
|
||||||
#define LCD_WIDTH ( 131 * opt.zoom )
|
#define LCD_WIDTH ( 131 * opt.zoom )
|
||||||
|
@ -604,13 +607,16 @@ static x49gp_ui_key_t ui_keys[ NB_KEYS ] = {
|
||||||
|
|
||||||
static inline void x50ng_set_key_state( x49gp_t* x49gp, const x49gp_ui_key_t* key, bool state )
|
static inline void x50ng_set_key_state( x49gp_t* x49gp, const x49gp_ui_key_t* key, bool state )
|
||||||
{
|
{
|
||||||
|
if ( opt.verbose )
|
||||||
|
fprintf( stderr, "%s -> %s\n", key->label, state ? "true" : "false" );
|
||||||
|
|
||||||
if ( key->rowbit )
|
if ( key->rowbit )
|
||||||
s3c2410_io_port_g_update( x49gp, key->column, key->row, key->columnbit, key->rowbit, state );
|
s3c2410_io_port_g_update( x49gp, key->column, key->row, key->columnbit, key->rowbit, state );
|
||||||
else
|
else
|
||||||
s3c2410_io_port_f_set_bit( x49gp, key->eint, state );
|
s3c2410_io_port_f_set_bit( x49gp, key->eint, state );
|
||||||
}
|
}
|
||||||
#define X50NG_PRESS_KEY( x49gp, key ) x50ng_set_key_state( x49gp, key, true )
|
#define X50NG_PRESS_KEY( x49gp, key ) x50ng_set_key_state( x49gp, key, true );
|
||||||
#define X50NG_RELEASE_KEY( x49gp, key ) x50ng_set_key_state( x49gp, key, false )
|
#define X50NG_RELEASE_KEY( x49gp, key ) x50ng_set_key_state( x49gp, key, false );
|
||||||
|
|
||||||
static void ui_release_button( x49gp_ui_button_t* button )
|
static void ui_release_button( x49gp_ui_button_t* button )
|
||||||
{
|
{
|
||||||
|
@ -749,7 +755,7 @@ static void do_emulator_reset( GtkMenuItem* menuitem, gpointer user_data )
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool react_to_key_event( GtkWidget* widget, GdkEventKey* event, gpointer user_data )
|
static bool react_to_key_event( GtkWidget* _widget, GdkEventKey* event, gpointer user_data )
|
||||||
{
|
{
|
||||||
x49gp_t* x49gp = user_data;
|
x49gp_t* x49gp = user_data;
|
||||||
x49gp_ui_t* ui = x49gp->ui;
|
x49gp_ui_t* ui = x49gp->ui;
|
||||||
|
@ -1012,8 +1018,20 @@ static bool react_to_key_event( GtkWidget* widget, GdkEventKey* event, gpointer
|
||||||
return GDK_EVENT_PROPAGATE;
|
return GDK_EVENT_PROPAGATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
x49gp_ui_button_t* button = &ui->buttons[ hpkey ];
|
// Bypassing GUI buttons:
|
||||||
|
/* switch ( event->type ) { */
|
||||||
|
/* case GDK_KEY_PRESS: */
|
||||||
|
/* X50NG_PRESS_KEY( x49gp, &ui_keys[ hpkey ] ); */
|
||||||
|
/* break; */
|
||||||
|
/* case GDK_KEY_RELEASE: */
|
||||||
|
/* X50NG_RELEASE_KEY( x49gp, &ui_keys[ hpkey ] ); */
|
||||||
|
/* break; */
|
||||||
|
/* default: */
|
||||||
|
/* return GDK_EVENT_PROPAGATE; */
|
||||||
|
/* } */
|
||||||
|
|
||||||
|
// Using GUI buttons:
|
||||||
|
x49gp_ui_button_t* button = &ui->buttons[ hpkey ];
|
||||||
GdkEventButton bev;
|
GdkEventButton bev;
|
||||||
memset( &bev, 0, sizeof( GdkEventButton ) );
|
memset( &bev, 0, sizeof( GdkEventButton ) );
|
||||||
bev.time = event->time;
|
bev.time = event->time;
|
||||||
|
@ -1036,206 +1054,70 @@ static bool react_to_key_event( GtkWidget* widget, GdkEventKey* event, gpointer
|
||||||
return GDK_EVENT_STOP;
|
return GDK_EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void x50g_string_to_keys_sequence( const char* input )
|
#ifdef TEST_PASTE
|
||||||
|
static void x50g_string_to_keys_sequence( x49gp_t* x49gp, const char* input )
|
||||||
{
|
{
|
||||||
|
// struct timespec key_press_delay = { 1, 0 };
|
||||||
|
int hpkey = -1;
|
||||||
for ( int i = 0; i < strlen( input ); i++ ) {
|
for ( int i = 0; i < strlen( input ); i++ ) {
|
||||||
switch ( input[ i ] ) {
|
if ( hpkey > 0 )
|
||||||
case '0':
|
X50NG_RELEASE_KEY( x49gp, &ui_keys[ hpkey ] )
|
||||||
fprintf( stderr, "%c", '0' );
|
|
||||||
break;
|
|
||||||
case '1':
|
|
||||||
fprintf( stderr, "%c", '1' );
|
|
||||||
break;
|
|
||||||
case '2':
|
|
||||||
fprintf( stderr, "%c", '2' );
|
|
||||||
break;
|
|
||||||
case '3':
|
|
||||||
fprintf( stderr, "%c", '3' );
|
|
||||||
break;
|
|
||||||
case '4':
|
|
||||||
fprintf( stderr, "%c", '4' );
|
|
||||||
break;
|
|
||||||
case '5':
|
|
||||||
fprintf( stderr, "%c", '5' );
|
|
||||||
break;
|
|
||||||
case '6':
|
|
||||||
fprintf( stderr, "%c", '6' );
|
|
||||||
break;
|
|
||||||
case '7':
|
|
||||||
fprintf( stderr, "%c", '7' );
|
|
||||||
break;
|
|
||||||
case '8':
|
|
||||||
fprintf( stderr, "%c", '8' );
|
|
||||||
break;
|
|
||||||
case '9':
|
|
||||||
fprintf( stderr, "%c", '9' );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'a':
|
fprintf( stderr, "%c", input[ i ] );
|
||||||
fprintf( stderr, "%c", 'a' );
|
if ( input[ i ] >= '0' && input[ i ] <= '9' ) {
|
||||||
break;
|
switch ( input[ i ] ) {
|
||||||
case 'b':
|
case '0':
|
||||||
fprintf( stderr, "%c", 'b' );
|
hpkey = HPKEY_0;
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case '1':
|
||||||
fprintf( stderr, "%c", 'c' );
|
hpkey = HPKEY_1;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case '2':
|
||||||
fprintf( stderr, "%c", 'd' );
|
hpkey = HPKEY_2;
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case '3':
|
||||||
fprintf( stderr, "%c", 'e' );
|
hpkey = HPKEY_3;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case '4':
|
||||||
fprintf( stderr, "%c", 'f' );
|
hpkey = HPKEY_4;
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case '5':
|
||||||
fprintf( stderr, "%c", 'g' );
|
hpkey = HPKEY_5;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case '6':
|
||||||
fprintf( stderr, "%c", 'h' );
|
hpkey = HPKEY_6;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case '7':
|
||||||
fprintf( stderr, "%c", 'i' );
|
hpkey = HPKEY_7;
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case '8':
|
||||||
fprintf( stderr, "%c", 'j' );
|
hpkey = HPKEY_8;
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case '9':
|
||||||
fprintf( stderr, "%c", 'k' );
|
hpkey = HPKEY_9;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
default:
|
||||||
fprintf( stderr, "%c", 'l' );
|
hpkey = HPKEY_ENTER;
|
||||||
break;
|
}
|
||||||
case 'm':
|
}
|
||||||
fprintf( stderr, "%c", 'm' );
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
fprintf( stderr, "%c", 'n' );
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
fprintf( stderr, "%c", 'o' );
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
fprintf( stderr, "%c", 'p' );
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
fprintf( stderr, "%c", 'q' );
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
fprintf( stderr, "%c", 'r' );
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
fprintf( stderr, "%c", 's' );
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
fprintf( stderr, "%c", 't' );
|
|
||||||
break;
|
|
||||||
case 'u':
|
|
||||||
fprintf( stderr, "%c", 'u' );
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
fprintf( stderr, "%c", 'v' );
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
fprintf( stderr, "%c", 'w' );
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
fprintf( stderr, "%c", 'x' );
|
|
||||||
break;
|
|
||||||
case 'y':
|
|
||||||
fprintf( stderr, "%c", 'y' );
|
|
||||||
break;
|
|
||||||
case 'z':
|
|
||||||
fprintf( stderr, "%c", 'z' );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'A':
|
if ( hpkey > 0 ) {
|
||||||
fprintf( stderr, "%c", 'A' );
|
X50NG_RELEASE_KEY( x49gp, &ui_keys[ hpkey ] )
|
||||||
break;
|
X50NG_PRESS_KEY( x49gp, &ui_keys[ hpkey ] )
|
||||||
case 'B':
|
|
||||||
fprintf( stderr, "%c", 'B' );
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
fprintf( stderr, "%c", 'C' );
|
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
fprintf( stderr, "%c", 'D' );
|
|
||||||
break;
|
|
||||||
case 'E':
|
|
||||||
fprintf( stderr, "%c", 'E' );
|
|
||||||
break;
|
|
||||||
case 'F':
|
|
||||||
fprintf( stderr, "%c", 'F' );
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
fprintf( stderr, "%c", 'G' );
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
fprintf( stderr, "%c", 'H' );
|
|
||||||
break;
|
|
||||||
case 'I':
|
|
||||||
fprintf( stderr, "%c", 'I' );
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
fprintf( stderr, "%c", 'J' );
|
|
||||||
break;
|
|
||||||
case 'K':
|
|
||||||
fprintf( stderr, "%c", 'K' );
|
|
||||||
break;
|
|
||||||
case 'L':
|
|
||||||
fprintf( stderr, "%c", 'L' );
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
fprintf( stderr, "%c", 'M' );
|
|
||||||
break;
|
|
||||||
case 'N':
|
|
||||||
fprintf( stderr, "%c", 'N' );
|
|
||||||
break;
|
|
||||||
case 'O':
|
|
||||||
fprintf( stderr, "%c", 'O' );
|
|
||||||
break;
|
|
||||||
case 'P':
|
|
||||||
fprintf( stderr, "%c", 'P' );
|
|
||||||
break;
|
|
||||||
case 'Q':
|
|
||||||
fprintf( stderr, "%c", 'Q' );
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
fprintf( stderr, "%c", 'R' );
|
|
||||||
break;
|
|
||||||
case 'S':
|
|
||||||
fprintf( stderr, "%c", 'S' );
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
fprintf( stderr, "%c", 'T' );
|
|
||||||
break;
|
|
||||||
case 'U':
|
|
||||||
fprintf( stderr, "%c", 'U' );
|
|
||||||
break;
|
|
||||||
case 'V':
|
|
||||||
fprintf( stderr, "%c", 'V' );
|
|
||||||
break;
|
|
||||||
case 'W':
|
|
||||||
fprintf( stderr, "%c", 'W' );
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
fprintf( stderr, "%c", 'X' );
|
|
||||||
break;
|
|
||||||
case 'Y':
|
|
||||||
fprintf( stderr, "%c", 'Y' );
|
|
||||||
break;
|
|
||||||
case 'Z':
|
|
||||||
fprintf( stderr, "%c", 'Z' );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
fprintf( stderr, "<unknown: %c>", input[ i ] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf( stderr, "\n" );
|
fprintf( stderr, "\n" );
|
||||||
|
|
||||||
|
if ( hpkey > 0 )
|
||||||
|
X50NG_RELEASE_KEY( x49gp, &ui_keys[ hpkey ] )
|
||||||
|
|
||||||
|
/* if ( hpkey > 0 ) { */
|
||||||
|
/* X50NG_RELEASE_KEY( x49gp, &ui_keys[ HPKEY_ENTER ] ) */
|
||||||
|
/* X50NG_PRESS_KEY( x49gp, &ui_keys[ HPKEY_ENTER ] ) */
|
||||||
|
/* X50NG_RELEASE_KEY( x49gp, &ui_keys[ HPKEY_ENTER ] ) */
|
||||||
|
/* } */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if GTK_MAJOR_VERSION == 3
|
#if GTK_MAJOR_VERSION == 3
|
||||||
static bool react_to_display_click( GtkWidget* widget, GdkEventButton* event, gpointer user_data )
|
static bool react_to_display_click( GtkWidget* widget, GdkEventButton* event, gpointer user_data )
|
||||||
|
@ -1259,14 +1141,17 @@ static bool react_to_display_click( GtkWidget* widget, GdkEventButton* event, gp
|
||||||
case 1: // left click
|
case 1: // left click
|
||||||
gdk_window_begin_move_drag( gtk_widget_get_window( ui->window ), event->button, event->x_root, event->y_root, event->time );
|
gdk_window_begin_move_drag( gtk_widget_get_window( ui->window ), event->button, event->x_root, event->y_root, event->time );
|
||||||
break;
|
break;
|
||||||
|
# ifdef TEST_PASTE
|
||||||
case 2: // middle click
|
case 2: // middle click
|
||||||
GtkClipboard* clip = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
|
GtkClipboard* clip = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
|
||||||
gchar* text = gtk_clipboard_wait_for_text( clip );
|
gchar* text = gtk_clipboard_wait_for_text( clip );
|
||||||
fprintf( stderr, "clipboard: %s\n", text );
|
fprintf( stderr, "clipboard: %s\n", text );
|
||||||
|
|
||||||
x50g_string_to_keys_sequence( text );
|
// x50g_string_to_keys_sequence( x49gp, text );
|
||||||
|
x50g_string_to_keys_sequence( x49gp, "0123456789\n" );
|
||||||
|
|
||||||
return GDK_EVENT_STOP;
|
return GDK_EVENT_STOP;
|
||||||
|
# endif
|
||||||
case 3: // right click
|
case 3: // right click
|
||||||
# if GTK_MAJOR_VERSION == 3
|
# if GTK_MAJOR_VERSION == 3
|
||||||
gtk_menu_popup_at_pointer( GTK_MENU( ui->menu ), NULL );
|
gtk_menu_popup_at_pointer( GTK_MENU( ui->menu ), NULL );
|
||||||
|
@ -1304,6 +1189,27 @@ static int draw_lcd( GtkWidget* widget, GdkEventConfigure* event, gpointer user_
|
||||||
return GDK_EVENT_STOP;
|
return GDK_EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TEST_PASTE
|
||||||
|
static void do_paste( gpointer user_data, GtkWidget* widget, GdkEvent* event )
|
||||||
|
{
|
||||||
|
x49gp_t* x49gp = user_data;
|
||||||
|
|
||||||
|
// x49gp->arm_exit++;
|
||||||
|
|
||||||
|
X50NG_RELEASE_KEY( x49gp, &ui_keys[ HPKEY_1 ] )
|
||||||
|
X50NG_PRESS_KEY( x49gp, &ui_keys[ HPKEY_1 ] )
|
||||||
|
// nanosleep( &key_press_delay, NULL );
|
||||||
|
sleep( 10 );
|
||||||
|
X50NG_RELEASE_KEY( x49gp, &ui_keys[ HPKEY_1 ] )
|
||||||
|
/* GtkClipboard* clip = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD ); */
|
||||||
|
/* gchar* text = gtk_clipboard_wait_for_text( clip ); */
|
||||||
|
/* fprintf( stderr, "clipboard: %s\n", text ); */
|
||||||
|
|
||||||
|
/* // x50g_string_to_keys_sequence( x49gp, text ); */
|
||||||
|
/* x50g_string_to_keys_sequence( x49gp, "0123456789\n" ); */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void do_quit( gpointer user_data, GtkWidget* widget, GdkEvent* event )
|
static void do_quit( gpointer user_data, GtkWidget* widget, GdkEvent* event )
|
||||||
{
|
{
|
||||||
x49gp_t* x49gp = user_data;
|
x49gp_t* x49gp = user_data;
|
||||||
|
@ -1675,6 +1581,12 @@ static int ui_load( x49gp_module_t* module, GKeyFile* keyfile )
|
||||||
|
|
||||||
gtk_menu_shell_append( GTK_MENU_SHELL( ui->menu ), gtk_separator_menu_item_new() );
|
gtk_menu_shell_append( GTK_MENU_SHELL( ui->menu ), gtk_separator_menu_item_new() );
|
||||||
|
|
||||||
|
# ifdef TEST_PASTE
|
||||||
|
GtkWidget* menu_paste = gtk_menu_item_new_with_label( "Paste" );
|
||||||
|
gtk_menu_shell_append( GTK_MENU_SHELL( ui->menu ), menu_paste );
|
||||||
|
g_signal_connect_swapped( G_OBJECT( menu_paste ), "activate", G_CALLBACK( do_paste ), x49gp );
|
||||||
|
# endif
|
||||||
|
|
||||||
GtkWidget* menu_reset = gtk_menu_item_new_with_label( "Reset" );
|
GtkWidget* menu_reset = gtk_menu_item_new_with_label( "Reset" );
|
||||||
gtk_menu_shell_append( GTK_MENU_SHELL( ui->menu ), menu_reset );
|
gtk_menu_shell_append( GTK_MENU_SHELL( ui->menu ), menu_reset );
|
||||||
g_signal_connect( G_OBJECT( menu_reset ), "activate", G_CALLBACK( do_emulator_reset ), x49gp );
|
g_signal_connect( G_OBJECT( menu_reset ), "activate", G_CALLBACK( do_emulator_reset ), x49gp );
|
||||||
|
|
Loading…
Add table
Reference in a new issue